<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Paulo Victor Leite Lima Gomes</title>
    <description>The latest articles on DEV Community by Paulo Victor Leite Lima Gomes (@pvgomes).</description>
    <link>https://dev.to/pvgomes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F109646%2F27accb17-594d-4776-b421-db7cca109bfe.jpg</url>
      <title>DEV Community: Paulo Victor Leite Lima Gomes</title>
      <link>https://dev.to/pvgomes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pvgomes"/>
    <language>en</language>
    <item>
      <title>shadow ai is now part of the ci/cd threat model</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Sun, 09 Aug 2026 00:03:17 +0000</pubDate>
      <link>https://dev.to/pvgomes/shadow-ai-is-now-part-of-the-cicd-threat-model-1ok6</link>
      <guid>https://dev.to/pvgomes/shadow-ai-is-now-part-of-the-cicd-threat-model-1ok6</guid>
      <description>&lt;p&gt;For a while, shadow AI sounded like the new version of shadow IT.&lt;/p&gt;

&lt;p&gt;Someone used a browser tool without approval. Someone installed an IDE extension. Someone pasted a stack trace into a chatbot and promised, with the confidence of a person who has not read the data policy, that there was "nothing sensitive in there."&lt;/p&gt;

&lt;p&gt;Annoying? Yes.&lt;/p&gt;

&lt;p&gt;New? Not really.&lt;/p&gt;

&lt;p&gt;Then the same behavior walks into CI/CD, and the joke changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhzgu3hiae5nlit5zn7l.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhzgu3hiae5nlit5zn7l.gif" alt="the harmless little helper entering the deploy pipeline" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CNCF published a fresh piece on shadow AI in CI/CD, framing the problem as a path from developer laptop to Kubernetes. That is the right framing. The issue is not that developers are using AI. They are. The issue is that AI tools, model calls, extensions, MCP servers, and agents can quietly become part of the delivery path without being named as infrastructure.&lt;/p&gt;

&lt;p&gt;And unnamed infrastructure is my least favorite kind. It always waits until a Friday to introduce itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  ci/cd is not a vibes zone
&lt;/h2&gt;

&lt;p&gt;CI/CD is where code becomes production. That sounds obvious, but people forget it when the tool looks like a helpful assistant instead of a deployment component.&lt;/p&gt;

&lt;p&gt;An AI extension that suggests code is one thing. An agent that opens pull requests, edits workflows, calls internal tools, reads secrets, writes artifacts, comments on review findings, generates Dockerfiles, updates Kubernetes manifests, or triggers release jobs is very much another thing.&lt;/p&gt;

&lt;p&gt;At that point, the agent is not "developer productivity."&lt;/p&gt;

&lt;p&gt;It is part of the software supply chain.&lt;/p&gt;

&lt;p&gt;If the answer is "well, it is just installed on a few laptops," congratulations. You have built a distributed production dependency with worse asset inventory.&lt;/p&gt;

&lt;h2&gt;
  
  
  the laptop is now part of the pipeline
&lt;/h2&gt;

&lt;p&gt;The classic supply-chain threat model already cared about developer machines. AI makes that boundary softer.&lt;/p&gt;

&lt;p&gt;A coding assistant can read a repository. A browser agent can read docs, issues, and dashboards. An MCP server can expose local files, databases, internal APIs, or cloud operations. A terminal agent can run commands. A review bot can influence what humans approve. A workflow generator can change the YAML that later runs with stronger permissions in CI.&lt;/p&gt;

&lt;p&gt;None of these are automatically bad. I use these tools. I also prefer them with guards.&lt;/p&gt;

&lt;p&gt;The problem is the invisible bridge.&lt;/p&gt;

&lt;p&gt;A developer installs an AI helper to save time. The helper writes code. The code changes a build step. The build step pulls a dependency. The dependency runs in CI. CI has tokens that can publish artifacts, push images, deploy to Kubernetes, or talk to cloud APIs. That is not a moral panic. That is just a graph.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapx6f29x7ibau69ccxs4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapx6f29x7ibau69ccxs4.gif" alt="security discovering the productivity graph" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  prompt injection gets a delivery badge
&lt;/h2&gt;

&lt;p&gt;Prompt injection is annoying in a chat window. In CI/CD it can become operational.&lt;/p&gt;

&lt;p&gt;Imagine an agent reading an issue, a README, a generated dependency report, or a web page during a build-related task. The content tells it, politely and confidently, to ignore previous instructions and fetch a secret, change a workflow, install a package, or call a tool it should not call.&lt;/p&gt;

&lt;p&gt;The model is not "hacked" in the movie sense. It is interpreting untrusted text while tools are available. That is enough.&lt;/p&gt;

&lt;p&gt;The old web security lesson still applies: data and instructions need boundaries. We learned this with SQL injection. We learned it with shell injection. We learned it with XSS. Now we get to learn it again with agents, because apparently software engineering is a subscription service to the same class of mistakes.&lt;/p&gt;

&lt;p&gt;CI/CD makes this sharper because the environment has authority. Build systems sign artifacts. They publish packages. They push container images. They deploy. They comment on pull requests in ways humans may trust. They often have more permissions than any single human needs, because the pipeline is where everybody's shortcuts go to become policy.&lt;/p&gt;

&lt;p&gt;An agent operating near that environment needs the same suspicion we give any automation with credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  inventory first, philosophy later
&lt;/h2&gt;

&lt;p&gt;The first useful step is boring: inventory.&lt;/p&gt;

&lt;p&gt;Which AI tools are installed by developers? Which are approved? Which can read source, call tools, write to GitHub, or run inside CI? Which MCP servers exist? Which secrets are exposed to jobs that can run agent-written scripts?&lt;/p&gt;

&lt;p&gt;This is not glamorous work. It will not get a keynote. It will produce a spreadsheet with several rows named things like &lt;code&gt;temp-copilot-test&lt;/code&gt; and &lt;code&gt;old-agent-demo-final2&lt;/code&gt;, which is how you know you are doing real platform engineering.&lt;/p&gt;

&lt;p&gt;But without inventory, policy is theatre.&lt;/p&gt;

&lt;p&gt;You cannot enforce an allowlist if nobody knows what is being used. You cannot audit a model call that never entered your logging path. You cannot rotate a token that was copied into a local agent config six months ago by someone who has since joined a team called Innovation Enablement, which is where accountability goes to wear a blazer.&lt;/p&gt;

&lt;h2&gt;
  
  
  policy belongs in the control plane
&lt;/h2&gt;

&lt;p&gt;The second step is moving from advice to controls.&lt;/p&gt;

&lt;p&gt;"Please do not paste secrets into random tools" is a good sentence. It is not a security architecture.&lt;/p&gt;

&lt;p&gt;This is why the enterprise features around AI tools matter even when they sound dull. MCP allowlists, org-level defaults, session limits, review labels, audit trails, and policy-managed tool access are not corporate checkbox dust. They are the beginning of treating agents like production actors.&lt;/p&gt;

&lt;p&gt;The policy should not say "no AI." That battle is mostly over, and banning useful tools usually creates a worse shadow version.&lt;/p&gt;

&lt;p&gt;The policy should say: these agents can run here, with these tools, under these identities, with these logs, with these spending limits, against these repositories, and with these review requirements.&lt;/p&gt;

&lt;p&gt;That is a sentence platform teams can implement.&lt;/p&gt;

&lt;h2&gt;
  
  
  ci permissions should be smaller than your ambition
&lt;/h2&gt;

&lt;p&gt;Most CI systems are too trusting by default because they grew up around scripts written by people inside the company. That was already optimistic. Agent-generated changes make it funnier.&lt;/p&gt;

&lt;p&gt;If an agent can modify a workflow file, and that workflow later runs with broad tokens, you have a privilege-escalation shape. If pull request builds can access secrets too early, you have a data-exfiltration shape. If a generated script can download and execute arbitrary dependencies, you have a supply-chain shape. If a bot can approve its own changes through a friendly review loop, you have invented management consulting for malware.&lt;/p&gt;

&lt;p&gt;The answer is not exotic.&lt;/p&gt;

&lt;p&gt;Use least privilege. Separate read and write tokens. Treat workflow changes as sensitive. Require human review for delivery definitions. Limit egress from build jobs. Pin actions where it matters. Keep production deploy credentials away from anything that runs untrusted code.&lt;/p&gt;

&lt;p&gt;The agent angle does not replace normal CI/CD hardening.&lt;/p&gt;

&lt;p&gt;It removes excuses for postponing it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxuvg2xf9pcylz0tcxnu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxuvg2xf9pcylz0tcxnu.gif" alt="the pipeline asking for a smaller token" width="400" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  review the output, but also review the path
&lt;/h2&gt;

&lt;p&gt;Humans are still in the loop, but the loop needs to include more than the final diff.&lt;/p&gt;

&lt;p&gt;If an agent opened a pull request, I want to know what it touched, what commands it ran, which tools it called, which external context it used, and whether it changed the delivery path. A clean-looking diff can still have a dirty path behind it.&lt;/p&gt;

&lt;p&gt;This does not mean every agent run needs a courtroom transcript. It means risky actions need traceability. For CI workflows, infrastructure-as-code, Kubernetes manifests, secrets plumbing, package publishing, auth code, and payment paths, the bar should be higher.&lt;/p&gt;

&lt;h2&gt;
  
  
  shadow ai is a naming failure
&lt;/h2&gt;

&lt;p&gt;I do not think shadow AI in CI/CD is mainly a developer behavior problem. Developers use tools that help them ship. This is not surprising. Water is wet. YAML is still a crime scene.&lt;/p&gt;

&lt;p&gt;The real problem is letting useful tools enter the delivery path without turning them into named, governed infrastructure.&lt;/p&gt;

&lt;p&gt;Once an AI system can influence code, builds, artifacts, credentials, deployments, or Kubernetes state, it needs an owner. It needs inventory. It needs logs. It needs permissions. It needs limits. It needs a way to be disabled without asking six teams who installed what.&lt;/p&gt;

&lt;p&gt;This is boring platform work.&lt;/p&gt;

&lt;p&gt;Good.&lt;/p&gt;

&lt;p&gt;Boring platform work is how we survive exciting tooling.&lt;/p&gt;

&lt;p&gt;Shadow AI stops being a cultural debate the moment it touches CI/CD. From there, it is supply-chain infrastructure without a nameplate.&lt;/p&gt;

&lt;p&gt;Put the nameplate on it.&lt;/p&gt;

&lt;p&gt;Then give it the smallest key that lets it do the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cncf.io/blog/2026/08/07/shadow-ai-in-ci-cd-threat-modeling-the-path-from-developer-laptop-to-kubernetes/" rel="noopener noreferrer"&gt;CNCF: Shadow AI in CI/CD, threat-modeling the path from developer laptop to Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2026-08-06-mcp-allowlists-in-enterprise-managed-settings/" rel="noopener noreferrer"&gt;GitHub Changelog: MCP allowlists in enterprise managed settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2026-07-01-set-ai-credit-session-limits-in-copilot-cli-and-sdk/" rel="noopener noreferrer"&gt;GitHub Changelog: Set AI credit session limits in Copilot CLI and SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cicd</category>
      <category>security</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>prometheus collectors are cloud control plane now</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Sat, 08 Aug 2026 00:08:29 +0000</pubDate>
      <link>https://dev.to/pvgomes/prometheus-collectors-are-cloud-control-plane-now-4hhe</link>
      <guid>https://dev.to/pvgomes/prometheus-collectors-are-cloud-control-plane-now-4hhe</guid>
      <description>&lt;p&gt;Prometheus used to have a nice emotional contract: you ran the thing, scraped the thing, and cursed at the thing when a target disappeared because somebody changed a label during a deployment and now the dashboard looks like a crime scene.&lt;/p&gt;

&lt;p&gt;It was not pleasant, but at least ownership was obvious.&lt;/p&gt;

&lt;p&gt;Then AWS announced CloudWatch managed Prometheus collectors, and the shape changed. CloudWatch can now run fully managed collectors that discover Prometheus-compatible targets in AWS infrastructure, scrape them through VPC connectivity, and deliver the metrics into CloudWatch. EKS, EC2, ECS, MSK, OpenSearch. The usual suspects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxuvg2xf9pcylz0tcxnu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxuvg2xf9pcylz0tcxnu.gif" alt="the metrics pipeline becoming someone else's service" width="400" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is genuinely useful.&lt;/p&gt;

&lt;p&gt;It also means the scrape layer is not just a daemonset, sidecar, or collector you forgot to upgrade. It is becoming another cloud control plane.&lt;/p&gt;

&lt;p&gt;That is worth paying attention to.&lt;/p&gt;

&lt;h2&gt;
  
  
  nobody enjoys operating scrapers
&lt;/h2&gt;

&lt;p&gt;Let us be honest. Maintaining metrics collection infrastructure is not the part of observability that makes people feel alive. Somebody has to run collectors, patch them, scale them, give them network access, keep configs synced, notice when service discovery breaks, and stop the high-cardinality endpoint from eating the month.&lt;/p&gt;

&lt;p&gt;Prometheus is excellent. Prometheus also makes you own the scraping path.&lt;/p&gt;

&lt;p&gt;AWS taking more of that burden makes sense. The new collectors are agentless from the customer's point of view. You provide scrape configuration and a connection to the resources. CloudWatch provisions and scales the machinery. The docs say the collector creates ENIs in selected subnets, scrapes through them using OTLP, and delivers metrics to a CloudWatch dataset through a VPC endpoint.&lt;/p&gt;

&lt;p&gt;That removes operational work and moves it into the platform contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  the scrape config is production code
&lt;/h2&gt;

&lt;p&gt;Every observability system eventually teaches the same annoying lesson:&lt;/p&gt;

&lt;p&gt;The dashboard is not the product.&lt;/p&gt;

&lt;p&gt;The pipeline is.&lt;/p&gt;

&lt;p&gt;If the scraper misses a target, the dashboard lies politely. If relabeling is wrong, the alert routes to the wrong team. If a metric selector is too wide, the bill grows. If it is too narrow, the incident starts with everyone saying "that is weird, the graph is flat."&lt;/p&gt;

&lt;p&gt;With managed collectors, scrape configuration is production code. It decides what gets seen, how it is named, where it lands, and how much it costs. That means it needs the same discipline as other production configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code review&lt;/li&gt;
&lt;li&gt;owners&lt;/li&gt;
&lt;li&gt;environment separation&lt;/li&gt;
&lt;li&gt;rollback&lt;/li&gt;
&lt;li&gt;change history&lt;/li&gt;
&lt;li&gt;label conventions&lt;/li&gt;
&lt;li&gt;cost expectations&lt;/li&gt;
&lt;li&gt;tests or at least validation queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, tests for observability config sound boring. So does checking a parachute.&lt;/p&gt;

&lt;h2&gt;
  
  
  managed does not mean ownerless
&lt;/h2&gt;

&lt;p&gt;The trap with managed services is the little mental shortcut where "AWS runs it" becomes "we do not have to think about it." That shortcut is expensive.&lt;/p&gt;

&lt;p&gt;Managed collectors can remove the need to operate collector hosts, in-cluster scrapers, or a pile of OpenTelemetry collector deployments. Great. Please remove toil. Tired humans deserve mercy.&lt;/p&gt;

&lt;p&gt;But the collector still needs network permissions. It still needs scrape targets. It still needs security groups. It still needs subnets. It still needs metric selection. It still emits billable data. It still becomes part of the answer when the incident commander asks, "can we trust this graph?"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapx6f29x7ibau69ccxs4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapx6f29x7ibau69ccxs4.gif" alt="trusting the graph during an incident" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Observability is not decoration. Autoscalers, rollback decisions, SLOs, anomaly detection, agent workflows, and very tired humans at 03:17 all depend on it. Once the metrics pipeline becomes managed infrastructure, platform teams need to treat it as a shared dependency.&lt;/p&gt;

&lt;h2&gt;
  
  
  labels are where good intentions go to get weird
&lt;/h2&gt;

&lt;p&gt;The hard part of metrics collection is rarely "can I scrape &lt;code&gt;/metrics&lt;/code&gt;?"&lt;/p&gt;

&lt;p&gt;It is usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what is this service called?&lt;/li&gt;
&lt;li&gt;which team owns it?&lt;/li&gt;
&lt;li&gt;is this production?&lt;/li&gt;
&lt;li&gt;which customer, region, tenant, cluster, namespace, queue, model, or job does this represent?&lt;/li&gt;
&lt;li&gt;is this cardinality useful or did we just create a tiny money printer pointed at ourselves?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Labels are the observability version of naming things and blaming DNS. They look simple until your query returns twelve answers and none of them are the one you need.&lt;/p&gt;

&lt;p&gt;Managed collectors do not remove that problem. They make the boundary cleaner.&lt;/p&gt;

&lt;p&gt;For ECS, AWS describes DNS-based discovery through Cloud Map so the collector follows changing task IPs. For EKS, discovery can follow Kubernetes targets. For EC2, direct instance scraping still needs ports and sane target definitions.&lt;/p&gt;

&lt;p&gt;But if every team brings its own labels, the centralized collector becomes a centralized junk drawer.&lt;/p&gt;

&lt;p&gt;The right platform move is to publish a small label contract and enforce it where possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;team&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;environment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;region&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workload_type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;slo_name&lt;/code&gt; when it exists&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then be suspicious of labels with unbounded values. User IDs, request IDs, raw URLs, pod hashes, prompt IDs, session IDs, and "temporary" fields are how observability turns into a billing incident wearing a Grafana badge.&lt;/p&gt;

&lt;h2&gt;
  
  
  cost is part of the signal now
&lt;/h2&gt;

&lt;p&gt;The CloudWatch docs are clear that managed collectors are charged by the hour and CloudWatch OpenTelemetry metric ingestion pricing applies. They also mention VPC data transfer can show up when scrapers pull metrics from targets, and suggest compressing &lt;code&gt;/metrics&lt;/code&gt; responses to reduce transfer volume.&lt;/p&gt;

&lt;p&gt;That is architecture.&lt;/p&gt;

&lt;p&gt;When metrics were collected by something your team operated, the cost was often hidden inside nodes, daemonsets, storage, and people pretending a giant Prometheus was "fine for now." With managed collectors, the bill can become more explicit. This is good if you measure it. It is surprising if you do not.&lt;/p&gt;

&lt;p&gt;Metric volume needs a budget. Scrape interval needs a budget. Cardinality needs a budget. Retention and query patterns need a budget. Before anyone says "but it is just metrics", remember that "just logs" already bought many companies a very educational invoice.&lt;/p&gt;

&lt;p&gt;The useful question is not "is managed collection cheaper?"&lt;/p&gt;

&lt;p&gt;What is the cost per service of the metrics we actually use to operate the system?&lt;/p&gt;

&lt;h2&gt;
  
  
  observability has a supply chain too
&lt;/h2&gt;

&lt;p&gt;We talk a lot about software supply chains now. Images, dependencies, SBOMs, signatures, provenance, all that healthy paranoia.&lt;/p&gt;

&lt;p&gt;Metrics have a supply chain too.&lt;/p&gt;

&lt;p&gt;Exporter. Endpoint. Network path. Scraper. Relabeling. Transport. Storage. Query. Alert. Dashboard. Human decision. If one link is wrong, the final graph may still look professional.&lt;/p&gt;

&lt;p&gt;Managed collectors make some links stronger. Less self-managed collector drift. Better scaling. Fewer forgotten agents. More unified querying with CloudWatch and PromQL. That is valuable.&lt;/p&gt;

&lt;p&gt;They also concentrate trust. If CloudWatch becomes the place where more Prometheus data lands, collector configuration becomes a first-class platform artifact. It should live near the IaC, have owners, and have a rollback path that does not involve three people clicking in a console while the incident channel develops a personality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhzgu3hiae5nlit5zn7l.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhzgu3hiae5nlit5zn7l.gif" alt="when the incident asks who owns the dashboard" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  what i would do first
&lt;/h2&gt;

&lt;p&gt;If I were rolling this out, I would avoid the grand observability transformation slide deck and start smaller.&lt;/p&gt;

&lt;p&gt;First, pick one environment and one workload type. ECS services through Cloud Map, for example. Prove that discovery, security groups, scrape intervals, labels, dashboards, and alarms make sense.&lt;/p&gt;

&lt;p&gt;Second, put the collector config in version control. No mystery config. No "we changed it in the console because the graph looked lonely."&lt;/p&gt;

&lt;p&gt;Third, define a label contract before onboarding the second team. That is where standards become folklore if nobody writes them down.&lt;/p&gt;

&lt;p&gt;Fourth, set cost alarms early. Not after the first strange invoice. Early. Scrape volume is part of the rollout.&lt;/p&gt;

&lt;p&gt;Fifth, document the trust path for incident responders. If an alert fires from a managed collector, people should know where the target is, which config scraped it, and who owns the metric.&lt;/p&gt;

&lt;p&gt;That is not bureaucracy.&lt;/p&gt;

&lt;p&gt;That is how you make "managed" mean less work instead of less visibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  the punchline
&lt;/h2&gt;

&lt;p&gt;CloudWatch managed Prometheus collectors are a good feature because they remove a chunk of observability plumbing nobody wants to babysit.&lt;/p&gt;

&lt;p&gt;But plumbing is not meaningless just because a cloud provider operates part of it.&lt;/p&gt;

&lt;p&gt;The scrape layer decides what your company can see. It shapes alerts, dashboards, SLOs, autoscaling, rollback confidence, and sometimes the emotional weather of an incident call.&lt;/p&gt;

&lt;p&gt;So yes, let AWS run the collectors if that reduces toil. Let CloudWatch pull Prometheus-compatible metrics from EKS, ECS, EC2, MSK, and OpenSearch. Use PromQL where it helps. Delete some self-managed collector snowflakes.&lt;/p&gt;

&lt;p&gt;Just do not confuse managed infrastructure with absent ownership.&lt;/p&gt;

&lt;p&gt;The metrics pipeline is becoming a cloud control plane.&lt;/p&gt;

&lt;p&gt;Treat the scrape config like production code, the labels like an API, and the bill like an alert signal.&lt;/p&gt;

&lt;p&gt;Otherwise the graph will look calm right up until reality files a ticket.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/aws/aws-weekly-roundup-price-reduction-of-gpt-models-in-bedrock-cloudwatch-managed-collectors-for-prometheus-metrics-and-more-august-3-2026/" rel="noopener noreferrer"&gt;AWS News Blog: AWS Weekly Roundup, August 3, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/07/cloudwatch-managed-collectors/" rel="noopener noreferrer"&gt;AWS: Amazon CloudWatch announces managed Prometheus collectors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/managed-prometheus-collectors.html" rel="noopener noreferrer"&gt;Amazon CloudWatch documentation: managed Prometheus collectors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Solution-Prometheus-On-ECS.html" rel="noopener noreferrer"&gt;Amazon CloudWatch documentation: Prometheus metric collection on Amazon ECS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudwatch</category>
      <category>prometheus</category>
      <category>observability</category>
    </item>
    <item>
      <title>docker content trust retiring is the migration teams forgot</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Fri, 07 Aug 2026 00:03:48 +0000</pubDate>
      <link>https://dev.to/pvgomes/docker-content-trust-retiring-is-the-migration-teams-forgot-1njc</link>
      <guid>https://dev.to/pvgomes/docker-content-trust-retiring-is-the-migration-teams-forgot-1njc</guid>
      <description>&lt;p&gt;Docker Content Trust is not disappearing in a dramatic way.&lt;/p&gt;

&lt;p&gt;There is no breach headline. No emergency patch window. No breathless thread explaining why every container is suddenly unsafe.&lt;/p&gt;

&lt;p&gt;Instead, Docker is doing something much more useful and much easier to ignore: it is retiring an old trust mechanism on a schedule.&lt;/p&gt;

&lt;p&gt;Docker announced that Docker Content Trust and the Notary v1 service at &lt;code&gt;notary.docker.io&lt;/code&gt; are being fully retired. Write brownouts already happened in July. Read brownouts are scheduled for August 10 and August 12, 2026. Full shutdown is scheduled for December 8, 2026.&lt;/p&gt;

&lt;p&gt;Most teams will not notice, because ordinary &lt;code&gt;docker pull&lt;/code&gt; and &lt;code&gt;docker push&lt;/code&gt; do not use DCT unless it was explicitly enabled.&lt;/p&gt;

&lt;p&gt;That is exactly why this is an interesting migration.&lt;/p&gt;

&lt;p&gt;The danger is not that every container workflow breaks. The danger is that a few important workflows break because nobody remembers they were relying on a trust feature from a different era of the container ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapx6f29x7ibau69ccxs4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapx6f29x7ibau69ccxs4.gif" alt="a build pipeline discovering old trust assumptions" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  the old checkbox was doing real work
&lt;/h2&gt;

&lt;p&gt;Docker Content Trust came from a useful idea: make image trust feel close to the Docker workflow.&lt;/p&gt;

&lt;p&gt;Set &lt;code&gt;DOCKER_CONTENT_TRUST=1&lt;/code&gt;. Use &lt;code&gt;docker trust&lt;/code&gt; commands. Let the client verify signed metadata before accepting an image tag. For many teams, that was the first practical taste of container image signing.&lt;/p&gt;

&lt;p&gt;It was not perfect, but it was a real control.&lt;/p&gt;

&lt;p&gt;The uncomfortable part is what happens when an early control becomes organizational memory. A security exception gets written around it. A CI pipeline inherits an environment variable. A Kubernetes admission policy checks for it. A base-image publishing process signs with it because that was the approved pattern three platform teams ago.&lt;/p&gt;

&lt;p&gt;Then years pass.&lt;/p&gt;

&lt;p&gt;The people who installed the mechanism move on. The repo keeps building. The cluster keeps deploying. The control still exists, but nobody can clearly say whether it is essential, obsolete, redundant, or accidentally load-bearing.&lt;/p&gt;

&lt;p&gt;That is the migration most teams forgot.&lt;/p&gt;

&lt;p&gt;Not the command migration.&lt;/p&gt;

&lt;p&gt;The ownership migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  trust moved from docker-native to supply-chain architecture
&lt;/h2&gt;

&lt;p&gt;Docker's guidance is blunt in the best way: Notary v1 is no longer maintained, and the ecosystem has moved toward OCI-native signing tools such as Sigstore Cosign and Notation.&lt;/p&gt;

&lt;p&gt;That is the right direction.&lt;/p&gt;

&lt;p&gt;It is also a change in responsibility.&lt;/p&gt;

&lt;p&gt;DCT made trust feel like a Docker client feature. Modern image trust is more distributed. Signatures live as OCI artifacts. Identity may come from OIDC. Verification may happen in CI, in a registry policy, in an admission controller, or in a deployment platform. Provenance and SBOMs may become part of the same release evidence.&lt;/p&gt;

&lt;p&gt;That is more powerful.&lt;/p&gt;

&lt;p&gt;It is also less magical.&lt;/p&gt;

&lt;p&gt;You do not migrate by replacing one command with another command and calling the work done. You migrate by deciding what must be true before an image can move from source code to production.&lt;/p&gt;

&lt;p&gt;Who is allowed to sign?&lt;/p&gt;

&lt;p&gt;Which identity signs release images?&lt;/p&gt;

&lt;p&gt;Where are signatures stored?&lt;/p&gt;

&lt;p&gt;Which registries are trusted?&lt;/p&gt;

&lt;p&gt;What happens when verification fails?&lt;/p&gt;

&lt;p&gt;Can a developer bypass the policy for an incident?&lt;/p&gt;

&lt;p&gt;Does the cluster enforce the same thing CI claims to enforce?&lt;/p&gt;

&lt;p&gt;Those questions are not Docker trivia. They are release architecture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxuvg2xf9pcylz0tcxnu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxuvg2xf9pcylz0tcxnu.gif" alt="containers moving from convenience to release discipline" width="400" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  disabling dct is not a strategy
&lt;/h2&gt;

&lt;p&gt;For some teams, the right immediate move really is simple.&lt;/p&gt;

&lt;p&gt;Search for &lt;code&gt;DOCKER_CONTENT_TRUST=1&lt;/code&gt;. Search for &lt;code&gt;docker trust sign&lt;/code&gt;, &lt;code&gt;docker trust inspect&lt;/code&gt;, and &lt;code&gt;docker trust revoke&lt;/code&gt;. Search CI configs, shell profiles, Dockerfiles, Compose files, deployment scripts, and old platform templates. If DCT is set only by accident, remove it before the read brownouts find it for you.&lt;/p&gt;

&lt;p&gt;That is fine.&lt;/p&gt;

&lt;p&gt;But "unset the variable" should be treated as a triage step, not a supply-chain strategy.&lt;/p&gt;

&lt;p&gt;If DCT was the only thing standing between your production release path and arbitrary mutable tags, removing it may keep builds green while reducing the evidence behind those builds.&lt;/p&gt;

&lt;p&gt;This is where teams get tricked by operational success.&lt;/p&gt;

&lt;p&gt;The pipeline passes.&lt;/p&gt;

&lt;p&gt;The incident is avoided.&lt;/p&gt;

&lt;p&gt;The migration ticket is closed.&lt;/p&gt;

&lt;p&gt;And the organization quietly moves from imperfect verification to no verification at all.&lt;/p&gt;

&lt;p&gt;That is not modernization. That is control deletion with a better changelog.&lt;/p&gt;

&lt;h2&gt;
  
  
  digest pinning is necessary but incomplete
&lt;/h2&gt;

&lt;p&gt;Docker's migration post correctly separates repeatability from publisher identity.&lt;/p&gt;

&lt;p&gt;Pulling by digest is a major improvement over trusting a tag. A digest says, "give me this exact content." That matters because tags can move, registry defaults can change, and rebuilds can produce new artifacts under familiar names.&lt;/p&gt;

&lt;p&gt;If production depends on &lt;code&gt;some-image:latest&lt;/code&gt;, you do not have a precise release input. You have a suggestion.&lt;/p&gt;

&lt;p&gt;So yes, pin digests where production repeatability matters.&lt;/p&gt;

&lt;p&gt;But digest pinning is not the same as trust.&lt;/p&gt;

&lt;p&gt;A digest can prove that you got the content you requested. It does not, by itself, prove that the content came from the publisher, pipeline, or review process you intended to trust.&lt;/p&gt;

&lt;p&gt;This distinction matters more now because AI agents are making artifact production cheaper. More code can be generated. More images can be built. More dependency updates can be proposed. More "small safe changes" can enter the queue.&lt;/p&gt;

&lt;p&gt;The bottleneck is no longer only producing software.&lt;/p&gt;

&lt;p&gt;The bottleneck is proving what happened to the software before it shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  admission control is where trust becomes real
&lt;/h2&gt;

&lt;p&gt;Signing an image is only half the story.&lt;/p&gt;

&lt;p&gt;The other half is enforcement.&lt;/p&gt;

&lt;p&gt;If the cluster accepts unsigned images, signature policy is documentation. If the deployment system accepts images from any registry, registry policy is a slide. If CI checks one path but emergency deploys use another, your supply-chain story has a side door.&lt;/p&gt;

&lt;p&gt;This is why tools like Kyverno, Ratify, Gatekeeper, Cosign, and Notation matter less as product names and more as places to make release claims enforceable.&lt;/p&gt;

&lt;p&gt;The platform team should be able to say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;release images are signed by this identity&lt;/li&gt;
&lt;li&gt;production deploys require a valid signature&lt;/li&gt;
&lt;li&gt;allowed registries are explicit&lt;/li&gt;
&lt;li&gt;base images come from approved sources&lt;/li&gt;
&lt;li&gt;exceptions expire&lt;/li&gt;
&lt;li&gt;verification failures are visible&lt;/li&gt;
&lt;li&gt;the policy is tested before the brownout, not during it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That list is boring.&lt;/p&gt;

&lt;p&gt;Good.&lt;/p&gt;

&lt;p&gt;Boring is what mature trust looks like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbeq2byh7c9wih8l6cil.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbeq2byh7c9wih8l6cil.gif" alt="security policy becoming part of the deployment path" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  this is really about old controls aging out
&lt;/h2&gt;

&lt;p&gt;DCT retirement is a container story, but the pattern is bigger than Docker.&lt;/p&gt;

&lt;p&gt;Engineering organizations accumulate controls the same way they accumulate dependencies. Some are still valuable. Some have better replacements. Some are dead but harmless. Some are dead but important. The dangerous ones are the controls that are both forgotten and load-bearing.&lt;/p&gt;

&lt;p&gt;AI makes this worse, not because AI changes image signing, but because it increases the amount of automation running through old paths.&lt;/p&gt;

&lt;p&gt;An agent can update a Dockerfile.&lt;/p&gt;

&lt;p&gt;An agent can regenerate a build pipeline.&lt;/p&gt;

&lt;p&gt;An agent can migrate a service to a new base image.&lt;/p&gt;

&lt;p&gt;An agent can open ten pull requests that all look plausible.&lt;/p&gt;

&lt;p&gt;But if nobody knows what release evidence is required, the agent will optimize for passing checks, not preserving trust.&lt;/p&gt;

&lt;p&gt;That is why the useful question this week is not "are we affected by Docker Content Trust retirement?"&lt;/p&gt;

&lt;p&gt;The better question is: "do we know which supply-chain controls are actually protecting production?"&lt;/p&gt;

&lt;p&gt;If the answer is no, the DCT timeline is a gift. It gives teams a dated reason to inventory old assumptions before December turns them into production surprises.&lt;/p&gt;

&lt;h2&gt;
  
  
  what i would do before august 10
&lt;/h2&gt;

&lt;p&gt;I would start with discovery, not a tool debate.&lt;/p&gt;

&lt;p&gt;Search for &lt;code&gt;DOCKER_CONTENT_TRUST&lt;/code&gt;, &lt;code&gt;docker trust&lt;/code&gt;, Notary v1 endpoints, and admission policies that mention DCT. Check CI variables, repo secrets, build images, deployment templates, and platform docs. Ask registry publishers whether they are moving to Cosign, Notation, or something else.&lt;/p&gt;

&lt;p&gt;Then split the findings into three buckets.&lt;/p&gt;

&lt;p&gt;First: accidental DCT usage that can be removed safely.&lt;/p&gt;

&lt;p&gt;Second: intentional DCT usage that needs a migration path to modern signing.&lt;/p&gt;

&lt;p&gt;Third: places where DCT was pretending to be a broader supply-chain strategy.&lt;/p&gt;

&lt;p&gt;That third bucket is the important one.&lt;/p&gt;

&lt;p&gt;It should produce platform work: digest pinning guidance, signing identity, registry policy, admission enforcement, exception handling, release evidence, and ownership.&lt;/p&gt;

&lt;p&gt;The old trust checkbox is going away.&lt;/p&gt;

&lt;p&gt;What replaces it is not a feature.&lt;/p&gt;

&lt;p&gt;It is a release discipline.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/blog/docker-content-trust-retirement-and-migration-guidance/" rel="noopener noreferrer"&gt;Docker: Docker Content Trust retirement and migration guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.sigstore.dev/quickstart/quickstart-cosign/" rel="noopener noreferrer"&gt;Sigstore Cosign quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notaryproject.dev/docs/quickstart/" rel="noopener noreferrer"&gt;Notary Project Notation quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyverno.io/docs/writing-policies/verify-images/" rel="noopener noreferrer"&gt;Kyverno documentation for verifying images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ratify.dev/docs/quickstarts/ratify-on-azure/" rel="noopener noreferrer"&gt;Ratify quickstart&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>containers</category>
      <category>supplychain</category>
      <category>platformengineering</category>
    </item>
    <item>
      <title>your gpu bill is not a model problem</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Thu, 06 Aug 2026 00:04:39 +0000</pubDate>
      <link>https://dev.to/pvgomes/your-gpu-bill-is-not-a-model-problem-59m</link>
      <guid>https://dev.to/pvgomes/your-gpu-bill-is-not-a-model-problem-59m</guid>
      <description>&lt;p&gt;The cloud bill has a very annoying habit.&lt;/p&gt;

&lt;p&gt;It waits until everyone is talking about the exciting abstraction, then it shows up with the boring invoice.&lt;/p&gt;

&lt;p&gt;For AI infrastructure, the exciting abstraction is the model.&lt;/p&gt;

&lt;p&gt;Which model is smarter? Which one has better reasoning? Which one is cheaper per million tokens? Which one can explain a failing test with the confidence of someone who absolutely did not run it?&lt;/p&gt;

&lt;p&gt;Useful questions.&lt;/p&gt;

&lt;p&gt;Incomplete questions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cncf.io/blog/2026/08/05/opencost-1-121-0-first-of-a-kind-kubernetes-inference-cost-tracking/" rel="noopener noreferrer"&gt;OpenCost 1.121.0&lt;/a&gt; added Kubernetes inference cost tracking with llm-d and vLLM metrics. The interesting part is not only that it can calculate model and token cost. The interesting part is the distinction it forces platform teams to make.&lt;/p&gt;

&lt;p&gt;What did the model's work cost?&lt;/p&gt;

&lt;p&gt;And what did keeping the model ready cost?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapx6f29x7ibau69ccxs4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapx6f29x7ibau69ccxs4.gif" alt="finance discovering the gpu was warm all night" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those are not the same question.&lt;/p&gt;

&lt;p&gt;That difference is where many self-hosted AI spreadsheets go to die.&lt;/p&gt;

&lt;h2&gt;
  
  
  the model is not the workload
&lt;/h2&gt;

&lt;p&gt;When teams talk about AI cost, they often jump straight to price-per-token.&lt;/p&gt;

&lt;p&gt;That makes sense for SaaS APIs. You send tokens. You receive tokens. Somewhere in the middle, a billing system does billing-system things and your dashboard gets another little number to make you sad.&lt;/p&gt;

&lt;p&gt;Self-hosting changes the shape.&lt;/p&gt;

&lt;p&gt;Now you are not only buying inference.&lt;/p&gt;

&lt;p&gt;You are running infrastructure.&lt;/p&gt;

&lt;p&gt;There are GPUs. There is memory. There is a gateway. There are pods. There are model weights sitting in VRAM. There is routing. There is cache behavior. There are namespaces, teams, tenants, and probably one deployment nobody wants to touch because it was "temporary" in March.&lt;/p&gt;

&lt;p&gt;This is why the OpenCost angle matters. It connects Kubernetes cost allocation to inference metrics from vLLM and llm-d. It is trying to answer cost questions in the place where the workload actually runs, not in a slide where all GPUs are magically 100% utilized and nobody ever pays for idle capacity.&lt;/p&gt;

&lt;p&gt;That slide is beautiful.&lt;/p&gt;

&lt;p&gt;It is also fiction.&lt;/p&gt;

&lt;h2&gt;
  
  
  usage cost can lie to you politely
&lt;/h2&gt;

&lt;p&gt;The useful distinction is usage-based cost versus allocation-based cost.&lt;/p&gt;

&lt;p&gt;Usage-based cost is about active work. The model processed tokens. GPU compute was consumed. Input and output tokens had real processing cost. KV cache hits changed that cost. Great.&lt;/p&gt;

&lt;p&gt;Allocation-based cost is about availability. The model is loaded. GPU memory is reserved. The serving stack is alive. Common infrastructure is running. The system is ready to respond even if the request traffic is having a nap.&lt;/p&gt;

&lt;p&gt;Both numbers are true.&lt;/p&gt;

&lt;p&gt;Only one answers the build-versus-buy question.&lt;/p&gt;

&lt;p&gt;If a self-hosted model costs one dollar per million tokens while it is actively working, and a hosted API costs two dollars per million tokens, the spreadsheet starts smiling.&lt;/p&gt;

&lt;p&gt;"Look, we are cheaper."&lt;/p&gt;

&lt;p&gt;Maybe.&lt;/p&gt;

&lt;p&gt;If the GPU is busy enough.&lt;/p&gt;

&lt;p&gt;If the model is mostly idle, the real cost per token includes the quiet hours too. A GPU with a model loaded is not free because the request queue is empty. It is just expensive in a less photogenic way.&lt;/p&gt;

&lt;p&gt;This is the trap. Usage-based cost can make self-hosting look cheap because it ignores the carrying cost of readiness. Allocation-based cost includes the part production teams actually pay for at the end of the month.&lt;/p&gt;

&lt;p&gt;The invoice does not care that your benchmark was efficient for seven minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  warm capacity is a product decision
&lt;/h2&gt;

&lt;p&gt;There is a reason teams keep models warm.&lt;/p&gt;

&lt;p&gt;Latency matters. Cold starts are bad. Users do not enjoy waiting while your platform gently remembers how to be useful. Some workloads need a model ready now, not after a scheduling adventure and a loading ceremony.&lt;/p&gt;

&lt;p&gt;So keeping capacity warm can be the correct choice.&lt;/p&gt;

&lt;p&gt;But it has to be a choice.&lt;/p&gt;

&lt;p&gt;Not an accident.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxuvg2xf9pcylz0tcxnu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxuvg2xf9pcylz0tcxnu.gif" alt="the platform team explaining that idle is still billable" width="400" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where AI FinOps becomes platform engineering. The useful question is not "is this model expensive?" That is too vague. Everything is expensive if you squint with procurement nearby.&lt;/p&gt;

&lt;p&gt;The better questions are more practical.&lt;/p&gt;

&lt;p&gt;Which teams need this model warm?&lt;/p&gt;

&lt;p&gt;Which traffic can tolerate queueing or scale-up?&lt;/p&gt;

&lt;p&gt;Which low-volume workloads should use an external API instead?&lt;/p&gt;

&lt;p&gt;Which models can share capacity?&lt;/p&gt;

&lt;p&gt;Which routes should consolidate traffic to improve utilization?&lt;/p&gt;

&lt;p&gt;Which experiments are quietly reserving production-grade hardware for demo-grade usage?&lt;/p&gt;

&lt;p&gt;This is less glamorous than model selection. It is also where the money is.&lt;/p&gt;

&lt;h2&gt;
  
  
  cost labels become architecture
&lt;/h2&gt;

&lt;p&gt;One detail I like in the OpenCost work is the label shape. The new metrics include things like model name, model version, namespace, workload type, and whether the cost basis is usage or allocation.&lt;/p&gt;

&lt;p&gt;That sounds boring.&lt;/p&gt;

&lt;p&gt;Good.&lt;/p&gt;

&lt;p&gt;Boring labels are how the bill becomes debuggable.&lt;/p&gt;

&lt;p&gt;Without them, AI cost turns into fog. Everyone knows the platform is expensive. Nobody knows if the expensive part is one team's chatbot, another team's batch summarizer, a forgotten staging deployment, or a model nobody retired because the migration ticket got renamed into a roadmap initiative and then disappeared.&lt;/p&gt;

&lt;p&gt;Cost attribution is not just finance hygiene. It changes engineering behavior.&lt;/p&gt;

&lt;p&gt;When teams can see the cost of keeping a model warm for their namespace, they can have a real conversation about latency, volume, and tradeoffs. When they only see an aggregate GPU bill, the conversation becomes vibes with a spreadsheet attachment.&lt;/p&gt;

&lt;p&gt;We have seen this movie with Kubernetes before.&lt;/p&gt;

&lt;p&gt;CPU requests looked like small YAML details until over-requested workloads became real money. Storage classes looked like plumbing until retained volumes became invoices. Logs looked harmless until everyone discovered that debugging output also has a billing department.&lt;/p&gt;

&lt;p&gt;Inference is getting the same treatment.&lt;/p&gt;

&lt;p&gt;The YAML is now connected to the token.&lt;/p&gt;

&lt;p&gt;Wonderful and terrible, as usual.&lt;/p&gt;

&lt;h2&gt;
  
  
  the platform owns the gap
&lt;/h2&gt;

&lt;p&gt;The gap between usage-based and allocation-based cost is the part I would watch.&lt;/p&gt;

&lt;p&gt;It is the cost of readiness.&lt;/p&gt;

&lt;p&gt;Sometimes that gap is healthy. A fraud system, incident assistant, or customer-facing workflow may justify warm capacity because response time matters. Fine. Put that in the architecture decision. Own it.&lt;/p&gt;

&lt;p&gt;Sometimes the gap is waste. A model is deployed for a pilot with twelve users. A team copied production values into staging. A bigger model is serving requests that a smaller model could handle. A routing layer spreads traffic so thin that every model looks underutilized.&lt;/p&gt;

&lt;p&gt;That is not a model problem.&lt;/p&gt;

&lt;p&gt;That is a platform problem.&lt;/p&gt;

&lt;p&gt;The platform owns the routing, isolation, quotas, schedules, autoscaling policy, cache behavior, and cost visibility. The model is only one component inside that system.&lt;/p&gt;

&lt;p&gt;AI infrastructure is becoming normal infrastructure faster than people want to admit. It needs the same dull tools we already learned to respect: allocation reports, budgets, ownership labels, deployment review, capacity planning, and cleanup jobs with teeth.&lt;/p&gt;

&lt;p&gt;Not because engineers love governance.&lt;/p&gt;

&lt;p&gt;We do not.&lt;/p&gt;

&lt;p&gt;Because otherwise the bill becomes the observability system.&lt;/p&gt;

&lt;p&gt;And the bill has terrible UX.&lt;/p&gt;

&lt;h2&gt;
  
  
  self-hosting needs utilization, not optimism
&lt;/h2&gt;

&lt;p&gt;I like self-hosting. I like owning the runtime. I like being able to tune the serving stack, inspect metrics, and avoid pretending that an API call is a complete architecture.&lt;/p&gt;

&lt;p&gt;But self-hosting is not a personality trait.&lt;/p&gt;

&lt;p&gt;It needs utilization.&lt;/p&gt;

&lt;p&gt;If the allocation-based cost per million tokens beats the external API price, great. If it does not, the answer is not to argue with the spreadsheet until morale improves. The answer is to change the architecture or stop self-hosting that workload.&lt;/p&gt;

&lt;p&gt;Route more traffic to fewer warm models.&lt;/p&gt;

&lt;p&gt;Use smaller models where they are enough.&lt;/p&gt;

&lt;p&gt;Separate latency-sensitive traffic from batch traffic.&lt;/p&gt;

&lt;p&gt;Scale down experiments.&lt;/p&gt;

&lt;p&gt;Expose cost per namespace and model version.&lt;/p&gt;

&lt;p&gt;Make teams see the fixed cost they are asking the platform to carry.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbeq2byh7c9wih8l6cil.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbeq2byh7c9wih8l6cil.gif" alt="the spreadsheet finally meeting production traffic" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The useful version of AI cost tracking does not end with "this model is expensive."&lt;/p&gt;

&lt;p&gt;It ends with a decision.&lt;/p&gt;

&lt;p&gt;Keep it warm because latency matters.&lt;/p&gt;

&lt;p&gt;Move it to an API because utilization is bad.&lt;/p&gt;

&lt;p&gt;Consolidate traffic because too many models are doing too little work.&lt;/p&gt;

&lt;p&gt;Change routing because the current setup is optimized for a demo, not production.&lt;/p&gt;

&lt;p&gt;That is the real lesson.&lt;/p&gt;

&lt;p&gt;Your GPU bill is not a model problem.&lt;/p&gt;

&lt;p&gt;It is a utilization story with Kubernetes labels.&lt;/p&gt;

&lt;p&gt;Which is a very platform-engineering way for AI to become boring.&lt;/p&gt;

&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>kubernetes</category>
      <category>opencost</category>
      <category>finops</category>
    </item>
    <item>
      <title>durable execution is something you install now</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Wed, 05 Aug 2026 12:05:45 +0000</pubDate>
      <link>https://dev.to/pvgomes/durable-execution-is-something-you-install-now-578p</link>
      <guid>https://dev.to/pvgomes/durable-execution-is-something-you-install-now-578p</guid>
      <description>&lt;p&gt;A process starts a multi-step job.&lt;/p&gt;

&lt;p&gt;Step 1 validates the customer. Step 2 creates an internal record. Step 3 moves money, changes a subscription, sends an irreversible request to a partner, or does whatever your business considers serious.&lt;/p&gt;

&lt;p&gt;Then the process dies.&lt;/p&gt;

&lt;p&gt;Not politely.&lt;/p&gt;

&lt;p&gt;The container gets killed. The deploy rolls. The host disappears. The worker restarts halfway through the thing it was doing.&lt;/p&gt;

&lt;p&gt;Now the question is horrible:&lt;/p&gt;

&lt;p&gt;What happens when it runs again?&lt;/p&gt;

&lt;p&gt;If step 3 already happened, restarting from step 1 may duplicate something expensive. If you skip too much, you may leave the customer in a half-activated state. If you retry blindly, the external provider may accept the same request twice.&lt;/p&gt;

&lt;p&gt;This is the shape of a lot of fintech work. Account opening, subscription activation, credit disbursement, repayment settlement, KYC refreshes, scheduled sweeps. They are not one database transaction. They are small business stories pretending to be function calls.&lt;/p&gt;

&lt;p&gt;For a long time, the answer was not a product. The answer was discipline.&lt;/p&gt;

&lt;h2&gt;
  
  
  the old answer was owning the machinery
&lt;/h2&gt;

&lt;p&gt;At a fintech on the American continent, the public architecture story was event-driven: Kafka, services, async processing, consistency through events, and careful thinking around idempotency. That style makes sense in a bank-sized environment.&lt;/p&gt;

&lt;p&gt;But the boring part of the work was never just "publish an event."&lt;/p&gt;

&lt;p&gt;The real work was deciding what each step meant, which message was the source of truth, how to identify duplicates, how to make consumers safe to replay, and how to compensate for something that had already crossed a boundary.&lt;/p&gt;

&lt;p&gt;You ended up with sagas, state machines, idempotency keys, outbox tables, retry topics, reconciliation jobs, audit trails, alerts, and runbooks.&lt;/p&gt;

&lt;p&gt;That is not a criticism. In serious financial systems, this discipline is part of the job. You cannot hand-wave around money by saying "the queue is eventually consistent."&lt;/p&gt;

&lt;p&gt;But there is an operational cost to owning the mechanism.&lt;/p&gt;

&lt;p&gt;Every team has to remember the same failure modes. Every new workflow has to rebuild the same scaffolding. Every incident asks: did the step finish, did the event publish, did the retry duplicate it, and is the customer state now real?&lt;/p&gt;

&lt;p&gt;The painful thing is that most of this machinery is not product-specific.&lt;/p&gt;

&lt;p&gt;The compensation logic is product-specific. The step boundaries are product-specific. Retry and reversal rules are product-specific.&lt;/p&gt;

&lt;p&gt;But "remember completed step 3 after the worker crashes" is plumbing.&lt;/p&gt;

&lt;p&gt;And plumbing eventually becomes a product.&lt;/p&gt;

&lt;h2&gt;
  
  
  DBOS and Temporal change the default
&lt;/h2&gt;

&lt;p&gt;This is why frameworks like DBOS and Temporal are worth paying attention to, even if you do not adopt either tomorrow.&lt;/p&gt;

&lt;p&gt;Temporal's model is built around workflows and activities. The Temporal service stores a durable event history for each workflow execution. When a worker crashes or restarts, workflow code can be replayed from that history, and completed activity results are not forgotten because a process died. The service has a record of what happened.&lt;/p&gt;

&lt;p&gt;DBOS takes a different shape. DBOS Transact is positioned as an open-source durable execution library that runs inside your application. The current DBOS material still describes the core design as Postgres-backed: workflow and step state are checkpointed into Postgres, and application servers coordinate through the database instead of a separate central orchestrator.&lt;/p&gt;

&lt;p&gt;That difference matters.&lt;/p&gt;

&lt;p&gt;Temporal asks you to run, or pay for, a workflow service. Temporal Cloud is priced as a managed platform, with usage and storage dimensions around things like actions and workflow history storage.&lt;/p&gt;

&lt;p&gt;DBOS is making a more Postgres-native bet. The open-source Transact library can run anywhere, and the paid DBOS offering is around Conductor, support, management tooling, and hosting. Their current public pricing lists Pro and Teams plans around managed apps, seats, and checkpoint volume.&lt;/p&gt;

&lt;p&gt;I do not think the interesting point is which one is "better." That depends too much on the system, team, language, and operational model.&lt;/p&gt;

&lt;p&gt;The interesting point is that both package the same formerly internal capability:&lt;/p&gt;

&lt;p&gt;This multi-step job survives process death.&lt;/p&gt;

&lt;p&gt;That sentence used to imply bespoke platform work. Now it can start with a framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  the hard part did not disappear
&lt;/h2&gt;

&lt;p&gt;There is a trap here, and it is exactly the trap that appears every time infrastructure gets better.&lt;/p&gt;

&lt;p&gt;People confuse "the framework remembers what happened" with "the system now knows what should happen."&lt;/p&gt;

&lt;p&gt;It does not.&lt;/p&gt;

&lt;p&gt;If a workflow charges a customer, activates a subscription, provisions access, sends an email, and updates analytics, the framework can help make that workflow resumable. It can record step completion, retry activities, show where execution stopped, and make the history visible instead of buried inside logs.&lt;/p&gt;

&lt;p&gt;But it cannot tell you whether charging the customer should happen before activation or after activation. It cannot tell you whether a failed activation should trigger a refund, a retry, a manual review, or a grace period. It cannot tell you whether a partner API is actually idempotent just because it accepts an idempotency key.&lt;/p&gt;

&lt;p&gt;That is still design work.&lt;/p&gt;

&lt;p&gt;At a fintech in the Gulf I work with now, this comes up in normal product workflows. A scheduled sweep is not interesting because a timer fired. It is interesting because the system needs to know which accounts were considered, which ones were skipped, and what should happen when the process wakes up after a deploy.&lt;/p&gt;

&lt;p&gt;Durable execution helps a lot there.&lt;/p&gt;

&lt;p&gt;A completed step recorded in Postgres is much better than a log line and a prayer. A workflow console is better than SSH-ing into a worker for clues.&lt;/p&gt;

&lt;p&gt;But the useful conversation shifts upward.&lt;/p&gt;

&lt;p&gt;Instead of asking, "how do we build the retry table?", the team asks, "where is the boundary where retry becomes compensation?"&lt;/p&gt;

&lt;p&gt;Instead of asking, "how do we resume after a crash?", the team asks, "what does resumed mean for this customer?"&lt;/p&gt;

&lt;p&gt;That is a better use of engineering time.&lt;/p&gt;

&lt;h2&gt;
  
  
  idempotency still lives at the edges
&lt;/h2&gt;

&lt;p&gt;One thing I would be careful about in any durable execution pitch is idempotency.&lt;/p&gt;

&lt;p&gt;Inside the framework boundary, you may get very strong guarantees. Completed workflow steps can be recorded. Activity results can be remembered. Retries can be controlled. Execution can resume after a crash.&lt;/p&gt;

&lt;p&gt;At the external boundary, reality is messy.&lt;/p&gt;

&lt;p&gt;Payment providers, banking partners, email systems, identity vendors, and card processors all have their own ideas about duplicate requests. Some support idempotency well. Some support it in documentation. Some support it until a timeout happens.&lt;/p&gt;

&lt;p&gt;Boundary calls still need stable request identifiers, provider references, and reconciliation. You still need to know whether a timeout means "nothing happened", "something happened but you did not see it", or "check later."&lt;/p&gt;

&lt;p&gt;Durable execution reduces the number of places where that logic leaks.&lt;/p&gt;

&lt;p&gt;It does not repeal distributed systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  durability as a purchasable property
&lt;/h2&gt;

&lt;p&gt;The reason I like this category is that it fits a pattern that keeps repeating in software.&lt;/p&gt;

&lt;p&gt;At first, a reliability property is craft. A strong team builds it internally because they have no choice. Then enough teams hit the same pain, and the property becomes a product.&lt;/p&gt;

&lt;p&gt;Observability did this. Feature flags did this. Secrets management did this. CI/CD did this. Policy-as-code did this. Now durable execution is doing it.&lt;/p&gt;

&lt;p&gt;The boring control-plane property becomes something you can buy, install, or outsource.&lt;/p&gt;

&lt;p&gt;That is good. I do not miss every team building its own mini workflow engine by accident.&lt;/p&gt;

&lt;p&gt;But the job does not vanish. It moves.&lt;/p&gt;

&lt;p&gt;The value is no longer proving that your worker can survive a restart. The value is deciding which workflows deserve durability, which steps are atomic from the business point of view, which failures should retry, which failures should compensate, and who owns the customer outcome.&lt;/p&gt;

&lt;p&gt;That is where durable execution gets interesting.&lt;/p&gt;

&lt;p&gt;Not because DBOS or Temporal make failure disappear.&lt;/p&gt;

&lt;p&gt;Because they make the failure visible enough that we can stop pretending the hard part was the retry loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/dbos-transact" rel="noopener noreferrer"&gt;DBOS Transact&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/dbos-pricing" rel="noopener noreferrer"&gt;DBOS Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/blog/postgres-is-all-you-need-for-durable-execution" rel="noopener noreferrer"&gt;Postgres is All You Need for Durable Workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/workflow-execution/event" rel="noopener noreferrer"&gt;Temporal Event History documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/cloud/pricing" rel="noopener noreferrer"&gt;Temporal Cloud pricing documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>opinion</category>
      <category>devops</category>
    </item>
    <item>
      <title>DBOS and the shrinking cost of durable workflows</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Wed, 05 Aug 2026 10:37:23 +0000</pubDate>
      <link>https://dev.to/pvgomes/dbos-and-the-shrinking-cost-of-durable-workflows-193p</link>
      <guid>https://dev.to/pvgomes/dbos-and-the-shrinking-cost-of-durable-workflows-193p</guid>
      <description>&lt;p&gt;The annoying failure is not the one where everything dies before anything important happens. That one is clean. You retry the job, or the user clicks again, or the scheduler runs next minute. Fine.&lt;/p&gt;

&lt;p&gt;The real failure is the one where the process dies after step 3.&lt;/p&gt;

&lt;p&gt;Step 1 created the customer record. Step 2 reserved something. Step 3 moved money, activated a subscription, sent a document, or called an external provider that will not forget what you asked it to do. Then the worker disappears. Kubernetes evicts the pod. The VM restarts. A deployment kills the process. Someone discovers that "stateless service" was more aspiration than architecture.&lt;/p&gt;

&lt;p&gt;Now what? If you restart the job, you might charge twice. If you skip it, the customer is stuck halfway through activation. If you manually repair it, congratulations, you invented an operations queue with anxiety as the UI.&lt;/p&gt;

&lt;p&gt;This is the problem durable execution is trying to make boring.&lt;/p&gt;

&lt;p&gt;Not easy. Boring.&lt;/p&gt;

&lt;h2&gt;
  
  
  we used to build this ourselves
&lt;/h2&gt;

&lt;p&gt;In fintech, this shows up everywhere because workflows are longer than a request and more fragile than the happy path diagram.&lt;/p&gt;

&lt;p&gt;At a fintech in the Americas, the answer was the one many serious backend teams reached: sagas, Kafka, idempotency keys, state tables, retries, reconciliation jobs, and discipline.&lt;/p&gt;

&lt;p&gt;That architecture was not dumb. It was right for its time.&lt;/p&gt;

&lt;p&gt;You split a process into steps. Each step publishes an event or writes state. Commands carry idempotency keys. External calls have deduplication at the boundary when possible. Reconciliation jobs scan for weird states later because you know the system will find one. Everyone learns that "at least once" is not a delivery guarantee, it is a personality test.&lt;/p&gt;

&lt;p&gt;The hard part was never only writing the saga. The hard part was owning it.&lt;/p&gt;

&lt;p&gt;You had to decide what state meant, which failures should pause, which should compensate, and which should page a human. You had to keep idempotency keys flowing across service boundaries. You had to make sure a step that looked atomic in code was atomic in the business.&lt;/p&gt;

&lt;p&gt;And because the mechanism was hand-rolled, every team ended up owning some version of the same machinery.&lt;/p&gt;

&lt;p&gt;One team had an orchestration table. Another had choreography over Kafka topics. Another had a cron that repaired half-completed rows. All of this worked, until it did not, and then the organizational memory lived in the heads of the people who had been burned before.&lt;/p&gt;

&lt;p&gt;This is why DBOS and Temporal are interesting to me. They did not invent the idea that a workflow should survive a crash. They productize the control-plane part we used to rebuild.&lt;/p&gt;

&lt;h2&gt;
  
  
  what DBOS changes
&lt;/h2&gt;

&lt;p&gt;I first paid attention to DBOS while looking at subscription activation workflows and scheduled sweeps at a bank I work with now in the Gulf. The storage model caught my eye.&lt;/p&gt;

&lt;p&gt;DBOS Transact makes workflows durable by checkpointing completed steps in Postgres. If the process crashes, the restarted app can resume from the last completed step.&lt;/p&gt;

&lt;p&gt;It also changes the adoption shape. DBOS is not asking every team to operate a separate workflow cluster before they get durability. The open-source Transact libraries are positioned as application-adjacent durable execution built on Postgres-compatible storage. Their material still says the state can live in your application database. DBOS also sells the control-plane layer, with paid plans priced around users, applications, and checkpoint volume.&lt;/p&gt;

&lt;p&gt;That matters because the first objection to workflow engines is often operational weight. DBOS is aiming at the space where you want crash recovery, durable queues, scheduled work, and observability without turning every service into research.&lt;/p&gt;

&lt;p&gt;The tradeoff is clear. If durable execution metadata is in Postgres, Postgres becomes part of the runtime. That can be a feature or a coupling point. You get simpler ownership and queryability, but you still need to understand retention, migrations, backups, and the blast radius of putting workflow history near application data.&lt;/p&gt;

&lt;p&gt;No free lunch. Fewer moving parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  what Temporal gives you
&lt;/h2&gt;

&lt;p&gt;Temporal has a different shape.&lt;/p&gt;

&lt;p&gt;Temporal gives you a durable execution platform where workflows are recorded as event histories. A workflow can run for seconds, days, or years, and the service persists the events needed to recover and continue. Activities run outside deterministic workflow logic. The SDK replays workflow history to rebuild state.&lt;/p&gt;

&lt;p&gt;That model is powerful when the workflow is long-lived, crosses services, and needs signals, timers, retries, versioning, and a strong operational surface.&lt;/p&gt;

&lt;p&gt;Temporal Cloud pricing also makes the product shape explicit. It is a managed platform priced around Actions, active storage, retained storage, and support. You are buying a durable execution control plane.&lt;/p&gt;

&lt;p&gt;That is a reasonable deal for many teams. It is also a real platform decision. Once Temporal is in the middle of a process, someone owns namespaces, workers, task queues, retry policies, versioning, security, and cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  the hard part stayed yours
&lt;/h2&gt;

&lt;p&gt;Here is the part that people sometimes skip when durable execution gets exciting.&lt;/p&gt;

&lt;p&gt;A framework can remember that step 3 completed. It cannot tell you whether step 3 was the right boundary.&lt;/p&gt;

&lt;p&gt;If step 3 called a payment provider, did the provider accept an idempotency key? If the network timed out, did the payment happen or not? If the workflow resumes tomorrow, should it retry, query the provider, compensate the customer, or stop for manual review?&lt;/p&gt;

&lt;p&gt;Durable execution makes these questions visible. It does not answer them for you.&lt;/p&gt;

&lt;p&gt;That visibility is useful. In hand-rolled systems, step boundaries often leak across topic names, retry loops, database rows, and tribal knowledge. In DBOS or Temporal, you are forced to make the workflow shape explicit. You name the step. You decide what gets checkpointed, what is safe to replay, and what must never be replayed.&lt;/p&gt;

&lt;p&gt;That is the real design work.&lt;/p&gt;

&lt;p&gt;Not "how do I keep a process alive forever?" The question is, "what does it mean for this business action to have happened?"&lt;/p&gt;

&lt;p&gt;That is why fintech engineers get twitchy about retries. Retry is not a technical verb when money is involved. It can mean "try the HTTP call again." It can also mean "charge twice."&lt;/p&gt;

&lt;p&gt;The boundary matters.&lt;/p&gt;

&lt;p&gt;So does ownership. A durable workflow that crosses payments, subscriptions, notifications, and compliance is not owned by the framework. It is owned by a team, or by nobody.&lt;/p&gt;

&lt;h2&gt;
  
  
  durability became a purchasable property
&lt;/h2&gt;

&lt;p&gt;The wider pattern is the interesting one.&lt;/p&gt;

&lt;p&gt;A lot of backend engineering is the history of boring properties becoming products. We used to build deployment scripts. Then deployment became a platform property. We used to hand-roll metrics pipelines. Then observability became a product category. Some teams still build these things, for good reasons. But the default shifted.&lt;/p&gt;

&lt;p&gt;Durable execution is going through the same move.&lt;/p&gt;

&lt;p&gt;"This multi-step job survives a crash" used to be a badge of engineering maturity buried inside every serious backend system. Now it is increasingly an infrastructure property. You can install a library, run a platform, or pay for a managed service.&lt;/p&gt;

&lt;p&gt;That is good. Fewer teams need to rediscover failure modes from first principles. More workflows can have explicit state instead of vibes. Scheduled sweeps, onboarding flows, subscription activation, refunds, identity checks, and cleanup jobs can stop depending on the fantasy that processes die only at convenient times.&lt;/p&gt;

&lt;p&gt;But it also raises the bar for engineering judgment.&lt;/p&gt;

&lt;p&gt;If durability is easy to add, teams will add it to things that should have stayed simple. If every background job becomes a workflow, you can create a system that is reliable but hard to reason about.&lt;/p&gt;

&lt;p&gt;The question is not "should we use DBOS or Temporal for everything?"&lt;/p&gt;

&lt;p&gt;The question is "which business processes deserve durable execution, and who owns the semantics when they resume?"&lt;/p&gt;

&lt;p&gt;That is a better question than "how many cron retries should we add?"&lt;/p&gt;

&lt;p&gt;And it is where the work belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/blog/postgres-is-all-you-need-for-durable-execution" rel="noopener noreferrer"&gt;DBOS, Postgres-backed Durable Workflow Execution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/dbos-pricing" rel="noopener noreferrer"&gt;DBOS pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://temporal.io/" rel="noopener noreferrer"&gt;Temporal, Durable Execution Solutions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/cloud/pricing" rel="noopener noreferrer"&gt;Temporal Cloud pricing documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>opinion</category>
      <category>devops</category>
    </item>
    <item>
      <title>durable execution is something you install</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Wed, 05 Aug 2026 10:33:55 +0000</pubDate>
      <link>https://dev.to/pvgomes/durable-execution-is-something-you-install-3e1a</link>
      <guid>https://dev.to/pvgomes/durable-execution-is-something-you-install-3e1a</guid>
      <description>&lt;p&gt;A process starts a multi-step job. Step 1 validates the customer. Step 2 creates an internal record. Step 3 moves money, changes a subscription, sends an irreversible request to a partner, or does whatever your business considers serious. Then the process dies.&lt;/p&gt;

&lt;p&gt;Not politely.&lt;/p&gt;

&lt;p&gt;The container gets killed. The deploy rolls. The host disappears. The worker restarts halfway through the thing it was doing.&lt;/p&gt;

&lt;p&gt;Now the question is simple and horrible:&lt;/p&gt;

&lt;p&gt;What happens when it runs again?&lt;/p&gt;

&lt;p&gt;If step 3 already happened, restarting from step 1 may duplicate something expensive. If you skip too much, you may leave the customer in a half-activated state. If you retry blindly, the external provider may accept the same request twice.&lt;/p&gt;

&lt;p&gt;This is the shape of a lot of fintech work. Account opening, subscription activation, credit disbursement, repayment settlement, KYC refreshes, scheduled sweeps, ledger posting. They are not one database transaction. They are small business stories pretending to be function calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  the old answer was discipline
&lt;/h2&gt;

&lt;p&gt;At a fintech on the American continent, the public architecture story was event-driven: Kafka, services, async processing, consistency through events, and careful thinking around idempotency. That style makes sense in a bank-sized environment.&lt;/p&gt;

&lt;p&gt;But the boring part of the work was never just "publish an event." The real work was deciding what each step meant, which message was the source of truth, how to identify duplicates, how to make consumers safe to replay, and how to compensate for something that had already crossed a boundary.&lt;/p&gt;

&lt;p&gt;You ended up with sagas, state machines, idempotency keys, outbox tables, retry topics, reconciliation jobs, audit trails, dashboards, alerts, and runbooks.&lt;/p&gt;

&lt;p&gt;That is not a criticism. In serious financial systems, this discipline is part of the job. You cannot hand-wave around money by saying "the queue is eventually consistent" and then go for lunch.&lt;/p&gt;

&lt;p&gt;But there is an operational cost to owning the mechanism. Every team has to remember the same failure modes. Every new workflow has to rebuild the same scaffolding. Every incident asks: did the step finish, did the event publish, did the retry duplicate it, and is the customer state now real?&lt;/p&gt;

&lt;p&gt;The painful thing is that most of this machinery is not product-specific.&lt;/p&gt;

&lt;p&gt;The compensation logic is product-specific. The step boundaries are product-specific. The decision that a transfer can be retried but a partner call needs an idempotency key is product-specific. But "remember completed step 3 after the worker crashes" is plumbing.&lt;/p&gt;

&lt;p&gt;And plumbing eventually becomes a product.&lt;/p&gt;

&lt;h2&gt;
  
  
  dbos and temporal change the default
&lt;/h2&gt;

&lt;p&gt;This is why frameworks like DBOS and Temporal are worth paying attention to, even if you do not adopt either tomorrow.&lt;/p&gt;

&lt;p&gt;Temporal's model is built around workflows and activities. The Temporal service stores a durable event history for each workflow execution. When a worker crashes or restarts, workflow code can be replayed from history, and completed activities are not simply repeated. The service has a record of what happened.&lt;/p&gt;

&lt;p&gt;DBOS takes a different product shape. DBOS Transact is positioned as an open-source library that runs inside your application. The current DBOS docs still describe a Postgres system database that stores workflow checkpoints, step outputs, and schedule and queue state. The DBOS pricing page now puts the paid model around Conductor, tooling, support, and hosting options, with Pro and Teams plans priced around users, managed apps, and checkpoint usage.&lt;/p&gt;

&lt;p&gt;That difference matters.&lt;/p&gt;

&lt;p&gt;Temporal asks you to run, or pay for, a workflow service. Temporal Cloud pricing is consumption-based, mostly around actions, storage, and support. The minimum Cloud plan is currently listed at $100/month, with included actions and storage before usage-based charges kick in.&lt;/p&gt;

&lt;p&gt;DBOS is making a more Postgres-native bet. The open-source library gives you durable workflows in application code, while Conductor adds operational tooling like monitoring, recovery, versioning, alerts, and support.&lt;/p&gt;

&lt;p&gt;The interesting bit is that both package the same formerly internal capability:&lt;/p&gt;

&lt;p&gt;This multi-step job survives process death.&lt;/p&gt;

&lt;p&gt;That sentence used to imply bespoke platform work. Now it can start with a framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  the hard part did not disappear
&lt;/h2&gt;

&lt;p&gt;There is a trap here, and it is exactly the trap that appears every time infrastructure gets better.&lt;/p&gt;

&lt;p&gt;People confuse "the framework remembers what happened" with "the system now knows what should happen."&lt;/p&gt;

&lt;p&gt;It does not.&lt;/p&gt;

&lt;p&gt;If a workflow charges a customer, activates a subscription, provisions access, sends an email, and updates analytics, the framework can help make that workflow resumable. It can record step completion, retry activities, show where execution stopped, and make the history visible instead of buried inside logs.&lt;/p&gt;

&lt;p&gt;But it cannot tell you whether charging the customer should happen before activation or after activation.&lt;/p&gt;

&lt;p&gt;It cannot tell you whether a failed activation should trigger a refund, a retry, a manual review, or a grace period. It cannot tell you whether a partner API is actually idempotent just because it accepts an idempotency key. It cannot tell you whether your "step" is one business action or three business actions wearing a coat.&lt;/p&gt;

&lt;p&gt;That is still design work.&lt;/p&gt;

&lt;p&gt;At a bank I work with now in the Gulf, this comes up in normal product workflows. A scheduled sweep is not interesting because a timer fired. It is interesting because the system needs to know which accounts were considered, which ones were skipped, which external calls succeeded, and what should happen when the process wakes up after a deploy.&lt;/p&gt;

&lt;p&gt;Durable execution helps a lot there. A completed step recorded in Postgres is much better than a log line and a prayer. A workflow console is better than SSH-ing into a worker for clues. But the useful conversation shifts upward.&lt;/p&gt;

&lt;p&gt;Instead of asking, "how do we build the retry table?", the team asks, "where is the boundary where retry becomes compensation?" Instead of asking, "how do we resume after a crash?", the team asks, "what does resumed mean for this customer?"&lt;/p&gt;

&lt;p&gt;That is a better use of engineering time.&lt;/p&gt;

&lt;h2&gt;
  
  
  idempotency still lives at the edges
&lt;/h2&gt;

&lt;p&gt;One thing I would be careful about in any durable execution pitch is idempotency.&lt;/p&gt;

&lt;p&gt;Inside the framework boundary, you may get very strong guarantees. Completed workflow steps can be recorded. Activity results can be remembered. Retries can be controlled. Execution can resume after a crash.&lt;/p&gt;

&lt;p&gt;At the external boundary, reality is messier.&lt;/p&gt;

&lt;p&gt;Payment providers, banking partners, email systems, identity vendors, and card processors all have their own ideas about duplicate requests. Some support idempotency well. Some support it in documentation. Some support it until a timeout happens between their side effect and your response.&lt;/p&gt;

&lt;p&gt;Boundary calls still need stable request identifiers, provider references, and reconciliation. You still need to know whether a timeout means "nothing happened", "something happened but you did not see it", or "check later."&lt;/p&gt;

&lt;p&gt;Durable execution reduces the number of places where that logic leaks.&lt;/p&gt;

&lt;p&gt;It does not repeal distributed systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  the wider pattern
&lt;/h2&gt;

&lt;p&gt;The reason I like this category is that it fits a pattern that keeps repeating in software. At first, a reliability property is craft. A strong team builds it internally because they have no choice. Then enough teams hit the same pain, and the property becomes a product.&lt;/p&gt;

&lt;p&gt;Observability did this. Feature flags did this. Secrets management did this. CI/CD did this. Policy-as-code did this. Now durable execution is doing it.&lt;/p&gt;

&lt;p&gt;The boring control-plane property becomes something you can buy, install, or outsource.&lt;/p&gt;

&lt;p&gt;That is good. I do not miss every team building its own mini workflow engine by accident.&lt;/p&gt;

&lt;p&gt;But the job does not vanish. It moves.&lt;/p&gt;

&lt;p&gt;The value is no longer proving that your worker can survive a restart. The value is deciding which workflows deserve durability, which steps are atomic from the business point of view, which failures should retry, which failures should compensate, and who owns the customer outcome.&lt;/p&gt;

&lt;p&gt;That is where durable execution gets interesting.&lt;/p&gt;

&lt;p&gt;Not because DBOS or Temporal make failure disappear.&lt;/p&gt;

&lt;p&gt;Because they make the failure visible enough that we can stop pretending the hard part was the retry loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.dbos.dev/architecture" rel="noopener noreferrer"&gt;DBOS architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/dbos-pricing" rel="noopener noreferrer"&gt;DBOS pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/workflow-execution/event" rel="noopener noreferrer"&gt;Temporal Event History documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/cloud/pricing" rel="noopener noreferrer"&gt;Temporal Cloud pricing documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>durableexecution</category>
      <category>dbos</category>
      <category>temporal</category>
      <category>fintech</category>
    </item>
    <item>
      <title>DBOS and the shrinking cost of durable workflows</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Wed, 05 Aug 2026 10:07:34 +0000</pubDate>
      <link>https://dev.to/pvgomes/dbos-and-the-shrinking-cost-of-durable-workflows-4hfo</link>
      <guid>https://dev.to/pvgomes/dbos-and-the-shrinking-cost-of-durable-workflows-4hfo</guid>
      <description>&lt;p&gt;The annoying failure is not the one where everything dies before anything important happens. That one is clean. You retry the job, or the user clicks again, or the scheduler runs next minute. Fine.&lt;/p&gt;

&lt;p&gt;The real failure is the one where the process dies after step 3.&lt;/p&gt;

&lt;p&gt;Step 1 created the customer record. Step 2 reserved something. Step 3 moved money, activated a subscription, sent a document, or called an external provider that will not forget what you asked it to do. Then the worker disappears. Kubernetes evicts the pod. The VM restarts. A deployment kills the process. Someone discovers that "stateless service" was more aspiration than architecture.&lt;/p&gt;

&lt;p&gt;Now what? If you restart the job, you might charge twice. If you skip it, the customer is stuck halfway through activation. If you manually repair it, congratulations, you invented an operations queue with anxiety as the UI.&lt;/p&gt;

&lt;p&gt;This is the problem durable execution is trying to make boring.&lt;/p&gt;

&lt;p&gt;Not easy. Boring.&lt;/p&gt;

&lt;h2&gt;
  
  
  we used to build this ourselves
&lt;/h2&gt;

&lt;p&gt;In fintech, this shows up everywhere because workflows are longer than a request and more fragile than the happy path diagram.&lt;/p&gt;

&lt;p&gt;At a fintech in the Americas, the answer was the one many serious backend teams reached: sagas, Kafka, idempotency keys, state tables, retries, reconciliation jobs, and discipline.&lt;/p&gt;

&lt;p&gt;That architecture was not dumb. It was right for its time.&lt;/p&gt;

&lt;p&gt;You split a process into steps. Each step publishes an event or writes state. Commands carry idempotency keys. External calls have deduplication at the boundary when possible. Reconciliation jobs scan for weird states later because you know the system will find one. Everyone learns that "at least once" is not a delivery guarantee, it is a personality test.&lt;/p&gt;

&lt;p&gt;The hard part was never only writing the saga. The hard part was owning it.&lt;/p&gt;

&lt;p&gt;You had to decide what state meant, which failures should pause, which should compensate, and which should page a human. You had to keep idempotency keys flowing across service boundaries. You had to make sure a step that looked atomic in code was atomic in the business.&lt;/p&gt;

&lt;p&gt;And because the mechanism was hand-rolled, every team ended up owning some version of the same machinery.&lt;/p&gt;

&lt;p&gt;One team had an orchestration table. Another had choreography over Kafka topics. Another had a cron that repaired half-completed rows. All of this worked, until it did not, and then the organizational memory lived in the heads of the people who had been burned before.&lt;/p&gt;

&lt;p&gt;This is why DBOS and Temporal are interesting to me. They did not invent the idea that a workflow should survive a crash. They productize the control-plane part we used to rebuild.&lt;/p&gt;

&lt;h2&gt;
  
  
  what DBOS changes
&lt;/h2&gt;

&lt;p&gt;I first paid attention to DBOS while looking at subscription activation workflows and scheduled sweeps at a bank I work with now in the Gulf. The storage model caught my eye.&lt;/p&gt;

&lt;p&gt;DBOS Transact makes workflows durable by checkpointing completed steps in Postgres. If the process crashes, the restarted app can resume from the last completed step.&lt;/p&gt;

&lt;p&gt;It also changes the adoption shape. DBOS is not asking every team to operate a separate workflow cluster before they get durability. The open-source Transact libraries are positioned as application-adjacent durable execution built on Postgres-compatible storage. Their material still says the state can live in your application database. DBOS also sells the control-plane layer, with paid plans priced around users, applications, and checkpoint volume.&lt;/p&gt;

&lt;p&gt;That matters because the first objection to workflow engines is often operational weight. DBOS is aiming at the space where you want crash recovery, durable queues, scheduled work, and observability without turning every service into research.&lt;/p&gt;

&lt;p&gt;The tradeoff is clear. If durable execution metadata is in Postgres, Postgres becomes part of the runtime. That can be a feature or a coupling point. You get simpler ownership and queryability, but you still need to understand retention, migrations, backups, and the blast radius of putting workflow history near application data.&lt;/p&gt;

&lt;p&gt;No free lunch. Fewer moving parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  what Temporal gives you
&lt;/h2&gt;

&lt;p&gt;Temporal has a different shape.&lt;/p&gt;

&lt;p&gt;Temporal gives you a durable execution platform where workflows are recorded as event histories. A workflow can run for seconds, days, or years, and the service persists the events needed to recover and continue. Activities run outside deterministic workflow logic. The SDK replays workflow history to rebuild state.&lt;/p&gt;

&lt;p&gt;That model is powerful when the workflow is long-lived, crosses services, and needs signals, timers, retries, versioning, and a strong operational surface.&lt;/p&gt;

&lt;p&gt;Temporal Cloud pricing also makes the product shape explicit. It is a managed platform priced around Actions, active storage, retained storage, and support. You are buying a durable execution control plane.&lt;/p&gt;

&lt;p&gt;That is a reasonable deal for many teams. It is also a real platform decision. Once Temporal is in the middle of a process, someone owns namespaces, workers, task queues, retry policies, versioning, security, and cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  the hard part stayed yours
&lt;/h2&gt;

&lt;p&gt;Here is the part that people sometimes skip when durable execution gets exciting.&lt;/p&gt;

&lt;p&gt;A framework can remember that step 3 completed. It cannot tell you whether step 3 was the right boundary.&lt;/p&gt;

&lt;p&gt;If step 3 called a payment provider, did the provider accept an idempotency key? If the network timed out, did the payment happen or not? If the workflow resumes tomorrow, should it retry, query the provider, compensate the customer, or stop for manual review?&lt;/p&gt;

&lt;p&gt;Durable execution makes these questions visible. It does not answer them for you.&lt;/p&gt;

&lt;p&gt;That visibility is useful. In hand-rolled systems, step boundaries often leak across topic names, retry loops, database rows, and tribal knowledge. In DBOS or Temporal, you are forced to make the workflow shape explicit. You name the step. You decide what gets checkpointed, what is safe to replay, and what must never be replayed.&lt;/p&gt;

&lt;p&gt;That is the real design work.&lt;/p&gt;

&lt;p&gt;Not "how do I keep a process alive forever?" The question is, "what does it mean for this business action to have happened?"&lt;/p&gt;

&lt;p&gt;That is why fintech engineers get twitchy about retries. Retry is not a technical verb when money is involved. It can mean "try the HTTP call again." It can also mean "charge twice."&lt;/p&gt;

&lt;p&gt;The boundary matters.&lt;/p&gt;

&lt;p&gt;So does ownership. A durable workflow that crosses payments, subscriptions, notifications, and compliance is not owned by the framework. It is owned by a team, or by nobody.&lt;/p&gt;

&lt;h2&gt;
  
  
  durability became a purchasable property
&lt;/h2&gt;

&lt;p&gt;The wider pattern is the interesting one.&lt;/p&gt;

&lt;p&gt;A lot of backend engineering is the history of boring properties becoming products. We used to build deployment scripts. Then deployment became a platform property. We used to hand-roll metrics pipelines. Then observability became a product category. Some teams still build these things, for good reasons. But the default shifted.&lt;/p&gt;

&lt;p&gt;Durable execution is going through the same move.&lt;/p&gt;

&lt;p&gt;"This multi-step job survives a crash" used to be a badge of engineering maturity buried inside every serious backend system. Now it is increasingly an infrastructure property. You can install a library, run a platform, or pay for a managed service.&lt;/p&gt;

&lt;p&gt;That is good. Fewer teams need to rediscover failure modes from first principles. More workflows can have explicit state instead of vibes. Scheduled sweeps, onboarding flows, subscription activation, refunds, identity checks, and cleanup jobs can stop depending on the fantasy that processes die only at convenient times.&lt;/p&gt;

&lt;p&gt;But it also raises the bar for engineering judgment.&lt;/p&gt;

&lt;p&gt;If durability is easy to add, teams will add it to things that should have stayed simple. If every background job becomes a workflow, you can create a system that is reliable but hard to reason about.&lt;/p&gt;

&lt;p&gt;The question is not "should we use DBOS or Temporal for everything?"&lt;/p&gt;

&lt;p&gt;The question is "which business processes deserve durable execution, and who owns the semantics when they resume?"&lt;/p&gt;

&lt;p&gt;That is a better question than "how many cron retries should we add?"&lt;/p&gt;

&lt;p&gt;And it is where the work belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/blog/postgres-is-all-you-need-for-durable-execution" rel="noopener noreferrer"&gt;DBOS, Postgres-backed Durable Workflow Execution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/dbos-pricing" rel="noopener noreferrer"&gt;DBOS pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://temporal.io/" rel="noopener noreferrer"&gt;Temporal, Durable Execution Solutions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/cloud/pricing" rel="noopener noreferrer"&gt;Temporal Cloud pricing documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>opinion</category>
      <category>devops</category>
    </item>
    <item>
      <title>DBOS and the shrinking cost of durable workflows</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Wed, 05 Aug 2026 09:09:42 +0000</pubDate>
      <link>https://dev.to/pvgomes/dbos-and-the-shrinking-cost-of-durable-workflows-44kh</link>
      <guid>https://dev.to/pvgomes/dbos-and-the-shrinking-cost-of-durable-workflows-44kh</guid>
      <description>&lt;p&gt;The annoying failure is not the one where everything dies before anything important happens. That one is clean. You retry the job, or the user clicks again, or the scheduler runs next minute. Fine.&lt;/p&gt;

&lt;p&gt;The real failure is the one where the process dies after step 3.&lt;/p&gt;

&lt;p&gt;Step 1 created the customer record. Step 2 reserved something. Step 3 moved money, activated a subscription, sent a document, or called an external provider that will not forget what you asked it to do. Then the worker disappears. Kubernetes evicts the pod. The VM restarts. A deployment kills the process. Someone discovers that "stateless service" was more aspiration than architecture.&lt;/p&gt;

&lt;p&gt;Now what? If you restart the job, you might charge twice. If you skip it, the customer is stuck halfway through activation. If you manually repair it, congratulations, you invented an operations queue with anxiety as the UI.&lt;/p&gt;

&lt;p&gt;This is the problem durable execution is trying to make boring.&lt;/p&gt;

&lt;p&gt;Not easy. Boring.&lt;/p&gt;

&lt;h2&gt;
  
  
  we used to build this ourselves
&lt;/h2&gt;

&lt;p&gt;In fintech, this shows up everywhere because workflows are longer than a request and more fragile than the happy path diagram.&lt;/p&gt;

&lt;p&gt;At a fintech in the Americas, the answer was the one many serious backend teams reached: sagas, Kafka, idempotency keys, state tables, retries, reconciliation jobs, and discipline.&lt;/p&gt;

&lt;p&gt;That architecture was not dumb. It was right for its time.&lt;/p&gt;

&lt;p&gt;You split a process into steps. Each step publishes an event or writes state. Commands carry idempotency keys. External calls have deduplication at the boundary when possible. Reconciliation jobs scan for weird states later because you know the system will find one. Everyone learns that "at least once" is not a delivery guarantee, it is a personality test.&lt;/p&gt;

&lt;p&gt;The hard part was never only writing the saga. The hard part was owning it.&lt;/p&gt;

&lt;p&gt;You had to decide what state meant, which failures should pause, which should compensate, and which should page a human. You had to keep idempotency keys flowing across service boundaries. You had to make sure a step that looked atomic in code was atomic in the business.&lt;/p&gt;

&lt;p&gt;And because the mechanism was hand-rolled, every team ended up owning some version of the same machinery.&lt;/p&gt;

&lt;p&gt;One team had an orchestration table. Another had choreography over Kafka topics. Another had a cron that repaired half-completed rows. All of this worked, until it did not, and then the organizational memory lived in the heads of the people who had been burned before.&lt;/p&gt;

&lt;p&gt;This is why DBOS and Temporal are interesting to me. They did not invent the idea that a workflow should survive a crash. They productize the control-plane part we used to rebuild.&lt;/p&gt;

&lt;h2&gt;
  
  
  what DBOS changes
&lt;/h2&gt;

&lt;p&gt;I first paid attention to DBOS while looking at subscription activation workflows and scheduled sweeps at a bank I work with now in the Gulf. The storage model caught my eye.&lt;/p&gt;

&lt;p&gt;DBOS Transact makes workflows durable by checkpointing completed steps in Postgres. If the process crashes, the restarted app can resume from the last completed step.&lt;/p&gt;

&lt;p&gt;It also changes the adoption shape. DBOS is not asking every team to operate a separate workflow cluster before they get durability. The open-source Transact libraries are positioned as application-adjacent durable execution built on Postgres-compatible storage. Their material still says the state can live in your application database. DBOS also sells the control-plane layer, with paid plans priced around users, applications, and checkpoint volume.&lt;/p&gt;

&lt;p&gt;That matters because the first objection to workflow engines is often operational weight. DBOS is aiming at the space where you want crash recovery, durable queues, scheduled work, and observability without turning every service into research.&lt;/p&gt;

&lt;p&gt;The tradeoff is clear. If durable execution metadata is in Postgres, Postgres becomes part of the runtime. That can be a feature or a coupling point. You get simpler ownership and queryability, but you still need to understand retention, migrations, backups, and the blast radius of putting workflow history near application data.&lt;/p&gt;

&lt;p&gt;No free lunch. Fewer moving parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  what Temporal gives you
&lt;/h2&gt;

&lt;p&gt;Temporal has a different shape.&lt;/p&gt;

&lt;p&gt;Temporal gives you a durable execution platform where workflows are recorded as event histories. A workflow can run for seconds, days, or years, and the service persists the events needed to recover and continue. Activities run outside deterministic workflow logic. The SDK replays workflow history to rebuild state.&lt;/p&gt;

&lt;p&gt;That model is powerful when the workflow is long-lived, crosses services, and needs signals, timers, retries, versioning, and a strong operational surface.&lt;/p&gt;

&lt;p&gt;Temporal Cloud pricing also makes the product shape explicit. It is a managed platform priced around Actions, active storage, retained storage, and support. You are buying a durable execution control plane.&lt;/p&gt;

&lt;p&gt;That is a reasonable deal for many teams. It is also a real platform decision. Once Temporal is in the middle of a process, someone owns namespaces, workers, task queues, retry policies, versioning, security, and cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  the hard part stayed yours
&lt;/h2&gt;

&lt;p&gt;Here is the part that people sometimes skip when durable execution gets exciting.&lt;/p&gt;

&lt;p&gt;A framework can remember that step 3 completed. It cannot tell you whether step 3 was the right boundary.&lt;/p&gt;

&lt;p&gt;If step 3 called a payment provider, did the provider accept an idempotency key? If the network timed out, did the payment happen or not? If the workflow resumes tomorrow, should it retry, query the provider, compensate the customer, or stop for manual review?&lt;/p&gt;

&lt;p&gt;Durable execution makes these questions visible. It does not answer them for you.&lt;/p&gt;

&lt;p&gt;That visibility is useful. In hand-rolled systems, step boundaries often leak across topic names, retry loops, database rows, and tribal knowledge. In DBOS or Temporal, you are forced to make the workflow shape explicit. You name the step. You decide what gets checkpointed, what is safe to replay, and what must never be replayed.&lt;/p&gt;

&lt;p&gt;That is the real design work.&lt;/p&gt;

&lt;p&gt;Not "how do I keep a process alive forever?" The question is, "what does it mean for this business action to have happened?"&lt;/p&gt;

&lt;p&gt;That is why fintech engineers get twitchy about retries. Retry is not a technical verb when money is involved. It can mean "try the HTTP call again." It can also mean "charge twice."&lt;/p&gt;

&lt;p&gt;The boundary matters.&lt;/p&gt;

&lt;p&gt;So does ownership. A durable workflow that crosses payments, subscriptions, notifications, and compliance is not owned by the framework. It is owned by a team, or by nobody.&lt;/p&gt;

&lt;h2&gt;
  
  
  durability became a purchasable property
&lt;/h2&gt;

&lt;p&gt;The wider pattern is the interesting one.&lt;/p&gt;

&lt;p&gt;A lot of backend engineering is the history of boring properties becoming products. We used to build deployment scripts. Then deployment became a platform property. We used to hand-roll metrics pipelines. Then observability became a product category. Some teams still build these things, for good reasons. But the default shifted.&lt;/p&gt;

&lt;p&gt;Durable execution is going through the same move.&lt;/p&gt;

&lt;p&gt;"This multi-step job survives a crash" used to be a badge of engineering maturity buried inside every serious backend system. Now it is increasingly an infrastructure property. You can install a library, run a platform, or pay for a managed service.&lt;/p&gt;

&lt;p&gt;That is good. Fewer teams need to rediscover failure modes from first principles. More workflows can have explicit state instead of vibes. Scheduled sweeps, onboarding flows, subscription activation, refunds, identity checks, and cleanup jobs can stop depending on the fantasy that processes die only at convenient times.&lt;/p&gt;

&lt;p&gt;But it also raises the bar for engineering judgment.&lt;/p&gt;

&lt;p&gt;If durability is easy to add, teams will add it to things that should have stayed simple. If every background job becomes a workflow, you can create a system that is reliable but hard to reason about.&lt;/p&gt;

&lt;p&gt;The question is not "should we use DBOS or Temporal for everything?"&lt;/p&gt;

&lt;p&gt;The question is "which business processes deserve durable execution, and who owns the semantics when they resume?"&lt;/p&gt;

&lt;p&gt;That is a better question than "how many cron retries should we add?"&lt;/p&gt;

&lt;p&gt;And it is where the work belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/blog/postgres-is-all-you-need-for-durable-execution" rel="noopener noreferrer"&gt;DBOS, Postgres-backed Durable Workflow Execution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/dbos-pricing" rel="noopener noreferrer"&gt;DBOS pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://temporal.io/" rel="noopener noreferrer"&gt;Temporal, Durable Execution Solutions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/cloud/pricing" rel="noopener noreferrer"&gt;Temporal Cloud pricing documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>durableexecution</category>
      <category>dbos</category>
      <category>temporal</category>
      <category>distributedsystems</category>
    </item>
    <item>
      <title>Gateway API is the Kubernetes network contract now</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Wed, 05 Aug 2026 00:03:50 +0000</pubDate>
      <link>https://dev.to/pvgomes/gateway-api-is-the-kubernetes-network-contract-now-4297</link>
      <guid>https://dev.to/pvgomes/gateway-api-is-the-kubernetes-network-contract-now-4297</guid>
      <description>&lt;p&gt;Kubernetes networking has spent years doing something very Kubernetes: taking a simple idea, wrapping it in twelve implementation details, and then asking everyone to be calm because there is an annotation for that.&lt;/p&gt;

&lt;p&gt;Ingress was supposed to be the friendly front door. In practice, it became a shared fiction with different controllers, different annotations, different load balancer behaviors, and different levels of "works on my cluster" energy.&lt;/p&gt;

&lt;p&gt;This is why Gateway API v1.6 caught my attention.&lt;/p&gt;

&lt;p&gt;Not because TCPRoute and UDPRoute graduating to Standard is the kind of news that makes normal people cancel dinner plans.&lt;/p&gt;

&lt;p&gt;It is interesting because Kubernetes networking is finally admitting the real problem:&lt;/p&gt;

&lt;p&gt;Networking is not one object owned by one team.&lt;/p&gt;

&lt;p&gt;It is a contract between platform engineers, network operators, security people, application teams, and the poor person holding the incident phone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapx6f29x7ibau69ccxs4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapx6f29x7ibau69ccxs4.gif" alt="the ingress annotation spreadsheet getting one more column" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gateway API v1.6 makes TCPRoute and UDPRoute Standard in the &lt;code&gt;v1&lt;/code&gt; API. The release also moves experimental APIs into a clearer separate group, &lt;code&gt;gateway.networking.x-k8s.io&lt;/code&gt;, so teams can see the line between stable contract and "please do not bet payroll on this yet."&lt;/p&gt;

&lt;p&gt;That sounds like API housekeeping.&lt;/p&gt;

&lt;p&gt;It is actually platform governance wearing a YAML hat.&lt;/p&gt;

&lt;h2&gt;
  
  
  ingress was too small for the job
&lt;/h2&gt;

&lt;p&gt;Ingress was useful. I am not here to pretend we all imagined it. For a simple HTTP service, host, path, TLS secret, backend service, done. Great.&lt;/p&gt;

&lt;p&gt;Then production arrived.&lt;/p&gt;

&lt;p&gt;Someone needed redirects. Someone needed header matching. Someone needed gRPC. Someone needed traffic splitting. Someone needed cross-namespace routing. Someone needed TCP because not everything in life is an HTTP endpoint with a tidy JSON body. Someone needed UDP because DNS, games, voice, and other inconvenient realities exist.&lt;/p&gt;

&lt;p&gt;The answer became annotations.&lt;/p&gt;

&lt;p&gt;Annotations are fine when they are metadata. They are less fine when they become a shadow API where every controller has its own dialect and every migration requires reading the controller docs like ancient cave paintings.&lt;/p&gt;

&lt;p&gt;You can build serious systems with annotations. Many teams did. But the contract is weak. The Kubernetes API says one thing, the controller-specific behavior says another thing, and the real platform behavior lives in tribal knowledge, Helm values, and a wiki page last updated by someone who now works somewhere else.&lt;/p&gt;

&lt;p&gt;Gateway API exists because service networking needs a richer model than "here is an Ingress, good luck."&lt;/p&gt;

&lt;h2&gt;
  
  
  roles matter more than objects
&lt;/h2&gt;

&lt;p&gt;The best part of Gateway API is not a specific route kind. It is the role model.&lt;/p&gt;

&lt;p&gt;A platform team can own &lt;code&gt;GatewayClass&lt;/code&gt;, deciding which implementation exists and how it is configured.&lt;/p&gt;

&lt;p&gt;An infrastructure or network team can own &lt;code&gt;Gateway&lt;/code&gt;, deciding where traffic enters and what listeners exist.&lt;/p&gt;

&lt;p&gt;Application teams can own &lt;code&gt;HTTPRoute&lt;/code&gt;, &lt;code&gt;GRPCRoute&lt;/code&gt;, &lt;code&gt;TCPRoute&lt;/code&gt;, or &lt;code&gt;UDPRoute&lt;/code&gt;, describing how their traffic should attach to that entry point.&lt;/p&gt;

&lt;p&gt;Security can care about which namespaces are allowed to bind to which listeners and what cross-namespace references are allowed.&lt;/p&gt;

&lt;p&gt;This is not just prettier YAML. This is the shape of the organization finally showing up in the API.&lt;/p&gt;

&lt;p&gt;That matters because most Kubernetes networking incidents are not caused by nobody knowing how packets work. They are caused by ownership being blurry.&lt;/p&gt;

&lt;p&gt;Who is allowed to expose a service?&lt;/p&gt;

&lt;p&gt;Who approves a public hostname?&lt;/p&gt;

&lt;p&gt;Who owns TLS policy?&lt;/p&gt;

&lt;p&gt;Who can route traffic across namespaces?&lt;/p&gt;

&lt;p&gt;Who knows whether the load balancer behavior differs between dev and prod?&lt;/p&gt;

&lt;p&gt;If the answer is "whoever found the right annotation first," congratulations, you have invented networking roulette.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhzgu3hiae5nlit5zn7l.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhzgu3hiae5nlit5zn7l.gif" alt="platform team discovering the network contract was hidden in annotations" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gateway API is useful because it makes those boundaries easier to express as Kubernetes resources instead of hallway negotiations with &lt;code&gt;kubectl&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  tcp and udp graduating is a big deal
&lt;/h2&gt;

&lt;p&gt;The v1.6 headline is TCPRoute and UDPRoute graduating to Standard.&lt;/p&gt;

&lt;p&gt;That is not glamorous. It is better than glamorous. It is boring in the way infrastructure should aspire to be.&lt;/p&gt;

&lt;p&gt;HTTP gets the attention because it is where most web teams live. But platform teams know the cluster is full of protocols that do not fit cleanly into HTTP routing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;database proxies&lt;/li&gt;
&lt;li&gt;Redis or Memcached&lt;/li&gt;
&lt;li&gt;MQTT&lt;/li&gt;
&lt;li&gt;DNS&lt;/li&gt;
&lt;li&gt;custom TCP protocols&lt;/li&gt;
&lt;li&gt;UDP services&lt;/li&gt;
&lt;li&gt;legacy systems that survived because nobody was brave enough to ask why&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before Gateway API matures across these protocols, teams often end up with side paths. Some traffic uses Ingress. Some uses Service &lt;code&gt;LoadBalancer&lt;/code&gt;. Some uses controller-specific CRDs. Some uses a cloud load balancer configured outside the cluster. Some uses Terraform, prayer, and a diagram with three arrows labeled "network."&lt;/p&gt;

&lt;p&gt;That fragmentation is expensive.&lt;/p&gt;

&lt;p&gt;Not always in cloud bill terms, although give it time. It is expensive in reasoning. During an incident, nobody wants to ask five systems where traffic might be going. They want one control plane, or at least one contract that explains the different routes.&lt;/p&gt;

&lt;p&gt;TCPRoute and UDPRoute reaching Standard says layer 4 routing is no longer a side quest. It belongs in the Kubernetes networking contract too.&lt;/p&gt;

&lt;h2&gt;
  
  
  standard and experimental should be visibly different
&lt;/h2&gt;

&lt;p&gt;I also like the experimental API group separation more than I expected.&lt;/p&gt;

&lt;p&gt;Experimental features are not bad. They are how platforms grow. But the problem is when experiments look almost exactly like stable APIs until they break under you.&lt;/p&gt;

&lt;p&gt;The new &lt;code&gt;gateway.networking.x-k8s.io&lt;/code&gt; group makes the risk more visible. That is healthy.&lt;/p&gt;

&lt;p&gt;Engineers are adults. Mostly. Let them use experimental features when the trade-off is worth it. But make the choice explicit. Put it in code review. Put it in the platform policy. Put it in the upgrade checklist.&lt;/p&gt;

&lt;p&gt;If a team wants an experimental route feature for an internal tool, fine.&lt;/p&gt;

&lt;p&gt;If a team wants it for card authorization traffic on Black Friday, maybe open a second tab and reconsider your life choices.&lt;/p&gt;

&lt;p&gt;The important thing is not banning experiments. The important thing is keeping experimental contracts from silently becoming production foundations.&lt;/p&gt;

&lt;h2&gt;
  
  
  portability is still not magic
&lt;/h2&gt;

&lt;p&gt;Gateway API is often described as portable. That is good, but we should not turn portability into another comforting lie.&lt;/p&gt;

&lt;p&gt;Portable does not mean every implementation behaves identically in every environment. Load balancers still have personalities. Cloud networks still have limits. Controllers still differ in supported features. TLS, health checks, source IP behavior, cross-zone traffic, and observability can still surprise you.&lt;/p&gt;

&lt;p&gt;The contract gets better. The work does not disappear.&lt;/p&gt;

&lt;p&gt;A serious platform team should still ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which Gateway API resources are supported by our implementation?&lt;/li&gt;
&lt;li&gt;Which features are Core, Extended, or implementation-specific?&lt;/li&gt;
&lt;li&gt;How do we test routes before production?&lt;/li&gt;
&lt;li&gt;Who owns upgrades of the Gateway API CRDs?&lt;/li&gt;
&lt;li&gt;What metrics prove traffic is going where we think it is going?&lt;/li&gt;
&lt;li&gt;What is the rollback path if a route change behaves badly?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There it is again. Evidence. Ownership. Rollback. The usual boring friends.&lt;/p&gt;

&lt;p&gt;Gateway API gives teams a cleaner place to put the network contract. It does not make the contract self-enforcing by magic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zes1vulm86130bvp1o0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zes1vulm86130bvp1o0.gif" alt="the route worked in staging, so naturally production had opinions" width="498" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  the platform lesson
&lt;/h2&gt;

&lt;p&gt;The bigger story is that Kubernetes keeps moving from "here are primitives" toward "here are shared contracts."&lt;/p&gt;

&lt;p&gt;That is what mature platform work looks like.&lt;/p&gt;

&lt;p&gt;A cluster is not just a place where pods run. It is a place where many teams negotiate identity, traffic, policy, cost, observability, upgrades, and failure boundaries.&lt;/p&gt;

&lt;p&gt;The primitive-only version says:&lt;/p&gt;

&lt;p&gt;"Create an Ingress and add these annotations."&lt;/p&gt;

&lt;p&gt;The platform-contract version says:&lt;/p&gt;

&lt;p&gt;"This Gateway is the approved public entry point. These listeners are owned by the platform team. These namespaces can attach routes. These route kinds are stable. These features are experimental. These metrics and alerts prove the path is healthy. These changes require review."&lt;/p&gt;

&lt;p&gt;Less exciting. More useful.&lt;/p&gt;

&lt;p&gt;This is why Gateway API v1.6 matters. TCPRoute and UDPRoute becoming Standard is not just about supporting more protocols. It is about reducing the number of weird escape hatches teams need when reality does not fit HTTP.&lt;/p&gt;

&lt;p&gt;And the clearer experimental boundary is not just cleanup. It helps teams avoid accidentally treating tomorrow's idea as today's production contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  what I would do now
&lt;/h2&gt;

&lt;p&gt;If I owned a Kubernetes platform today, I would not rewrite every ingress next week because a blog post happened. That is how platform teams create migrations that nobody asked for and then act surprised when application teams hide.&lt;/p&gt;

&lt;p&gt;I would do something smaller and more useful.&lt;/p&gt;

&lt;p&gt;First, inventory current ingress and load balancer patterns. Find the annotation zoo. Find the controller-specific features. Find the services bypassing the main path.&lt;/p&gt;

&lt;p&gt;Second, pick one Gateway API implementation already aligned with the platform direction. Do not make this a beauty contest with twelve vendors and a scoring spreadsheet from the land of eternal meetings.&lt;/p&gt;

&lt;p&gt;Third, define ownership. Who creates GatewayClasses? Who owns Gateways? Who approves Routes? Who can attach across namespaces? Who reviews experimental features?&lt;/p&gt;

&lt;p&gt;Fourth, migrate the next new service first. New contracts are easier when you are not also moving the old mess under pressure.&lt;/p&gt;

&lt;p&gt;Fifth, measure it like production. Route status, listener health, backend failures, certificate issues, rejected attachments, and controller errors should be visible without someone spelunking through events at 2 a.m.&lt;/p&gt;

&lt;p&gt;Gateway API is not "Ingress 2.0" in the lazy sense.&lt;/p&gt;

&lt;p&gt;It is the Kubernetes network contract growing up.&lt;/p&gt;

&lt;p&gt;That is not as catchy as a new dashboard screenshot, but it is much more valuable.&lt;/p&gt;

&lt;p&gt;Because the real win is not that we get another API object.&lt;/p&gt;

&lt;p&gt;The real win is that fewer critical networking decisions have to live in annotations, controller folklore, and one senior engineer's memory.&lt;/p&gt;

&lt;p&gt;That engineer deserves a vacation.&lt;/p&gt;

&lt;p&gt;The cluster deserves a contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/blog/2026/08/03/gateway-api-v1-6-release/" rel="noopener noreferrer"&gt;Kubernetes Blog: Gateway API v1.6: TCPRoute and UDPRoute Graduate to Standard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway-api.sigs.k8s.io/docs/" rel="noopener noreferrer"&gt;Gateway API documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway-api.sigs.k8s.io/concepts/roles-and-personas/" rel="noopener noreferrer"&gt;Gateway API roles and personas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway-api.sigs.k8s.io/reference/api-spec/1.6/" rel="noopener noreferrer"&gt;Gateway API v1.6 API reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>networking</category>
      <category>gatewayapi</category>
      <category>platformengineering</category>
    </item>
    <item>
      <title>durable execution is something you install</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Tue, 04 Aug 2026 15:02:50 +0000</pubDate>
      <link>https://dev.to/pvgomes/durable-execution-is-something-you-install-1b5j</link>
      <guid>https://dev.to/pvgomes/durable-execution-is-something-you-install-1b5j</guid>
      <description>&lt;p&gt;A process starts a multi-step job. Step 1 validates the customer. Step 2 creates an internal record. Step 3 moves money, changes a subscription, sends an irreversible request to a partner, or does whatever your business considers serious. Then the process dies.&lt;/p&gt;

&lt;p&gt;Not politely.&lt;/p&gt;

&lt;p&gt;The container gets killed. The deploy rolls. The host disappears. The worker restarts halfway through the thing it was doing.&lt;/p&gt;

&lt;p&gt;Now the question is simple and horrible:&lt;/p&gt;

&lt;p&gt;What happens when it runs again?&lt;/p&gt;

&lt;p&gt;If step 3 already happened, restarting from step 1 may duplicate something expensive. If you skip too much, you may leave the customer in a half-activated state. If you retry blindly, the external provider may accept the same request twice.&lt;/p&gt;

&lt;p&gt;This is the shape of a lot of fintech work. Account opening, subscription activation, credit disbursement, repayment settlement, KYC refreshes, scheduled sweeps, ledger posting. They are not one database transaction. They are small business stories pretending to be function calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  the old answer was discipline
&lt;/h2&gt;

&lt;p&gt;At a fintech on the American continent, the public architecture story was event-driven: Kafka, services, async processing, consistency through events, and careful thinking around idempotency. That style makes sense in a bank-sized environment.&lt;/p&gt;

&lt;p&gt;But the boring part of the work was never just "publish an event." The real work was deciding what each step meant, which message was the source of truth, how to identify duplicates, how to make consumers safe to replay, and how to compensate for something that had already crossed a boundary.&lt;/p&gt;

&lt;p&gt;You ended up with sagas, state machines, idempotency keys, outbox tables, retry topics, reconciliation jobs, audit trails, dashboards, alerts, and runbooks.&lt;/p&gt;

&lt;p&gt;That is not a criticism. In serious financial systems, this discipline is part of the job. You cannot hand-wave around money by saying "the queue is eventually consistent" and then go for lunch.&lt;/p&gt;

&lt;p&gt;But there is an operational cost to owning the mechanism. Every team has to remember the same failure modes. Every new workflow has to rebuild the same scaffolding. Every incident asks: did the step finish, did the event publish, did the retry duplicate it, and is the customer state now real?&lt;/p&gt;

&lt;p&gt;The painful thing is that most of this machinery is not product-specific.&lt;/p&gt;

&lt;p&gt;The compensation logic is product-specific. The step boundaries are product-specific. The decision that a transfer can be retried but a partner call needs an idempotency key is product-specific. But "remember completed step 3 after the worker crashes" is plumbing.&lt;/p&gt;

&lt;p&gt;And plumbing eventually becomes a product.&lt;/p&gt;

&lt;h2&gt;
  
  
  dbos and temporal change the default
&lt;/h2&gt;

&lt;p&gt;This is why frameworks like DBOS and Temporal are worth paying attention to, even if you do not adopt either tomorrow.&lt;/p&gt;

&lt;p&gt;Temporal's model is built around workflows and activities. The Temporal service stores a durable event history for each workflow execution. When a worker crashes or restarts, workflow code can be replayed from history, and completed activities are not simply repeated. The service has a record of what happened.&lt;/p&gt;

&lt;p&gt;DBOS takes a different product shape. DBOS Transact is positioned as an open-source library that runs inside your application. The current DBOS site still says Transact uses your existing Postgres database to store and recover workflow state and execution history. Their paid model is around DBOS Conductor, tooling, support, and hosting options, with Pro and Teams plans priced around checkpoint usage.&lt;/p&gt;

&lt;p&gt;That difference matters.&lt;/p&gt;

&lt;p&gt;Temporal asks you to run, or pay for, a workflow service. Temporal Cloud pricing is consumption-based, mostly around actions and storage. The minimum Cloud plan is currently listed at $100/month.&lt;/p&gt;

&lt;p&gt;DBOS is making a more Postgres-native bet. The open-source library gives you durable workflows in application code, while Conductor adds operational tooling like monitoring, recovery, versioning, alerts, and support.&lt;/p&gt;

&lt;p&gt;The interesting bit is that both package the same formerly internal capability:&lt;/p&gt;

&lt;p&gt;This multi-step job survives process death.&lt;/p&gt;

&lt;p&gt;That sentence used to imply bespoke platform work. Now it can start with a framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  the hard part did not disappear
&lt;/h2&gt;

&lt;p&gt;There is a trap here, and it is exactly the trap that appears every time infrastructure gets better.&lt;/p&gt;

&lt;p&gt;People confuse "the framework remembers what happened" with "the system now knows what should happen."&lt;/p&gt;

&lt;p&gt;It does not.&lt;/p&gt;

&lt;p&gt;If a workflow charges a customer, activates a subscription, provisions access, sends an email, and updates analytics, the framework can help make that workflow resumable. It can record step completion, retry activities, show where execution stopped, and make the history visible instead of buried inside logs.&lt;/p&gt;

&lt;p&gt;But it cannot tell you whether charging the customer should happen before activation or after activation.&lt;/p&gt;

&lt;p&gt;It cannot tell you whether a failed activation should trigger a refund, a retry, a manual review, or a grace period. It cannot tell you whether a partner API is actually idempotent just because it accepts an idempotency key. It cannot tell you whether your "step" is one business action or three business actions wearing a trench coat.&lt;/p&gt;

&lt;p&gt;That is still design work.&lt;/p&gt;

&lt;p&gt;At a fintech in the Gulf I work with now, this comes up in normal product workflows. A scheduled sweep is not interesting because a timer fired. It is interesting because the system needs to know which accounts were considered, which ones were skipped, which external calls succeeded, and what should happen when the process wakes up after a deploy.&lt;/p&gt;

&lt;p&gt;Durable execution helps a lot there. A completed step recorded in Postgres is much better than a log line and a prayer. A workflow console is better than SSH-ing into a worker for clues. But the useful conversation shifts upward.&lt;/p&gt;

&lt;p&gt;Instead of asking, "how do we build the retry table?", the team asks, "where is the boundary where retry becomes compensation?" Instead of asking, "how do we resume after a crash?", the team asks, "what does resumed mean for this customer?"&lt;/p&gt;

&lt;p&gt;That is a better use of engineering time.&lt;/p&gt;

&lt;h2&gt;
  
  
  idempotency still lives at the edges
&lt;/h2&gt;

&lt;p&gt;One thing I would be careful about in any durable execution pitch is idempotency.&lt;/p&gt;

&lt;p&gt;Inside the framework boundary, you may get very strong guarantees. Completed workflow steps can be recorded. Activity results can be remembered. Retries can be controlled. Execution can resume after a crash.&lt;/p&gt;

&lt;p&gt;At the external boundary, reality is messier.&lt;/p&gt;

&lt;p&gt;Payment providers, banking partners, email systems, identity vendors, and card processors all have their own ideas about duplicate requests. Some support idempotency well. Some support it in documentation. Some support it until a timeout happens between their side effect and your response.&lt;/p&gt;

&lt;p&gt;Boundary calls still need stable request identifiers, provider references, and reconciliation. You still need to know whether a timeout means "nothing happened", "something happened but you did not see it", or "check later."&lt;/p&gt;

&lt;p&gt;Durable execution reduces the number of places where that logic leaks.&lt;/p&gt;

&lt;p&gt;It does not repeal distributed systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  the wider pattern
&lt;/h2&gt;

&lt;p&gt;The reason I like this category is that it fits a pattern that keeps repeating in software. At first, a reliability property is craft. A strong team builds it internally because they have no choice. Then enough teams hit the same pain, and the property becomes a product.&lt;/p&gt;

&lt;p&gt;Observability did this. Feature flags did this. Secrets management did this. CI/CD did this. Policy-as-code did this. Now durable execution is doing it.&lt;/p&gt;

&lt;p&gt;The boring control-plane property becomes something you can buy, install, or outsource.&lt;/p&gt;

&lt;p&gt;That is good. I do not miss every team building its own mini workflow engine by accident.&lt;/p&gt;

&lt;p&gt;But the job does not vanish. It moves.&lt;/p&gt;

&lt;p&gt;The value is no longer proving that your worker can survive a restart. The value is deciding which workflows deserve durability, which steps are atomic from the business point of view, which failures should retry, which failures should compensate, and who owns the customer outcome.&lt;/p&gt;

&lt;p&gt;That is where durable execution gets interesting.&lt;/p&gt;

&lt;p&gt;Not because DBOS or Temporal make failure disappear.&lt;/p&gt;

&lt;p&gt;Because they make the failure visible enough that we can stop pretending the hard part was the retry loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/dbos-transact" rel="noopener noreferrer"&gt;DBOS Transact&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/dbos-pricing" rel="noopener noreferrer"&gt;DBOS Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/workflow-execution/event" rel="noopener noreferrer"&gt;Temporal Event History documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/cloud/pricing" rel="noopener noreferrer"&gt;Temporal Cloud pricing documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>opinion</category>
      <category>devops</category>
    </item>
    <item>
      <title>durable execution is something you install</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Tue, 04 Aug 2026 14:02:20 +0000</pubDate>
      <link>https://dev.to/pvgomes/durable-execution-is-something-you-install-jfe</link>
      <guid>https://dev.to/pvgomes/durable-execution-is-something-you-install-jfe</guid>
      <description>&lt;p&gt;A process starts a multi-step job. Step 1 validates the customer. Step 2 creates an internal record. Step 3 moves money, changes a subscription, sends an irreversible request to a partner, or does whatever your business considers serious. Then the process dies.&lt;/p&gt;

&lt;p&gt;Not politely.&lt;/p&gt;

&lt;p&gt;The container gets killed. The deploy rolls. The host disappears. The worker restarts halfway through the thing it was doing.&lt;/p&gt;

&lt;p&gt;Now the question is simple and horrible:&lt;/p&gt;

&lt;p&gt;What happens when it runs again?&lt;/p&gt;

&lt;p&gt;If step 3 already happened, restarting from step 1 may duplicate something expensive. If you skip too much, you may leave the customer in a half-activated state. If you retry blindly, the external provider may accept the same request twice.&lt;/p&gt;

&lt;p&gt;This is the shape of a lot of fintech work. Account opening, subscription activation, credit disbursement, repayment settlement, KYC refreshes, scheduled sweeps, ledger posting. They are not one database transaction. They are small business stories pretending to be function calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  the old answer was discipline
&lt;/h2&gt;

&lt;p&gt;At a fintech on the American continent, the public architecture story was event-driven: Kafka, services, async processing, consistency through events, and careful thinking around idempotency. That style makes sense in a bank-sized environment.&lt;/p&gt;

&lt;p&gt;But the boring part of the work was never just "publish an event." The real work was deciding what each step meant, which message was the source of truth, how to identify duplicates, how to make consumers safe to replay, and how to compensate for something that had already crossed a boundary.&lt;/p&gt;

&lt;p&gt;You ended up with sagas, state machines, idempotency keys, outbox tables, retry topics, reconciliation jobs, audit trails, dashboards, alerts, and runbooks.&lt;/p&gt;

&lt;p&gt;That is not a criticism. In serious financial systems, this discipline is part of the job. You cannot hand-wave around money by saying "the queue is eventually consistent" and then go for lunch.&lt;/p&gt;

&lt;p&gt;But there is an operational cost to owning the mechanism. Every team has to remember the same failure modes. Every new workflow has to rebuild the same scaffolding. Every incident asks: did the step finish, did the event publish, did the retry duplicate it, and is the customer state now real?&lt;/p&gt;

&lt;p&gt;The painful thing is that most of this machinery is not product-specific.&lt;/p&gt;

&lt;p&gt;The compensation logic is product-specific. The step boundaries are product-specific. The decision that a transfer can be retried but a partner call needs an idempotency key is product-specific. But "remember completed step 3 after the worker crashes" is plumbing.&lt;/p&gt;

&lt;p&gt;And plumbing eventually becomes a product.&lt;/p&gt;

&lt;h2&gt;
  
  
  dbos and temporal change the default
&lt;/h2&gt;

&lt;p&gt;This is why frameworks like DBOS and Temporal are worth paying attention to, even if you do not adopt either tomorrow.&lt;/p&gt;

&lt;p&gt;Temporal's model is built around workflows and activities. The Temporal service stores a durable event history for each workflow execution. When a worker crashes or restarts, workflow code can be replayed from history, and completed activities are not simply repeated. The service has a record of what happened.&lt;/p&gt;

&lt;p&gt;DBOS takes a different product shape. DBOS Transact is positioned as an open-source library that runs inside your application. The current DBOS site still says Transact uses your existing Postgres database to store and recover workflow state and execution history. Their paid model is around DBOS Conductor, tooling, support, and hosting options, with Pro and Teams plans priced around checkpoint usage.&lt;/p&gt;

&lt;p&gt;That difference matters.&lt;/p&gt;

&lt;p&gt;Temporal asks you to run, or pay for, a workflow service. Temporal Cloud pricing is consumption-based, mostly around actions and storage. The minimum Cloud plan is currently listed at $100/month.&lt;/p&gt;

&lt;p&gt;DBOS is making a more Postgres-native bet. The open-source library gives you durable workflows in application code, while Conductor adds operational tooling like monitoring, recovery, versioning, alerts, and support.&lt;/p&gt;

&lt;p&gt;The interesting bit is that both package the same formerly internal capability:&lt;/p&gt;

&lt;p&gt;This multi-step job survives process death.&lt;/p&gt;

&lt;p&gt;That sentence used to imply bespoke platform work. Now it can start with a framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  the hard part did not disappear
&lt;/h2&gt;

&lt;p&gt;There is a trap here, and it is exactly the trap that appears every time infrastructure gets better.&lt;/p&gt;

&lt;p&gt;People confuse "the framework remembers what happened" with "the system now knows what should happen."&lt;/p&gt;

&lt;p&gt;It does not.&lt;/p&gt;

&lt;p&gt;If a workflow charges a customer, activates a subscription, provisions access, sends an email, and updates analytics, the framework can help make that workflow resumable. It can record step completion, retry activities, show where execution stopped, and make the history visible instead of buried inside logs.&lt;/p&gt;

&lt;p&gt;But it cannot tell you whether charging the customer should happen before activation or after activation.&lt;/p&gt;

&lt;p&gt;It cannot tell you whether a failed activation should trigger a refund, a retry, a manual review, or a grace period. It cannot tell you whether a partner API is actually idempotent just because it accepts an idempotency key. It cannot tell you whether your "step" is one business action or three business actions wearing a trench coat.&lt;/p&gt;

&lt;p&gt;That is still design work.&lt;/p&gt;

&lt;p&gt;At a fintech in the Gulf I work with now, this comes up in normal product workflows. A scheduled sweep is not interesting because a timer fired. It is interesting because the system needs to know which accounts were considered, which ones were skipped, which external calls succeeded, and what should happen when the process wakes up after a deploy.&lt;/p&gt;

&lt;p&gt;Durable execution helps a lot there. A completed step recorded in Postgres is much better than a log line and a prayer. A workflow console is better than SSH-ing into a worker for clues. But the useful conversation shifts upward.&lt;/p&gt;

&lt;p&gt;Instead of asking, "how do we build the retry table?", the team asks, "where is the boundary where retry becomes compensation?" Instead of asking, "how do we resume after a crash?", the team asks, "what does resumed mean for this customer?"&lt;/p&gt;

&lt;p&gt;That is a better use of engineering time.&lt;/p&gt;

&lt;h2&gt;
  
  
  idempotency still lives at the edges
&lt;/h2&gt;

&lt;p&gt;One thing I would be careful about in any durable execution pitch is idempotency.&lt;/p&gt;

&lt;p&gt;Inside the framework boundary, you may get very strong guarantees. Completed workflow steps can be recorded. Activity results can be remembered. Retries can be controlled. Execution can resume after a crash.&lt;/p&gt;

&lt;p&gt;At the external boundary, reality is messier.&lt;/p&gt;

&lt;p&gt;Payment providers, banking partners, email systems, identity vendors, and card processors all have their own ideas about duplicate requests. Some support idempotency well. Some support it in documentation. Some support it until a timeout happens between their side effect and your response.&lt;/p&gt;

&lt;p&gt;Boundary calls still need stable request identifiers, provider references, and reconciliation. You still need to know whether a timeout means "nothing happened", "something happened but you did not see it", or "check later."&lt;/p&gt;

&lt;p&gt;Durable execution reduces the number of places where that logic leaks.&lt;/p&gt;

&lt;p&gt;It does not repeal distributed systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  the wider pattern
&lt;/h2&gt;

&lt;p&gt;The reason I like this category is that it fits a pattern that keeps repeating in software. At first, a reliability property is craft. A strong team builds it internally because they have no choice. Then enough teams hit the same pain, and the property becomes a product.&lt;/p&gt;

&lt;p&gt;Observability did this. Feature flags did this. Secrets management did this. CI/CD did this. Policy-as-code did this. Now durable execution is doing it.&lt;/p&gt;

&lt;p&gt;The boring control-plane property becomes something you can buy, install, or outsource.&lt;/p&gt;

&lt;p&gt;That is good. I do not miss every team building its own mini workflow engine by accident.&lt;/p&gt;

&lt;p&gt;But the job does not vanish. It moves.&lt;/p&gt;

&lt;p&gt;The value is no longer proving that your worker can survive a restart. The value is deciding which workflows deserve durability, which steps are atomic from the business point of view, which failures should retry, which failures should compensate, and who owns the customer outcome.&lt;/p&gt;

&lt;p&gt;That is where durable execution gets interesting.&lt;/p&gt;

&lt;p&gt;Not because DBOS or Temporal make failure disappear.&lt;/p&gt;

&lt;p&gt;Because they make the failure visible enough that we can stop pretending the hard part was the retry loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/dbos-transact" rel="noopener noreferrer"&gt;DBOS Transact&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dbos.dev/dbos-pricing" rel="noopener noreferrer"&gt;DBOS Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/workflow-execution/event" rel="noopener noreferrer"&gt;Temporal Event History documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.temporal.io/cloud/pricing" rel="noopener noreferrer"&gt;Temporal Cloud pricing documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test my projects, I use &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;. If you want $20 USD to get started, &lt;a href="https://railway.com?referralCode=G_jRmP" rel="noopener noreferrer"&gt;use this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>opinion</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
