[{"data":1,"prerenderedAt":457},["ShallowReactive",2],{"blog-post-detail-you-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf":3,"blogs-all-posts-detail-suggestions-en":28,"blog-comments-you-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf-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-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","en","Microservices","microservices","Here's a sequence that shows up in almost every Laravel app that talks to the outside world:   Charge...","Sient","17\u002F8\u002F2026","6 phút","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,19,20,21,12],"laravel","php","architecture","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","\nHere's a sequence that shows up in almost every Laravel app that talks to the outside world:\n \n1. Charge the customer's card.\n2. Create a policy (or order, or booking) with a partner API.\n3. Generate a PDF confirmation.\nStep 3 throws. Maybe the PDF library ran out of memory, maybe the storage disk is full. Whatever the reason, you're now sitting on a charged card and a partner-side record that your own database has no idea exist. `DB::transaction()` can't save you here — it only knows about your own database. The payment gateway and the partner API have already committed their side of the world, and nothing you do to your own tables will undo that.\n \nThis is the problem the **Saga pattern** solves: instead of one atomic transaction, you model the operation as a chain of steps, each with an `execute()` and a `compensate()`. If step N fails, you call `compensate()` on every step that already succeeded, in reverse order — refund the payment, cancel the partner policy — and end up back where you started, minus the failed step.\n \nConceptually simple. The interesting part is what it takes to actually implement `compensate()` correctly, and that's what the rest of this post is about.\n \n## What's already out there\n \nBefore writing anything, I looked at what exists for Laravel. There's real prior art here, and it's worth understanding before picking a tool:\n \n- **Durable Workflow** (formerly Laravel Workflow) and **Saga Lara Flow** are both built on the same underlying idea: a Temporal-style durable execution engine. Every step's state is persisted to your database, the workflow runs through your queue, and if a worker dies mid-execution the workflow resumes from where it left off — including mid-compensation. You get replay, long-running workflows that span days, signals for waiting on external events, and parallel branches.\n- There's also at least one package that tries to split the difference — in-memory execution by default with opt-in persistence, closer to what I ended up wanting, but with enough surface area (DAG execution, approval gates, webhook outboxes, dashboards) that it stops feeling lightweight in practice.\nAll of that durability is genuinely valuable — if your workflow can legitimately take hours, or has to survive a deploy mid-flight, you want exactly this. But it has a cost: a queue worker running somewhere, migrations for the workflow-state tables, and a chain of steps that no longer executes inline in the request that triggered it.\n \nMy payment → policy → PDF sequence doesn't need any of that. It runs entirely within one HTTP request, start to finish, in a few hundred milliseconds. Pulling in a queue-backed durable execution engine for that is like reaching for a distributed lock to protect a variable that never leaves one thread.\n \n## What I actually wanted\n \nA synchronous orchestrator: no queue, no database, no migrations. Steps run in the same request that triggered them, and if one fails, the completed ones get compensated before the request returns — the caller finds out immediately, in the same try\u002Fcatch they'd use for anything else.\n \n```php\nfinal class ChargePayment implements CompensatorStep\n{\n    public function execute(CompensatorContext $context): mixed\n    {\n        $payment = PaymentGateway::charge($context->get('amount'));\n        $context->set('payment_id', $payment->id);\n \n        return $payment;\n    }\n \n    public function compensate(CompensatorContext $context): void\n    {\n        PaymentGateway::refund($context->get('payment_id'));\n    }\n}\n \nfinal class CreatePartnerPolicy implements CompensatorStep\n{\n    public function execute(CompensatorContext $context): mixed\n    {\n        $policy = PartnerApi::createPolicy($context->all());\n        $context->set('policy_id', $policy->id);\n \n        return $policy;\n    }\n \n    public function compensate(CompensatorContext $context): void\n    {\n        PartnerApi::cancelPolicy($context->get('policy_id'));\n    }\n}\n \n$result = (new Compensator())\n    ->addStep(new ChargePayment())\n    ->addStep(new CreatePartnerPolicy())\n    ->step(execute: fn ($ctx) => Pdf::generate($ctx->get('policy_id')), name: 'generate_pdf')\n    ->run(new CompensatorContext(['amount' => 4999]));\n \nif ($result->needsManualCleanup()) {\n    \u002F\u002F chain failed AND rollback failed — something is genuinely stranded\n}\n```\n \nThat's the whole shape of it. `composer require`, no config file, no `vendor:publish`, nothing to migrate. I called the package **Compensator**, after the term for exactly this kind of undo step — \"compensating transaction.\"\n \nThe API surface being small was the easy part, though. Getting the failure semantics right — everything that happens *around* a `compensate()` call — turned out to be where most of the actual design work was.\n \n## The part that actually matters: what happens when the rollback itself fails\n \nThe naive version of this pattern assumes `compensate()` always succeeds. In practice, the same partner API that just accepted a policy creation can be the one that's flaky thirty seconds later when you try to cancel it. If you stop compensating the moment one rollback call throws, you leave everything *before* that step un-rolled-back too — which is usually worse than reporting one failure and continuing.\n \nSo the default behavior is to keep compensating the rest of the chain even after one `compensate()` throws, and report every failure on the result rather than swallowing it:\n \n```php\nif ($result->needsManualCleanup()) {\n    foreach ($result->compensationFailures as $failure) {\n        logger()->critical('stranded side effect', [\n            'step' => $failure->stepName,\n            'attempts' => $failure->attempts,\n            'error' => $failure->exception->getMessage(),\n        ]);\n    }\n}\n```\n \n`needsManualCleanup()` is deliberately the one flag worth alerting on: the chain failed *and* the rollback failed. That combination means a real side effect — a charge, a partner record — is sitting out there unresolved, and no amount of retrying inside the request is going to fix it. Someone needs to know.\n \nWhich raises the next question: since a compensation can fail transiently (the refund API blips for a second), should Compensator retry it? It can, opt-in:\n \n```php\n(new Compensator())\n    ->retryCompensation(times: 2, sleepMs: 200)\n```\n \nThis is where a subtlety I initially missed becomes unavoidable: if `compensate()` can run more than once — because of a retry, or because a later process resumes an interrupted rollback — it has to be idempotent. \"Refund this payment\" has to check whether the payment is still refundable before acting, not assume it's the first time anyone's called it:\n \n```php\npublic function compensate(CompensatorContext $context): void\n{\n    $payment = PaymentGateway::find($context->get('payment_id'));\n \n    if ($payment?->isRefundable()) {\n        $payment->refund();\n    }\n}\n```\n \nThat single requirement — idempotent by design, not by accident — is probably the most important sentence in the whole package's documentation, and it's the kind of thing that's easy to skip when you're sketching the happy path.\n \n## The honest limitation\n \nHere's the trade-off I don't want to bury: giving up the database means giving up durability. If PHP dies **between** steps — an out-of-memory fatal, a worker killed mid-deploy — nothing catches that, the rollback never runs, and you're left with a charged card and zero record of it anywhere. A queue-backed durable engine survives exactly this scenario; that's the whole point of persisting state.\n \nCompensator can soften this, not solve it — a shutdown handler that attempts the rollback even after a fatal error:\n \n```php\n(new Compensator())\n    ->protectAgainstFatals()\n```\n \nIt's best-effort. Nothing survives `SIGKILL` or the machine losing power. If a stranded side effect is genuinely unacceptable for what you're building — real money, anything legally binding — that's your signal to reach for a durable engine instead, not to lean harder on a shutdown handler. Pretending otherwise would just be shipping a worse version of the thing I was trying to avoid.\n \n## Where the line actually is\n \nAfter going through this, the decision isn't \"Compensator vs. the durable engines\" so much as a question about your workflow's shape:\n \n- **Runs inside one request, finishes in milliseconds-to-seconds, no need to survive a crash mid-flight** → a synchronous orchestrator is enough, and a queue is pure overhead.\n- **Can legitimately run for minutes, hours, or days; needs to survive worker restarts and deploys; needs to wait on external signals or human approval** → you want the durability a queue + persisted state actually buys you. Don't try to route around it with retries and shutdown handlers.\nI ended up publishing what I built as [`sients\u002Fcompensator`](https:\u002F\u002Fgithub.com\u002Fsients\u002Fcompensator) — MIT-licensed, on Packagist, PHP 8.2+ \u002F Laravel 12+. If you've hit the same shape of problem — a handful of external calls in one request that need a clean, ordered rollback — it might save you writing the same `array_reverse` loop I would have otherwise written by hand.\n\n---\n\n> 🔗 **Nguồn bài viết gốc**: [Sient](https:\u002F\u002Fdev.to\u002Fsient\u002Fyou-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-5gop)\n","You Don't Always Need a Workflow Engine to Roll Back a Failed Checkout - Intlight Insights","https:\u002F\u002Fintlighttech.com\u002Fblogs\u002Fyou-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf",{"items":29,"total":356,"page":357,"totalPages":357,"limit":358,"lang":10,"categories":359,"popularTags":373},[30,49,63,79,95,109,121,134,148,162,176,188,201,213,226,238,252,264,278,291,305,318,330,332,344],{"id":31,"title":32,"slug":33,"lang":10,"category":34,"categorySlug":35,"summary":36,"excerpt":36,"author":37,"date":38,"readTime":39,"image":40,"tags":41,"publishedAt":46,"createdAt":46,"updatedAt":46,"filePath":47,"sourceUrl":48},"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","8\u002F17\u002F2026","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,42,43,44,45],"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":50,"title":51,"slug":52,"lang":10,"category":11,"categorySlug":12,"summary":53,"excerpt":53,"author":54,"date":38,"readTime":39,"image":55,"tags":56,"publishedAt":60,"createdAt":60,"updatedAt":60,"filePath":61,"sourceUrl":62},"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,57,58,59],"backend","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":64,"title":65,"slug":66,"lang":10,"category":67,"categorySlug":68,"summary":69,"excerpt":69,"author":70,"date":38,"readTime":39,"image":71,"tags":72,"publishedAt":76,"createdAt":76,"updatedAt":76,"filePath":77,"sourceUrl":78},"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",[67,73,74,68,75],"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":80,"title":81,"slug":82,"lang":10,"category":83,"categorySlug":84,"summary":85,"excerpt":85,"author":86,"date":38,"readTime":39,"image":87,"tags":88,"publishedAt":92,"createdAt":92,"updatedAt":92,"filePath":93,"sourceUrl":94},"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",[83,84,89,90,91],"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":96,"title":97,"slug":98,"lang":10,"category":34,"categorySlug":35,"summary":99,"excerpt":99,"author":100,"date":38,"readTime":39,"image":101,"tags":102,"publishedAt":106,"createdAt":106,"updatedAt":106,"filePath":107,"sourceUrl":108},"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,43,103,104,105],"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":110,"title":111,"slug":112,"lang":10,"category":34,"categorySlug":35,"summary":113,"excerpt":113,"author":114,"date":38,"readTime":16,"image":115,"tags":116,"publishedAt":118,"createdAt":118,"updatedAt":118,"filePath":119,"sourceUrl":120},"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,74,43,73,117],"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":122,"title":123,"slug":124,"lang":10,"category":11,"categorySlug":12,"summary":125,"excerpt":125,"author":126,"date":38,"readTime":16,"image":127,"tags":128,"publishedAt":131,"createdAt":131,"updatedAt":131,"filePath":132,"sourceUrl":133},"cron-1786955347443","Real-Life Refactoring Example: ~3x Less Code to Read","real-life-refactoring-example-3x-less-code-to-read-dccm","There is a popular idea that refactoring is making code shorter. It is not entirely wrong....","Valentine Shi","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,129,130,57,12],"node","software","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",{"id":135,"title":136,"slug":137,"lang":10,"category":67,"categorySlug":68,"summary":138,"excerpt":138,"author":139,"date":38,"readTime":16,"image":140,"tags":141,"publishedAt":145,"createdAt":145,"updatedAt":145,"filePath":146,"sourceUrl":147},"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",[67,68,142,143,144],"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":149,"title":150,"slug":151,"lang":10,"category":83,"categorySlug":84,"summary":152,"excerpt":152,"author":153,"date":38,"readTime":16,"image":154,"tags":155,"publishedAt":159,"createdAt":159,"updatedAt":159,"filePath":160,"sourceUrl":161},"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",[83,156,157,84,158],"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":163,"title":164,"slug":165,"lang":10,"category":34,"categorySlug":35,"summary":166,"excerpt":166,"author":167,"date":38,"readTime":16,"image":168,"tags":169,"publishedAt":173,"createdAt":173,"updatedAt":173,"filePath":174,"sourceUrl":175},"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,43,170,171,172],"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":177,"title":178,"slug":179,"lang":10,"category":11,"categorySlug":12,"summary":180,"excerpt":180,"author":181,"date":38,"readTime":16,"image":182,"tags":183,"publishedAt":185,"createdAt":185,"updatedAt":185,"filePath":186,"sourceUrl":187},"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,58,12,59,184],"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":189,"title":190,"slug":191,"lang":10,"category":67,"categorySlug":68,"summary":192,"excerpt":192,"author":193,"date":38,"readTime":16,"image":194,"tags":195,"publishedAt":198,"createdAt":198,"updatedAt":198,"filePath":199,"sourceUrl":200},"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",[67,196,90,68,197],"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":202,"title":203,"slug":204,"lang":10,"category":83,"categorySlug":84,"summary":205,"excerpt":205,"author":206,"date":38,"readTime":16,"image":207,"tags":208,"publishedAt":210,"createdAt":210,"updatedAt":210,"filePath":211,"sourceUrl":212},"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",[83,84,209,74,90],"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":214,"title":215,"slug":216,"lang":10,"category":34,"categorySlug":35,"summary":217,"excerpt":217,"author":100,"date":15,"readTime":16,"image":218,"tags":219,"publishedAt":223,"createdAt":223,"updatedAt":223,"filePath":224,"sourceUrl":225},"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.","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,220,221,43,222],"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":227,"title":228,"slug":229,"lang":10,"category":11,"categorySlug":12,"summary":230,"excerpt":230,"author":231,"date":15,"readTime":16,"image":232,"tags":233,"publishedAt":235,"createdAt":235,"updatedAt":235,"filePath":236,"sourceUrl":237},"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,21,89,12,234],"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":239,"title":240,"slug":241,"lang":10,"category":67,"categorySlug":68,"summary":242,"excerpt":242,"author":243,"date":15,"readTime":16,"image":244,"tags":245,"publishedAt":249,"createdAt":249,"updatedAt":249,"filePath":250,"sourceUrl":251},"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",[67,246,247,68,248],"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":253,"title":254,"slug":255,"lang":10,"category":83,"categorySlug":84,"summary":256,"excerpt":256,"author":257,"date":15,"readTime":16,"image":258,"tags":259,"publishedAt":261,"createdAt":261,"updatedAt":261,"filePath":262,"sourceUrl":263},"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",[83,260,90,73,84],"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":265,"title":266,"slug":267,"lang":10,"category":34,"categorySlug":35,"summary":268,"excerpt":268,"author":269,"date":15,"readTime":16,"image":270,"tags":271,"publishedAt":275,"createdAt":275,"updatedAt":275,"filePath":276,"sourceUrl":277},"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,272,43,273,274],"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":279,"title":280,"slug":281,"lang":10,"category":11,"categorySlug":12,"summary":282,"excerpt":282,"author":283,"date":15,"readTime":16,"image":284,"tags":285,"publishedAt":288,"createdAt":288,"updatedAt":288,"filePath":289,"sourceUrl":290},"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,286,248,287],"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":292,"title":293,"slug":294,"lang":10,"category":67,"categorySlug":68,"summary":295,"excerpt":295,"author":296,"date":15,"readTime":16,"image":297,"tags":298,"publishedAt":302,"createdAt":302,"updatedAt":302,"filePath":303,"sourceUrl":304},"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",[67,299,300,301,68],"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":306,"title":307,"slug":308,"lang":10,"category":83,"categorySlug":84,"summary":309,"excerpt":309,"author":310,"date":15,"readTime":16,"image":311,"tags":312,"publishedAt":315,"createdAt":315,"updatedAt":315,"filePath":316,"sourceUrl":317},"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",[83,90,313,84,314],"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":319,"title":320,"slug":321,"lang":10,"category":34,"categorySlug":35,"summary":322,"excerpt":322,"author":269,"date":15,"readTime":16,"image":323,"tags":324,"publishedAt":327,"createdAt":327,"updatedAt":327,"filePath":328,"sourceUrl":329},"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,325,43,326,274],"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":7,"title":8,"slug":9,"lang":10,"category":11,"categorySlug":12,"summary":13,"excerpt":13,"author":14,"date":15,"readTime":16,"image":17,"tags":331,"publishedAt":22,"createdAt":22,"updatedAt":22,"filePath":23,"sourceUrl":24},[11,19,20,21,12],{"id":333,"title":334,"slug":335,"lang":10,"category":67,"categorySlug":68,"summary":336,"excerpt":336,"author":337,"date":15,"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",[67,74,197,68,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":83,"categorySlug":84,"summary":348,"excerpt":348,"author":349,"date":15,"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",[83,84,68,352,90],"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":83,"slug":84,"count":368},6,{"name":67,"slug":68,"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":43,"slug":43,"count":372},{"name":68,"slug":68,"count":372},{"name":11,"slug":12,"count":368},{"name":12,"slug":12,"count":368},{"name":67,"slug":68,"count":368},{"name":83,"slug":84,"count":368},{"name":84,"slug":84,"count":368},{"name":90,"slug":90,"count":368},{"name":74,"slug":74,"count":384},4,{"name":73,"slug":73,"count":386},3,{"name":57,"slug":57,"count":388},2,{"name":58,"slug":58,"count":388},{"name":59,"slug":391,"count":388},"trending",{"name":89,"slug":89,"count":388},{"success":394,"slug":9,"lang":10,"items":395,"total":455,"page":357,"limit":456,"hasMore":394,"remaining":368},true,[396,407,417,427,436],{"author":397,"avatar":398,"role":399,"date":400,"createdAt":401,"content":402,"likes":403,"isLiked":404,"replies":405,"id":406},"Hannah Schmidt","H","DevOps & CI\u002FCD Lead","1 day ago","2026-08-16T10:09:00.577Z","Can confirm: automated canary deployments with Argo Rollouts and Prometheus metrics analysis prevented several outages for our payment gateways.",31,false,[],"c-you-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf-en-1",{"author":408,"avatar":409,"role":410,"date":411,"createdAt":412,"content":413,"likes":414,"isLiked":404,"replies":415,"id":416},"Elena Rostova","E","Lead SRE & Platform Architect","45 mins ago","2026-08-17T09:24:00.576Z","The KEDA autoscaling setup with custom Prometheus metrics is production-grade. We observed a 60% compute cost reduction after switching to event-driven pod scaling.",34,[],"c-you-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf-en-2",{"author":418,"avatar":419,"role":420,"date":421,"createdAt":422,"content":423,"likes":424,"isLiked":404,"replies":425,"id":426},"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,[],"c-you-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf-en-3",{"author":428,"avatar":419,"role":429,"date":430,"createdAt":431,"content":432,"likes":433,"isLiked":404,"replies":434,"id":435},"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-you-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf-en-4",{"author":437,"avatar":438,"role":439,"date":440,"createdAt":441,"content":442,"likes":443,"isLiked":404,"replies":444,"id":454},"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,[445],{"author":446,"avatar":447,"role":448,"date":449,"createdAt":450,"content":451,"likes":452,"isLiked":404,"id":453},"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-you-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf-en-5-1","c-you-dont-always-need-a-workflow-engine-to-roll-back-a-failed-checkout-1iwf-en-5",13,5,1786961341998]