[{"data":1,"prerenderedAt":457},["ShallowReactive",2],{"blog-post-detail-real-life-refactoring-example-3x-less-code-to-read-dccm":3,"blogs-all-posts-detail-suggestions-en":28,"blog-comments-real-life-refactoring-example-3x-less-code-to-read-dccm-en":393},{"status":4,"source":5,"data":6},"success","markdown-file",{"id":7,"title":8,"slug":9,"lang":10,"category":11,"categorySlug":12,"summary":13,"excerpt":13,"author":14,"date":15,"readTime":16,"image":17,"tags":18,"publishedAt":22,"createdAt":22,"updatedAt":22,"filePath":23,"sourceUrl":24,"content":25,"seoTitle":26,"seoDescription":13,"canonicalUrl":27},"cron-1786955347443","Real-Life Refactoring Example: ~3x Less Code to Read","real-life-refactoring-example-3x-less-code-to-read-dccm","en","Microservices","microservices","There is a popular idea that refactoring is making code shorter. It is not entirely wrong....","Valentine Shi","8\u002F17\u002F2026","6 phút","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foubl9dlj23byhsak2mqy.png",[11,19,20,21,12],"node","software","backend","2026-08-17T08:29:07.443Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fmicroservices\u002Freal-life-refactoring-example-3x-less-code-to-read-dccm.md","https:\u002F\u002Fdev.to\u002Fvalentineshi-dev\u002Freal-life-refactoring-example-3x-less-code-to-read-3mdl","\nThere is a popular idea that refactoring is making code shorter. It is not entirely wrong. Repetition, pointless conditional branches, and dead variables do make code longer for no reason. But the usual topmost problems are when the intentions of a class's main public method, the business or operational ones, are unclear to a reader.\n\n---\n\nI had such a case in an S3 document-upload adapter.\n\nThe adapter was not doing anything unusual. It had to stream a document to S3-compatible storage, count actual bytes, calculate a checksum, reject empty or too-large content, normalize S3 errors, clean up a stored object where needed, and write technical logs. This is a substantial piece of work. The problem was that the public `store()` method contained most of it directly.\n\nAt a glance it looked like a method that stores a document. In practice, reading it meant walking through AWS SDK setup, `try\u002Fcatch` blocks, S3 error-object construction, cleanup, and a large logging payload before reaching the returned value.\n\nThe code was not unreadable because it had many lines. It was unreadable because the important lines had no space to stand out.\n\n## The Main Method Refactor\n\nThe main method did not show the adapter's use case. Before the refactoring, upload execution was part of `store()` itself:\n\n```ts\ntry {\n resp new Upload({\n  client: this.#s3_client,\n  params: {\n   Bucket: this.#bucket_name,\n   Key: documentStorageKey,\n   Body: countedStream,\n   ContentType: file.mime_type\n  },\n  leavePartsOnError: false\n }).done();\n} catch (error: unknown) {\n \u002F\u002F Detect validation errors.\n \u002F\u002F Build an S3 error object.\n \u002F\u002F Build an application exception.\n \u002F\u002F Log it.\n \u002F\u002F Throw it.\n}\n```\n\nHow do I decide what to refactor? ne rule of thumb is to watch the nesting depth. In my book, a class should not contain more than three levels of nesting. The first is the class declaration, the second is the method level, and the third is at most one level of nesting within a method - inline object literals and deeply nested objects are not allowed.\n\nThe second rule - the main public methods must reveal their intention clearly by their names and their internal code must reveal the story of how the method does what it does in the domain or integration terms.\n\nSo the first refactoring was to extract that `try\u002Fcatch` into a story-telling method:\n\n```ts\nconst resp this.uploadToStorage(documentUUID, documentStorageKey, file, countedStream, startedAt);\n```\n\nIt was \"Extract Method\" refactoring, described by Martin Fowler in his Refactoring book. The main method started to read as a story because the implementation was hidden and the method name revealed intention. It packed 40+ lines into one intention-revealing call — roughly 40x less implementation detail to scan in the main flow.\n\nI used the same approach to extract two conditionals converting a raw S3 error into an application error, and to delete an empty object and throw another error. The first turned ~20 lines into one call, and the second reduced another ~30 lines to one call. Together, roughly 90 lines of implementation detail became three intention-revealing calls — about 30x less code to scan at this level. And look at the method names — they continue the story\n\n```ts\nthis.throwIfS3Error(storedObjectKey, response, httpStatusCode, startedAt);\nawait this.throwIfUploadedFileIsEmpty(storedObjectKey, file, countedStream, startedAt);\n```\n\nMoreover, now a reader can answer the first useful question quickly: what happens when a document is stored? It is uploaded. The response is checked. Empty content and errors are dealt with.\n\nThe helper methods still contain difficult code. That is fine. Difficult code should exist where it belongs. It should not hide the business flow of the public method.\n\n> [!INFO]\n> The main `store()` method shrank from 121 lines to 39 — a 68% or 3x reduction in code to read.\n\n## A Private Helper Is Not Automatically a Public API\n\nThe next request looked small. The upload service needed to delete the object it had just stored when a duplicate document was found, or when persistence failed later in the transaction.\n\nThere was already a private cleanup method.\n\n```ts\nprivate async cleanupStoredObject(documentUUID: string, documentStorageKey: string, startedAt: number): Promise\u003Cvoid> {}\n```\n\nA tempting change was to make it public. That would have been wrong.\n\nThe private method accepted a document UUID, a storage key, and a timestamp. The timestamp existed only because the method wrote a cleanup-failure log. It also swallowed a deletion error. That was correct for the empty-upload path: the caller must receive the original “empty upload” error even when cleanup itself fails.\n\nIt is not a public removal contract. The public operation became this instead:\n\n```ts\npublic async remove(storedObjectKey: string): Promise\u003Cvoid>\n```\n\nIt now owns the S3 request. It owns the timing of the S3 operation. It normalizes the provider error. It writes the technical storage event. It throws the normalized error to its caller and it is universally used by the adapter and its caller.\n\n```ts\npublic async remove(storedObjectKey: string): Promise\u003Cvoid> {\n    const removalStartedAt = Date.now();\n\n    try {\n        await this.#s3_client.send(new DeleteObjectCommand({\n            Bucket: this.#bucket_name,\n            Key: storedObjectKey\n        }));\n    } catch (error: unknown) {\n        const normalizedFailure = this.normalizeStorageFailure(error);\n\n        this.logStorageEvent({\n            logLevel: ELogLevel.ERROR,\n            eventName: EDocumentStorageLogEventName.DOCUMENT_STORAGE_CLEANUP_FAILED,\n            outcome: ELogOutcome.FAILURE,\n            operationName: DOCUMENT_STORAGE_LOG_CONSTANTS.operation.remove,\n            storedObjectKey,\n            startedAt: removalStartedAt,\n            error: normalizedFailure\n        });\n\n        throw normalizedFailure;\n    }\n}\n```\n\nThe caller decides what to do with that error.\n\nThe `remove()` itself catches it for an empty upload because empty content remains the reported result. The adapter's caller - the upload service - will catch it for a duplicate upload because a duplicate remains the domain concern, not the adapter's one. These are different decisions made by different owners.\n\n## One String, Two Names\n\nNaming was not cosmetic in this refactoring. The application has a document UUID. The S3 adapter uses an object key. They were used in the multiple adapter logging methods extracted from the main `store()` method.\n\n```ts\nprivate logFailure(documentUUID: string, documentStorageKey: string, error: MinimalRAGException, startedAt: number): void {}\n```\n\nThe document UUID is part of the key:\n\n```ts\nconst storedObjectKey = `raw\u002F${documentUUID}`;\n```\n\nThe domain value object returns it as `document_storage_key`, because it is document metadata from the domain side. Inside the S3 adapter, it is `storedObjectKey`, because it is passed to the AWS SDK as `Key`.\n\nThe difference matters most when deleting an object.\n\nAt one point, removal was proposed as `remove(documentUUID)`, with the adapter reconstructing `raw\u002F\u003CUUID>`. It looked tidy. But the exact key is already known after `store()` returns. Rebuilding it makes removal depend on a key layout which may later change. Passing the known stored object key is simpler and more honest.\n\nThe final refactoring replaces multiple log methods with one (Parameterize Method), parameterized with an object instead of a long list of positional parameters (Introduce Parameter Object). The method signature becomes 2x shorter, with intention-revealing names that are clear at first sight.\n\n```ts\nprivate logStorageEvent(options: TLogStorageEventOptions): void {}\n```\n\n## Logging Had Become Its Own Mini-Application\n\nThis refactoring describes the other dimension of the refactoring result shown above.\n\nThe adapter had a method for successful storage. Another for successful removal. Another for S3 failure. Another for validation failure. Another for cleanup failure.\n\nThey all built nearly the same event:\n\n```ts\n{\n    event_name,\n    event_type: ELogEventType.INTEGRATION,\n    outcome,\n    resource: { storage_key: storedObjectKey },\n    operation,\n    error_code?,\n    error?\n}\n```\n\nDifferent logging events are useful. Five separate ways to construct 70%-identical logging event are not.\n\n```ts\nprivate logSuccess(documentUUID: string, documentStorageKey: string, startedAt: number, actualByteSize: bigint, httpStatusCode: number | undefined): void {}\n```\n\nThis is where a long argument list becomes a real problem. Six positional arguments might compile. Nobody wants to remember their order during a production incident.\n\nThe final code uses the single logging method and one parameter object:\n\n```ts\ntype TLogStorageEventOpti & {\n logLevel: ELogLevel;\n outcome: ELogOutcome;\n error?: MinimalRAGException;\n};\n\n\u002F\u002F ...\n\nthis.logStorageEvent({\n logLevel: ELogLevel.WARN,\n eventName: EDocumentStorageLogEventName.DOCUMENT_STORAGE_VALIDATION_FAILED,\n outcome: ELogOutcome.FAILURE,\n operationName: DOCUMENT_STORAGE_LOG_CONSTANTS.operation.store,\n storedObjectKey,\n startedAt,\n actualByteSize: countedStream.actual_byte_size,\n error: rejection\n});\n```\n\nThe refactoring reduced roughly 90 lines the reader previously had to scan to about 30.\n\n## Deeply Buried Intention\n\nThe builder of the logged object initially contained code like this, which is completely opaque:\n\n```ts\n{\n    operation: new LogOperationVO({\n        \u002F\u002F other fields\n        ...(cause?.request_id ? { provider_request_id: cause.request_id } : {})\n    }),\n}\n```\n\nThat conditional object spread was very far from readable.\n\nI extracted values into interim constants with intention-revealing names and used them in the logged object construction:\n\n```ts\n\u002F\u002F Extract all ternaries to the clearly named constants\nconst actualByteSize = options.actualByteSize?.toString() ?? null;\nconst httpStatusCode = options.httpStatusCode ?? cause?.http_status_code ?? null;\nconst providerRequestId = cause?.request_id ?? null;\nconst storageError = cause\n ? new LogErrorVO({\n    name: cause.error_name,\n    message: cause.error_message,\n    dependency: DOCUMENT_STORAGE_LOG_CONSTANTS.dependency\n   })\n : null;\n\n\u002F\u002F Call the logger\nthis.#logger.log(options.logLevel, {\n operation: new LogOperationVO({\n  \u002F\u002F Other fields\n  actual_byte_size: actualByteSize,\n  http_status_code: httpStatusCode,\n  provider_request_id: providerRequestId\n }),\n error: storageError\n});\n```\n\nThis makes the final log event construction boring. That is good. Logging is repeated often enough throughout an application that it should better be DRY.\n\n## Actual Refactorings Used\n\nFor readers who care about Fowler’s refactoring names, here is the short record.\n\n### Make The Public Storage Flow Readable\n\n| Change                                                                 | Fowler refactoring |\n| ---------------------------------------------------------------------- | ------------------ |\n| Move inline upload and its error handling into `uploadToStorage(...)`. | Extract Method     |\n| Move raw S3 error conversion into `normalizeStorageFailure(...)`.      | Extract Method     |\n| Move empty-object deletion into `cleanupStoredObject(...)`.            | Extract Method     |\n| Move response and empty-stream checks into named methods.              | Extract Method     |\n| Move successful-storage logging out of `store()`.                      | Extract Method     |\n\n### Clarify Storage Vocabulary and Logging\n\n| Change                                                        | Fowler refactoring                           |\n| ------------------------------------------------------------- | -------------------------------------------- |\n| `documentUuid` to `documentUUID`.                             | Rename Variable \u002F Rename Parameter           |\n| Repeated S3 literals into `DOCUMENT_STORAGE_LOG_CONSTANTS`.   | Replace Magic Literal with Symbolic Constant |\n| `documentStorageKey` to `storedObjectKey` inside the adapter. | Rename Variable                              |\n| Long logging parameters into `TLogStorageEventOptions`.       | Introduce Parameter Object                   |\n| Conditional payload expressions into named locals.            | Extract Variable                             |\n| Separate log methods into `logStorageEvent(...)`.             | Extract Method                               |\n\nThe public `remove(storedObjectKey)` method is not a Fowler refactoring. It is a new adapter capability. The validation event rename is not one either. It changes the meaning of the logged outcome. Calling every improvement a refactoring only makes the word less useful.\n\n## Result\n\nThe adapter did not become magically small. It should not. It now does more than it did before: it exposes removal, logs useful operational information, returns a named S3 response type, and gives the upload service a clean cleanup operation.\n\nAnd the public path is now readable as a path:\n\n```ts\nconst resp this.uploadToStorage(...);\nthis.throwIfS3Error(...);\nawait this.throwIfUploadedFileIsEmpty(...);\nthis.logStorageEvent(...);\n```\n\nThat is the result I want from refactoring - saving the reader's cognitive capacity for the really important work: deciding what, when and how the application should do in business and integration terms.\n\nNB: The initial code implementation I had to refactor was written by AI.\n\n---\n\n> 🔗 **Nguồn bài viết gốc**: [Valentine Shi](https:\u002F\u002Fdev.to\u002Fvalentineshi-dev\u002Freal-life-refactoring-example-3x-less-code-to-read-3mdl)\n","Real-Life Refactoring Example: ~3x Less Code to Read - Intlight Insights","https:\u002F\u002Fintlighttech.com\u002Fblogs\u002Freal-life-refactoring-example-3x-less-code-to-read-dccm",{"items":29,"total":356,"page":357,"totalPages":357,"limit":358,"lang":10,"categories":359,"popularTags":373},[30,48,61,77,93,107,119,121,135,149,163,175,188,200,214,227,241,253,267,280,294,307,319,332,344],{"id":31,"title":32,"slug":33,"lang":10,"category":34,"categorySlug":35,"summary":36,"excerpt":36,"author":37,"date":15,"readTime":38,"image":39,"tags":40,"publishedAt":45,"createdAt":45,"updatedAt":45,"filePath":46,"sourceUrl":47},"cron-1786956218725-en","I Thought I'd Lost the Plot. I Was Writing It.","i-thought-id-lost-the-plot-i-was-writing-it-wjvz","AI Agents","ai-agents","I Thought I'd Lost the Plot. I Was Writing It.            I set out to build autonomous...","Joe Black","6 min read","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3l9h76kr920p8bm2mjp.png",[34,41,42,43,44],"claudecode","aiagents","developmenttools","autonomousagents","2026-08-17T08:43:38.725Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fai-agents\u002Fi-thought-id-lost-the-plot-i-was-writing-it-wjvz.md","https:\u002F\u002Fdev.to\u002Fjoeblackwaslike\u002Fi-thought-id-lost-the-plot-i-was-writing-it-5fil",{"id":49,"title":50,"slug":51,"lang":10,"category":11,"categorySlug":12,"summary":52,"excerpt":52,"author":53,"date":15,"readTime":38,"image":54,"tags":55,"publishedAt":58,"createdAt":58,"updatedAt":58,"filePath":59,"sourceUrl":60},"cron-1786956216746-en","What Is the Circuit Breaker Pattern? A Practical Guide","what-is-the-circuit-breaker-pattern-a-practical-guide-4j68","What Is the Circuit Breaker Pattern? A Practical Guide for Developers   Imagine your...","Avijit Bera","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi6cy1uyqxjd14ikkveev.png",[11,12,21,56,57],"api","Trending","2026-08-17T08:43:36.746Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fmicroservices\u002Fwhat-is-the-circuit-breaker-pattern-a-practical-guide-4j68.md","https:\u002F\u002Fdev.to\u002Favijitbera\u002Fwhat-is-the-circuit-breaker-pattern-a-practical-guide-20i4",{"id":62,"title":63,"slug":64,"lang":10,"category":65,"categorySlug":66,"summary":67,"excerpt":67,"author":68,"date":15,"readTime":38,"image":69,"tags":70,"publishedAt":74,"createdAt":74,"updatedAt":74,"filePath":75,"sourceUrl":76},"cron-1786956214008-en","I attacked my own npm package before launching it. It let the proposer approve their own writes","i-attacked-my-own-npm-package-before-launching-it-it-let-the-proposer-approve-their-own-writes-oi6y","Security","security","My library exists so a human approves an LLM's UPDATE before it runs. It never checked that the approver was somebody other than the proposer — and wrote \\\"approved\\\" into the audit trail anyway.","hyuga","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F65yv5n4qvrgn3t6ot4gy.png",[65,71,72,66,73],"opensource","ai","database","2026-08-17T08:43:34.007Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fsecurity\u002Fi-attacked-my-own-npm-package-before-launching-it-it-let-the-proposer-approve-their-own-writes-oi6y.md","https:\u002F\u002Fdev.to\u002Fhyuga611\u002Fi-attacked-my-own-npm-package-before-launching-it-it-let-the-proposer-approve-their-own-writes-4mki",{"id":78,"title":79,"slug":80,"lang":10,"category":81,"categorySlug":82,"summary":83,"excerpt":83,"author":84,"date":15,"readTime":38,"image":85,"tags":86,"publishedAt":90,"createdAt":90,"updatedAt":90,"filePath":91,"sourceUrl":92},"cron-1786956210950-en","Build an MCP Server in Go (Part 1): Designing a diagnostic-grade Kubernetes client","build-an-mcp-server-in-go-part-1-designing-a-diagnostic-grade-kubernetes-client-p1d4","Kubernetes","kubernetes","This post designs the Kubernetes client. The next post wraps it as an MCP server and wires it to an...","Fer Rios","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpw4b055hh8hxl5unrmvv.png",[81,82,87,88,89],"go","devops","mcp","2026-08-17T08:43:30.949Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fkubernetes\u002Fbuild-an-mcp-server-in-go-part-1-designing-a-diagnostic-grade-kubernetes-client-p1d4.md","https:\u002F\u002Fdev.to\u002Fferztyle\u002Fbuild-an-mcp-server-in-go-part-1-designing-a-diagnostic-grade-kubernetes-client-49a2",{"id":94,"title":95,"slug":96,"lang":10,"category":34,"categorySlug":35,"summary":97,"excerpt":97,"author":98,"date":15,"readTime":38,"image":99,"tags":100,"publishedAt":104,"createdAt":104,"updatedAt":104,"filePath":105,"sourceUrl":106},"cron-1786956117904-en","The Write Policy Is the Hard Part: Promotion Pipelines for Agent Memory","the-write-policy-is-the-hard-part-promotion-pipelines-for-agent-memory-4qv9","Storing agent memory is easy. Deciding what earns a permanent write, and keeping the write-path alive through RBAC and network policy, is the real work.","Guatu","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fguatulabs.dev%2Fog%2Fthe-write-policy-is-the-hard-part-promotion-pipelines-for-agent-memory.png",[34,42,101,102,103],"agentmemory","rbac","networkpolicies","2026-08-17T08:41:57.903Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fai-agents\u002Fthe-write-policy-is-the-hard-part-promotion-pipelines-for-agent-memory-4qv9.md","https:\u002F\u002Fdev.to\u002Ffuthgar\u002Fthe-write-policy-is-the-hard-part-promotion-pipelines-for-agent-memory-5mc",{"id":108,"title":109,"slug":110,"lang":10,"category":34,"categorySlug":35,"summary":111,"excerpt":111,"author":112,"date":15,"readTime":16,"image":113,"tags":114,"publishedAt":116,"createdAt":116,"updatedAt":116,"filePath":117,"sourceUrl":118},"cron-1786955347611","I Changed How I Think About AI Memory","i-changed-how-i-think-about-ai-memory-fnpm","I Changed How I Think About AI Memory   When I first built Lean AI Memory, I focused too...","Phúc Phùng","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0oqod5zshdan74573bau.png",[34,72,42,71,115],"git","2026-08-17T08:29:07.610Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fai-agents\u002Fi-changed-how-i-think-about-ai-memory-fnpm.md","https:\u002F\u002Fdev.to\u002Fphucphungbk\u002Fi-changed-how-i-think-about-ai-memory-4mkd",{"id":7,"title":8,"slug":9,"lang":10,"category":11,"categorySlug":12,"summary":13,"excerpt":13,"author":14,"date":15,"readTime":16,"image":17,"tags":120,"publishedAt":22,"createdAt":22,"updatedAt":22,"filePath":23,"sourceUrl":24},[11,19,20,21,12],{"id":122,"title":123,"slug":124,"lang":10,"category":65,"categorySlug":66,"summary":125,"excerpt":125,"author":126,"date":15,"readTime":16,"image":127,"tags":128,"publishedAt":132,"createdAt":132,"updatedAt":132,"filePath":133,"sourceUrl":134},"cron-1786955347034","The Tragedy of the Clean-Handed Auditor","the-tragedy-of-the-clean-handed-auditor-rgoz","\\\"I could save them if they'd only listen...\\\"  Hey, you. Yeah, you: the compliance or governance...","Ben Link","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5z426h3tt6e2b3sthd2f.png",[65,66,129,130,131],"compliance","developers","careerdevelopment","2026-08-17T08:29:07.034Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fsecurity\u002Fthe-tragedy-of-the-clean-handed-auditor-rgoz.md","https:\u002F\u002Fdev.to\u002Flinkbenjamin\u002Fthe-tragedy-of-the-clean-handed-auditor-1253",{"id":136,"title":137,"slug":138,"lang":10,"category":81,"categorySlug":82,"summary":139,"excerpt":139,"author":140,"date":15,"readTime":16,"image":141,"tags":142,"publishedAt":146,"createdAt":146,"updatedAt":146,"filePath":147,"sourceUrl":148},"cron-1786955346614","Building Sluice: QoS-Aware Capacity Governance for Self-Hosted LLM Inference","building-sluice-qos-aware-capacity-governance-for-self-hosted-llm-inference-flbu","📦 Project: https:\u002F\u002Fgithub.com\u002FVampiricCyborg\u002Fsluice           1. The Problem: When Capacity Becomes...","Madhav M S","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh3vuie9oakcn3bqzxtbh.png",[81,143,144,82,145],"distributedsystems","llm","systemdesign","2026-08-17T08:29:06.613Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fkubernetes\u002Fbuilding-sluice-qos-aware-capacity-governance-for-self-hosted-llm-inference-flbu.md","https:\u002F\u002Fdev.to\u002Fvampiriccyborg\u002Fbuilding-sluice-qos-aware-capacity-governance-for-self-hosted-llm-inference-13ja",{"id":150,"title":151,"slug":152,"lang":10,"category":34,"categorySlug":35,"summary":153,"excerpt":153,"author":154,"date":15,"readTime":16,"image":155,"tags":156,"publishedAt":160,"createdAt":160,"updatedAt":160,"filePath":161,"sourceUrl":162},"cron-1786954879160","Test What Your AI Agents Must Not Do","test-what-your-ai-agents-must-not-do-fj6y","A Guardrail Without A Negative Test Is Still An Assumption   Most AI agent governance starts...","Bobai Kato","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fres.cloudinary.com%2Fota-run%2Fimage%2Fupload%2Fq_auto%2Ftest-what-your-ai-agents-must-not-do.png",[34,42,157,158,159],"agentsafety","negativetesting","executiongovernance","2026-08-17T08:21:19.160Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fai-agents\u002Ftest-what-your-ai-agents-must-not-do-fj6y.md","https:\u002F\u002Fdev.to\u002Fotaready\u002Ftest-what-your-ai-agents-must-not-do-3e1a",{"id":164,"title":165,"slug":166,"lang":10,"category":11,"categorySlug":12,"summary":167,"excerpt":167,"author":168,"date":15,"readTime":16,"image":169,"tags":170,"publishedAt":172,"createdAt":172,"updatedAt":172,"filePath":173,"sourceUrl":174},"cron-1786954878754","Protecting Microservices: Implementing End-to-End Encryption Across REST APIs","protecting-microservices-implementing-end-to-end-encryption-across-rest-apis-gtfz","End-to-end encryption across REST APIs is the difference between a microservices architecture that...","Fu'ad Husnan","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fba3onadsxu08gb14brer.png",[11,56,12,57,171],"2026","2026-08-17T08:21:18.754Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fmicroservices\u002Fprotecting-microservices-implementing-end-to-end-encryption-across-rest-apis-gtfz.md","https:\u002F\u002Fdev.to\u002Ffuadhusnan_f44f3e13\u002Fprotecting-microservices-implementing-end-to-end-encryption-across-rest-apis-26hb",{"id":176,"title":177,"slug":178,"lang":10,"category":65,"categorySlug":66,"summary":179,"excerpt":179,"author":180,"date":15,"readTime":16,"image":181,"tags":182,"publishedAt":185,"createdAt":185,"updatedAt":185,"filePath":186,"sourceUrl":187},"cron-1786954878272","I Gave My Agent One Signed Permission It Couldn’t Mint Itself","i-gave-my-agent-one-signed-permission-it-couldnt-mint-itself-nm1o","Evidence status. The supervised operator run completed on 2026-08-09. An operator-signed job...","Self-Correcting Systems","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg1gjbzx4muvma5fznpjl.png",[65,183,88,66,184],"machinelearning","agents","2026-08-17T08:21:18.271Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fsecurity\u002Fi-gave-my-agent-one-signed-permission-it-couldnt-mint-itself-nm1o.md","https:\u002F\u002Fdev.to\u002Fkenielzep97\u002Fi-gave-my-agent-one-signed-permission-it-couldnt-mint-itself-2lpc",{"id":189,"title":190,"slug":191,"lang":10,"category":81,"categorySlug":82,"summary":192,"excerpt":192,"author":193,"date":15,"readTime":16,"image":194,"tags":195,"publishedAt":197,"createdAt":197,"updatedAt":197,"filePath":198,"sourceUrl":199},"cron-1786954877848","One GPU, four ways to share it: ten scenarios, and the headline finding I had to retract","one-gpu-four-ways-to-share-it-ten-scenarios-and-the-headline-finding-i-had-to-retract-3y1v","I measured every GPU sharing mode across ten scenarios, published a headline finding that duplicate models are nearly free on unified memory, then failed to replicate it and retracted it. Here is what the controlled replication showed and how the original measurement fooled me.","Christopher Maher","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fllmkube.com%2Fog-gpu-sharing-four-ways-devto.png",[81,82,196,72,88],"gpu","2026-08-17T08:21:17.847Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fkubernetes\u002Fone-gpu-four-ways-to-share-it-ten-scenarios-and-the-headline-finding-i-had-to-retract-3y1v.md","https:\u002F\u002Fdev.to\u002Fdefilan\u002Fone-gpu-four-ways-to-share-it-ten-scenarios-and-the-one-number-that-inverts-on-your-hardware-1bih",{"id":201,"title":202,"slug":203,"lang":10,"category":34,"categorySlug":35,"summary":204,"excerpt":204,"author":98,"date":205,"readTime":16,"image":206,"tags":207,"publishedAt":211,"createdAt":211,"updatedAt":211,"filePath":212,"sourceUrl":213},"cron-1786954563310","FastMCP Agent Mail: RBAC Tokens vs Anonymous Access, and the 403 Errors in Between","fastmcp-agent-mail-rbac-tokens-vs-anonymous-access-and-the-403-errors-in-between-ef0p","Why a FastMCP agent mail server that works anonymously in dev returns 403 behind TLS ingress, and how to wire bearer tokens without leaking them.","17\u002F8\u002F2026","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fguatulabs.dev%2Fog%2Ffastmcp-agent-mail-rbac-token-vs-anonymous-lessons-from-403-errors.png",[34,208,209,42,210],"fastmcp","mcpservers","authentication","2026-08-17T08:16:03.310Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fai-agents\u002Ffastmcp-agent-mail-rbac-tokens-vs-anonymous-access-and-the-403-errors-in-between-ef0p.md","https:\u002F\u002Fdev.to\u002Ffuthgar\u002Ffastmcp-agent-mail-rbac-tokens-vs-anonymous-access-and-the-403-errors-in-between-22pk",{"id":215,"title":216,"slug":217,"lang":10,"category":11,"categorySlug":12,"summary":218,"excerpt":218,"author":219,"date":205,"readTime":16,"image":220,"tags":221,"publishedAt":224,"createdAt":224,"updatedAt":224,"filePath":225,"sourceUrl":226},"cron-1786954562962","eBPF-Powered Request Tracing in Go Microservices Without Instrumentation Tax","ebpf-powered-request-tracing-in-go-microservices-without-instrumentation-tax-k53p","How eBPF uprobes and ring buffers replace manual trace propagation in Go services—mechanics, tradeoffs, and failure modes.","Neeraj Singhi","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fws515jitp8rvalxr8d63.png",[11,222,87,12,223],"architecture","performance","2026-08-17T08:16:02.962Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fmicroservices\u002Febpf-powered-request-tracing-in-go-microservices-without-instrumentation-tax-k53p.md","https:\u002F\u002Fdev.to\u002Fneeraj_singhi_golang\u002Febpf-powered-request-tracing-in-go-microservices-without-instrumentation-tax-34kf",{"id":228,"title":229,"slug":230,"lang":10,"category":65,"categorySlug":66,"summary":231,"excerpt":231,"author":232,"date":205,"readTime":16,"image":233,"tags":234,"publishedAt":238,"createdAt":238,"updatedAt":238,"filePath":239,"sourceUrl":240},"cron-1786954562825","How Dopamine Works: The Architecture of a Modern iOS Jailbreak","how-dopamine-works-the-architecture-of-a-modern-ios-jailbreak-woxq","Most developers will never jailbreak a phone. That is fine. This article is not a how-to, and there...","ArshTechPro","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0gnfjvl3fzvb1r1rpvci.png",[65,235,236,66,237],"ios","mobile","programming","2026-08-17T08:16:02.825Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fsecurity\u002Fhow-dopamine-works-the-architecture-of-a-modern-ios-jailbreak-woxq.md","https:\u002F\u002Fdev.to\u002Farshtechpro\u002Fhow-dopamine-works-the-architecture-of-a-modern-ios-jailbreak-2hj3",{"id":242,"title":243,"slug":244,"lang":10,"category":81,"categorySlug":82,"summary":245,"excerpt":245,"author":246,"date":205,"readTime":16,"image":247,"tags":248,"publishedAt":250,"createdAt":250,"updatedAt":250,"filePath":251,"sourceUrl":252},"cron-1786954562468","I got tired of SSHing into 10 VMs a day, so I built a live map of my whole infrastructure","i-got-tired-of-sshing-into-10-vms-a-day-so-i-built-a-live-map-of-my-whole-infrastructure-iqz9","Every day at work looked the same. Something breaks, or I need to push a new image, and I'm SSHing...","ByteStrix","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4xdxpc7fsu7nv8usri7a.png",[81,249,88,71,82],"productivity","2026-08-17T08:16:02.468Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fkubernetes\u002Fi-got-tired-of-sshing-into-10-vms-a-day-so-i-built-a-live-map-of-my-whole-infrastructure-iqz9.md","https:\u002F\u002Fdev.to\u002Fbytestrix\u002Fi-got-tired-of-sshing-into-10-vms-a-day-so-i-built-a-live-map-of-my-whole-infrastructure-2iil",{"id":254,"title":255,"slug":256,"lang":10,"category":34,"categorySlug":35,"summary":257,"excerpt":257,"author":258,"date":205,"readTime":16,"image":259,"tags":260,"publishedAt":264,"createdAt":264,"updatedAt":264,"filePath":265,"sourceUrl":266},"cron-1786954558132","The Coordinated Rename Is the Agent's Most Dangerous Refactor","the-coordinated-rename-is-the-agents-most-dangerous-refactor-iazu","Multi-agent rename tooling rewrites two hundred files in ten seconds because it noticed the drift. Half the time the drift was a load-bearing distinction the team encoded on purpose. Vocabulary curation is a real-time review surface now, and senior includes refusing changes that would be technically more consistent because the domain has two concepts the agent has no way to see.","Travis Frisinger","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fwww.tddbuddy.com%2Fimages%2Fcovers%2Fthe-coordinated-rename-is-the-dangerous-refactor.png",[34,261,42,262,263],"vocabulary","domainmodeling","codereview","2026-08-17T08:15:58.132Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fai-agents\u002Fthe-coordinated-rename-is-the-agents-most-dangerous-refactor-iazu.md","https:\u002F\u002Fdev.to\u002Ftmfrisinger\u002Fthe-coordinated-rename-is-the-agents-most-dangerous-refactor-6a",{"id":268,"title":269,"slug":270,"lang":10,"category":11,"categorySlug":12,"summary":271,"excerpt":271,"author":272,"date":205,"readTime":16,"image":273,"tags":274,"publishedAt":277,"createdAt":277,"updatedAt":277,"filePath":278,"sourceUrl":279},"cron-1786954557526","Microservices: Building Applications as Independent, Communicating Services","microservices-building-applications-as-independent-communicating-services-c45k","Microservices: Building Applications as Independent, Communicating Services   A practical,...","Rhuturaj Takle","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8puio1c7flrtyivr04hl.png",[11,12,275,237,276],"dotnet","learning","2026-08-17T08:15:57.526Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fmicroservices\u002Fmicroservices-building-applications-as-independent-communicating-services-c45k.md","https:\u002F\u002Fdev.to\u002Frhuturaj_takle\u002Fmicroservices-building-applications-as-independent-communicating-services-2eo8",{"id":281,"title":282,"slug":283,"lang":10,"category":65,"categorySlug":66,"summary":284,"excerpt":284,"author":285,"date":205,"readTime":16,"image":286,"tags":287,"publishedAt":291,"createdAt":291,"updatedAt":291,"filePath":292,"sourceUrl":293},"cron-1786954556056","From Arduino To Automotive: How I Escaped The IDE And Owned The Bus","from-arduino-to-automotive-how-i-escaped-the-ide-and-owned-the-bus-hj7g","Arduino taught me how to build. Bare metal taught me how the build actually works.  I have a lot of...","v. Splicer","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fabn3138rnp9vm0nyk54b.jpg",[65,288,289,290,66],"esp32","arduino","canbus","2026-08-17T08:15:56.056Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fsecurity\u002Ffrom-arduino-to-automotive-how-i-escaped-the-ide-and-owned-the-bus-hj7g.md","https:\u002F\u002Fdev.to\u002Fnumbpill3d\u002Ffrom-arduino-to-automotive-how-i-escaped-the-ide-and-owned-the-bus-f8f",{"id":295,"title":296,"slug":297,"lang":10,"category":81,"categorySlug":82,"summary":298,"excerpt":298,"author":299,"date":205,"readTime":16,"image":300,"tags":301,"publishedAt":304,"createdAt":304,"updatedAt":304,"filePath":305,"sourceUrl":306},"cron-1786954555663","The Backup Awakens: A Star Wars Story","the-backup-awakens-a-star-wars-story-jzpq","The Quest Begins (The \\\"Why\\\")   Honestly, I used to think backups were the boring chores you...","Timevolt","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ynsfxiz14nn4b9ylhn6.png",[81,88,302,82,303],"docker","cicd","2026-08-17T08:15:55.662Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fkubernetes\u002Fthe-backup-awakens-a-star-wars-story-jzpq.md","https:\u002F\u002Fdev.to\u002Ftimevolt\u002Fthe-backup-awakens-a-star-wars-story-1616",{"id":308,"title":309,"slug":310,"lang":10,"category":34,"categorySlug":35,"summary":311,"excerpt":311,"author":258,"date":205,"readTime":16,"image":312,"tags":313,"publishedAt":316,"createdAt":316,"updatedAt":316,"filePath":317,"sourceUrl":318},"cron-1786954321408","Test Deletion Is a Privileged Operation","test-deletion-is-a-privileged-operation-2pfz","The cheapest way for an agent to make a failing test pass is to delete it. That is logical for the agent and catastrophic for the codebase. Tests are append-only by default. Deletion needs a human author, a separate commit, and a separate review.","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fwww.tddbuddy.com%2Fimages%2Fcovers%2Ftest-deletion-is-a-privileged-operation.png",[34,314,42,315,263],"tdd","testdesign","2026-08-17T08:12:01.408Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fai-agents\u002Ftest-deletion-is-a-privileged-operation-2pfz.md","https:\u002F\u002Fdev.to\u002Ftmfrisinger\u002Ftest-deletion-is-a-privileged-operation-264a",{"id":320,"title":321,"slug":322,"lang":10,"category":11,"categorySlug":12,"summary":323,"excerpt":323,"author":324,"date":205,"readTime":16,"image":325,"tags":326,"publishedAt":329,"createdAt":329,"updatedAt":329,"filePath":330,"sourceUrl":331},"cron-1786954321239","You Don't Always Need a Workflow Engine to Roll Back a Failed Checkout","you-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf","Here's a sequence that shows up in almost every Laravel app that talks to the outside world:   Charge...","Sient","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu6g3j4z4af9tbuozbz2v.png",[11,327,328,222,12],"laravel","php","2026-08-17T08:12:01.239Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fmicroservices\u002Fyou-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf.md","https:\u002F\u002Fdev.to\u002Fsient\u002Fyou-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-5gop",{"id":333,"title":334,"slug":335,"lang":10,"category":65,"categorySlug":66,"summary":336,"excerpt":336,"author":337,"date":205,"readTime":16,"image":338,"tags":339,"publishedAt":341,"createdAt":341,"updatedAt":341,"filePath":342,"sourceUrl":343},"cron-1786954321092","I Stopped Trusting AI Agents With Tools. So I Built a Gatekeeper.","i-stopped-trusting-ai-agents-with-tools-so-i-built-a-gatekeeper-9i2m","Update 08\u002F15 0.2.0 Released   github.com\u002Fdeghosal-2026\u002Fagent-tooltrust · pip install agent-tooltrust...","Debashish Ghosal","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr97gsrqar0qk7ejjibih.png",[65,72,184,66,340],"gatekeeper","2026-08-17T08:12:01.092Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fsecurity\u002Fi-stopped-trusting-ai-agents-with-tools-so-i-built-a-gatekeeper-9i2m.md","https:\u002F\u002Fdev.to\u002Fdebashish_ghosal\u002Fi-stopped-trusting-ai-agents-with-tools-so-i-built-a-gatekeeper-26fb",{"id":345,"title":346,"slug":347,"lang":10,"category":81,"categorySlug":82,"summary":348,"excerpt":348,"author":349,"date":205,"readTime":16,"image":350,"tags":351,"publishedAt":353,"createdAt":353,"updatedAt":353,"filePath":354,"sourceUrl":355},"cron-1786954320913","I Automated My Entire GitOps Security Stack. The First Thing It Blocked Was My Own Salary.","i-automated-my-entire-gitops-security-stack-the-first-thing-it-blocked-was-my-own-salary-pko8","I Automated My Entire GitOps Security Stack. The First Thing It Blocked Was My Own...","Le Beltagy","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1000,height=420,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frvjfi7ee0tmi1xp1mem5.png",[81,82,66,352,88],"gitops","2026-08-17T08:12:00.911Z","\u002FUsers\u002Fnguyenanhtuan\u002FCode\u002FNuxtjs\u002Fnextpress\u002Fintlight\u002Fpublic\u002Fcontents\u002Fkubernetes\u002Fi-automated-my-entire-gitops-security-stack-the-first-thing-it-blocked-was-my-own-salary-pko8.md","https:\u002F\u002Fdev.to\u002Fle_beltagy\u002Fi-automated-my-entire-gitops-security-stack-the-first-thing-it-blocked-was-my-own-salary-227e",25,1,50,[360,363,367,369,370,371],{"name":361,"slug":362,"count":356},"All","all",{"name":364,"slug":365,"count":366},"Nuxt 4","nuxt-4",0,{"name":81,"slug":82,"count":368},6,{"name":65,"slug":66,"count":368},{"name":11,"slug":12,"count":368},{"name":34,"slug":35,"count":372},7,[374,375,376,377,378,379,380,381,382,383,385,387,389,390,392],{"name":34,"slug":35,"count":372},{"name":42,"slug":42,"count":372},{"name":66,"slug":66,"count":372},{"name":11,"slug":12,"count":368},{"name":12,"slug":12,"count":368},{"name":65,"slug":66,"count":368},{"name":81,"slug":82,"count":368},{"name":82,"slug":82,"count":368},{"name":88,"slug":88,"count":368},{"name":72,"slug":72,"count":384},4,{"name":71,"slug":71,"count":386},3,{"name":21,"slug":21,"count":388},2,{"name":56,"slug":56,"count":388},{"name":57,"slug":391,"count":388},"trending",{"name":87,"slug":87,"count":388},{"success":394,"slug":9,"lang":10,"items":395,"total":455,"page":357,"limit":456,"hasMore":394,"remaining":372},true,[396,407,416,435,445],{"author":397,"avatar":398,"role":399,"date":400,"createdAt":401,"content":402,"likes":403,"isLiked":404,"replies":405,"id":406},"Liam O'Connor","L","Frontend Performance Specialist","3 hours ago","2026-08-17T07:09:00.576Z","Nuxt 4 with selective hydration and zero-JS interactive islands delivers mind-blowing speed. Sub-100ms INP and 99+ Core Web Vitals out of the box.",21,false,[],"c-real-life-refactoring-example-3x-less-code-to-read-dccm-en-1",{"author":408,"avatar":398,"role":409,"date":410,"createdAt":411,"content":412,"likes":413,"isLiked":404,"replies":414,"id":415},"Lucas Moreau","Cloud Native Developer","12 hours ago","2026-08-16T22:09:00.577Z","Kafka event streaming with schema registry ensures backward compatibility even as payload models evolve across microservice boundaries.",18,[],"c-real-life-refactoring-example-3x-less-code-to-read-dccm-en-2",{"author":417,"avatar":418,"role":419,"date":420,"createdAt":421,"content":422,"likes":423,"isLiked":404,"replies":424,"id":434},"Alexander Wright","A","Principal Systems Architect @ Stripe","20 mins ago","2026-08-17T09:49:00.576Z","Superb architectural breakdown! The hybrid L1 in-memory + L2 distributed Redis cache pattern is crucial for mitigating high-concurrency thundering herd issues.",29,[425],{"author":426,"avatar":427,"role":428,"date":429,"createdAt":430,"content":431,"likes":432,"isLiked":404,"id":433},"David Chen","D","Staff Infrastructure Engineer","12 mins ago","2026-08-17T09:57:00.576Z","Totally agree, Alexander. Pairing that with singleflight request deduplication on the backend virtually eliminates DB spikes.",15,"r-real-life-refactoring-example-3x-less-code-to-read-dccm-en-3-1","c-real-life-refactoring-example-3x-less-code-to-read-dccm-en-3",{"author":436,"avatar":437,"role":438,"date":439,"createdAt":440,"content":441,"likes":442,"isLiked":404,"replies":443,"id":444},"Julian Sterling","J","Cybersecurity Director","2 hours ago","2026-08-17T08:09:00.576Z","Zero-Trust microsegmentation powered by eBPF and Cilium eliminates sidecar proxy overhead while delivering strict L7 network encryption. Excellent walkthrough!",27,[],"c-real-life-refactoring-example-3x-less-code-to-read-dccm-en-4",{"author":446,"avatar":447,"role":448,"date":449,"createdAt":450,"content":451,"likes":452,"isLiked":404,"replies":453,"id":454},"Oliver Bennett","O","VP of Engineering","8 hours ago","2026-08-17T02:09:00.577Z","Top-tier technical writing. Clear architecture diagrams, reproducible benchmarks, and actionable code snippets. Bookmarked for our engineering team.",45,[],"c-real-life-refactoring-example-3x-less-code-to-read-dccm-en-5",14,5,1786961340902]