<?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>agent trust is a runtime problem</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Tue, 21 Jul 2026 00:05:00 +0000</pubDate>
      <link>https://dev.to/pvgomes/agent-trust-is-a-runtime-problem-3nfb</link>
      <guid>https://dev.to/pvgomes/agent-trust-is-a-runtime-problem-3nfb</guid>
      <description>&lt;p&gt;There is a sentence the industry keeps trying very hard to believe:&lt;/p&gt;

&lt;p&gt;"We can make agents safe with better instructions."&lt;/p&gt;

&lt;p&gt;I understand why. Instructions are cheap. Policies are familiar. A system prompt feels like a place where serious adults can write serious words like "never" and "must" and "only with approval." Then the agent reads a README from the internet, installs a package, opens a browser, calls an MCP server, touches a repository, and suddenly the serious words are trying to govern a live workflow with the authority of a sticky note.&lt;/p&gt;

&lt;p&gt;This is why Docker's recent AI Engineer World's Fair write-up caught my attention. The headline is about agent trust, but the useful part is less dramatic: harden what agents build on, isolate where they run, control what they can reach, and govern the whole thing from one place.&lt;/p&gt;

&lt;p&gt;That is platform engineering wearing a new jacket and pretending it just arrived.&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="agent reading every rule at once" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Good. We have spent the last decade learning that useful software needs boring boundaries. Containers needed image policy, network policy, registries, scanners, signed artifacts, secrets management, and audit logs.&lt;/p&gt;

&lt;p&gt;Agents deserve the same disrespect.&lt;/p&gt;

&lt;h2&gt;
  
  
  the agent does not need to be evil
&lt;/h2&gt;

&lt;p&gt;The easy security story is that an agent might run a destructive command.&lt;/p&gt;

&lt;p&gt;That is real, but it is also the cartoon version.&lt;/p&gt;

&lt;p&gt;The more common risk is quieter. The agent reads too much. It connects dots that were never meant to be connected. It copies context from a private repository into a public tool call. It installs a dependency that opens a new network path. It calls an unreviewed MCP server because the server description sounded helpful and the afternoon was already long.&lt;/p&gt;

&lt;p&gt;No villain required.&lt;/p&gt;

&lt;p&gt;This is the annoying thing about useful agents: usefulness comes from access. A coding agent that cannot read files, run tests, inspect errors, install dependencies, call documentation tools, use a browser, or open a pull request is basically autocomplete with confidence issues.&lt;/p&gt;

&lt;p&gt;So the question is not "should agents have access?"&lt;/p&gt;

&lt;p&gt;The question is "where is that access mediated?"&lt;/p&gt;

&lt;p&gt;If the answer is "in the prompt", we are being optimistic in the same way a team is optimistic when production credentials live in a wiki page titled "please rotate this soon."&lt;/p&gt;

&lt;h2&gt;
  
  
  prompts shape intent, runtimes enforce reality
&lt;/h2&gt;

&lt;p&gt;Prompts matter. I am not joining the club of people who pretend instructions are useless because that sounds sophisticated. A clear instruction can improve behavior. A good system prompt can define task scope, escalation rules, and expectations.&lt;/p&gt;

&lt;p&gt;But prompts shape probabilities.&lt;/p&gt;

&lt;p&gt;Runtimes enforce boundaries.&lt;/p&gt;

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

&lt;p&gt;A prompt can say "do not access the network except for documentation." A runtime can actually block network destinations that are not allowed. A prompt can say "do not write outside the repository." A sandbox can mount the repository read-write and everything else read-only or not at all. A prompt can say "only use approved tools." A gateway can reject unapproved MCP calls before they happen.&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="approval gate energy" width="400" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is why runtime governance research feels directionally right. One recent paper argues that agent behavior is path-dependent: the risk depends not only on one action, but on the sequence of actions that led there. Static access control catches some cases. Prompt rules catch some behavior. But once an agent is acting through tools, the execution path itself becomes the thing you need to observe and govern.&lt;/p&gt;

&lt;p&gt;That sounds academic until you watch a real agent work.&lt;/p&gt;

&lt;p&gt;It reads an issue. Searches the repo. Opens docs. Installs a package. Runs a test. Follows an error to a blog post. Copies an example. Edits code. Runs another command. Tries a browser route. Opens a PR.&lt;/p&gt;

&lt;p&gt;Each step might be defensible alone.&lt;/p&gt;

&lt;p&gt;The sequence might be a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  mcp made the tool layer everybody's problem
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol is useful because it gives agents a common way to call tools. It is also dangerous for exactly the same reason.&lt;/p&gt;

&lt;p&gt;Once tool access becomes portable, tool governance becomes unavoidable.&lt;/p&gt;

&lt;p&gt;An MCP server is not just a plugin. It can be a route into databases, ticket systems, cloud APIs, internal docs, messaging tools, browsers, build systems, and customer-shaped data. If developers can add these servers faster than security or platform teams can review them, congratulations, you have reinvented browser extensions with production credentials.&lt;/p&gt;

&lt;p&gt;Docker's governance page talks about central control for sandbox, network, and MCP access, with policy events exported to SIEM and compliance systems. The product details will change, and other vendors will build their own versions, but the shape is what matters.&lt;/p&gt;

&lt;p&gt;Agent tooling needs an allowlist. It needs ownership. It needs review. It needs audit. It needs default-deny for things that can touch sensitive systems.&lt;/p&gt;

&lt;p&gt;Not because developers are irresponsible.&lt;/p&gt;

&lt;p&gt;Because serious tools need serious boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  the laptop is not outside the platform
&lt;/h2&gt;

&lt;p&gt;One subtle point in the Docker argument is that a lot of agent work starts on the developer laptop.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but many enterprise security conversations still behave as if the real platform begins in CI or the cloud. The laptop is treated as a messy prelude. The official system starts later, after the pull request, after the build, after the deployment pipeline wakes up and puts on a badge.&lt;/p&gt;

&lt;p&gt;Agents make that mental model weaker.&lt;/p&gt;

&lt;p&gt;If an agent can read a repository, run local tools, call network services, use a browser, and interact with MCP servers before code ever reaches CI, then the developer machine is already an execution environment for semi-autonomous work.&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%2Fimages.unsplash.com%2Fphoto-1558494949-ef010cbdcc31%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" 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%2Fimages.unsplash.com%2Fphoto-1558494949-ef010cbdcc31%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" alt="the boring platform path for scaling signals" width="1200" height="673"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It means the agent runtime on the laptop belongs in the platform inventory.&lt;/p&gt;

&lt;p&gt;Which agents are allowed? Which sandboxes do they use? Which directories can they mount? Which network paths can they reach? Which MCP servers are approved? Which credentials can enter the session? What gets logged? What is retained? What can a reviewer see after the agent opens a pull request?&lt;/p&gt;

&lt;p&gt;These are not exotic AI questions.&lt;/p&gt;

&lt;p&gt;They are old platform questions with a faster actor.&lt;/p&gt;

&lt;h2&gt;
  
  
  autonomy without evidence is just vibes at scale
&lt;/h2&gt;

&lt;p&gt;The best version of agent autonomy is not "the agent did something and we hope it was fine."&lt;/p&gt;

&lt;p&gt;The best version is "the agent did something inside a bounded runtime, using approved tools, with visible inputs and outputs, and left behind enough evidence for a human to review the work."&lt;/p&gt;

&lt;p&gt;That evidence should not only be the code diff.&lt;/p&gt;

&lt;p&gt;The diff tells you what changed. It does not tell you whether the agent read files it should not have read, called an unapproved tool, installed a sketchy package, copied from a questionable source, or hit a network endpoint nobody expected.&lt;/p&gt;

&lt;p&gt;For agent-generated work, the provenance around the work starts to matter more.&lt;/p&gt;

&lt;p&gt;Where did it run? What image or environment was used? What tools were available? Which commands executed? Which domains were reached? Which files were mounted? Which secrets were exposed? Which policy checks passed? Which ones warned? Which ones blocked?&lt;/p&gt;

&lt;p&gt;We already learned this lesson in supply chain security. The artifact is not enough. You eventually want to know what built it, from which inputs, under which policy, with which attestations.&lt;/p&gt;

&lt;p&gt;Agents are now part of that build story.&lt;/p&gt;

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

&lt;p&gt;Agent trust will not come from one magic layer.&lt;/p&gt;

&lt;p&gt;Better models help. Better prompts help. Better reviews help. But the durable trust boundary is going to live in the runtime and the tool path: sandboxes, network controls, filesystem mounts, MCP governance, credential scoping, audit events, and reviewable evidence.&lt;/p&gt;

&lt;p&gt;This is not the glamorous side of AI.&lt;/p&gt;

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

&lt;p&gt;The glamorous side is where demos live. The boring side is where production survives.&lt;/p&gt;

&lt;p&gt;The practical rule is simple: if an agent can act like a developer, operate it like a developer environment. Give it useful access, but make that access explicit. Let it move fast, but inside a boundary. Let it call tools, but only the tools the organization is willing to defend.&lt;/p&gt;

&lt;p&gt;Do not ask the prompt to do the runtime's job.&lt;/p&gt;

&lt;p&gt;The prompt can say "be careful."&lt;/p&gt;

&lt;p&gt;The runtime can make careful the default.&lt;/p&gt;

&lt;p&gt;That is where trust starts to become real.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/blog/ai-engineer-worlds-fair-2026-the-runtime-is-where-agent-trust-is-won/" rel="noopener noreferrer"&gt;Docker Blog: AI Engineer World's Fair 2026: The Runtime Is Where Agent Trust Is Won&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/products/ai-governance/" rel="noopener noreferrer"&gt;Docker AI Governance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2603.16586" rel="noopener noreferrer"&gt;arXiv: Runtime Governance for AI Agents: Policies on Paths&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2605.04785" rel="noopener noreferrer"&gt;arXiv: AgentTrust: Runtime Safety Evaluation and Interception for AI Agent Tool Use&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>agents</category>
      <category>security</category>
      <category>platformengineering</category>
    </item>
    <item>
      <title>public registries are not your supply-chain strategy</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Mon, 20 Jul 2026 00:05:25 +0000</pubDate>
      <link>https://dev.to/pvgomes/public-registries-are-not-your-supply-chain-strategy-26i7</link>
      <guid>https://dev.to/pvgomes/public-registries-are-not-your-supply-chain-strategy-26i7</guid>
      <description>&lt;p&gt;AWS warned that Bitnami images were leaving Amazon ECR Public.&lt;/p&gt;

&lt;p&gt;Not a vulnerability with a scary logo.&lt;/p&gt;

&lt;p&gt;Not a zero-day.&lt;/p&gt;

&lt;p&gt;Not a dramatic cloud outage with a dashboard slowly turning red.&lt;/p&gt;

&lt;p&gt;Just a registry change.&lt;/p&gt;

&lt;p&gt;And that is exactly why it matters.&lt;/p&gt;

&lt;p&gt;Starting June 10, 2026, Bitnami container images are no longer available from Amazon ECR Public Gallery. AWS said Bitnami had 317 container image repositories there, and any pull from &lt;code&gt;public.ecr.aws/bitnami/&lt;/code&gt; would fail after the removal. They even scheduled a 24-hour brownout on June 1 for the top 20 repositories so teams could notice the dependency before it became permanent.&lt;/p&gt;

&lt;p&gt;That is a very practical, very boring kind of supply-chain incident.&lt;/p&gt;

&lt;p&gt;The kind that does not need an attacker.&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="production discovering the base image shelf is gone" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  the container still running is not the problem
&lt;/h2&gt;

&lt;p&gt;The part that tricks people is that running containers do not immediately explode when a registry changes.&lt;/p&gt;

&lt;p&gt;If the image is already on the node, the process keeps running. The service looks fine. The dashboard is green. Everyone goes back to arguing about roadmap priorities.&lt;/p&gt;

&lt;p&gt;Then something normal happens.&lt;/p&gt;

&lt;p&gt;A pod restarts. An ECS task is replaced. A node gets recycled. The deployment rolls. CI builds a new artifact. Autoscaling adds capacity. Someone runs a disaster-recovery test. The image has to be pulled again.&lt;/p&gt;

&lt;p&gt;And now your application is not really failing because of Kubernetes, ECS, Helm, Terraform, or your app code.&lt;/p&gt;

&lt;p&gt;It is failing because a public shelf you treated like infrastructure stopped being your shelf.&lt;/p&gt;

&lt;p&gt;That is the uncomfortable lesson here. Container availability is not only about your cluster. It is also about every registry, namespace, tag, mirror, chart, and pipeline reference that sits between source code and a running workload.&lt;/p&gt;

&lt;h2&gt;
  
  
  public images are still dependencies
&lt;/h2&gt;

&lt;p&gt;We have a weird habit in engineering.&lt;/p&gt;

&lt;p&gt;If a dependency is in &lt;code&gt;package.json&lt;/code&gt;, we admit it is a dependency.&lt;/p&gt;

&lt;p&gt;If it is in a base image, a Helm value, a Dockerfile, a CI action, or an old Terraform module, we often treat it like background weather.&lt;/p&gt;

&lt;p&gt;It is not weather.&lt;/p&gt;

&lt;p&gt;It is a dependency.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;public.ecr.aws/bitnami/postgresql:15&lt;/code&gt; is a dependency. So is &lt;code&gt;bitnami/redis&lt;/code&gt;. So is the chart value that pulls it indirectly. So is the build image used by the pipeline that nobody has edited since the migration from Jenkins.&lt;/p&gt;

&lt;p&gt;The reason this registry change is interesting is that it exposes how much of production still depends on informal distribution assumptions.&lt;/p&gt;

&lt;p&gt;Somebody else hosts it.&lt;/p&gt;

&lt;p&gt;Somebody else publishes it.&lt;/p&gt;

&lt;p&gt;Somebody else keeps the namespace alive.&lt;/p&gt;

&lt;p&gt;Somebody else decides when the business model changes.&lt;/p&gt;

&lt;p&gt;That may be completely reasonable for a hobby project. For production, it needs to be a conscious decision, not an accident left behind by a copy-pasted tutorial.&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%2Fimages.unsplash.com%2Fphoto-1494412519320-aa613dfb7738%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" 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%2Fimages.unsplash.com%2Fphoto-1494412519320-aa613dfb7738%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" alt="containers stacked like hidden dependencies" width="1200" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  mirroring is mitigation, not ownership
&lt;/h2&gt;

&lt;p&gt;AWS gave the right immediate advice: find references to &lt;code&gt;public.ecr.aws/bitnami/&lt;/code&gt;, mirror the images you need into your own private ECR registry, and update deployments to point at your registry.&lt;/p&gt;

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

&lt;p&gt;Do that.&lt;/p&gt;

&lt;p&gt;But do not confuse mirroring with solving the whole problem.&lt;/p&gt;

&lt;p&gt;A mirror protects you from the immediate pull failure. It gives you a copy. It lets scaling, redeployments, and node replacement keep working after the upstream location disappears.&lt;/p&gt;

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

&lt;p&gt;It is not enough.&lt;/p&gt;

&lt;p&gt;Once you mirror an image, you own a new question: who keeps it patched?&lt;/p&gt;

&lt;p&gt;If the upstream source stops publishing to the place you used, your private copy can easily become a fossil with a nice AWS account ID in front of it. It will keep pulling. It may even make everyone feel safer. Meanwhile, the real update path is gone or moved somewhere else.&lt;/p&gt;

&lt;p&gt;This is where teams get into trouble. They treat the mirror as a backup, but it slowly becomes the actual source of truth without the maintenance process that source of truth deserves.&lt;/p&gt;

&lt;p&gt;A private registry is not a magic freezer where images stay safe forever.&lt;/p&gt;

&lt;p&gt;It is inventory.&lt;/p&gt;

&lt;p&gt;Inventory needs owners.&lt;/p&gt;

&lt;h2&gt;
  
  
  tags are not a recovery plan
&lt;/h2&gt;

&lt;p&gt;The next trap is tag behavior.&lt;/p&gt;

&lt;p&gt;A lot of teams still deploy images using loose tags because it is convenient. &lt;code&gt;latest&lt;/code&gt;, minor-only tags, mutable chart defaults, whatever the tutorial suggested.&lt;/p&gt;

&lt;p&gt;This is already risky when the registry is healthy.&lt;/p&gt;

&lt;p&gt;During a removal event, it gets worse.&lt;/p&gt;

&lt;p&gt;What exactly did you mirror? The tag name? The digest? The architecture variants? The chart dependency? The image used by the init container? The one in the backup job? The one in the dev namespace that production secretly depends on because environments are never as clean as diagrams?&lt;/p&gt;

&lt;p&gt;If you cannot answer those questions, you do not have a supply-chain strategy.&lt;/p&gt;

&lt;p&gt;You have hope with YAML.&lt;/p&gt;

&lt;p&gt;The better practice is boring and slightly annoying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inventory image references across repos, charts, task definitions, Dockerfiles, and CI&lt;/li&gt;
&lt;li&gt;record the digests you actually run&lt;/li&gt;
&lt;li&gt;mirror the specific tags and digests needed for production&lt;/li&gt;
&lt;li&gt;update deployment config to your owned registry&lt;/li&gt;
&lt;li&gt;make future image updates an explicit workflow&lt;/li&gt;
&lt;li&gt;alert on direct pulls from public registries in production paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not glamorous work. It is the work that prevents "why did the cluster stop scaling?" from becoming a registry archaeology exercise at 2 AM.&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%2Fimages.unsplash.com%2Fphoto-1553413077-190dd305871c%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" 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%2Fimages.unsplash.com%2Fphoto-1553413077-190dd305871c%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" alt="the private registry becoming the real shelf" width="1200" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  helm makes this easier to miss
&lt;/h2&gt;

&lt;p&gt;Helm charts are a very common place for this problem to hide.&lt;/p&gt;

&lt;p&gt;The application team installs a chart. The chart has image defaults. Maybe the defaults point to Bitnami. Maybe an environment override changes one image but not another. Maybe the chart pulls a sidecar or init container nobody remembers.&lt;/p&gt;

&lt;p&gt;Six months later, the platform team asks, "Are we using &lt;code&gt;public.ecr.aws/bitnami/&lt;/code&gt; anywhere?"&lt;/p&gt;

&lt;p&gt;Everyone searches the obvious repository and says no.&lt;/p&gt;

&lt;p&gt;Then the brownout happens and a namespace quietly proves otherwise.&lt;/p&gt;

&lt;p&gt;This is why registry policy cannot live only in human memory. The cluster should help. Admission control can reject unapproved registries. Image policy controllers can require known prefixes. CI can scan manifests before merge. SBOM and inventory tooling can tell you what is actually running, not only what the repo claims should be running.&lt;/p&gt;

&lt;p&gt;None of that is perfect.&lt;/p&gt;

&lt;p&gt;Perfect is not the point.&lt;/p&gt;

&lt;p&gt;The point is to make hidden image dependencies boring enough to find before an upstream announcement finds them for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  the platform team owns the paved path
&lt;/h2&gt;

&lt;p&gt;This is not me saying every product team should become a container-registry specialist.&lt;/p&gt;

&lt;p&gt;That is how you create twenty-seven slightly different solutions and one shared incident.&lt;/p&gt;

&lt;p&gt;The platform team should provide the paved path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;approved base images&lt;/li&gt;
&lt;li&gt;private registry namespaces&lt;/li&gt;
&lt;li&gt;mirroring and promotion workflows&lt;/li&gt;
&lt;li&gt;image signing and scanning&lt;/li&gt;
&lt;li&gt;digest pinning guidance&lt;/li&gt;
&lt;li&gt;pull-through cache rules where they actually fit&lt;/li&gt;
&lt;li&gt;alerts for public registry usage in production&lt;/li&gt;
&lt;li&gt;a clear exception process for teams that really need an external image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then product teams can make real choices without memorizing every registry failure mode.&lt;/p&gt;

&lt;p&gt;The key is to separate convenience from ownership.&lt;/p&gt;

&lt;p&gt;It is fine to use public images. The ecosystem depends on that. The mistake is pretending public distribution is the same thing as production ownership.&lt;/p&gt;

&lt;p&gt;Those are different things.&lt;/p&gt;

&lt;h2&gt;
  
  
  this is bigger than bitnami
&lt;/h2&gt;

&lt;p&gt;Bitnami is just the visible example this week.&lt;/p&gt;

&lt;p&gt;The broader pattern is older and much larger. Free tiers change. Public registries rate-limit. Namespaces move. Vendors retire channels. Images get renamed. Tags are deleted. Maintainers burn out. Companies acquire companies. Licensing changes. Security teams block a source. A registry outage happens on the day you need to replace nodes.&lt;/p&gt;

&lt;p&gt;None of this is exotic.&lt;/p&gt;

&lt;p&gt;It is normal software supply chain life.&lt;/p&gt;

&lt;p&gt;Containers made packaging feel clean, but they did not remove the ownership problem. They just moved it into OCI layers, registry namespaces, tags, digests, chart defaults, cache behavior, and deployment controllers.&lt;/p&gt;

&lt;p&gt;That is still better than the old world in many ways.&lt;/p&gt;

&lt;p&gt;But better packaging does not mean free operational responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  what i would do this week
&lt;/h2&gt;

&lt;p&gt;If I owned a platform with Kubernetes or ECS workloads, I would not start with a heroic migration spreadsheet.&lt;/p&gt;

&lt;p&gt;I would start with one sharp query:&lt;/p&gt;

&lt;p&gt;Where do we reference &lt;code&gt;public.ecr.aws/bitnami/&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Search repos. Search Helm values. Search Terraform and CloudFormation. Search task definitions. Search running workloads. Search CI.&lt;/p&gt;

&lt;p&gt;Then I would split the results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;production workloads that must be mirrored immediately&lt;/li&gt;
&lt;li&gt;build and CI images that can break releases&lt;/li&gt;
&lt;li&gt;development-only images that need a replacement but not a panic&lt;/li&gt;
&lt;li&gt;unused references that should be deleted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After that, I would mirror only what is actually needed, by digest where possible, and create a follow-up owner for the long-term migration path.&lt;/p&gt;

&lt;p&gt;The important part is not only surviving June 10.&lt;/p&gt;

&lt;p&gt;The important part is learning whether the organization can answer this kind of question quickly.&lt;/p&gt;

&lt;p&gt;If it cannot, Bitnami is not the problem.&lt;/p&gt;

&lt;p&gt;Visibility is the problem.&lt;/p&gt;

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

&lt;p&gt;The Bitnami removal from ECR Public is not dramatic because AWS gave notice, documented the impact, and described mitigation steps.&lt;/p&gt;

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

&lt;p&gt;But it is still a supply-chain fire drill.&lt;/p&gt;

&lt;p&gt;It shows how easily a production system can depend on public image distribution without anyone treating that dependency as owned infrastructure.&lt;/p&gt;

&lt;p&gt;Running containers are not enough. Cached images are not enough. A private mirror is not enough if nobody owns updates. A green dashboard is not enough if the next scale-out event cannot pull the image.&lt;/p&gt;

&lt;p&gt;Public registries are useful.&lt;/p&gt;

&lt;p&gt;They are not your supply-chain strategy.&lt;/p&gt;

&lt;p&gt;Your strategy is the boring stuff around them: inventory, mirrors, digests, policy, owners, patch paths, and proof that the cluster is not quietly depending on someone else's shelf.&lt;/p&gt;

&lt;p&gt;That is less exciting than another AI platform announcement.&lt;/p&gt;

&lt;p&gt;It is also the kind of work that keeps production boring.&lt;/p&gt;

&lt;p&gt;And boring production is still one of the best products engineering can ship.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/containers/bitnami-image-removal-from-ecr-public/" rel="noopener noreferrer"&gt;AWS Containers Blog: Bitnami image removal from ECR Public&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aws/containers-roadmap/issues/2817" rel="noopener noreferrer"&gt;AWS Containers Roadmap: Bitnami image removal from ECR Public issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.broadcom.com/tanzu/blogs/beltran-rueda-borrego/2026/05/20/important-update-transitioning-bitnami-offerings-o" rel="noopener noreferrer"&gt;Broadcom Tanzu: Important update, transitioning Bitnami offerings on AWS&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>containers</category>
      <category>ecr</category>
      <category>bitnami</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>hardened images are becoming the default base layer</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Sun, 19 Jul 2026 00:08:22 +0000</pubDate>
      <link>https://dev.to/pvgomes/hardened-images-are-becoming-the-default-base-layer-336l</link>
      <guid>https://dev.to/pvgomes/hardened-images-are-becoming-the-default-base-layer-336l</guid>
      <description>&lt;p&gt;There is a line in almost every service that gets less respect than it deserves.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; something:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if the team is feeling mature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; something@sha256:...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That line looks small. It feels like setup. It sits above the "real" application code, so people treat it like the opening credits before the movie starts.&lt;/p&gt;

&lt;p&gt;But the base image is not decoration.&lt;/p&gt;

&lt;p&gt;It is inherited production infrastructure.&lt;/p&gt;

&lt;p&gt;It brings an operating system shape, packages, libraries, certificates, shell behavior, update cadence, CVE noise, provenance, and sometimes a small museum of things your application never asked for. Then your team spends the next few years pretending the scanner is being dramatic.&lt;/p&gt;

&lt;p&gt;Docker's push around Docker Hardened Images is interesting because it points at a better default. Not a perfect default. Please, we are still in software. But a better one: secure, minimal, transparent base images that are meant to be ordinary starting points, not elite artifacts hidden behind a compliance ceremony.&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%2Fngh9y5xgq1xq1plna7bg.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%2Fngh9y5xgq1xq1plna7bg.gif" alt="a tiny Dockerfile line carrying the whole security program" width="220" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is the useful part.&lt;/p&gt;

&lt;p&gt;The best container security feature is not another dashboard yelling at developers.&lt;/p&gt;

&lt;p&gt;It is making the thing developers already use less embarrassing by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  the base image is a dependency stream
&lt;/h2&gt;

&lt;p&gt;We talk about dependencies as if they mostly live in &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;go.mod&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;, or a lockfile that nobody wants to review because it looks like a phone book fell into Git.&lt;/p&gt;

&lt;p&gt;But a base image is also a dependency.&lt;/p&gt;

&lt;p&gt;Worse, it is a dependency stream.&lt;/p&gt;

&lt;p&gt;You do not choose &lt;code&gt;python&lt;/code&gt;, &lt;code&gt;node&lt;/code&gt;, &lt;code&gt;nginx&lt;/code&gt;, &lt;code&gt;postgres&lt;/code&gt;, or &lt;code&gt;debian&lt;/code&gt; once and move on with your life. You inherit a flow of patches, rebuilds, tags, digests, package metadata, vulnerability disclosures, upstream decisions, and compatibility tradeoffs.&lt;/p&gt;

&lt;p&gt;That stream becomes part of every service built on top of it.&lt;/p&gt;

&lt;p&gt;If the base image carries unnecessary packages, every one can become a scanner finding. If it ships with a shell the workload does not need, that shell becomes part of the runtime surface. If the maintainer cadence is slow, your application teams become the people waiting with a red dashboard and a product manager asking why checkout work is blocked by &lt;code&gt;libwhatever&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Very normal. Very relaxing.&lt;/p&gt;

&lt;p&gt;This is why hardened images are not just "smaller images."&lt;/p&gt;

&lt;p&gt;Smaller helps. Fewer packages mean fewer things to patch, fewer things to exploit, fewer things to explain to auditors, and fewer false alarms during the morning coffee ritual.&lt;/p&gt;

&lt;p&gt;But the bigger value is ownership.&lt;/p&gt;

&lt;p&gt;Someone is saying: this foundation has a maintenance model, an SBOM, provenance, signing, vulnerability policy, and a migration path. You can build on it without each application team inventing container supply-chain engineering from first principles.&lt;/p&gt;

&lt;p&gt;That matters because most product teams should not be in the business of maintaining Linux distributions accidentally.&lt;/p&gt;

&lt;h2&gt;
  
  
  secure by default is not the same as secure by lecture
&lt;/h2&gt;

&lt;p&gt;Security programs love education.&lt;/p&gt;

&lt;p&gt;Sometimes that is good. Developers should understand the systems they ship. They should know what a base image is, why digest pinning matters, why &lt;code&gt;curl | sh&lt;/code&gt; is a cry for help, and why "but it works locally" is not a threat model.&lt;/p&gt;

&lt;p&gt;But education alone is a weak control.&lt;/p&gt;

&lt;p&gt;If the safe path requires every team to remember ten practices, choose between fifteen image variants, configure scanning, interpret SBOMs, and manually chase upstream patches, many teams will drift.&lt;/p&gt;

&lt;p&gt;Not because they are lazy.&lt;/p&gt;

&lt;p&gt;Because they are busy.&lt;/p&gt;

&lt;p&gt;Because the product still needs to ship. Because the incident from yesterday is still warm. Because the person who understood the old image moved teams and left behind one comment saying "do not upgrade this, breaks prod."&lt;/p&gt;

&lt;p&gt;Secure defaults reduce the number of heroic choices a developer must make before doing normal work.&lt;/p&gt;

&lt;p&gt;This is the part of Docker Hardened Images that I like. The pitch is not only "here is a security product." It is "what if the better base layer was the default thing developers could reach for?"&lt;/p&gt;

&lt;p&gt;That is how platform work should feel: a paved path with fewer traps.&lt;/p&gt;

&lt;h2&gt;
  
  
  minimal does not mean magical
&lt;/h2&gt;

&lt;p&gt;There is a bad version of the hardened-image conversation where everyone starts speaking as if switching the &lt;code&gt;FROM&lt;/code&gt; line deletes risk.&lt;/p&gt;

&lt;p&gt;It does not.&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="security finding after someone said the word hardened" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can run bad application code on a hardened image. You can leak secrets from a minimal container. You can misconfigure Kubernetes, expose admin endpoints, ship vulnerable app dependencies, and create an incident with an image that looks beautiful in the scanner.&lt;/p&gt;

&lt;p&gt;Hardened images lower some kinds of risk.&lt;/p&gt;

&lt;p&gt;They do not absolve the rest of the system.&lt;/p&gt;

&lt;p&gt;Engineers are allergic to silver bullets for good reasons. We have seen too many products arrive with "just use this" energy. Then the migration breaks native libraries, the team adds half the packages back, and six months later the "minimal" image has &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;vim&lt;/code&gt;, and an emotional support package manager.&lt;/p&gt;

&lt;p&gt;The useful hardened-image rollout is honest about this.&lt;/p&gt;

&lt;p&gt;Some workloads will migrate easily. Some will need compatibility work. Some will discover they were relying on tools that should never have been in the runtime image.&lt;/p&gt;

&lt;p&gt;If production requires a debugging shell, ask why. If the app needs a build tool at runtime, ask why. If the container includes utilities only used by one emergency script, ask whether that script is now the architecture.&lt;/p&gt;

&lt;p&gt;Minimal images force those conversations.&lt;/p&gt;

&lt;p&gt;Usually at an inconvenient time, because containers enjoy comedy.&lt;/p&gt;

&lt;h2&gt;
  
  
  platform teams should own the foundation
&lt;/h2&gt;

&lt;p&gt;The wrong rollout is a Slack message: "Everyone please migrate to hardened images by end of quarter."&lt;/p&gt;

&lt;p&gt;This produces predictable results. One team does it well. One team copies the first team badly. One team asks which image to use. One team says their legacy service cannot move. One team silently ignores the message because the scanner has been red since before the current manager joined.&lt;/p&gt;

&lt;p&gt;The better rollout treats base images as a platform contract.&lt;/p&gt;

&lt;p&gt;Give teams approved image families. Publish migration examples. Provide scanners that understand the image metadata. Make SBOMs and provenance easy to inspect. Define ownership for base image updates separately from application dependency updates. Track adoption by service. Make exceptions visible.&lt;/p&gt;

&lt;p&gt;Also, please test the images against real internal workloads.&lt;/p&gt;

&lt;p&gt;The demo service is always polite. It has no weird native dependency, no timezone sadness, no ancient certificate chain, and no business logic hiding in &lt;code&gt;final-run.sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If a platform team can make the hardened image path boring enough, product teams will use it. If the path is confusing, teams will keep using whatever worked last year.&lt;/p&gt;

&lt;p&gt;They will not be entirely wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  this is also an ai infrastructure story
&lt;/h2&gt;

&lt;p&gt;There is an AI angle here, because of course there is. But this one is real.&lt;/p&gt;

&lt;p&gt;Agentic systems multiply runtime surfaces. They run tool servers, execute code, browse, test, and connect to databases, SaaS APIs, internal dashboards, and all the strange little utilities that make a company function.&lt;/p&gt;

&lt;p&gt;Those workloads still start from images. If the agent runtime, tool server, browser worker, model sidecar, or evaluation job starts from a sloppy base layer, the AI magic is standing on the same old supply-chain mud.&lt;/p&gt;

&lt;p&gt;The lesson is boring and useful: AI infrastructure does not escape container hygiene. It makes container hygiene more important because semi-autonomous processes touch sensitive systems.&lt;/p&gt;

&lt;p&gt;If an agent can act, the runtime foundation matters.&lt;/p&gt;

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

&lt;p&gt;Hardened images are not exciting in the way a new model release is exciting.&lt;/p&gt;

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

&lt;p&gt;Exciting is overrated in infrastructure. A lot of production maturity is replacing chaotic defaults with boring ones that survive teams, audits, incidents, and budgets.&lt;/p&gt;

&lt;p&gt;The base image is one of those defaults: the first layer of application security, the first inherited dependency, the first thing scanners will judge, and the first place many teams accidentally import more operating system than they need.&lt;/p&gt;

&lt;p&gt;So yes, making hardened images easier to adopt is a big deal. Not because every developer should become a supply-chain specialist. Because they should not have to.&lt;/p&gt;

&lt;p&gt;Developers still need to understand what they are shipping. Platform teams still need evidence, migration paths, exception handling, and update discipline. Security teams still need to distinguish real risk from dashboard noise.&lt;/p&gt;

&lt;p&gt;But the default base layer should be less silly.&lt;/p&gt;

&lt;p&gt;That is the whole point.&lt;/p&gt;

&lt;p&gt;The best security platform work is not the work that makes everyone feel watched.&lt;/p&gt;

&lt;p&gt;It is the work that makes the ordinary path safer before anyone has to remember a checklist.&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-hardened-images-for-every-developer/" rel="noopener noreferrer"&gt;Docker: A Safer Container Ecosystem with Docker: Free Docker Hardened Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/products/hardened-images/" rel="noopener noreferrer"&gt;Docker: Docker Hardened Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/dhi/" rel="noopener noreferrer"&gt;Docker Docs: Docker Hardened Images&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>security</category>
      <category>containers</category>
      <category>docker</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>agentic autofix needs evidence, not applause</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Sat, 18 Jul 2026 00:03:57 +0000</pubDate>
      <link>https://dev.to/pvgomes/agentic-autofix-needs-evidence-not-applause-4hl8</link>
      <guid>https://dev.to/pvgomes/agentic-autofix-needs-evidence-not-applause-4hl8</guid>
      <description>&lt;p&gt;GitHub put agentic autofix for code scanning alerts into public preview this month, and it is exactly the kind of feature that sounds small until you imagine it touching a real backlog.&lt;/p&gt;

&lt;p&gt;Code scanning used to give you an alert.&lt;/p&gt;

&lt;p&gt;Now the tool wants to explore the repository, work across files, propose a fix, rerun the original analysis, and open a pull request.&lt;/p&gt;

&lt;p&gt;That is not just "faster remediation."&lt;/p&gt;

&lt;p&gt;That is AppSec crossing from detection into change management.&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%2F98whusp0fio7g6br39b2.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%2F98whusp0fio7g6br39b2.gif" alt="the security alert has a pull request now" width="500" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I like this direction, with the usual amount of fear in my eyes.&lt;/p&gt;

&lt;p&gt;Security teams have lived for years with the world's least romantic queue: findings, duplicates, false positives, stale alerts, "we will fix it next sprint", and the immortal ticket assigned to someone who left the company in 2023.&lt;/p&gt;

&lt;p&gt;So yes, a tool that can turn a code scanning alert into a reviewable pull request is useful. Very useful.&lt;/p&gt;

&lt;p&gt;But the interesting part is not that Copilot can write a patch.&lt;/p&gt;

&lt;p&gt;The interesting part is that the scarce skill moves.&lt;/p&gt;

&lt;p&gt;Before, the scarce skill was often "can we understand and prioritize the alert?"&lt;/p&gt;

&lt;p&gt;After agentic autofix, the scarce skill becomes "can we trust this remediation enough to merge it?"&lt;/p&gt;

&lt;p&gt;That is a different job.&lt;/p&gt;

&lt;h2&gt;
  
  
  the alert was annoying, but at least it was honest
&lt;/h2&gt;

&lt;p&gt;A static analysis alert is irritating in a very simple way. It says: "I found a pattern that may be dangerous."&lt;/p&gt;

&lt;p&gt;Sometimes it is right. Sometimes it is nonsense. Sometimes it is technically right and operationally useless, which is the AppSec version of being stuck in a meeting with a spreadsheet.&lt;/p&gt;

&lt;p&gt;But an alert has a clean boundary. It points at a potential problem.&lt;/p&gt;

&lt;p&gt;A generated fix has a bigger blast radius.&lt;/p&gt;

&lt;p&gt;It can change control flow. It can move validation. It can add escaping in the wrong layer. It can silence the scanner without fixing the actual vulnerability. It can make a test pass while changing behavior that was never tested because the legacy system was held together with vibes and one senior engineer's memory.&lt;/p&gt;

&lt;p&gt;This is not an argument against autofix.&lt;/p&gt;

&lt;p&gt;It is an argument against treating generated remediation as a magical cleanup button.&lt;/p&gt;

&lt;p&gt;Security fixes are not only code changes. They are claims about risk.&lt;/p&gt;

&lt;p&gt;If the tool opens a PR, the PR should carry those claims clearly.&lt;/p&gt;

&lt;h2&gt;
  
  
  generated security prs need evidence bundles
&lt;/h2&gt;

&lt;p&gt;The mature version of agentic autofix is not "here is a diff, good luck."&lt;/p&gt;

&lt;p&gt;The mature version is an evidence bundle.&lt;/p&gt;

&lt;p&gt;A good security autofix PR should answer boring questions in plain language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What vulnerability class was detected?&lt;/li&gt;
&lt;li&gt;What input or state made it exploitable?&lt;/li&gt;
&lt;li&gt;What files and data paths did the agent inspect?&lt;/li&gt;
&lt;li&gt;Why is this remediation scoped to these changes?&lt;/li&gt;
&lt;li&gt;Which analysis was rerun?&lt;/li&gt;
&lt;li&gt;Which tests were added or updated?&lt;/li&gt;
&lt;li&gt;What behavior might still be risky?&lt;/li&gt;
&lt;li&gt;What did the agent not verify?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds like paperwork.&lt;/p&gt;

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

&lt;p&gt;Security is partly paperwork because humans need to build trust across teams that do not share the same context. The application team knows the weird code path. The security team knows the vulnerability class. The platform team knows how scanning is wired. The reviewer knows the change may wake them up later.&lt;/p&gt;

&lt;p&gt;A generated PR has to be legible to all of them.&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%2Fyhjbc01d3kndr3k0yprh.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%2Fyhjbc01d3kndr3k0yprh.gif" alt="show your work, tiny robot" width="370" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Without the evidence, the reviewer has to reverse engineer the agent's reasoning from the diff. That is not automation. That is outsourcing the confusing part to a human with less time.&lt;/p&gt;

&lt;p&gt;Congratulations, we made the queue shorter and the review harder.&lt;/p&gt;

&lt;p&gt;Very modern.&lt;/p&gt;

&lt;h2&gt;
  
  
  rerunning the scanner is necessary, not sufficient
&lt;/h2&gt;

&lt;p&gt;GitHub says agentic autofix reruns the original analysis to confirm the alert closes before opening the pull request.&lt;/p&gt;

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

&lt;p&gt;It is also the floor.&lt;/p&gt;

&lt;p&gt;Closing the original alert proves the scanner no longer sees the same shape. It does not prove the system is secure. It does not prove the fix belongs at the right abstraction layer. It does not prove the change handles adjacent inputs. It does not prove the application still behaves correctly.&lt;/p&gt;

&lt;p&gt;This is where teams get into trouble with any automated remediation tool.&lt;/p&gt;

&lt;p&gt;The machine optimizes for the detectable condition. The product carries the real-world behavior.&lt;/p&gt;

&lt;p&gt;Imagine a SQL injection alert. A bad fix can parameterize one query and leave the actual untrusted path open somewhere else. A worse fix can escape strings manually because it makes the pattern disappear. A very cursed fix can add validation that blocks valid customer data because nobody wrote a test for the angry customer with a quote in their surname.&lt;/p&gt;

&lt;p&gt;The scanner is a useful witness.&lt;/p&gt;

&lt;p&gt;It is not the judge.&lt;/p&gt;

&lt;p&gt;For serious vulnerabilities, I want a small test that fails before and passes after. I want the changed boundary explained. I want the agent to say whether it found similar patterns elsewhere. I want the reviewer to see what was intentionally left alone.&lt;/p&gt;

&lt;p&gt;This is normal engineering discipline.&lt;/p&gt;

&lt;p&gt;The only new part is that the first draft came from a tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  appsec becomes review design
&lt;/h2&gt;

&lt;p&gt;Agentic autofix will probably make some security programs look better in dashboards.&lt;/p&gt;

&lt;p&gt;Fewer open alerts. Faster mean time to remediation. More security PRs created. A cleaner executive chart. Everybody loves a chart until it asks for nuance.&lt;/p&gt;

&lt;p&gt;But the real metric is not how many alerts got patched.&lt;/p&gt;

&lt;p&gt;The real metric is how many risky changes were safely understood, reviewed, merged, and kept healthy afterward.&lt;/p&gt;

&lt;p&gt;That means AppSec has to care about review.&lt;/p&gt;

&lt;p&gt;What should an autofix PR look like? Who is allowed to trigger one? Should high-risk fixes require security review plus code owner review? Should the agent be allowed to edit tests? Should it touch authentication code? Should it change dependencies? Should it open one PR per finding or group related findings in a campaign?&lt;/p&gt;

&lt;p&gt;These questions sound procedural because they are.&lt;/p&gt;

&lt;p&gt;That is where production safety lives.&lt;/p&gt;

&lt;p&gt;The same feature can be excellent in one organization and chaos in another. A team with clear ownership, good tests, and reviewers who understand the affected code can absorb generated security PRs. A team with weak tests, overloaded reviewers, and twenty services nobody owns will just create a more efficient machine for generating false confidence.&lt;/p&gt;

&lt;p&gt;Automation does not remove ownership.&lt;/p&gt;

&lt;p&gt;It finds out whether ownership was real.&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 review queue after the agent discovered alerts" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  security review is moving left and sideways
&lt;/h2&gt;

&lt;p&gt;GitHub also added security reviews in the Copilot app through a slash command for in-flight code changes.&lt;/p&gt;

&lt;p&gt;That pairs nicely with agentic autofix. One feature tries to fix known alerts. The other tries to catch high-confidence issues while code is still being written.&lt;/p&gt;

&lt;p&gt;This is the part I find useful: security is getting closer to the work loop.&lt;/p&gt;

&lt;p&gt;Not in the old "shift left" slogan way, where everyone repeats the phrase until the developer inherits six more tools and a guilt dashboard.&lt;/p&gt;

&lt;p&gt;I mean literally closer to the work loop.&lt;/p&gt;

&lt;p&gt;The IDE, CLI, code scanning alerts, pull requests, and review comments are starting to become one security surface. That is powerful because context is nearby. The diff is fresh. The author still remembers what they were doing. The fix can land before the finding becomes a fossil.&lt;/p&gt;

&lt;p&gt;But it also means security automation is entering the same messy place where normal software decisions happen.&lt;/p&gt;

&lt;p&gt;Half-written code. Experimental branches. Weird mocks. Deleted tests. Local assumptions. Deadlines.&lt;/p&gt;

&lt;p&gt;So the tooling has to be humble.&lt;/p&gt;

&lt;p&gt;It should say what it knows, what it checked, and what it did not check. It should preserve context for humans instead of pretending the human is just a merge button with a salary.&lt;/p&gt;

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

&lt;p&gt;Agentic autofix is a good feature because security teams need help with remediation, not just alert production.&lt;/p&gt;

&lt;p&gt;But the useful future is not a robot silently cleaning the backlog while everyone applauds.&lt;/p&gt;

&lt;p&gt;The useful future is generated remediation with evidence: clear scope, tests, analysis results, affected paths, remaining uncertainty, and ownership.&lt;/p&gt;

&lt;p&gt;If a tool can open a security PR, it should also help the reviewer understand why the PR is safe to merge.&lt;/p&gt;

&lt;p&gt;Otherwise we are not reducing risk.&lt;/p&gt;

&lt;p&gt;We are just converting security alerts into code review debt with better branding.&lt;/p&gt;

&lt;p&gt;And honestly, we already had enough debt. It came with free dashboards.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2026-07-10-agentic-autofix-for-code-scanning-alerts-in-public-preview/" rel="noopener noreferrer"&gt;GitHub Changelog: Agentic autofix for code scanning alerts in public preview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2026-07-14-security-reviews-now-available-in-the-github-copilot-app/" rel="noopener noreferrer"&gt;GitHub Changelog: Security reviews now available in the GitHub Copilot app&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>security</category>
      <category>ai</category>
      <category>github</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>custom metrics are the real autoscaling contract</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Fri, 17 Jul 2026 00:04:40 +0000</pubDate>
      <link>https://dev.to/pvgomes/custom-metrics-are-the-real-autoscaling-contract-2i6n</link>
      <guid>https://dev.to/pvgomes/custom-metrics-are-the-real-autoscaling-contract-2i6n</guid>
      <description>&lt;p&gt;Kubernetes has a very simple lie that everyone enjoys for a while:&lt;/p&gt;

&lt;p&gt;CPU and memory tell you when to scale.&lt;/p&gt;

&lt;p&gt;This is a useful lie. It gets teams started. It makes demos easy. It gives the HorizontalPodAutoscaler something obvious to watch. CPU goes up, replicas go up, everyone nods, the dashboard looks serious.&lt;/p&gt;

&lt;p&gt;Then production arrives wearing dirty shoes.&lt;/p&gt;

&lt;p&gt;The queue is saturated while CPU is bored. The payment provider is slow but your pods look healthy. The batch job is falling behind because one tenant sent a weird workload. The API is green, but the thing the customer actually cares about is waiting in a backlog somewhere.&lt;/p&gt;

&lt;p&gt;Congratulations. You have discovered that autoscaling is not about resources.&lt;/p&gt;

&lt;p&gt;Autoscaling is about pressure.&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%2Fngh9y5xgq1xq1plna7bg.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%2Fngh9y5xgq1xq1plna7bg.gif" alt="the dashboard saying cpu is fine while reality is not fine" width="220" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is why the recent Kubernetes post about building a custom metrics exporter is more interesting than it looks. On the surface, it is a practical walkthrough: expose an application-specific metric, wire it through the custom metrics API, let the HPA consume it.&lt;/p&gt;

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

&lt;p&gt;But the bigger story is that Kubernetes is quietly telling teams something important: if CPU and memory are the only signals your platform exposes, your platform understands the wrong bottlenecks.&lt;/p&gt;

&lt;h2&gt;
  
  
  cpu is a symptom, not a business signal
&lt;/h2&gt;

&lt;p&gt;CPU is not useless. Please do not turn this into another "metrics are fake" LinkedIn sermon. CPU matters. Memory matters. Saturation matters. If your service is burning cores like a crypto miner in a basement, the autoscaler should probably notice.&lt;/p&gt;

&lt;p&gt;But CPU is usually an implementation symptom, not the user-facing problem.&lt;/p&gt;

&lt;p&gt;A worker pool can be overloaded because queue depth is growing, even if every worker spends half its time blocked on a downstream API. A payment service can need more capacity because authorization latency is increasing, not because Go suddenly became CPU hungry. An inference service can need smarter routing because time-to-first-token and token throughput are drifting, not because average CPU crossed a nice round number.&lt;/p&gt;

&lt;p&gt;This is where custom metrics become the real contract.&lt;/p&gt;

&lt;p&gt;Not "scale when the pod is hot."&lt;/p&gt;

&lt;p&gt;"Scale when the system is failing to absorb work."&lt;/p&gt;

&lt;p&gt;Those are different sentences.&lt;/p&gt;

&lt;p&gt;The first sentence belongs to infrastructure. The second belongs to the product.&lt;/p&gt;

&lt;p&gt;And this is where things get uncomfortable, because platform teams cannot invent the right metrics alone. They can provide the plumbing, adapters, exporters, Prometheus integration, guardrails, naming rules, and examples. But they cannot know that &lt;code&gt;checkout_pending_authorizations&lt;/code&gt; matters more than &lt;code&gt;container_cpu_usage_seconds_total&lt;/code&gt; on Black Friday.&lt;/p&gt;

&lt;p&gt;The application team has to bring domain knowledge.&lt;/p&gt;

&lt;p&gt;The platform has to make that knowledge operational.&lt;/p&gt;

&lt;p&gt;That is the contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  custom metrics make ownership visible
&lt;/h2&gt;

&lt;p&gt;I like custom metrics because they force a conversation that teams often avoid.&lt;/p&gt;

&lt;p&gt;What does pressure mean for this system?&lt;/p&gt;

&lt;p&gt;Not in general. Not in a diagram. In this service.&lt;/p&gt;

&lt;p&gt;For a queue worker, pressure might be backlog age. For a fraud system, it might be decisions waiting longer than an SLA. For an AI gateway, it might be tokens per second, cache hit rate, provider throttle responses, or cost per successful answer. For a data pipeline, it might be lag behind the source. For a customer-facing API, it might be request latency split by tenant or endpoint.&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="queue pressure becoming the scaling signal" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once that metric is used for autoscaling, it stops being decorative observability.&lt;/p&gt;

&lt;p&gt;It becomes a control input.&lt;/p&gt;

&lt;p&gt;That changes the seriousness of the metric. A dashboard panel can be wrong for months and survive because humans are very good at ignoring dashboards. A scaling metric that is wrong will spend money, hide incidents, create replica storms, or keep the system underprovisioned while everyone wonders why the HPA is "not working."&lt;/p&gt;

&lt;p&gt;Very often the HPA is working exactly as configured.&lt;/p&gt;

&lt;p&gt;The configuration is just measuring the wrong reality.&lt;/p&gt;

&lt;p&gt;This is why custom metrics need ownership attached to them. Who defines the metric? Who validates it? Who changes thresholds? Who knows whether a spike means demand, a bug, abuse, a downstream outage, or a bad release?&lt;/p&gt;

&lt;p&gt;If nobody owns those answers, the autoscaler becomes a very confident random number amplifier.&lt;/p&gt;

&lt;h2&gt;
  
  
  the adapter is plumbing; the metric is design
&lt;/h2&gt;

&lt;p&gt;The Kubernetes mechanics matter.&lt;/p&gt;

&lt;p&gt;You need a custom metrics API adapter, labels that match Kubernetes objects, sane cardinality, scraping, permissions, and failure behavior.&lt;/p&gt;

&lt;p&gt;All of that matters.&lt;/p&gt;

&lt;p&gt;But the hardest part is deciding which signal deserves to affect capacity.&lt;/p&gt;

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

&lt;p&gt;A bad custom metric can be worse than no custom metric. If you scale workers based on queue length alone, you may create a thundering herd against a downstream dependency. If you scale an inference service based only on request count, you ignore prompt length, cache behavior, model selection, and provider throttling. If you scale a batch system on average lag, one large tenant can hide many small tenants having a terrible day.&lt;/p&gt;

&lt;p&gt;So the mature pattern is not "add custom metrics everywhere."&lt;/p&gt;

&lt;p&gt;The mature pattern is to treat scaling signals like APIs.&lt;/p&gt;

&lt;p&gt;Name them carefully. Document what they mean. Keep cardinality boring. Test them during load. Define what happens when they are missing. Review threshold changes like code.&lt;/p&gt;

&lt;p&gt;Annoying, yes. Still cheaper than learning during an incident that your autoscaler has been scaling on a metric nobody trusts.&lt;/p&gt;

&lt;h2&gt;
  
  
  platform teams should ship metric paths, not magic
&lt;/h2&gt;

&lt;p&gt;The platform team response should not be: "every service team, please become a metrics adapter expert by Friday."&lt;/p&gt;

&lt;p&gt;That is how you get twelve half-working exporters, three naming conventions, and one service that accidentally exposes customer IDs as metric labels because someone copied a tutorial at 1 AM.&lt;/p&gt;

&lt;p&gt;The better platform move is paved paths: safe exporter templates, a blessed custom metrics adapter, common examples, cardinality review, and clear ownership.&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%2Fimages.unsplash.com%2Fphoto-1558494949-ef010cbdcc31%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" 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%2Fimages.unsplash.com%2Fphoto-1558494949-ef010cbdcc31%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" alt="the boring platform path for scaling signals" width="1200" height="673"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But do not pretend the platform can decide every threshold.&lt;/p&gt;

&lt;p&gt;The useful division of labor is simple: platform owns the measurement path, service teams own the meaning of the signal, SRE owns the failure modes, and finance eventually asks why the graph looks like a staircase made of money.&lt;/p&gt;

&lt;p&gt;That last one is not a joke. Autoscaling is spending automation. Every scaling decision is also a cost decision.&lt;/p&gt;

&lt;p&gt;If a queue gets deep, should we scale to zero lag no matter the price?&lt;/p&gt;

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

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

&lt;p&gt;That is a product decision wearing Kubernetes clothes.&lt;/p&gt;

&lt;h2&gt;
  
  
  the ai angle makes this louder
&lt;/h2&gt;

&lt;p&gt;AI workloads make this louder.&lt;/p&gt;

&lt;p&gt;CPU and memory are comically incomplete for model-serving and agent systems. A model server can look "fine" while users wait too long for first token. An agent workflow can saturate a tool API, a browser pool, a vector database, or a code review queue. A gateway can burn money because requests are routed without understanding cache locality or token volume.&lt;/p&gt;

&lt;p&gt;The pressure signal might be latency, tokens, queue age, tool-call failures, provider quota, cache misses, or cost per task.&lt;/p&gt;

&lt;p&gt;None of those fit neatly into the old "average CPU utilization" mental model.&lt;/p&gt;

&lt;p&gt;This is why custom metrics are going to become less optional. As Kubernetes absorbs more AI, batch, serverless, and specialized workloads, generic resource pressure becomes only the first layer.&lt;/p&gt;

&lt;p&gt;Not magical autonomous infrastructure.&lt;/p&gt;

&lt;p&gt;Just honest feedback loops.&lt;/p&gt;

&lt;p&gt;The boring kind. The useful kind.&lt;/p&gt;

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

&lt;p&gt;A custom metrics exporter sounds like plumbing because it is plumbing.&lt;/p&gt;

&lt;p&gt;But plumbing is often where the architecture tells the truth.&lt;/p&gt;

&lt;p&gt;CPU and memory are easy to measure, but they are not always what the system is actually constrained by. Serious production systems care about backlog, latency, tenant pressure, provider limits, model throughput, payment failures, retry storms, cost, and work that is aging in a queue while the pod looks relaxed.&lt;/p&gt;

&lt;p&gt;When you connect those signals to autoscaling, you are not just adding a metric.&lt;/p&gt;

&lt;p&gt;You are declaring what pressure means.&lt;/p&gt;

&lt;p&gt;That declaration deserves engineering discipline. Ownership. Tests. Documentation. Review. Failure behavior. Cost awareness.&lt;/p&gt;

&lt;p&gt;The Kubernetes custom metrics path is useful because it lets platform teams move beyond generic resource watching. But the important question is not "can we expose this metric?"&lt;/p&gt;

&lt;p&gt;The important question is:&lt;/p&gt;

&lt;p&gt;"Do we trust this signal enough to let it move production?"&lt;/p&gt;

&lt;p&gt;If the answer is yes, make it boring, visible, and owned.&lt;/p&gt;

&lt;p&gt;If the answer is no, maybe keep it on the dashboard until it grows up.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/blog/2026/07/14/custom-metrics-exporter-kubernetes/" rel="noopener noreferrer"&gt;Kubernetes Blog: Building a Custom Metrics Exporter for Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/" rel="noopener noreferrer"&gt;Kubernetes Documentation: Horizontal Pod Autoscaling&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>autoscaling</category>
      <category>observability</category>
      <category>platformengineering</category>
    </item>
    <item>
      <title>the kubernetes api server is part of your network policy now</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Thu, 16 Jul 2026 00:04:48 +0000</pubDate>
      <link>https://dev.to/pvgomes/the-kubernetes-api-server-is-part-of-your-network-policy-now-4e7a</link>
      <guid>https://dev.to/pvgomes/the-kubernetes-api-server-is-part-of-your-network-policy-now-4e7a</guid>
      <description>&lt;p&gt;AWS announced a small-looking Amazon EKS feature in June that says a lot about where Kubernetes operations are going.&lt;/p&gt;

&lt;p&gt;Customer-routed control plane egress.&lt;/p&gt;

&lt;p&gt;I know. The name sounds like a feature flag generated by a committee that was not allowed to leave the room until everyone had inserted one noun.&lt;/p&gt;

&lt;p&gt;But the idea is useful: EKS can now route customer-controllable Kubernetes API server outbound traffic through your own VPC. Admission webhook callbacks, OIDC provider lookups, aggregate API server requests, and the DNS resolution for those calls can leave through an ENI in your network instead of only through the EKS-managed control plane path.&lt;/p&gt;

&lt;p&gt;In less AWS-language:&lt;/p&gt;

&lt;p&gt;The API server makes outbound calls.&lt;/p&gt;

&lt;p&gt;Those calls matter.&lt;/p&gt;

&lt;p&gt;And now you can treat some of them like real network traffic instead of mystical cloud weather.&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 control plane leaving through the front door this time" width="400" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  the api server was never just a thing you call
&lt;/h2&gt;

&lt;p&gt;Most engineers learn the Kubernetes API server as the thing clients talk to.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl&lt;/code&gt; talks to it. Controllers talk to it. Nodes talk to it. CI talks to it. Your platform automation talks to it, sometimes with permissions that make security people stare silently at the wall.&lt;/p&gt;

&lt;p&gt;So we naturally think about API server networking as inbound access.&lt;/p&gt;

&lt;p&gt;Can my node reach it?&lt;/p&gt;

&lt;p&gt;Can my laptop reach it?&lt;/p&gt;

&lt;p&gt;Is the endpoint public?&lt;/p&gt;

&lt;p&gt;Did someone add &lt;code&gt;0.0.0.0/0&lt;/code&gt; because "temporary" is apparently a religion?&lt;/p&gt;

&lt;p&gt;That model is incomplete.&lt;/p&gt;

&lt;p&gt;The API server also calls out. It calls admission webhooks. It fetches OIDC discovery documents. It proxies requests to aggregated API servers. If your cluster has serious extension points, the API server is not just receiving traffic. It is participating in your network design.&lt;/p&gt;

&lt;p&gt;That is the part this EKS feature makes very explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  admission webhooks made this inevitable
&lt;/h2&gt;

&lt;p&gt;Admission webhooks are one of those Kubernetes features that start innocent and then become load-bearing.&lt;/p&gt;

&lt;p&gt;At first, maybe you use a validating webhook to block privileged containers. Nice. Useful. Easy to explain.&lt;/p&gt;

&lt;p&gt;Then you add mutation for sidecars. Then policy enforcement. Then security scanning. Then internal platform defaults. Then some vendor controller installs a webhook with a certificate rotation story that feels like folklore.&lt;/p&gt;

&lt;p&gt;Eventually a pod creation request is not just a write to the API server. It is a small distributed transaction involving your control plane, webhook services, DNS, network routing, TLS, timeouts, retries, and humans asking why deployments are stuck.&lt;/p&gt;

&lt;p&gt;Very calm technology.&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="everything is fine, it is only the admission path" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the API server calls an admission webhook, that outbound path is part of your availability and security boundary. If you cannot observe it, route it, restrict it, or explain it during an audit, then it is not really governed. It is just trusted.&lt;/p&gt;

&lt;p&gt;And "trusted because the cloud provider handles it somewhere" is not always enough, especially for regulated teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  private endpoints solved only half the story
&lt;/h2&gt;

&lt;p&gt;EKS has had private endpoint options for a long time. Those are about how clients reach the Kubernetes API server. Private endpoint access is the inbound side of the conversation.&lt;/p&gt;

&lt;p&gt;Customer-routed control plane egress is the other direction.&lt;/p&gt;

&lt;p&gt;It answers a different question:&lt;/p&gt;

&lt;p&gt;Where does the API server go when it needs to call something on my behalf?&lt;/p&gt;

&lt;p&gt;That distinction matters because a private cluster endpoint can make a team feel more secure than it really is. Yes, your workers and operators may reach the API server privately. Good. But if the API server still needs to call a webhook, identity provider, or extension API, the outbound path has its own controls, logs, failure modes, and surprises.&lt;/p&gt;

&lt;p&gt;This is the kind of detail that does not fit nicely in architecture diagrams. The diagram has a box named "EKS control plane" and a line to "VPC" and everyone nods because meetings must end eventually.&lt;/p&gt;

&lt;p&gt;Reality is more annoying.&lt;/p&gt;

&lt;p&gt;The control plane has traffic classes. Some are AWS-managed. Some are customer-controllable. Some can now route through your VPC. Some cannot. AWS is explicit that EKS-managed components keep using EKS-managed paths, and that things like EKS Capabilities run in separate AWS-managed infrastructure. The IAM Authenticator's STS calls continue on the EKS-managed path too.&lt;/p&gt;

&lt;p&gt;That is not a flaw. That is the contract.&lt;/p&gt;

&lt;p&gt;The useful work is understanding the contract instead of pretending the box is magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  this is network policy for the grown-up cluster
&lt;/h2&gt;

&lt;p&gt;The phrase "network policy" usually makes Kubernetes people think about pod-to-pod traffic.&lt;/p&gt;

&lt;p&gt;Which namespace can call which service? Which egress destinations are allowed? Is DNS open? Did we accidentally allow half the internet because the payment API changed IP ranges again?&lt;/p&gt;

&lt;p&gt;All still important.&lt;/p&gt;

&lt;p&gt;But serious platform teams are going to start applying the same instinct to control-plane initiated traffic.&lt;/p&gt;

&lt;p&gt;If the API server calls a webhook, should that traffic stay inside the VPC? Should it go through AWS Network Firewall? Should it use PrivateLink? Should VPC Flow Logs capture it? Should an organization policy require customer-routed egress for certain clusters?&lt;/p&gt;

&lt;p&gt;AWS even added an IAM condition key for this, &lt;code&gt;eks:controlPlaneEgressMode&lt;/code&gt;, which is the kind of boring detail that tells you the feature is aimed at real enterprise control, not demo confetti.&lt;/p&gt;

&lt;p&gt;This is what platform maturity looks like. Not always heroic. Often just routing a packet through the boring place where your controls already live.&lt;/p&gt;

&lt;h2&gt;
  
  
  extensions turned the control plane into an application dependency
&lt;/h2&gt;

&lt;p&gt;The bigger story is that Kubernetes keeps moving more business logic into extension points.&lt;/p&gt;

&lt;p&gt;Admission controllers enforce policy. Aggregated APIs extend the platform. Operators reconcile the weird stuff. OIDC connects identity. Controllers talk constantly. The "cluster" is no longer just a scheduler plus some pods. It is an operating system made of APIs, callbacks, controllers, and disappointed YAML.&lt;/p&gt;

&lt;p&gt;So the API server's outbound traffic is not background noise.&lt;/p&gt;

&lt;p&gt;It can decide whether deployments proceed, whether identities validate, whether custom resources work, and whether your platform rules actually run.&lt;/p&gt;

&lt;p&gt;That means it belongs in the same discussions as workload egress, service mesh policy, private networking, audit trails, and incident response. Not because every company needs maximum lockdown. Because every company needs to know which parts of the system are allowed to call which other parts, and what happens when they cannot.&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 network diagram after one more webhook" width="498" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  managed kubernetes is not an excuse to stop understanding kubernetes
&lt;/h2&gt;

&lt;p&gt;The lazy interpretation of managed Kubernetes is "the cloud provider runs the hard parts, so I do not have to care."&lt;/p&gt;

&lt;p&gt;The better interpretation is "the cloud provider runs some hard parts, and I still need to understand the contract at the boundaries."&lt;/p&gt;

&lt;p&gt;Customer-routed control plane egress is one of those boundary features. It does not make the EKS control plane yours. It does not turn managed Kubernetes into self-managed Kubernetes. Please do not take a useful feature and convert it into weekend suffering.&lt;/p&gt;

&lt;p&gt;It just gives you more control over specific outbound traffic that exists because of your cluster configuration and your extension choices.&lt;/p&gt;

&lt;p&gt;That is exactly the sort of feature regulated and platform-heavy teams need. Not because it looks exciting in a keynote, but because it lets them answer practical questions: where did this traffic go, which policy controlled it, can we prove it, and can we explain the failure?&lt;/p&gt;

&lt;p&gt;This is the boring endgame for a lot of cloud features. The first version makes the thing easy. The later versions make it governable.&lt;/p&gt;

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

&lt;p&gt;The Kubernetes API server is not just a sacred endpoint in the sky.&lt;/p&gt;

&lt;p&gt;It is part of your system.&lt;/p&gt;

&lt;p&gt;If it calls your webhooks, identity providers, and extension APIs, then its outbound path is part of your architecture. It deserves routing, logging, policy, failure testing, and ownership.&lt;/p&gt;

&lt;p&gt;That may feel like one more thing for platform teams to carry.&lt;/p&gt;

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

&lt;p&gt;Sorry.&lt;/p&gt;

&lt;p&gt;But it is also healthier than pretending the control plane is outside the blast radius of the extensions we keep attaching to it.&lt;/p&gt;

&lt;p&gt;Managed Kubernetes made clusters easier to create.&lt;/p&gt;

&lt;p&gt;Extension-heavy Kubernetes made them harder to reason about.&lt;/p&gt;

&lt;p&gt;Customer-routed control plane egress is a useful reminder that the control plane is not above the network.&lt;/p&gt;

&lt;p&gt;It is in the network.&lt;/p&gt;

&lt;p&gt;Act accordingly.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/containers/amazon-eks-now-supports-control-plane-egress-through-your-vpc/" rel="noopener noreferrer"&gt;Amazon EKS now supports control plane egress through your VPC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/cluster-endpoint.html" rel="noopener noreferrer"&gt;Amazon EKS cluster API server endpoint 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>kubernetes</category>
      <category>eks</category>
      <category>aws</category>
      <category>security</category>
    </item>
    <item>
      <title>ai-era interviews should test evidence, not leetcode muscle memory</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Wed, 15 Jul 2026 00:06:25 +0000</pubDate>
      <link>https://dev.to/pvgomes/ai-era-interviews-should-test-evidence-not-leetcode-muscle-memory-33lj</link>
      <guid>https://dev.to/pvgomes/ai-era-interviews-should-test-evidence-not-leetcode-muscle-memory-33lj</guid>
      <description>&lt;p&gt;Software engineering interviews have always had a strange theater problem.&lt;/p&gt;

&lt;p&gt;We ask people to reverse a linked list, then hire them to spend six months arguing with YAML, logs, flaky tests, half-migrated services, and the undocumented billing job everyone fears.&lt;/p&gt;

&lt;p&gt;Very normal industry. No notes.&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%2Fngh9y5xgq1xq1plna7bg.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%2Fngh9y5xgq1xq1plna7bg.gif" alt="a skeptical engineer reviewing the interview ritual" width="220" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now AI is making the old ritual look even weirder.&lt;/p&gt;

&lt;p&gt;Recent coverage from The Guardian, Business Insider, and ITPro all circles the same point: software engineering is not disappearing, but the visible shape of the job is changing. More code can be generated. More candidates will show up with AI in their workflow. Some companies already encourage it in interviews. At the same time, people are worried about juniors skipping fundamentals because the assistant gives them a plausible answer before they understand the question.&lt;/p&gt;

&lt;p&gt;That does not mean interviews should become "prompt this chatbot while we watch."&lt;/p&gt;

&lt;p&gt;It also does not mean we should retreat into LeetCode nostalgia and pretend the last decade did not happen.&lt;/p&gt;

&lt;p&gt;The better interview should test evidence.&lt;/p&gt;

&lt;p&gt;Not vibes. Not memorized puzzle moves.&lt;/p&gt;

&lt;p&gt;Evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  code generation made the old signal weaker
&lt;/h2&gt;

&lt;p&gt;The classic algorithm interview was never perfect, but it had a theory behind it. If someone could solve a constrained problem under pressure, maybe they had enough programming fluency, decomposition, and correctness thinking to do real work.&lt;/p&gt;

&lt;p&gt;Sometimes that signal was useful. Sometimes it filtered for people who had time to grind the format. Sometimes it selected for confidence more than judgment. We all know the game.&lt;/p&gt;

&lt;p&gt;AI makes the signal weaker because the easiest parts to test are now the easiest parts to outsource.&lt;/p&gt;

&lt;p&gt;Write a function from a clean prompt? Generate boilerplate? Remember syntax? Produce a first-pass implementation? Those are no longer rare skills. They are table stakes plus tool usage.&lt;/p&gt;

&lt;p&gt;That does not make programming knowledge obsolete. The opposite, actually.&lt;/p&gt;

&lt;p&gt;When the assistant produces code, the engineer still has to know whether the code is correct, maintainable, secure, idiomatic for that codebase, and compatible with the mess already in production. The assistant can write a migration. It cannot feel the cold sweat of being on call when that migration locks the wrong table.&lt;/p&gt;

&lt;p&gt;So an interview that only tests raw code production is increasingly testing the part of the workflow that is getting commoditized.&lt;/p&gt;

&lt;p&gt;The more valuable signal is what happens after the code appears.&lt;/p&gt;

&lt;h2&gt;
  
  
  give candidates a messy diff
&lt;/h2&gt;

&lt;p&gt;One good AI-era interview is simple: give the candidate a generated pull request.&lt;/p&gt;

&lt;p&gt;Not a perfect one. A realistic one.&lt;/p&gt;

&lt;p&gt;The diff should include a small feature or bug fix with a few problems: maybe an edge case, a weak test, a security issue, a hidden coupling, or a migration with bad production behavior.&lt;/p&gt;

&lt;p&gt;Then ask the candidate to review it.&lt;/p&gt;

&lt;p&gt;What worries you?&lt;/p&gt;

&lt;p&gt;Which tests would you add?&lt;/p&gt;

&lt;p&gt;What would you ask the author?&lt;/p&gt;

&lt;p&gt;Which part can ship today and which part needs another pass?&lt;/p&gt;

&lt;p&gt;What evidence would make you comfortable approving this?&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 interview becoming a real review instead of a puzzle show" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This tests something closer to the work.&lt;/p&gt;

&lt;p&gt;A good engineer reads code skeptically without becoming theatrical. They separate style nitpicks from correctness issues. They notice when a change violates a boundary. They know when a test is useful and when it is just a decorative green checkbox.&lt;/p&gt;

&lt;p&gt;That is much harder to fake with a memorized problem set.&lt;/p&gt;

&lt;p&gt;It is also exactly where AI changes the job. If teams use coding agents, review load goes up unless the agent output is boringly good. The candidate who can inspect generated work, ask for evidence, and improve the change without turning every review into a personality contest is valuable.&lt;/p&gt;

&lt;p&gt;That person saves production.&lt;/p&gt;

&lt;p&gt;Or at least saves the team from another "tiny cleanup PR" that somehow rewrites authentication.&lt;/p&gt;

&lt;h2&gt;
  
  
  test debugging, not just building
&lt;/h2&gt;

&lt;p&gt;Another better interview: give the candidate a failing test and an incident-shaped timeline.&lt;/p&gt;

&lt;p&gt;The service started returning 500s after a dependency update. The logs show a weird serialization error. A teammate already asked an AI assistant and got a confident but probably wrong explanation. The candidate gets the code, the logs, and the failing test.&lt;/p&gt;

&lt;p&gt;Ask them to debug out loud.&lt;/p&gt;

&lt;p&gt;Not perform confidence. Debug.&lt;/p&gt;

&lt;p&gt;What do they inspect first? Do they form hypotheses? Do they know how to reduce the problem? Do they distrust the first plausible answer? Do they know the difference between fixing the symptom and fixing the cause?&lt;/p&gt;

&lt;p&gt;This is where fundamentals still matter.&lt;/p&gt;

&lt;p&gt;Git matters because you need to understand what changed.&lt;/p&gt;

&lt;p&gt;Tests matter because you need a reproducible signal.&lt;/p&gt;

&lt;p&gt;Logs matter because production does not care that your local run was beautiful.&lt;/p&gt;

&lt;p&gt;Architecture matters because a local bug often has system-level consequences.&lt;/p&gt;

&lt;p&gt;AI can help with each step, but it cannot replace the engineer's responsibility to verify. If anything, it makes verification more important because the assistant can produce a very clean wrong answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  prompt fluency is useful, but judgment is the product
&lt;/h2&gt;

&lt;p&gt;Yes, candidates should probably know how to use AI tools.&lt;/p&gt;

&lt;p&gt;Pretending otherwise is silly. It is like interviewing a backend engineer in 2026 and acting surprised that they use an IDE, docs, and a terminal. Tool fluency is part of the job.&lt;/p&gt;

&lt;p&gt;But "can prompt well" is not enough.&lt;/p&gt;

&lt;p&gt;The useful question is whether the candidate can turn AI output into accountable engineering work.&lt;/p&gt;

&lt;p&gt;Can they write a prompt that includes constraints from the existing system? Can they ask the model for alternatives instead of accepting the first answer? Can they force the assistant to produce tests, assumptions, and failure modes? Can they spot hallucinated APIs?&lt;/p&gt;

&lt;p&gt;That last one matters more than people admit.&lt;/p&gt;

&lt;p&gt;Sometimes the fastest AI workflow is closing the chat and opening the file.&lt;/p&gt;

&lt;p&gt;This is also why companies should stop treating AI-assisted interviews as cheating by default. If the real job allows AI tools, the interview should observe how candidates use them. The interesting signal is whether the tool makes their work more inspectable or just more confident.&lt;/p&gt;

&lt;h2&gt;
  
  
  juniors still need the boring foundations
&lt;/h2&gt;

&lt;p&gt;There is a real concern in the ITPro/O'Reilly-style discussion about fundamentals. If new developers skip Git, testing, debugging, code review, and architecture because AI gives them runnable-looking answers, they become productive enough to create change, not grounded enough to own it.&lt;/p&gt;

&lt;p&gt;That is not a reason to ban AI from learning. It is a reason to design interviews and apprenticeships around ownership.&lt;/p&gt;

&lt;p&gt;Ask junior candidates to explain a diff, a failing test, and a safe revert. Let them use AI, but require them to validate every claim against the codebase.&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%2Fimages.unsplash.com%2Fphoto-1551836022-d5d88e9218df%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" 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%2Fimages.unsplash.com%2Fphoto-1551836022-d5d88e9218df%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26q%3D80" alt="a candidate discovering the generated answer still needs ownership" width="1200" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  hiring should reward the work we actually need
&lt;/h2&gt;

&lt;p&gt;The industry says it wants engineers with judgment, ownership, debugging skill, systems thinking, security awareness, and the ability to work with AI.&lt;/p&gt;

&lt;p&gt;Then many interviews still reward speed-running toy problems.&lt;/p&gt;

&lt;p&gt;This mismatch was annoying before.&lt;/p&gt;

&lt;p&gt;Now it is expensive.&lt;/p&gt;

&lt;p&gt;If the job is becoming more about reviewing generated work and deciding what evidence is enough, then the interview should look like that. Give candidates a generated patch, an ambiguous ticket, a flaky test, or an AI-produced explanation and ask them to verify it.&lt;/p&gt;

&lt;p&gt;A strong candidate should be able to say what is correct, what is risky, which test is weak, which requirement is ambiguous, and where the AI answer sounds plausible but the code says something else.&lt;/p&gt;

&lt;p&gt;That is not less technical than a puzzle. It is more technical because it connects code to consequences.&lt;/p&gt;

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

&lt;p&gt;AI did not make software engineering interviews easy to fix.&lt;/p&gt;

&lt;p&gt;It made the old laziness harder to defend.&lt;/p&gt;

&lt;p&gt;The question is no longer "can this person produce code in isolation while someone watches awkwardly?"&lt;/p&gt;

&lt;p&gt;The question is "can this person turn code into reliable engineering evidence?"&lt;/p&gt;

&lt;p&gt;That means review. Debugging. Tests. Logs. Git history. Architecture boundaries. Security thinking. Rollback plans. Clear explanations. The unglamorous stuff that keeps systems alive.&lt;/p&gt;

&lt;p&gt;LeetCode muscle memory is not useless. It can still test some fluency.&lt;/p&gt;

&lt;p&gt;But if it remains the center of the interview while the actual job moves toward AI-assisted delivery, companies will hire for the wrong reflexes.&lt;/p&gt;

&lt;p&gt;The best interview now is not the one that proves a candidate can write code without help.&lt;/p&gt;

&lt;p&gt;It is the one that proves they can be trusted when help produces code too quickly.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.theguardian.com/technology/ng-interactive/2026/jul/12/software-developers-engineers-ai" rel="noopener noreferrer"&gt;The Guardian: how software engineers are adapting to AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.businessinsider.com/software-engineering-job-technical-interviews-hiring-ai-2026-7" rel="noopener noreferrer"&gt;Business Insider: software engineering jobs need more than coding skills in the AI era&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.itpro.com/software/development/the-challenge-now-is-making-sure-the-next-generation-develops-those-same-foundations-before-relying-too-heavily-on-ai-devs-are-swerving-fundamental-skills-like-git-and-agile-because-of-ai-but-theres-a-good-reason" rel="noopener noreferrer"&gt;ITPro: developers, AI, Git, Agile, and fundamentals&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>interview</category>
      <category>hiring</category>
    </item>
    <item>
      <title>choosing the right agent surface: Codex, Claude Code, Copilot, and when not to use an agent</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Tue, 14 Jul 2026 21:32:11 +0000</pubDate>
      <link>https://dev.to/pvgomes/choosing-the-right-agent-surface-codex-claude-code-copilot-and-when-not-to-use-an-agent-2cc1</link>
      <guid>https://dev.to/pvgomes/choosing-the-right-agent-surface-codex-claude-code-copilot-and-when-not-to-use-an-agent-2cc1</guid>
      <description>&lt;p&gt;This is part 5 of a 5-post series on professional agentic coding for senior engineers.&lt;/p&gt;

&lt;p&gt;There is no single best coding agent.&lt;/p&gt;

&lt;p&gt;There is a best surface for the task.&lt;/p&gt;

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

&lt;p&gt;If you choose the tool because it is fashionable, you will bend the workflow around the tool. Senior engineers should do the opposite: choose the surface that gives the right context, permissions, verification loop, and review path.&lt;/p&gt;

&lt;h2&gt;
  
  
  use Codex when you want repo-aware terminal work
&lt;/h2&gt;

&lt;p&gt;Codex is a strong fit when the work is close to the repository and you want the agent to inspect files, edit code, run commands, manage plans, use subagents, and produce a verified diff.&lt;/p&gt;

&lt;p&gt;Good Codex tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bug fixes with tests&lt;/li&gt;
&lt;li&gt;repo investigations&lt;/li&gt;
&lt;li&gt;refactors with clear boundaries&lt;/li&gt;
&lt;li&gt;PR review with &lt;code&gt;/review&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;multi-step terminal workflows&lt;/li&gt;
&lt;li&gt;tasks that benefit from &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;long-running goals with explicit verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good Codex prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Goal: fix the import cycle causing the API package to fail typecheck.
Context: start with pnpm typecheck output and packages/api/src.
Constraints: no new dependencies, preserve public exports.
Done when: typecheck passes and /review finds no blocking correctness issues.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex is not magic because it is Codex. It is useful because it can work in the same environment as the code and show evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  use Claude Code for terminal-native planning and hooks
&lt;/h2&gt;

&lt;p&gt;Claude Code is strong for terminal-native coding flows, plan/explore workflows, subagents, project memory through &lt;code&gt;CLAUDE.md&lt;/code&gt;, and hooks for repeatable checks.&lt;/p&gt;

&lt;p&gt;Good Claude Code tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explore a new codebase area before editing&lt;/li&gt;
&lt;li&gt;implement a bounded change with a plan&lt;/li&gt;
&lt;li&gt;use subagents for specialized review&lt;/li&gt;
&lt;li&gt;run repeatable local checks&lt;/li&gt;
&lt;li&gt;keep recurring project notes in &lt;code&gt;CLAUDE.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good Claude prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use plan mode.
Inspect the checkout flow and current tests.
I want to add retry handling for transient PSP timeouts.
Do not edit files until you explain the existing flow and propose a minimal plan.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code's plan-first workflow is especially useful when the engineer wants the model to slow down before touching files.&lt;/p&gt;

&lt;h2&gt;
  
  
  use GitHub Copilot agents for GitHub-native issue-to-PR work
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot coding agent is useful when the work naturally starts as a GitHub issue and should end as a PR.&lt;/p&gt;

&lt;p&gt;Good Copilot agent tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;well-scoped issues&lt;/li&gt;
&lt;li&gt;small-to-medium feature changes&lt;/li&gt;
&lt;li&gt;docs updates&lt;/li&gt;
&lt;li&gt;test additions&lt;/li&gt;
&lt;li&gt;simple bug fixes with clear reproduction&lt;/li&gt;
&lt;li&gt;repository-governed workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The issue has to be concrete.&lt;/p&gt;

&lt;p&gt;Bad issue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Improve onboarding.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good issue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Goal&lt;/span&gt;

Show validation errors inline on the signup form instead of only as a toast.

&lt;span class="gu"&gt;## Scope&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; apps/web signup form only
&lt;span class="p"&gt;-&lt;/span&gt; no API changes

&lt;span class="gu"&gt;## Done&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; invalid email and missing password errors show inline
&lt;span class="p"&gt;-&lt;/span&gt; existing signup tests pass
&lt;span class="p"&gt;-&lt;/span&gt; PR includes screenshot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copilot can also use repository instructions and custom agents. That makes it good for org-level workflows, but only if the instructions are maintained.&lt;/p&gt;

&lt;h2&gt;
  
  
  use IDE chat or autocomplete for small local edits
&lt;/h2&gt;

&lt;p&gt;Not every task needs a full agent.&lt;/p&gt;

&lt;p&gt;Use IDE chat or autocomplete when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you are editing one function&lt;/li&gt;
&lt;li&gt;you know exactly what to change&lt;/li&gt;
&lt;li&gt;the risk is small&lt;/li&gt;
&lt;li&gt;verification is immediate&lt;/li&gt;
&lt;li&gt;the surrounding context is already in your head&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rewrite this function to remove the duplicated null checks.
Keep behavior identical.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need to spin up a full autonomous loop for every small cleanup.&lt;/p&gt;

&lt;h2&gt;
  
  
  when not to use an agent
&lt;/h2&gt;

&lt;p&gt;Sometimes the right answer is: do not delegate this yet.&lt;/p&gt;

&lt;p&gt;Avoid agents when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the product decision is unclear&lt;/li&gt;
&lt;li&gt;the acceptance criteria are political or subjective&lt;/li&gt;
&lt;li&gt;the change affects money movement without strong tests&lt;/li&gt;
&lt;li&gt;the task requires production secrets the agent should not access&lt;/li&gt;
&lt;li&gt;the migration is destructive&lt;/li&gt;
&lt;li&gt;the blast radius is not understood&lt;/li&gt;
&lt;li&gt;there is no realistic verification path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not mean agents can never help.&lt;/p&gt;

&lt;p&gt;They can investigate, write a plan, enumerate risks, or draft tests.&lt;/p&gt;

&lt;p&gt;But implementation should wait until the human decision or verification path exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  bad practice: tool loyalty
&lt;/h2&gt;

&lt;p&gt;Tool loyalty is when engineers say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I do everything in Claude.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I only use Codex.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Copilot should handle all issues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not engineering judgment. That is brand attachment.&lt;/p&gt;

&lt;p&gt;Better:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use Codex when the local repo and terminal loop matter&lt;/li&gt;
&lt;li&gt;use Claude Code when plan/explore and subagent workflows fit&lt;/li&gt;
&lt;li&gt;use Copilot when GitHub issue-to-PR governance is the cleanest path&lt;/li&gt;
&lt;li&gt;use IDE completion for tiny edits&lt;/li&gt;
&lt;li&gt;use no agent when the problem is not ready&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  the selection checklist
&lt;/h2&gt;

&lt;p&gt;Before choosing a surface, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where does the source of truth live: local repo, GitHub issue, production logs, design doc?&lt;/li&gt;
&lt;li&gt;Does the task need local secrets or local state?&lt;/li&gt;
&lt;li&gt;Does the task need a PR from an issue?&lt;/li&gt;
&lt;li&gt;Does it need a plan before edits?&lt;/li&gt;
&lt;li&gt;Does it need subagents or fresh-context review?&lt;/li&gt;
&lt;li&gt;What tools must run to prove success?&lt;/li&gt;
&lt;li&gt;What permissions are safe?&lt;/li&gt;
&lt;li&gt;What is the blast radius if the agent is wrong?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answer usually tells you the tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  closing the series
&lt;/h2&gt;

&lt;p&gt;The professional workflow is not "use more AI."&lt;/p&gt;

&lt;p&gt;It is design the loop.&lt;/p&gt;

&lt;p&gt;Context.&lt;/p&gt;

&lt;p&gt;Plan.&lt;/p&gt;

&lt;p&gt;Patch.&lt;/p&gt;

&lt;p&gt;Proof.&lt;/p&gt;

&lt;p&gt;Review.&lt;/p&gt;

&lt;p&gt;Reusable instructions.&lt;/p&gt;

&lt;p&gt;Senior engineers who do that will get leverage from agents.&lt;/p&gt;

&lt;p&gt;Senior engineers who skip it will get bigger diffs and more review fatigue.&lt;/p&gt;

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

&lt;p&gt;The loop matters more.&lt;/p&gt;

&lt;h2&gt;
  
  
  sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/codex-manual.md" rel="noopener noreferrer"&gt;OpenAI Codex manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/best-practices" rel="noopener noreferrer"&gt;Claude Code best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/sub-agents" rel="noopener noreferrer"&gt;Claude Code subagents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/tutorials/cloud-agent/get-the-best-results" rel="noopener noreferrer"&gt;GitHub Copilot: get the best results from Copilot coding agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/add-custom-instructions/add-repository-instructions" rel="noopener noreferrer"&gt;GitHub Copilot repository instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/create-custom-agents" rel="noopener noreferrer"&gt;GitHub Copilot custom agents&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>agents</category>
      <category>productivity</category>
    </item>
    <item>
      <title>review and verification: making agent code mergeable</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Tue, 14 Jul 2026 21:31:35 +0000</pubDate>
      <link>https://dev.to/pvgomes/review-and-verification-making-agent-code-mergeable-495c</link>
      <guid>https://dev.to/pvgomes/review-and-verification-making-agent-code-mergeable-495c</guid>
      <description>&lt;p&gt;This is part 4 of a 5-post series on professional agentic coding for senior engineers.&lt;/p&gt;

&lt;p&gt;Agent-written code should pass a stronger bar, not a weaker one.&lt;/p&gt;

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

&lt;p&gt;In practice, teams do the opposite.&lt;/p&gt;

&lt;p&gt;The agent writes a diff quickly. The diff looks coherent. The human skims. The PR ships.&lt;/p&gt;

&lt;p&gt;Then production explains what the review missed.&lt;/p&gt;

&lt;p&gt;The fix is not to distrust agents blindly. The fix is to make verification explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  tests before trust
&lt;/h2&gt;

&lt;p&gt;For a bug fix, ask for a regression test first when practical.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before changing production code, add a failing test that reproduces expired sessions returning 500.
Run only that test and show the failure.
Then implement the fix.
Then rerun the test and the focused auth suite.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not only about correctness. It also teaches the agent the target behavior.&lt;/p&gt;

&lt;p&gt;Without a failing test, the agent may fix a nearby problem and still miss the actual one.&lt;/p&gt;

&lt;h2&gt;
  
  
  focused checks first
&lt;/h2&gt;

&lt;p&gt;Do not start with the entire CI pipeline if the feedback loop is slow.&lt;/p&gt;

&lt;p&gt;Start focused:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;changed package tests&lt;/li&gt;
&lt;li&gt;changed file tests&lt;/li&gt;
&lt;li&gt;typecheck for changed package&lt;/li&gt;
&lt;li&gt;lint for touched files&lt;/li&gt;
&lt;li&gt;UI screenshot or Playwright spec for the changed screen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then broaden:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;full package test suite&lt;/li&gt;
&lt;li&gt;full typecheck&lt;/li&gt;
&lt;li&gt;build&lt;/li&gt;
&lt;li&gt;integration tests&lt;/li&gt;
&lt;li&gt;PR checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This mirrors how senior engineers work manually.&lt;/p&gt;

&lt;p&gt;Fast feedback first. Wider confidence later.&lt;/p&gt;

&lt;h2&gt;
  
  
  require evidence in the final summary
&lt;/h2&gt;

&lt;p&gt;A useful agent final summary includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;files changed&lt;/li&gt;
&lt;li&gt;behavior changed&lt;/li&gt;
&lt;li&gt;commands run&lt;/li&gt;
&lt;li&gt;outputs or pass/fail state&lt;/li&gt;
&lt;li&gt;checks not run and why&lt;/li&gt;
&lt;li&gt;remaining risks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Done. I fixed it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Changed:
- src/auth/session.ts
- tests/auth/session.test.ts

Verification:
- npm test -- tests/auth/session.test.ts: passed
- npm run typecheck: passed

Risk:
- Did not run full integration suite because local database is unavailable.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the minimum useful handoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  fresh-context review
&lt;/h2&gt;

&lt;p&gt;The writer agent should not be the only reviewer.&lt;/p&gt;

&lt;p&gt;Use fresh context.&lt;/p&gt;

&lt;p&gt;Codex has &lt;code&gt;/review&lt;/code&gt;, which can inspect uncommitted changes, a branch diff, or a commit and report prioritized findings without changing the working tree.&lt;/p&gt;

&lt;p&gt;Claude Code can use a separate reviewer session or a review-focused subagent.&lt;/p&gt;

&lt;p&gt;GitHub Copilot can review PRs too, but do not confuse automated review with approval. It is one input.&lt;/p&gt;

&lt;p&gt;Good Codex pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/review
Review the branch diff against main.
Prioritize correctness, regressions, missing tests, and security issues.
Do not suggest style-only changes unless they hide a real risk.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good Claude pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use a fresh reviewer subagent.
Review the diff for auth/security risks only.
Return file/line references, severity, and suggested fixes.
Do not modify files.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key is independence. The reviewer should not be carrying the implementation plan in its head.&lt;/p&gt;

&lt;h2&gt;
  
  
  compare against product intent
&lt;/h2&gt;

&lt;p&gt;Agent code can pass tests and still be wrong.&lt;/p&gt;

&lt;p&gt;Maybe the test asserted the wrong behavior.&lt;/p&gt;

&lt;p&gt;Maybe the implementation solves a technical symptom but violates product expectations.&lt;/p&gt;

&lt;p&gt;Maybe the API now behaves correctly for one client and breaks another.&lt;/p&gt;

&lt;p&gt;Senior review is where product intent comes back into the room.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this solve the user-visible problem?&lt;/li&gt;
&lt;li&gt;Does it preserve existing contracts?&lt;/li&gt;
&lt;li&gt;Does it create a migration or rollout risk?&lt;/li&gt;
&lt;li&gt;Does it make observability better or worse?&lt;/li&gt;
&lt;li&gt;Are failure modes clearer?&lt;/li&gt;
&lt;li&gt;Can support explain this behavior?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agents are good at local code changes. Senior engineers are supposed to see the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  be careful with workflow changes
&lt;/h2&gt;

&lt;p&gt;GitHub's Copilot docs warn about reviewing Copilot output and being careful with generated changes. This is especially important when the PR touches workflows, permissions, or automation.&lt;/p&gt;

&lt;p&gt;Do not casually approve agent changes to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Actions workflows&lt;/li&gt;
&lt;li&gt;deployment scripts&lt;/li&gt;
&lt;li&gt;secrets handling&lt;/li&gt;
&lt;li&gt;auth middleware&lt;/li&gt;
&lt;li&gt;database migrations&lt;/li&gt;
&lt;li&gt;package-lock-level dependency changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are high-leverage files.&lt;/p&gt;

&lt;p&gt;The agent may be right.&lt;/p&gt;

&lt;p&gt;Read them anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  bad practice: writer self-certification
&lt;/h2&gt;

&lt;p&gt;The most common bad pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Implement the fix and tell me if it looks good.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course it will say it looks good.&lt;/p&gt;

&lt;p&gt;You asked the author.&lt;/p&gt;

&lt;p&gt;Better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Implement the fix, run the focused tests, then stop.
After that, I will run a fresh-context review.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;After implementation, spawn a read-only reviewer subagent to inspect the diff for correctness and missing tests.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make review a separate step.&lt;/p&gt;

&lt;h2&gt;
  
  
  checklist
&lt;/h2&gt;

&lt;p&gt;Before merging agent-written code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is there a regression test when practical?&lt;/li&gt;
&lt;li&gt;Did focused tests pass?&lt;/li&gt;
&lt;li&gt;Did typecheck/lint/build run where relevant?&lt;/li&gt;
&lt;li&gt;Did a fresh-context review happen?&lt;/li&gt;
&lt;li&gt;Are the final commands and results visible?&lt;/li&gt;
&lt;li&gt;Are skipped checks explicitly explained?&lt;/li&gt;
&lt;li&gt;Did a human compare the diff to product intent?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer is no, the PR is not ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/codex-manual.md" rel="noopener noreferrer"&gt;OpenAI Codex manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/best-practices" rel="noopener noreferrer"&gt;Claude Code best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/common-workflows" rel="noopener noreferrer"&gt;Claude Code common workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/use-copilot-agents/review-copilot-output" rel="noopener noreferrer"&gt;GitHub Copilot: review Copilot output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/engineering/building-effective-agents" rel="noopener noreferrer"&gt;Anthropic: building effective agents&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>agents</category>
      <category>productivity</category>
    </item>
    <item>
      <title>subagents and specialized agents: parallelism without chaos</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Tue, 14 Jul 2026 21:30:59 +0000</pubDate>
      <link>https://dev.to/pvgomes/subagents-and-specialized-agents-parallelism-without-chaos-281j</link>
      <guid>https://dev.to/pvgomes/subagents-and-specialized-agents-parallelism-without-chaos-281j</guid>
      <description>&lt;p&gt;This is part 3 of a 5-post series on professional agentic coding for senior engineers.&lt;/p&gt;

&lt;p&gt;Subagents are one of the most useful ideas in agentic coding.&lt;/p&gt;

&lt;p&gt;They are also one of the easiest ways to create a mess.&lt;/p&gt;

&lt;p&gt;The rule is simple:&lt;/p&gt;

&lt;p&gt;Use subagents to isolate context and specialization.&lt;/p&gt;

&lt;p&gt;Do not use subagents to create uncontrolled shared-state writes.&lt;/p&gt;

&lt;h2&gt;
  
  
  why subagents work
&lt;/h2&gt;

&lt;p&gt;Main agent context is expensive attention.&lt;/p&gt;

&lt;p&gt;If you fill it with logs, search results, failed attempts, screenshots, and five different hypotheses, the final implementation gets worse.&lt;/p&gt;

&lt;p&gt;Subagents let you move noisy work out of the main thread.&lt;/p&gt;

&lt;p&gt;Good subagent work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read-heavy research&lt;/li&gt;
&lt;li&gt;security review&lt;/li&gt;
&lt;li&gt;test gap analysis&lt;/li&gt;
&lt;li&gt;log investigation&lt;/li&gt;
&lt;li&gt;API surface mapping&lt;/li&gt;
&lt;li&gt;migration planning&lt;/li&gt;
&lt;li&gt;docs summarization&lt;/li&gt;
&lt;li&gt;fresh-context review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bad subagent work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;six agents editing the same files&lt;/li&gt;
&lt;li&gt;parallel refactors in one checkout&lt;/li&gt;
&lt;li&gt;broad write access with vague roles&lt;/li&gt;
&lt;li&gt;"everyone go fix payment bugs"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first category reduces cognitive load.&lt;/p&gt;

&lt;p&gt;The second creates coordination debt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codex example: read-only review swarm
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review this PR using parallel read-only subagents.

Spawn:
- one agent for security and correctness
- one agent for missing tests
- one agent for maintainability and API design

Keep all agents read-only.
Wait for all three.
Summarize findings by severity with file references.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a good use of parallelism because each agent has a different lens and no agent writes.&lt;/p&gt;

&lt;p&gt;The main agent or human engineer integrates the findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code example: isolated investigation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use a subagent to inspect token refresh edge cases.
It should read src/auth and tests/auth.
Report only:
- likely bug locations
- missing tests
- risks
- file references

Do not modify files.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That subagent can consume a lot of context without polluting the implementation thread.&lt;/p&gt;

&lt;p&gt;Then the main session can turn the result into a small plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Copilot custom agents
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot's custom agents are useful when a repository has repeated specialized work.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;security reviewer&lt;/li&gt;
&lt;li&gt;migration planner&lt;/li&gt;
&lt;li&gt;accessibility reviewer&lt;/li&gt;
&lt;li&gt;test coverage reviewer&lt;/li&gt;
&lt;li&gt;documentation maintainer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The custom agent should have a narrow role, clear instructions, and constrained tools.&lt;/p&gt;

&lt;p&gt;Bad custom agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;backend-genius&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

You are a world-class backend engineer. Fix whatever is needed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good custom agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;migration-reviewer&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Reviews database migrations for safety and reversibility.&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;codebase"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Review migration changes only.
Check for reversibility, locking risk, destructive operations, and missing rollout notes.
Do not modify files.
Return findings with file references and severity.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Specific beats powerful.&lt;/p&gt;

&lt;h2&gt;
  
  
  parallel writes need separate worktrees
&lt;/h2&gt;

&lt;p&gt;Sometimes parallel write work is valid.&lt;/p&gt;

&lt;p&gt;But it needs isolation.&lt;/p&gt;

&lt;p&gt;If two agents are implementing unrelated parts of a system, use separate worktrees or branches. Give each agent a narrow file ownership boundary. Merge deliberately.&lt;/p&gt;

&lt;p&gt;Good:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent A: implement frontend validation in apps/web only.
Agent B: implement backend validation in apps/api only.
Use separate worktrees.
Do not edit shared packages without stopping for review.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Both agents: improve checkout flow.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is how you get two plausible designs, overlapping diffs, and a human stuck doing archaeology.&lt;/p&gt;

&lt;h2&gt;
  
  
  writer and reviewer is the safest pattern
&lt;/h2&gt;

&lt;p&gt;The best first subagent pattern is not parallel implementation.&lt;/p&gt;

&lt;p&gt;It is writer and reviewer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Main agent or writer session implements a bounded change.&lt;/li&gt;
&lt;li&gt;Fresh reviewer agent reads the diff.&lt;/li&gt;
&lt;li&gt;Reviewer reports risks and missing tests.&lt;/li&gt;
&lt;li&gt;Main agent fixes.&lt;/li&gt;
&lt;li&gt;Human reviews final diff.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The reviewer has fresh context. It is not emotionally attached to the plan. It is not trying to defend its own code.&lt;/p&gt;

&lt;p&gt;That alone catches a surprising amount.&lt;/p&gt;

&lt;h2&gt;
  
  
  bad practice: every agent gets every tool
&lt;/h2&gt;

&lt;p&gt;Tool access should follow the role.&lt;/p&gt;

&lt;p&gt;A log-analysis subagent probably does not need write access.&lt;/p&gt;

&lt;p&gt;A security-review subagent probably should not push branches.&lt;/p&gt;

&lt;p&gt;A migration planner probably should not execute production migrations.&lt;/p&gt;

&lt;p&gt;Broad tools feel convenient until the wrong agent takes the wrong action.&lt;/p&gt;

&lt;p&gt;This is normal engineering governance. Apply least privilege to agents too.&lt;/p&gt;

&lt;h2&gt;
  
  
  checklist
&lt;/h2&gt;

&lt;p&gt;Before spawning a subagent, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What specialized question should it answer?&lt;/li&gt;
&lt;li&gt;Should it be read-only?&lt;/li&gt;
&lt;li&gt;What files or systems can it inspect?&lt;/li&gt;
&lt;li&gt;What output format do I need back?&lt;/li&gt;
&lt;li&gt;Will its work pollute or clarify the main context?&lt;/li&gt;
&lt;li&gt;If it writes, what ownership boundary prevents conflicts?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you cannot define the role in one sentence, it is probably not a good subagent yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/sub-agents" rel="noopener noreferrer"&gt;Claude Code subagents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/best-practices" rel="noopener noreferrer"&gt;Claude Code best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents" rel="noopener noreferrer"&gt;Anthropic: effective context engineering for AI agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/codex-manual.md" rel="noopener noreferrer"&gt;OpenAI Codex manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/create-custom-agents" rel="noopener noreferrer"&gt;GitHub Copilot custom agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/add-skills" rel="noopener noreferrer"&gt;GitHub Copilot skills&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>agents</category>
      <category>productivity</category>
    </item>
    <item>
      <title>instructions as code: AGENTS.md, CLAUDE.md, and copilot-instructions.md</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Tue, 14 Jul 2026 21:30:11 +0000</pubDate>
      <link>https://dev.to/pvgomes/instructions-as-code-agentsmd-claudemd-and-copilot-instructionsmd-258a</link>
      <guid>https://dev.to/pvgomes/instructions-as-code-agentsmd-claudemd-and-copilot-instructionsmd-258a</guid>
      <description>&lt;p&gt;This is part 2 of a 5-post series on professional agentic coding for senior engineers.&lt;/p&gt;

&lt;p&gt;Agent instruction files are becoming part of the engineering system.&lt;/p&gt;

&lt;p&gt;Codex has &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Claude Code has &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;GitHub Copilot supports repository instructions such as &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;, path-specific instruction files, and cloud-agent instruction surfaces.&lt;/p&gt;

&lt;p&gt;This is good.&lt;/p&gt;

&lt;p&gt;It is also a new place to create technical debt.&lt;/p&gt;

&lt;h2&gt;
  
  
  instructions should be short and operational
&lt;/h2&gt;

&lt;p&gt;The agent does not need a philosophy essay.&lt;/p&gt;

&lt;p&gt;It needs the facts that change what it should do in this repository.&lt;/p&gt;

&lt;p&gt;Good instruction files include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;install commands&lt;/li&gt;
&lt;li&gt;focused test commands&lt;/li&gt;
&lt;li&gt;typecheck and lint commands&lt;/li&gt;
&lt;li&gt;repo layout&lt;/li&gt;
&lt;li&gt;naming conventions&lt;/li&gt;
&lt;li&gt;important boundaries&lt;/li&gt;
&lt;li&gt;dependency rules&lt;/li&gt;
&lt;li&gt;how to verify work&lt;/li&gt;
&lt;li&gt;project-specific gotchas&lt;/li&gt;
&lt;li&gt;PR expectations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bad instruction files include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stale onboarding docs&lt;/li&gt;
&lt;li&gt;generic rules like "write clean code"&lt;/li&gt;
&lt;li&gt;huge architecture histories&lt;/li&gt;
&lt;li&gt;every preference someone has ever had&lt;/li&gt;
&lt;li&gt;commands nobody has run in six months&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not to make the agent read more.&lt;/p&gt;

&lt;p&gt;The point is to make it read the right things.&lt;/p&gt;

&lt;h2&gt;
  
  
  a useful AGENTS.md
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# AGENTS.md&lt;/span&gt;

&lt;span class="gu"&gt;## Commands&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Install: pnpm install
&lt;span class="p"&gt;-&lt;/span&gt; Test API: pnpm --filter @app/api test
&lt;span class="p"&gt;-&lt;/span&gt; Test web: pnpm --filter @app/web test
&lt;span class="p"&gt;-&lt;/span&gt; Typecheck: pnpm typecheck

&lt;span class="gu"&gt;## Repo Layout&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; apps/api: backend HTTP API
&lt;span class="p"&gt;-&lt;/span&gt; apps/web: React frontend
&lt;span class="p"&gt;-&lt;/span&gt; packages/db: migrations and query helpers
&lt;span class="p"&gt;-&lt;/span&gt; packages/shared: shared types and utilities

&lt;span class="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Prefer existing patterns over new abstractions.
&lt;span class="p"&gt;-&lt;/span&gt; Do not add production dependencies without explicit approval.
&lt;span class="p"&gt;-&lt;/span&gt; For bug fixes, add regression tests when practical.
&lt;span class="p"&gt;-&lt;/span&gt; Do not edit generated files directly.

&lt;span class="gu"&gt;## Done Means&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Relevant tests pass.
&lt;span class="p"&gt;-&lt;/span&gt; Typecheck passes for changed packages.
&lt;span class="p"&gt;-&lt;/span&gt; Final response lists commands run and checks skipped.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;It is useful.&lt;/p&gt;

&lt;p&gt;Codex loads &lt;code&gt;AGENTS.md&lt;/code&gt; from global, project, and nested scopes, with closer files applying more specifically. That means you can keep root instructions broad and put package-specific rules closer to the code.&lt;/p&gt;

&lt;p&gt;Root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Prefer existing repo patterns. Run relevant tests. Do not add dependencies without approval.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;apps/api/AGENTS.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Use Fastify plugin patterns already in this package.
Run pnpm --filter @app/api test for API changes.
Database migrations must be reversible.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is better than one giant instruction file trying to govern everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  a useful CLAUDE.md
&lt;/h2&gt;

&lt;p&gt;Claude Code's memory guidance has the same shape. &lt;code&gt;CLAUDE.md&lt;/code&gt; should contain recurring project knowledge, commands, conventions, and workflow notes.&lt;/p&gt;

&lt;p&gt;Good:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Common Commands&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; pnpm typecheck
&lt;span class="p"&gt;-&lt;/span&gt; pnpm --filter @app/api test
&lt;span class="p"&gt;-&lt;/span&gt; pnpm --filter @app/web test

&lt;span class="gu"&gt;## Project Notes&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Auth sessions live in apps/api/src/auth.
&lt;span class="p"&gt;-&lt;/span&gt; Payment ledger code is append-only; do not update historical rows.
&lt;span class="p"&gt;-&lt;/span&gt; Prefer repository query helpers over raw SQL in application services.

&lt;span class="gu"&gt;## Verification&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Bug fixes should include regression tests when practical.
&lt;span class="p"&gt;-&lt;/span&gt; UI changes need a screenshot or Playwright check.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Be smart.
Write clean code.
Do not make mistakes.
Use best practices.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That feels nice and changes almost nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copilot instructions need the same discipline
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot's cloud agent works from issues and repository context. That makes durable instructions especially important, because the task often starts in GitHub rather than your local terminal.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; for repository-wide guidance.&lt;/p&gt;

&lt;p&gt;Use path-specific instructions when the rules differ.&lt;/p&gt;

&lt;p&gt;Use custom agents when a role needs a narrow prompt and constrained tools.&lt;/p&gt;

&lt;p&gt;The mistake is to assume "Copilot knows our repo." It knows what it can read and what you tell it to prioritize. If your issue is vague and your instructions are stale, you get a vague PR with stale assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  what belongs in the prompt instead
&lt;/h2&gt;

&lt;p&gt;Do not put task-specific details in durable instructions.&lt;/p&gt;

&lt;p&gt;Bad &lt;code&gt;AGENTS.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;For the current auth bug, inspect ticket AUTH-123 and fix refresh tokens.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That belongs in the task prompt.&lt;/p&gt;

&lt;p&gt;Durable instructions should be true next week.&lt;/p&gt;

&lt;p&gt;One-off prompts should describe today's outcome.&lt;/p&gt;

&lt;p&gt;This separation matters because instruction files survive. A stale one-off note inside a durable file becomes a hidden source of bad behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  bad practice: instruction dumping
&lt;/h2&gt;

&lt;p&gt;Instruction dumping is when the team responds to one agent mistake by adding five more rules.&lt;/p&gt;

&lt;p&gt;The file grows.&lt;/p&gt;

&lt;p&gt;The model follows less of it.&lt;/p&gt;

&lt;p&gt;The commands drift.&lt;/p&gt;

&lt;p&gt;Nobody reviews it.&lt;/p&gt;

&lt;p&gt;Then people say "agents do not follow instructions."&lt;/p&gt;

&lt;p&gt;Sometimes true.&lt;/p&gt;

&lt;p&gt;But often the instructions are unmaintainable.&lt;/p&gt;

&lt;p&gt;Treat these files like code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;review changes&lt;/li&gt;
&lt;li&gt;delete stale rules&lt;/li&gt;
&lt;li&gt;keep commands executable&lt;/li&gt;
&lt;li&gt;prefer specific rules over generic advice&lt;/li&gt;
&lt;li&gt;keep path-specific context near the path&lt;/li&gt;
&lt;li&gt;add rules only when they prevent repeated mistakes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  checklist
&lt;/h2&gt;

&lt;p&gt;A good instruction file answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do I install and test this repo?&lt;/li&gt;
&lt;li&gt;Where are the important packages?&lt;/li&gt;
&lt;li&gt;What conventions are non-obvious?&lt;/li&gt;
&lt;li&gt;What should I never do?&lt;/li&gt;
&lt;li&gt;What does done mean here?&lt;/li&gt;
&lt;li&gt;Which checks should I run for common changes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it does not affect the next action, cut it.&lt;/p&gt;

&lt;h2&gt;
  
  
  sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/codex-manual.md" rel="noopener noreferrer"&gt;OpenAI Codex manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/memory" rel="noopener noreferrer"&gt;Claude Code memory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/best-practices" rel="noopener noreferrer"&gt;Claude Code best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/add-custom-instructions/add-repository-instructions" rel="noopener noreferrer"&gt;GitHub Copilot repository instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/create-custom-agents" rel="noopener noreferrer"&gt;GitHub Copilot custom agents&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>agents</category>
      <category>productivity</category>
    </item>
    <item>
      <title>the senior engineer's agent loop: context, plan, patch, proof</title>
      <dc:creator>Paulo Victor Leite Lima Gomes</dc:creator>
      <pubDate>Tue, 14 Jul 2026 21:30:10 +0000</pubDate>
      <link>https://dev.to/pvgomes/the-senior-engineers-agent-loop-context-plan-patch-proof-46g</link>
      <guid>https://dev.to/pvgomes/the-senior-engineers-agent-loop-context-plan-patch-proof-46g</guid>
      <description>&lt;p&gt;This is part 1 of a 5-post series on professional agentic coding for senior engineers.&lt;/p&gt;

&lt;p&gt;The series:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the senior engineer's agent loop: context, plan, patch, proof&lt;/li&gt;
&lt;li&gt;instructions as code: AGENTS.md, CLAUDE.md, and copilot-instructions.md&lt;/li&gt;
&lt;li&gt;subagents and specialized agents: parallelism without chaos&lt;/li&gt;
&lt;li&gt;review and verification: making agent code mergeable&lt;/li&gt;
&lt;li&gt;choosing the right agent surface: Codex, Claude Code, Copilot, and when not to use an agent&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The biggest mistake senior engineers make with coding agents is treating the prompt as the unit of work.&lt;/p&gt;

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

&lt;p&gt;The unit of work is the loop.&lt;/p&gt;

&lt;p&gt;Context -&amp;gt; plan -&amp;gt; bounded execution -&amp;gt; verification -&amp;gt; review.&lt;/p&gt;

&lt;p&gt;If that loop is strong, the model can be useful even when it is imperfect. If that loop is weak, even the best model becomes a confident diff generator.&lt;/p&gt;

&lt;h2&gt;
  
  
  start with the real outcome
&lt;/h2&gt;

&lt;p&gt;Bad task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix auth.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Goal: expired sessions should redirect to login instead of returning 500.
Context: start in src/auth, src/session, and tests/auth.
Constraints: no public API changes and no new dependencies.
Done when: add a failing regression test, implement the fix, run npm test -- auth, and show the final output.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That second version is not "prompt engineering." It is normal engineering.&lt;/p&gt;

&lt;p&gt;It says what is wrong, where to look, what not to change, and how we know the work is done.&lt;/p&gt;

&lt;p&gt;Claude Code's best-practices docs make this very explicit: give the agent a verification signal. Tests, builds, screenshots, logs, fixture diffs, anything machine-checkable. Do not ask for "better." Ask for evidence.&lt;/p&gt;

&lt;p&gt;Codex behaves the same way. A strong Codex task brief should include the goal, context, constraints, and done criteria. The more the agent has to infer, the more you are buying lottery tickets with your repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  use planning when the scope is uncertain
&lt;/h2&gt;

&lt;p&gt;Planning is not always needed.&lt;/p&gt;

&lt;p&gt;If the change is tiny, let the agent edit.&lt;/p&gt;

&lt;p&gt;But when the task is broad, unfamiliar, cross-cutting, or risky, split exploration from implementation.&lt;/p&gt;

&lt;p&gt;Claude Code example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude --permission-mode plan

Read src/auth, src/session, and the existing auth tests.
I want Google OAuth login added without changing the current password login path.
First explain the current session flow, then propose the minimal implementation plan.
Do not edit files yet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use plan mode.
Read the payment retry flow and the tests around failed card charges.
Explain the current behavior, list the files that likely need changes, and identify risky edge cases.
Stop before editing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub Copilot coding agent example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Goal&lt;/span&gt;

Add retries for transient card network failures.

&lt;span class="gu"&gt;## Scope&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Only payment authorization retry behavior.
&lt;span class="p"&gt;-&lt;/span&gt; Do not change settlement, refunds, or ledger posting.

&lt;span class="gu"&gt;## Done&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Regression tests cover network timeout and retry exhaustion.
&lt;span class="p"&gt;-&lt;/span&gt; Existing payment tests pass.
&lt;span class="p"&gt;-&lt;/span&gt; PR explains any behavior changes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the issue is not concrete enough for Copilot to produce a reviewable PR, the issue is not ready for an autonomous coding agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  constrain the patch
&lt;/h2&gt;

&lt;p&gt;Agents are very good at "while I was here" edits.&lt;/p&gt;

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

&lt;p&gt;A senior engineer should define the allowed patch surface before implementation starts.&lt;/p&gt;

&lt;p&gt;Good:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Only edit src/auth/session.ts and tests/auth/session.test.ts unless you find a hard blocker.
If another file must change, stop and explain why first.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Clean this up while fixing it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Clean this up" is where a small bug fix turns into an architecture argument hidden inside a diff.&lt;/p&gt;

&lt;h2&gt;
  
  
  ask for proof, not confidence
&lt;/h2&gt;

&lt;p&gt;The final response should not be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Done, the issue is fixed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final response should look more like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Changed:
- src/auth/session.ts
- tests/auth/session.test.ts

Verification:
- npm test -- auth/session.test.ts: passed
- npm run typecheck: passed

Notes:
- No public API changes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a check cannot run, the agent should say why.&lt;/p&gt;

&lt;p&gt;If a test fails, the agent should read the error, fix the root cause, and rerun it.&lt;/p&gt;

&lt;p&gt;This is where senior engineers keep control. Not by manually writing every line, but by refusing to accept unverifiable work.&lt;/p&gt;

&lt;h2&gt;
  
  
  bad practice: "prompt and pray"
&lt;/h2&gt;

&lt;p&gt;The failure mode looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;vague request&lt;/li&gt;
&lt;li&gt;broad edits&lt;/li&gt;
&lt;li&gt;no test added&lt;/li&gt;
&lt;li&gt;no focused verification&lt;/li&gt;
&lt;li&gt;same agent self-certifies&lt;/li&gt;
&lt;li&gt;human spends review time reverse-engineering intent&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is not a workflow. That is a cleanup job.&lt;/p&gt;

&lt;p&gt;The fix is boring and powerful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;define the outcome&lt;/li&gt;
&lt;li&gt;give high-signal context&lt;/li&gt;
&lt;li&gt;set boundaries&lt;/li&gt;
&lt;li&gt;ask for a plan when needed&lt;/li&gt;
&lt;li&gt;demand proof&lt;/li&gt;
&lt;li&gt;review the diff&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That loop is the difference between agentic coding as engineering practice and agentic coding as expensive autocomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  checklist
&lt;/h2&gt;

&lt;p&gt;Before giving an agent write access, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the exact customer or system behavior I want?&lt;/li&gt;
&lt;li&gt;Where should the agent start reading?&lt;/li&gt;
&lt;li&gt;What files or areas are out of bounds?&lt;/li&gt;
&lt;li&gt;What checks prove the work?&lt;/li&gt;
&lt;li&gt;Should the agent plan first?&lt;/li&gt;
&lt;li&gt;Who reviews the final diff?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you cannot answer those, you are not ready to delegate the task yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/best-practices" rel="noopener noreferrer"&gt;Claude Code best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/common-workflows" rel="noopener noreferrer"&gt;Claude Code common workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/codex-manual.md" rel="noopener noreferrer"&gt;OpenAI Codex manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/tutorials/cloud-agent/get-the-best-results" rel="noopener noreferrer"&gt;GitHub Copilot: get the best results from Copilot coding agent&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>agents</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
