<?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: hefty</title>
    <description>The latest articles on DEV Community by hefty (@hefty_69a4c2d631c9dd70724).</description>
    <link>https://dev.to/hefty_69a4c2d631c9dd70724</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%2F3686846%2Fd23c7b90-6e5c-4c63-a220-85df4d0e14fa.png</url>
      <title>DEV Community: hefty</title>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hefty_69a4c2d631c9dd70724"/>
    <language>en</language>
    <item>
      <title>Your Coding Agent Needs an `unverified` State</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Fri, 18 Sep 2026 06:39:08 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/your-coding-agent-needs-an-unverified-state-1k3d</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/your-coding-agent-needs-an-unverified-state-1k3d</guid>
      <description>&lt;p&gt;Imagine a coding agent patches a checkout bug. The focused unit test passes. The process exits cleanly. Its final message says the task is done.&lt;/p&gt;

&lt;p&gt;One problem: the request was about a browser checkout flow, and nobody ran that flow.&lt;/p&gt;

&lt;p&gt;The patch may be correct. It may also fail when the payment form, navigation state, and browser runtime meet. The agent has evidence for one claim and no evidence for another. Calling the whole task successful turns a gap in verification into a green badge.&lt;/p&gt;

&lt;p&gt;Coding-agent systems need an explicit &lt;code&gt;unverified&lt;/code&gt; outcome. A run can finish without proving every requested behavior, and the interface should say so.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Done" is carrying too many meanings
&lt;/h2&gt;

&lt;p&gt;Most agent workflows collapse several events into one status:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The process stopped.&lt;/li&gt;
&lt;li&gt;The tool changed something.&lt;/li&gt;
&lt;li&gt;The requested behavior was accepted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Those events are related, but they are not interchangeable.&lt;/p&gt;

&lt;p&gt;A zero exit code tells you that a process completed according to its own exit convention. Reading the file back tells you that bytes were written. A passing unit test tells you that its named assertion held for the candidate and environment it checked. None of those facts automatically proves the whole task.&lt;/p&gt;

&lt;p&gt;The gap gets easier to miss as agents gain more tools. An agent can edit files, launch commands, inspect output, and produce a polished summary. More activity creates more observations. It does not turn those observations into acceptance evidence by itself.&lt;/p&gt;

&lt;p&gt;The workflow needs two axes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;execution_status&lt;/code&gt;: Did the attempt finish, fail, or remain blocked?&lt;/li&gt;
&lt;li&gt;claim-level verification: Which requested behaviors were verified, contradicted, or left unverified?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An attempt can be &lt;code&gt;finished&lt;/code&gt; while one of its claims remains &lt;code&gt;unverified&lt;/code&gt;. That is not a system error. It is an honest description of the available evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Track claims, not confidence
&lt;/h2&gt;

&lt;p&gt;A single task badge hides too much. Break the request into claims that can be checked independently.&lt;/p&gt;

&lt;p&gt;For the hypothetical checkout patch, the claims might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the price calculation returns the expected total for a named case&lt;/li&gt;
&lt;li&gt;the payment button becomes enabled after valid input&lt;/li&gt;
&lt;li&gt;the browser completes the requested checkout path&lt;/li&gt;
&lt;li&gt;the patch does not change an unrelated account flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These claims may not all need the same evidence. A focused unit test could cover the calculation. A browser check could cover the interaction. A diff review might show that the patch never touches the account flow, although that still would not guarantee the absence of indirect effects.&lt;/p&gt;

&lt;p&gt;Each claim gets one of three outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;verified&lt;/code&gt;: a named check produced evidence for the claim&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;contradicted&lt;/code&gt;: a named check produced evidence against the claim&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unverified&lt;/code&gt;: the workflow does not have enough relevant evidence either way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Unverified&lt;/code&gt; is not a softer word for failure. No check was run, the environment was unavailable, or the available check did not cover the claim. &lt;code&gt;Contradicted&lt;/code&gt; means relevant evidence exists and points the other way. Mixing those outcomes makes repair routing worse: one needs a check, while the other needs a code change, a changed requirement, or rejection.&lt;/p&gt;

&lt;p&gt;Claim-level outcomes prevent the opposite mistake too. One failed check should not stain every claim in the task. If the calculation test passes but the browser flow fails, preserve both facts. The system now knows what not to redo and where the repair belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a small verification record
&lt;/h2&gt;

&lt;p&gt;The record does not need to become a new observability platform. It needs enough structure to stop prose from laundering uncertainty.&lt;/p&gt;

&lt;p&gt;Here is an illustrative format, not an existing protocol or a claim about any project's API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;execution_status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;finished&lt;/span&gt;
&lt;span class="na"&gt;candidate_ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;exact&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;patch&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;revision&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;under&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;review&amp;gt;"&lt;/span&gt;
&lt;span class="na"&gt;claims&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;checkout-total&lt;/span&gt;
    &lt;span class="na"&gt;expected&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;named&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;calculation&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;behavior&amp;gt;"&lt;/span&gt;
    &lt;span class="na"&gt;outcome&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verified&lt;/span&gt;
    &lt;span class="na"&gt;evidence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;focused&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;artifact&amp;gt;"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;browser-checkout&lt;/span&gt;
    &lt;span class="na"&gt;expected&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;requested&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;browser&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;behavior&amp;gt;"&lt;/span&gt;
    &lt;span class="na"&gt;outcome&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unverified&lt;/span&gt;
    &lt;span class="na"&gt;evidence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
    &lt;span class="na"&gt;gap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;browser&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;environment&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;was&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;not&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;available&amp;gt;"&lt;/span&gt;
&lt;span class="na"&gt;next_action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;run&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;named&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;browser&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;scenario&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;against&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;this&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;candidate&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The angle brackets matter. They keep the example from looking like a real execution log. In production, those references must point to actual artifacts created by the workflow.&lt;/p&gt;

&lt;p&gt;A useful record answers four practical questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What exact candidate was evaluated?&lt;/li&gt;
&lt;li&gt;What did each check claim to establish?&lt;/li&gt;
&lt;li&gt;Where is the evidence?&lt;/li&gt;
&lt;li&gt;What bounded action would resolve the remaining gap?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It should not say &lt;code&gt;all tests passed&lt;/code&gt; when only one test command ran. It should name the check and the requirement it covers. It should not use a file hash as proof of behavior. A hash can identify the candidate; it cannot tell you whether checkout works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence expires when the relevant candidate changes
&lt;/h2&gt;

&lt;p&gt;Verification belongs to a candidate, not to a conversation.&lt;/p&gt;

&lt;p&gt;Suppose the browser flow passes, then the agent edits the checkout component again. The old browser evidence may no longer apply. Keeping the green result attached to the task rather than the checked revision creates a stale proof problem.&lt;/p&gt;

&lt;p&gt;That does not mean every edit invalidates every check. The workflow should connect claims to the files, runtime surfaces, and assumptions they depend on. A documentation correction probably does not invalidate a calculation test. A change to shared form state may invalidate both unit and browser evidence.&lt;/p&gt;

&lt;p&gt;The useful rule is narrower: when the candidate changes, reassess the evidence for affected claims. Preserve unaffected evidence and rerun or downgrade the rest.&lt;/p&gt;

&lt;p&gt;Aiden's published design separates attempts, effects, evidence, verification, and verdicts. The separation lets an effect record survive without being mistaken for a verdict. A parent process can inspect what a worker changed, then decide whether the supplied evidence covers the assigned claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parent agents must verify the handoff
&lt;/h2&gt;

&lt;p&gt;Multi-agent systems make false completion easier.&lt;/p&gt;

&lt;p&gt;A helper returns a confident paragraph: "Implemented the fix and verified the result." The parent sees clean prose, not the boundary of the check. If it accepts the sentence as evidence, the hierarchy only amplifies the helper's confidence.&lt;/p&gt;

&lt;p&gt;The parent should evaluate the handoff against the assignment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is there a candidate artifact to inspect?&lt;/li&gt;
&lt;li&gt;Does the evidence belong to that candidate?&lt;/li&gt;
&lt;li&gt;Does the check address the assigned claim?&lt;/li&gt;
&lt;li&gt;Are unresolved gaps still visible?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a demand for the parent to rerun every command. It is a demand that the parent judge evidence, not tone. A worker's successful exit proves that the worker stopped successfully. Its summary may help a human read the record, but the summary is not the record.&lt;/p&gt;

&lt;p&gt;The same rule applies to human review. Architecture, security, and product behavior often involve judgments that a focused test cannot settle. The system should route those claims to review instead of silently treating machine-checkable evidence as universal approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route the gap instead of hiding it
&lt;/h2&gt;

&lt;p&gt;An &lt;code&gt;unverified&lt;/code&gt; state can look like unfinished work. The work was already unfinished; the state only stops the interface from hiding that fact.&lt;/p&gt;

&lt;p&gt;A good unresolved handoff should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the last candidate that was checked&lt;/li&gt;
&lt;li&gt;the claims that were verified&lt;/li&gt;
&lt;li&gt;the exact claim that remains open&lt;/li&gt;
&lt;li&gt;the evidence collected so far&lt;/li&gt;
&lt;li&gt;the reason verification stopped&lt;/li&gt;
&lt;li&gt;one safe next action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reason matters. Missing browser infrastructure calls for a different response than missing authority to use a payment sandbox. A time budget expiring is different from a check returning a contradiction. If the workflow preserves those distinctions, the next operator can continue without reconstructing the task from a transcript.&lt;/p&gt;

&lt;p&gt;An unresolved handoff also needs a stop condition. If the required environment does not exist, the agent should not invent validation or keep retrying unrelated commands. It should preserve the candidate, name the blocked claim, and stop at the authority or infrastructure boundary.&lt;/p&gt;

&lt;p&gt;Preserving the gap gives the next step a typed input instead of a vague success message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bring the missing check back into view
&lt;/h2&gt;

&lt;p&gt;Return to the checkout patch. The unit test passed, so the calculation claim can be &lt;code&gt;verified&lt;/code&gt; for the checked candidate. The browser flow was never run, so that claim is &lt;code&gt;unverified&lt;/code&gt;. The task is not globally green, and it is not globally failed.&lt;/p&gt;

&lt;p&gt;The next action is small: run the named browser scenario against the same candidate. If it passes, attach the evidence and update that claim. If it fails, mark the claim &lt;code&gt;contradicted&lt;/code&gt; and route the patch back for repair. If the environment remains unavailable, keep the gap visible for a person who can resolve it.&lt;/p&gt;

&lt;p&gt;A coding agent should be allowed to finish its run without pretending it proved the result. An honest &lt;code&gt;unverified&lt;/code&gt; state gives the next developer something better than confidence: it gives them the exact boundary of what is known.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Source notes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/taracodlabs/aiden" rel="noopener noreferrer"&gt;Aiden — autonomous AI agent for computer and codebase work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/unfiltered_anshul/open-source-ai-coding-agents-in-2025-which-ones-actually-ship-code-jc8"&gt;Open-Source AI Coding Agents in 2026: Which Ones Actually Ship Code?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>testing</category>
      <category>devtools</category>
    </item>
    <item>
      <title>The Fastest Coding-Agent Step Is the One You Remove From the Loop</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Mon, 14 Sep 2026 10:40:09 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/the-fastest-coding-agent-step-is-the-one-you-remove-from-the-loop-2hk2</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/the-fastest-coding-agent-step-is-the-one-you-remove-from-the-loop-2hk2</guid>
      <description>&lt;p&gt;Put a fast model inside a bad workflow and watch what happens.&lt;/p&gt;

&lt;p&gt;It scans the repository, receives a wall of search output, asks permission for a harmless command, loses the important constraint in the noise, rereads the same files, and finally runs the test that could have run automatically ten minutes earlier. The model may be quick. The task is still slow.&lt;/p&gt;

&lt;p&gt;Coding-agent performance is an end-to-end property. Inference speed matters, but only for the slice of the run spent waiting on inference. The rest is context collection, tool execution, approvals, validation, retries, and recovery.&lt;/p&gt;

&lt;p&gt;Before paying for faster reasoning, remove the turns that never needed reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Count handoffs, not chat messages
&lt;/h2&gt;

&lt;p&gt;A round trip is any handoff that must finish before useful work can continue. It might be another model turn, a tool invocation, a human decision, or a recovery cycle after the run loses state.&lt;/p&gt;

&lt;p&gt;A normal coding-agent loop looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;context -&amp;gt; reason -&amp;gt; act -&amp;gt; observe -&amp;gt; approve -&amp;gt; validate -&amp;gt; recover or finish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;None of those phases is automatically waste. The waste appears when boundaries are vague.&lt;/p&gt;

&lt;p&gt;A tool dumps an entire log when the next step needs one error. An approval covers one command instead of a defined risk scope. A failed check returns prose instead of a machine-readable result. A resumed session rebuilds context from the transcript because nobody saved a durable checkpoint.&lt;/p&gt;

&lt;p&gt;Map those handoffs before changing models. Here is an illustrative version, not a proposed standard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;context_acquisition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;actor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;retrieval tool&lt;/span&gt;
  &lt;span class="na"&gt;input_boundary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;task contract and allowed repository scope&lt;/span&gt;
  &lt;span class="na"&gt;output_artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;context manifest&lt;/span&gt;
  &lt;span class="na"&gt;repeat_trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;a named evidence gap&lt;/span&gt;

&lt;span class="na"&gt;model_reasoning&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;actor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;coding agent&lt;/span&gt;
  &lt;span class="na"&gt;input_boundary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;context manifest and current goal&lt;/span&gt;
  &lt;span class="na"&gt;output_artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;decision or bounded plan&lt;/span&gt;
  &lt;span class="na"&gt;stop_condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;next action and success condition are explicit&lt;/span&gt;

&lt;span class="na"&gt;tool_execution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;actor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deterministic tool&lt;/span&gt;
  &lt;span class="na"&gt;input_boundary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fixed command, files, and limits&lt;/span&gt;
  &lt;span class="na"&gt;output_artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bounded result plus full-log reference&lt;/span&gt;
  &lt;span class="na"&gt;retry_rule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;retry only a classified transient failure&lt;/span&gt;

&lt;span class="na"&gt;approval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;actor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;human or policy service&lt;/span&gt;
  &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;named effects and resources&lt;/span&gt;
  &lt;span class="na"&gt;output_artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;decision record&lt;/span&gt;
  &lt;span class="na"&gt;invalidation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;scope, target, or reviewed artifact changes&lt;/span&gt;

&lt;span class="na"&gt;validation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;actor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test, linter, type checker, or other named check&lt;/span&gt;
  &lt;span class="na"&gt;input_boundary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;candidate artifact&lt;/span&gt;
  &lt;span class="na"&gt;output_artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;structured pass or fail evidence&lt;/span&gt;
  &lt;span class="na"&gt;failure_route&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;repair, escalate, or stop&lt;/span&gt;

&lt;span class="na"&gt;recovery&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;actor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;runtime&lt;/span&gt;
  &lt;span class="na"&gt;input_boundary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;durable checkpoint and classified failure&lt;/span&gt;
  &lt;span class="na"&gt;output_artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;restored state and allowed next action&lt;/span&gt;
  &lt;span class="na"&gt;stop_condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;state cannot be restored safely&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The indentation mistake in many real systems is conceptual: everything sits under &lt;code&gt;model_reasoning&lt;/code&gt;. Retrieval, command selection, policy, validation, and recovery all become prompts. The agent keeps talking because the workflow gave it no other way to move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remove the model from deterministic leaf work
&lt;/h2&gt;

&lt;p&gt;Models are useful when the next action depends on incomplete evidence, tradeoffs, or interpretation. They are an expensive control structure for a transform with fixed inputs and a checkable output.&lt;/p&gt;

&lt;p&gt;Formatting is the obvious example. File conversion, schema validation, asset resizing, linting, and many code-generation substeps can also be deterministic. Give them typed inputs, run the tool directly, and return a small result.&lt;/p&gt;

&lt;p&gt;If a generated release image needs platform-ready dimensions, a browser-local utility such as &lt;a href="https://resizeimagefor.com" rel="noopener noreferrer"&gt;Resize Image For&lt;/a&gt; can handle that fixed resize-and-export step without uploading source pixels for processing. Asking an agent to rediscover dimensions, choose an image library, write a temporary script, and inspect the output adds uncertainty to a settled operation.&lt;/p&gt;

&lt;p&gt;The same principle applies inside a repository. If the project already has a formatter command, run it. If a JSON schema decides whether a file is valid, call the validator. If a codemod expresses a known migration, let the agent choose whether the codemod fits, then let the codemod perform the repetitive edits.&lt;/p&gt;

&lt;p&gt;Direct tools do not make the workflow safe by themselves. A deterministic command can still target the wrong files or receive bad input. The benefit is a narrower contract: the agent decides what should happen, while the tool performs a repeatable operation whose output is easier to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bound context without starving the task
&lt;/h2&gt;

&lt;p&gt;"Use less context" is bad advice when applied blindly. Missing a package convention or an acceptance requirement can create more retries than a smaller prompt saves.&lt;/p&gt;

&lt;p&gt;The useful goal is bounded context. Start each run with a stable task contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the repository state and task goal&lt;/li&gt;
&lt;li&gt;allowed files, commands, and effects&lt;/li&gt;
&lt;li&gt;relevant project instructions&lt;/li&gt;
&lt;li&gt;the expected artifact&lt;/li&gt;
&lt;li&gt;named acceptance checks&lt;/li&gt;
&lt;li&gt;stop and escalation conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Retrieve repository material against that contract. Return the matching symbols, nearby tests, and local instructions instead of dumping a broad search transcript. When a tool produces a large log, keep the full output as an artifact and send the agent the failing check, exit status, and a reference to the detail.&lt;/p&gt;

&lt;p&gt;This also changes recovery. A durable task contract, context manifest, current diff, and latest check result are much cheaper to resume from than a long conversation full of superseded plans.&lt;/p&gt;

&lt;p&gt;Alera's project description makes these surrounding surfaces visible: real PTYs for CLI agents, isolated Git worktrees, lifecycle activity, resource tracking, and persisted sessions. That does not establish a speed advantage. It does show that process state, workspace state, and session state belong in the performance model.&lt;/p&gt;

&lt;p&gt;A fast response cannot compensate for rebuilding all three after every interruption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put approvals at risk boundaries
&lt;/h2&gt;

&lt;p&gt;Approval prompts are often treated as a choice between safety and speed. That framing produces two bad designs: interrupt the operator for every small action, or grant broad authority so the chart looks faster.&lt;/p&gt;

&lt;p&gt;An approval should describe a meaningful boundary. Scope it to the effects that carry risk: changing deployment files, using a credential, writing outside the worktree, opening a network connection, merging a pull request, or publishing an artifact. Let routine operations inside an already approved scope proceed without renegotiation.&lt;/p&gt;

&lt;p&gt;The approval also needs an invalidation rule. Permission to deploy one reviewed artifact should not silently transfer to a different artifact after the agent edits it. A decision tied to a target, scope, and artifact state is useful evidence. A floating "yes" in a transcript is not.&lt;/p&gt;

&lt;p&gt;Proliferate's README presents reusable workflows, isolated task worktrees, parallel agents, and human approval gates as explicit orchestration primitives. Again, that is a project-authored description rather than measured proof. The useful design signal is the separation: workflow steps and approval boundaries exist outside the model's conversational improvisation.&lt;/p&gt;

&lt;p&gt;Some reviews must remain serial. A consequential change may deserve a person reading the final diff even if that adds latency. Optimize the placement and scope of that decision; do not delete it to win a benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation should return evidence, not reassurance
&lt;/h2&gt;

&lt;p&gt;An agent saying "the tests should pass" is not a validation phase. Neither is a final message that says the task is complete.&lt;/p&gt;

&lt;p&gt;Where acceptance can be mechanical, let the named checks decide it. The runtime can run tests, lint, type checks, schema checks, build commands, or task-specific assertions without asking the model to narrate each command. Return structured results to the loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm-typecheck&lt;/span&gt;
&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;failed&lt;/span&gt;
&lt;span class="na"&gt;exit_code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2 errors in src/auth/session.ts&lt;/span&gt;
&lt;span class="na"&gt;artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;logs/pnpm-typecheck-017.txt&lt;/span&gt;
&lt;span class="na"&gt;next_route&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bounded-repair&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model still has a job when a check fails: diagnose the evidence and propose a repair. It should not need to persuade the system that a failed check is close enough.&lt;/p&gt;

&lt;p&gt;This boundary matters after tool upgrades too. A current coding-tool roundup reports changes involving permissions, secret redaction, MCP configuration and trust, and experimental worktree behavior. Those changes sit around inference. An upgraded model can answer faster while the run loses time to a stale integration, a changed entry point, or a permission failure.&lt;/p&gt;

&lt;p&gt;Re-run the workflow checks after an upgrade. Old latency assumptions do not survive a changed execution path merely because the model name stayed familiar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parallel agents change the shape of waiting
&lt;/h2&gt;

&lt;p&gt;Parallelism can reduce elapsed time when tasks are genuinely independent. It can also create more handoffs: worktree setup, task partitioning, shared-state coordination, competing patches, and a larger review queue.&lt;/p&gt;

&lt;p&gt;Count accepted outcomes, not active terminals. Two agents investigating the same failure may produce twice the activity and no additional progress. Four patches waiting on one reviewer are still waiting.&lt;/p&gt;

&lt;p&gt;This is why resource and lifecycle visibility matter. For each worker, preserve the task boundary, current state, produced artifact, and owner of the next decision. Concurrency without those records turns recovery into archaeology.&lt;/p&gt;

&lt;p&gt;Parallel work earns its complexity when overlap removes waiting that cannot be removed another way. It is not a substitute for making one loop legible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark the loop, not the launch demo
&lt;/h2&gt;

&lt;p&gt;The launch discussion for Bullet is useful because its maker attributes speed to several workflow choices: model routing, targeted search, bounded tool output, context hygiene, and fewer round trips. Commenters questioned the comparison methodology. Both sides point to the same requirement: "fast" needs a task envelope.&lt;/p&gt;

&lt;p&gt;Compare representative runs from the same starting state and task class. Record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;latency by phase&lt;/li&gt;
&lt;li&gt;round-trip count by type&lt;/li&gt;
&lt;li&gt;retries and their causes&lt;/li&gt;
&lt;li&gt;the artifact produced&lt;/li&gt;
&lt;li&gt;the named checks that passed or failed&lt;/li&gt;
&lt;li&gt;whether the outcome was accepted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not blend a typo fix with a cross-package migration and call the average meaningful. Do not count a run as fast because it stopped before validation. Do not compare one agent with precise repository instructions against another starting from a vague sentence.&lt;/p&gt;

&lt;p&gt;Fewer round trips are a hypothesis, not a guarantee. One extra retrieval can prevent several repair cycles. One deliberate approval can prevent a costly effect. A model turn that catches a bad assumption may be the quickest part of the run.&lt;/p&gt;

&lt;p&gt;The target is avoidable latency. Preserve the handoffs that carry judgment, authority, or proof.&lt;/p&gt;

&lt;p&gt;That distinction also protects engineering understanding. Removing repetitive work is useful. Removing the points where someone has to understand the architecture, assess a tradeoff, or review a risky diff is how output outruns comprehension.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a round-trip budget before a model leaderboard
&lt;/h2&gt;

&lt;p&gt;For one week, instrument the workflow you already have. You do not need a grand observability platform. A task record with timestamps, handoff types, retries, artifacts, and check results is enough to expose obvious waste.&lt;/p&gt;

&lt;p&gt;Look for repeated patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repository searches that fetch the same material&lt;/li&gt;
&lt;li&gt;raw tool output repeatedly injected into context&lt;/li&gt;
&lt;li&gt;low-risk actions approved one at a time&lt;/li&gt;
&lt;li&gt;deterministic transforms performed through model turns&lt;/li&gt;
&lt;li&gt;validation delayed until a large patch accumulates&lt;/li&gt;
&lt;li&gt;sessions that cannot resume from a durable artifact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fix one boundary at a time. Replace repeated discovery with a context manifest. Add a summary contract to a noisy tool. Move a fixed transform behind a direct command. Tie approval to a real risk scope. Run a focused check as soon as the relevant artifact exists.&lt;/p&gt;

&lt;p&gt;Then compare models under the improved workflow. The faster model may still win, and now the comparison measures more than its ability to survive your orchestration overhead.&lt;/p&gt;

&lt;p&gt;Use this order: remove unnecessary turns, bound the remaining handoffs, then compare models.&lt;/p&gt;

&lt;p&gt;Before paying for a faster model, remove the turns that never needed a model.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Source notes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/leynier/alera" rel="noopener noreferrer"&gt;Alera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/proliferate-ai/proliferate" rel="noopener noreferrer"&gt;Proliferate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/aicoding-guide/this-week-in-claude-code-codex-and-gemini-cli-week-of-september-13-2026-1ob5"&gt;This week in Claude Code, Codex and Gemini CLI (week of September 13, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=49283063" rel="noopener noreferrer"&gt;Launch HN: Bullet (YC S26) — A Faster Coding Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/softwareengineer/comments/1wdb4n/programming_practice_in_todays_dev/" rel="noopener noreferrer"&gt;Programming practice in today's dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Your Coding Agent UI Needs an Event Model, Not a Chat Transcript</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Sat, 12 Sep 2026 08:25:09 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/your-coding-agent-ui-needs-an-event-model-not-a-chat-transcript-2m82</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/your-coding-agent-ui-needs-an-event-model-not-a-chat-transcript-2m82</guid>
      <description>&lt;p&gt;Imagine a coding agent has been running for 25 minutes. Its transcript is busy. It searched the repository, announced a plan, edited three files, ran a command, apologized for an error, and said it was making one final adjustment.&lt;/p&gt;

&lt;p&gt;The cursor is still moving. What you cannot see is more important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which phase is active?&lt;/li&gt;
&lt;li&gt;Is the agent blocked or still making progress?&lt;/li&gt;
&lt;li&gt;What was the last durable artifact?&lt;/li&gt;
&lt;li&gt;Did the required checks pass?&lt;/li&gt;
&lt;li&gt;What action is safe now?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A chat transcript can contain every sentence the agent produced and still fail to answer all five.&lt;/p&gt;

&lt;p&gt;Chat is useful for instructions and explanations. It is a bad state model. Once an agent runs tools, waits for approval, creates artifacts, and validates work over several minutes, its operator UI needs a structured event stream underneath the conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chat is an explanation layer
&lt;/h2&gt;

&lt;p&gt;Chat became the default agent interface for an obvious reason: models produce text, and people know how to type into a box. That works well when the exchange is short and the output is the product.&lt;/p&gt;

&lt;p&gt;The shape changes when the output is a patch, pull request, deployment plan, or test result. Now the text describes work happening elsewhere. A sentence such as "I'm checking the failing tests" may describe intent, an active process, a retry, or stale narration left behind after a crash.&lt;/p&gt;

&lt;p&gt;The frontend should not have to parse that sentence to decide whether to show a spinner, an approval button, or a recovery action. Prose changes between models and versions. It can arrive late, contradict an earlier message, or sound finished before the acceptance checks run.&lt;/p&gt;

&lt;p&gt;Keep the conversation. Let it carry goals, questions, tradeoffs, and rationale. Put operational truth on a separate channel with stable semantics.&lt;/p&gt;

&lt;p&gt;Current tools are already exposing pieces of this distinction. Microsoft's Foundry Toolkit release notes describe richer model profiling and clearer Agent Inspector handling for events and latency. A recent DEV.to comparison evaluates coding agents through practical concerns such as repository permissions, tests, and knowing when to stop. These are project and author descriptions, not a shared standard, but they point at the same product problem: useful agent interfaces must represent the workflow around generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the run a small event contract
&lt;/h2&gt;

&lt;p&gt;You do not need to invent a universal agent protocol. Start with the information your interface must render without guessing.&lt;/p&gt;

&lt;p&gt;Here is an illustrative TypeScript model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Phase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;planning&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;editing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;validation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;EventBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;runId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;eventId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;Phase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;correlationId&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AgentEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;EventBase&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;run_queued&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;phase_started&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Phase&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool_started&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool_finished&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;succeeded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;artifact_created&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;artifactRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;approval_required&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;requiresAction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;approvalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;approval_resolved&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;approvalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;approved&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;denied&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;check_finished&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;checkRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;passed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;run_failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;errorCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;recoverable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;run_completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;checkRefs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treat the names as placeholders; the boundaries are what matter.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;runId&lt;/code&gt;, &lt;code&gt;eventId&lt;/code&gt;, and &lt;code&gt;sequence&lt;/code&gt; give the frontend identity and ordering. A correlation ID can join a tool start to its finish or connect a retry to the operation it replaced. The summary stays short enough for a timeline. Large outputs live behind &lt;code&gt;artifactRef&lt;/code&gt; or &lt;code&gt;checkRef&lt;/code&gt; instead of flooding the event payload.&lt;/p&gt;

&lt;p&gt;Durations belong only on operations the runtime can measure. If the system cannot separate model time from network delay, it should not manufacture that distinction for a polished chart.&lt;/p&gt;

&lt;p&gt;An append-only stream is often a good fit because it preserves transitions. The UI can rebuild a projection after reconnecting instead of trusting one giant mutable session object whose history has vanished. That is an implementation option, not a requirement. The contract matters more than whether you call the storage pattern event sourcing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model the states people care about
&lt;/h2&gt;

&lt;p&gt;"Streaming," "running," and "done" are too coarse for an agent that can pause, ask permission, validate a patch, and fail in ways that may or may not be recoverable.&lt;/p&gt;

&lt;p&gt;A practical UI might project events into these states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;queued&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;running&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;waiting_for_approval&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;validating&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;failed_recoverable&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;failed_terminal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;completed&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a proposed state set, not an industry standard. Your workflow may need fewer states or more precise ones. What matters is that each displayed state follows from an event rather than a mood inferred from the latest message.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;waiting_for_approval&lt;/code&gt; deserves special treatment. The run is not progressing, but it has not failed. The interface should preserve what action was requested, the scope of that request, and the decision that resumed or stopped the run. A modal that disappears after one click leaves the timeline unable to explain why the agent gained permission to continue.&lt;/p&gt;

&lt;p&gt;Failure needs similar honesty. A failed test may permit a bounded retry. A revoked credential may require operator action. A corrupted workspace may end the run. Showing the same red "failed" badge for all three forces the user back into logs to discover the available next step.&lt;/p&gt;

&lt;p&gt;Completion should be strict. If the task contract names tests, review, or another acceptance check, &lt;code&gt;run_completed&lt;/code&gt; should reference that evidence. The agent's final "done" message is commentary. It is not an acceptance event.&lt;/p&gt;

&lt;h2&gt;
  
  
  Activity is not progress
&lt;/h2&gt;

&lt;p&gt;A transcript looks productive whenever text keeps arriving. An event timeline can make the same mistake if it rewards volume.&lt;/p&gt;

&lt;p&gt;Ten tool calls might represent ten useful steps. They might also be the same failed search repeated with slightly different wording. Counting events does not tell you which one happened.&lt;/p&gt;

&lt;p&gt;Progress indicators should follow durable milestones: a phase transition, a new diff, an approval decision, or a named check result. If the workflow has no defensible percentage, skip the percentage. "Validation: 2 of 4 checks finished" tells the truth. "87% complete" usually does not.&lt;/p&gt;

&lt;p&gt;The same rule applies to status copy. Prefer "waiting for approval to modify deployment files" over "the agent is thinking." One describes an observable condition and gives the operator a decision. The other decorates uncertainty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Latency needs semantics
&lt;/h2&gt;

&lt;p&gt;One timer cannot explain a long-running agent.&lt;/p&gt;

&lt;p&gt;A run can spend time in a queue, waiting on a model, executing a tool, waiting for a person, or validating an artifact. Those delays call for different responses. Faster model inference will not fix a five-hour approval wait. A quicker shell command will not help a run that keeps choosing the wrong tool.&lt;/p&gt;

&lt;p&gt;Recent launch discussions make this measurement gap visible. Makers describe fewer round trips, bounded tool output, and lower cost, while community replies ask for stronger evidence. Rather than adding another "fast" badge, give operators a latency view that connects measurable phases to outcomes.&lt;/p&gt;

&lt;p&gt;For each correlated operation, record the start and finish when the runtime owns both boundaries. Then show where elapsed time accumulated and whether the operation produced an artifact, a check result, a retry, or a failure. Keep unobserved time labeled as unobserved rather than assigning it to the model by subtraction.&lt;/p&gt;

&lt;p&gt;That makes performance work concrete. It also prevents approval delay and validation time from being misreported as generation latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project one stream into several views
&lt;/h2&gt;

&lt;p&gt;The event stream is infrastructure, not the interface itself. Different users need different projections of the same run.&lt;/p&gt;

&lt;p&gt;A compact status panel can show the current phase, blocker, last durable artifact, acceptance state, and allowed next action. A timeline can preserve transitions for diagnosis. An approval inbox can collect unresolved requests across runs. Artifact and check views can connect a run to its diff, worktree, pull request, logs, and validation results. A latency view can group measured duration by phase and operation.&lt;/p&gt;

&lt;p&gt;This shape matches what is appearing around current multi-agent products. Project discussions connect agent runs with documents and human approval gates. Product descriptions connect them with worktrees, pull requests, artifacts, remote access, and recovery. Those descriptions do not prove reliability or productivity. They do show why a transcript-only UI runs out of room: the work has relationships that paragraphs cannot represent cleanly.&lt;/p&gt;

&lt;p&gt;Keep the event payload bounded. A test log belongs in controlled artifact storage, with the event pointing to it. The same goes for a diff or pull request. References let each view fetch the evidence it needs without turning the timeline into a second database of duplicated blobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovery starts with an honest last state
&lt;/h2&gt;

&lt;p&gt;An event model alone cannot make recovery safe, but it gives the interface enough information to stop pretending.&lt;/p&gt;

&lt;p&gt;After a disconnect or crash, the UI should be able to show the last accepted sequence, the last durable artifact, whether the failure was marked recoverable, and which action the runtime currently permits. It should also expose uncertainty. A stale connection should look stale, not "running."&lt;/p&gt;

&lt;p&gt;The projection code must expect duplicates, delayed delivery, and reconnects. Event IDs support idempotent handling. Per-run sequence numbers expose gaps and out-of-order delivery. If event 42 arrives before event 41, the UI can wait, refresh, or mark the view incomplete instead of quietly building a fictional timeline.&lt;/p&gt;

&lt;p&gt;This does not replace checkpointing or idempotent tools. It keeps the frontend focused on the information needed to present recovery without guessing at backend state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not turn telemetry into a data leak
&lt;/h2&gt;

&lt;p&gt;Structured events are easier to query and display. They are also easier to retain forever by accident.&lt;/p&gt;

&lt;p&gt;Tool arguments, file paths, prompts, and logs can expose source code or secrets. Capture the smallest summaries and references required to operate the run. Redact deliberately, restrict access, and set retention rules for event and artifact stores. A beautiful inspector is not worth copying sensitive payloads into five projections.&lt;/p&gt;

&lt;p&gt;Small synchronous assistants may not need any of this. If a tool answers in seconds, produces no external artifact, and never waits for permission, a conversation can be enough. The event model earns its complexity when the workflow becomes long-running, tool-using, approval-bearing, or recoverable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The transcript is not the control surface
&lt;/h2&gt;

&lt;p&gt;A transcript tells the story of a run. An event model lets the product operate it.&lt;/p&gt;

&lt;p&gt;With explicit events, the interface can answer the questions that matter: what phase is active, what is blocked, which artifact exists, what passed, and what action is available. Chat can then do what it is good at: helping a person steer the work and understand why the agent made a choice.&lt;/p&gt;

&lt;p&gt;If your frontend has to parse reassuring prose to decide whether the work is complete, it does not have a run model yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source notes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/foundry-dev-tools/blob/main/WHATS_NEW.md" rel="noopener noreferrer"&gt;Foundry Toolkit for VS Code: What's New&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/sonotommy/8-ai-coding-agents-that-actually-ship-production-code-in-2026-18ch"&gt;8 AI Coding Agents That Actually Ship Production Code in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=49390739" rel="noopener noreferrer"&gt;Show HN: Proliferate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=49283063" rel="noopener noreferrer"&gt;Launch HN: Bullet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.producthunt.com/products/hob-2" rel="noopener noreferrer"&gt;hob&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Token Price Is a Terrible Metric for Coding-Agent Cost</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Thu, 10 Sep 2026 22:50:10 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/token-price-is-a-terrible-metric-for-coding-agent-cost-j59</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/token-price-is-a-terrible-metric-for-coding-agent-cost-j59</guid>
      <description>&lt;p&gt;Run A uses the cheaper model. It edits the right files, fails a test, retries with a wider change, burns through more tool calls, and stops with a confident completion message. An engineer spends the next hour figuring out which half of the patch can be kept.&lt;/p&gt;

&lt;p&gt;Run B uses a more expensive model. It works from the same repository state, stays inside scope, runs the named checks, and returns a patch the reviewer accepts with one small correction.&lt;/p&gt;

&lt;p&gt;The model line item can make Run A look cheaper. The engineering outcome says otherwise.&lt;/p&gt;

&lt;p&gt;Token price is an input price. It does not tell you what a verified patch cost. If coding agents are doing repository-level work, the useful internal metric is cost per accepted task, with every retry, failed check, recovery step, execution environment, and human intervention left in the ledger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your invoice measures consumption, not completion
&lt;/h2&gt;

&lt;p&gt;Tokens matter. Tool calls matter. Model time and sandbox time matter. You should track all of them.&lt;/p&gt;

&lt;p&gt;They still stop short of the result.&lt;/p&gt;

&lt;p&gt;A provider invoice cannot tell you whether a migration was safe, a visual regression was caught, or the reviewer rejected the patch. It usually cannot associate an abandoned worktree with the accepted patch that replaced it. If the agent switched models halfway through, the bill may split one engineering task across several unrelated line items.&lt;/p&gt;

&lt;p&gt;Current model releases are starting to frame efficiency around the whole agent loop. Meta's Muse Spark 1.3 announcement, for example, claims fewer tokens and tool calls alongside better long-horizon coding behavior. Those are vendor claims, not independently reproduced results here. More importantly, fewer calls are only useful if the run still reaches the acceptance boundary.&lt;/p&gt;

&lt;p&gt;A loop that stops early because it gave up is not efficient. Neither is a loop that says "done" before the test suite disagrees.&lt;/p&gt;

&lt;p&gt;The accounting needs three layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consumption: model usage, tool calls, execution time, and isolated compute&lt;/li&gt;
&lt;li&gt;failure load: retries, failed checks, abandoned branches, and recovery work&lt;/li&gt;
&lt;li&gt;outcome: accepted, rejected, or incomplete under named checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The third layer keeps the first two honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define the task before measuring the agent
&lt;/h2&gt;

&lt;p&gt;Cost per accepted task becomes nonsense if every run gets a different task.&lt;/p&gt;

&lt;p&gt;A typo fix with a deterministic test is not comparable to a dependency migration across six packages. A generated frontend with visual and interaction requirements is not comparable to renaming a private function. Averaging them into one number creates a tidy dashboard and a bad purchasing decision.&lt;/p&gt;

&lt;p&gt;Define a task envelope before the agent starts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repository revision and working state&lt;/li&gt;
&lt;li&gt;task class and goal&lt;/li&gt;
&lt;li&gt;allowed file and command scope&lt;/li&gt;
&lt;li&gt;authority and time limits&lt;/li&gt;
&lt;li&gt;expected artifact&lt;/li&gt;
&lt;li&gt;acceptance checks&lt;/li&gt;
&lt;li&gt;review decision required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then compare runs inside the same task class. Use the same starting revision when practical. Keep the validation contract stable. If one model gets a precise brief and another gets "fix the app," you are measuring prompt quality as much as model performance.&lt;/p&gt;

&lt;p&gt;The acceptance boundary also has to be explicit. A zero exit code may be one check, but it is not a general definition of success. The boundary could include unit tests, type checks, a migration dry run, browser screenshots, an accessibility scan, or human review of a risky diff. Different tasks need different evidence.&lt;/p&gt;

&lt;p&gt;This metric is local by design. Your repository, harness, and review policy shape the result. Cost per accepted task is useful for comparing choices inside one engineering system, not for declaring a universal winner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put the receipt in the harness
&lt;/h2&gt;

&lt;p&gt;Most teams already have enough raw data to build a useful receipt. The problem is that it lives in separate places: provider usage, terminal logs, worktrees, CI, review comments, and somebody's memory of the failed first attempt.&lt;/p&gt;

&lt;p&gt;The harness is where those records can meet.&lt;/p&gt;

&lt;p&gt;Alera's README describes separate terminals, Git worktrees, lifecycle hooks, quota tracking, and resource attribution in one agentic development environment. Mivia documents isolated worktrees, durable step records, lifecycle hooks, provider choice, and local workflow files. These are project-authored descriptions, not proof that either tool measures every cost correctly. They do show where task-level accounting can attach to real execution.&lt;/p&gt;

&lt;p&gt;A compact receipt could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auth-callback-fix-017&lt;/span&gt;
  &lt;span class="na"&gt;repository_revision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;84c19e2&lt;/span&gt;
  &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bounded-bug-fix&lt;/span&gt;
  &lt;span class="na"&gt;goal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fix duplicate callback processing&lt;/span&gt;

&lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example-provider&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example-model&lt;/span&gt;

&lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;src/auth/callback.ts&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;tests/auth/callback.test.ts&lt;/span&gt;
  &lt;span class="na"&gt;time_minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;45&lt;/span&gt;
  &lt;span class="na"&gt;allowed_effects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;edit_worktree&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;run_local_tests&lt;/span&gt;
  &lt;span class="na"&gt;forbidden_effects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;

&lt;span class="na"&gt;acceptance&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pnpm test --filter auth-callback&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pnpm typecheck&lt;/span&gt;
  &lt;span class="na"&gt;reviewer_decision_required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;consumption&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;input_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recorded_by_provider&lt;/span&gt;
  &lt;span class="na"&gt;output_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recorded_by_provider&lt;/span&gt;
  &lt;span class="na"&gt;tool_calls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recorded_by_harness&lt;/span&gt;
  &lt;span class="na"&gt;execution_duration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recorded_by_harness&lt;/span&gt;
  &lt;span class="na"&gt;isolated_compute_duration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recorded_by_runtime&lt;/span&gt;

&lt;span class="na"&gt;failure_load&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;failed_checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;first auth-callback test run&lt;/span&gt;
  &lt;span class="na"&gt;abandoned_worktrees&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
  &lt;span class="na"&gt;recovery_steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;reverted out-of-scope config edit&lt;/span&gt;

&lt;span class="na"&gt;human_load&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;approvals&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
  &lt;span class="na"&gt;intervention&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;reviewer requested one scope correction&lt;/span&gt;

&lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;worktrees/auth-callback-fix-017.diff&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;accepted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The example does not force every field into dollars. Human review may stay qualitative unless the team records time consistently. The point is traceability: one task, its spend, its failures, its evidence, and its final disposition.&lt;/p&gt;

&lt;p&gt;Store rejected and incomplete receipts too. If the ledger keeps only successful runs, the apparent cost will improve every time the agent fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failed loops are part of the price
&lt;/h2&gt;

&lt;p&gt;Coding-agent cost discussions often drift toward routing: use a cheaper model for easy work, fall back to a stronger model when needed. That can work. It can also hide a pile of waste behind the word "fallback."&lt;/p&gt;

&lt;p&gt;Suppose the first model makes three attempts, expands the diff, and leaves the worktree in an uncertain state. The second model then spends time reconstructing the task and cleaning up before producing the accepted patch. The accepted result belongs to the full chain, not just the final model call.&lt;/p&gt;

&lt;p&gt;The same rule applies to parallel agents. More workers can finish independent tasks faster, but they can also duplicate investigation, collide on shared state, or produce several patches that compete for one review slot. Per-session resource attribution matters because concurrency can raise throughput and waste in the same afternoon.&lt;/p&gt;

&lt;p&gt;This is where durable steps and lifecycle hooks earn their keep. A step boundary gives the harness somewhere to record spend and check outcomes. A validation hook can stop a broken loop before it starts another expensive revision. An abandoned worktree remains associated with the task instead of disappearing from the success story.&lt;/p&gt;

&lt;p&gt;Human intervention belongs in the receipt as well, but do not fake precision. "Reviewer resolved an out-of-scope config edit" is better data than a guessed dollar amount. Over time, repeated interventions reveal where the task contract or harness needs work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Segment by task class before comparing models
&lt;/h2&gt;

&lt;p&gt;A useful evaluation set should look like the work your team wants agents to do.&lt;/p&gt;

&lt;p&gt;For small deterministic edits, acceptance may be cheap: one focused test plus diff review. A migration needs stronger state checks and rollback evidence. Debugging needs a reproduced failure before the patch and a clear signal afterward. Generated frontend work needs browser behavior and visual evidence, not merely code that compiles.&lt;/p&gt;

&lt;p&gt;Keep those classes separate. Within each class, select representative tasks, fix the envelope, and compare accepted outcomes. For a narrow frontend study, a collection of &lt;a href="https://awesomegenerativeui.com/papers" rel="noopener noreferrer"&gt;Generative UI research papers&lt;/a&gt; can help identify domain-specific systems and evaluation ideas worth turning into a task set. The directory is a research surface, not a coding-agent benchmark and not evidence that any model will save money.&lt;/p&gt;

&lt;p&gt;Track the distribution, not only the average. One model may be cheap and predictable on bounded edits while occasionally exploding on migrations. Another may cost more per call but fail less often on long tasks. A single blended number hides the difference that should drive routing.&lt;/p&gt;

&lt;p&gt;Vendor efficiency claims can feed this process as hypotheses. If a release claims fewer tokens or tool calls, run representative local tasks under the same envelope. Check whether accepted-task cost falls, whether the failure rate changes, and whether review gets easier or harder. The local receipt decides whether the claim matters to your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimize the harness before the token
&lt;/h2&gt;

&lt;p&gt;The cheapest improvement may have nothing to do with model price.&lt;/p&gt;

&lt;p&gt;Add stop rules so an agent cannot repeat the same failed approach indefinitely. Bound concurrency so every session has an owner and a budget. Persist step records so a fallback does not need to reconstruct the run from chat history. Trigger validation at meaningful boundaries, not only after a large patch has accumulated.&lt;/p&gt;

&lt;p&gt;Execution belongs in the accounting too. Cloudflare's documented Cursor integration separates the agent loop from customer-controlled isolated execution. That architecture does not prove lower cost or better security. It does make the operating boundary visible: commands, repositories, tools, and compute can live outside the model provider, and their cost does not vanish because the token invoice ignores them.&lt;/p&gt;

&lt;p&gt;Once the harness can associate consumption, failures, checks, and acceptance with one task, model pricing becomes useful again. You can see where a cheaper model is genuinely economical, where a stronger model reduces recovery, and where the task contract is causing both to waste time.&lt;/p&gt;

&lt;p&gt;Until then, a low token bill can be an expensive way to produce work nobody should merge.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Source notes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://research.meta.ai/blog/introducing-muse-spark-1-3" rel="noopener noreferrer"&gt;Introducing Muse Spark 1.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/leynier/alera" rel="noopener noreferrer"&gt;Alera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MiviaLabs/mivia-agent" rel="noopener noreferrer"&gt;Mivia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/unfiltered_anshul/open-source-ai-coding-agents-in-2025-which-ones-actually-ship-code-jc8"&gt;Open-Source AI Coding Agents in 2026: Which Ones Actually Ship Code?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/AI_Agents/comments/1w9fh76/how_are_companies_managing_the_cost_of_ai_coding/" rel="noopener noreferrer"&gt;How are companies managing the cost of AI coding agents?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/sandbox/tutorials/cursor-cloud-agents/" rel="noopener noreferrer"&gt;Run Cursor Cloud Agents on Cloudflare via self-hosted machines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>A Bigger Context Window Won't Make Your Coding Agent Resumable</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Fri, 04 Sep 2026 12:24:11 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/a-bigger-context-window-wont-make-your-coding-agent-resumable-2cce</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/a-bigger-context-window-wont-make-your-coding-agent-resumable-2cce</guid>
      <description>&lt;p&gt;Your coding agent has been running for eight hours. It edited twelve files, started a dev server, attempted a migration, hit two failing tests, and then lost its session.&lt;/p&gt;

&lt;p&gt;The transcript is still there. It might even fit inside the model's context window. But a fresh process still cannot answer the questions that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which changes were successfully applied?&lt;/li&gt;
&lt;li&gt;Is the migration safe to run again?&lt;/li&gt;
&lt;li&gt;Is that dev server still alive?&lt;/li&gt;
&lt;li&gt;Which failing test blocked the last step?&lt;/li&gt;
&lt;li&gt;Should the next process resume, roll back, or stop for review?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The transcript survived. The job did not.&lt;/p&gt;

&lt;p&gt;Long-running agent work needs a resume protocol. More context can help a model continue a conversation, but it cannot turn chat history into durable job state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context is not a checkpoint
&lt;/h2&gt;

&lt;p&gt;Conversation context preserves messages, tool calls, and explanations. That is useful. It can remind a model what the user asked and how the session reasoned about the task.&lt;/p&gt;

&lt;p&gt;A checkpoint has a different job. It records what is true about the work now.&lt;/p&gt;

&lt;p&gt;That distinction gets expensive when a run is interrupted. A transcript might say, "I'll update the schema and rerun the tests." It does not necessarily prove that the schema changed, identify which command ran, or preserve its exit code. If the session disappeared between the tool call and the final response, the prose may describe an intention rather than the repository's actual state.&lt;/p&gt;

&lt;p&gt;A replacement process needs a compact operational record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the run's contract&lt;/li&gt;
&lt;li&gt;the last completed step&lt;/li&gt;
&lt;li&gt;changes and external side effects already made&lt;/li&gt;
&lt;li&gt;exact validation results&lt;/li&gt;
&lt;li&gt;the next safe decision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that record, recovery starts with archaeology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the run a bounded contract
&lt;/h2&gt;

&lt;p&gt;"Keep working until it is done" sounds productive, but it is a terrible recovery contract. Done is undefined, authority is open-ended, and a replacement process cannot tell whether the run stopped normally or simply ran out of road.&lt;/p&gt;

&lt;p&gt;A useful contract names the boundary before execution begins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a run ID and owner&lt;/li&gt;
&lt;li&gt;repository and worktree&lt;/li&gt;
&lt;li&gt;the goal and stop condition&lt;/li&gt;
&lt;li&gt;time, tool, and authority limits&lt;/li&gt;
&lt;li&gt;the expected artifact&lt;/li&gt;
&lt;li&gt;the checks that decide whether the artifact is acceptable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nightshift's author describes this shift explicitly: long agent runs become disk-backed, time-bounded jobs with contracts, recovery paths, receipts, and archives. That is a project-authored design, not independent evidence that every run will recover correctly. Still, the operating model is the interesting part. A shift has an end, and its state exists somewhere other than the active chat.&lt;/p&gt;

&lt;p&gt;The stop condition deserves special attention. "Implement authentication" leaves too much room for interpretation. "Prepare a reviewable patch for the login callback, stop before deployment, and record the named test results" gives the next operator something they can inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Persist facts at step boundaries
&lt;/h2&gt;

&lt;p&gt;Do not wait until the final response to save state. By then, the process may already be gone.&lt;/p&gt;

&lt;p&gt;Checkpoint after meaningful steps: dependency installation, migration generation, code modification, test execution, browser validation, or any external mutation. The record should stay small. Its purpose is fast re-entry, not a polished diary of everything the agent thought about.&lt;/p&gt;

&lt;p&gt;Mivia's documented workflow offers a useful implementation signal here. Its README describes isolated workflows, per-step run records, lifecycle hooks, and local files. Those features create places where a harness can persist facts before moving forward.&lt;/p&gt;

&lt;p&gt;The word "facts" matters. Save the command and its real result, not "tests look good." Save the files changed, not "updated the frontend." If a check failed, keep the failure visible instead of smoothing it into a progress summary.&lt;/p&gt;

&lt;p&gt;A good checkpoint might say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;last_completed_step: generated migration 0042_add_job_receipts
changed_files:
  - db/migrations/0042_add_job_receipts.sql
  - src/jobs/receipt.ts
checks:
  - command: pnpm test --filter job-receipts
    exit_code: 1
    outcome: 2 tests failed in receipt-retry.test.ts
pending_action: inspect whether retries duplicate an existing receipt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is far more useful than another page of confident narration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Track side effects separately
&lt;/h2&gt;

&lt;p&gt;File changes are only part of an agent run. The process may have started services, modified a database, opened a pull request, published an artifact, sent a message, or changed remote configuration.&lt;/p&gt;

&lt;p&gt;Those effects need their own ledger because replaying the original prompt can repeat them.&lt;/p&gt;

&lt;p&gt;A blind retry might apply the same migration twice. It might create a second deployment while the first one is still running. It might overwrite uncertainty with a new sequence of actions that happens to produce cleaner logs.&lt;/p&gt;

&lt;p&gt;A side-effect ledger should answer three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What changed outside the transcript?&lt;/li&gt;
&lt;li&gt;Can the operation be checked safely?&lt;/li&gt;
&lt;li&gt;Is it repeatable, reversible, or neither?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This does not make every action idempotent. It makes the uncertainty visible before another process acts on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovery must live outside the failed session
&lt;/h2&gt;

&lt;p&gt;A stalled process cannot be the sole owner of its recovery plan. The plan needs to be readable by a fresh process or a human operator with no access to the original model state.&lt;/p&gt;

&lt;p&gt;Recovery should begin with inspection, followed by an explicit decision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resume&lt;/strong&gt; when the recorded state matches the environment and the pending action is still valid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roll back&lt;/strong&gt; when a known reversible change should be removed before work continues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalate&lt;/strong&gt; when the evidence is incomplete, the environment drifted, or another action could compound an unknown side effect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why recovery is not the same as retry. Retry repeats an operation. Recovery first establishes what already happened.&lt;/p&gt;

&lt;p&gt;PI-Desktop's project documentation points at the operator-facing side of this problem through project sessions, message-scoped diffs, approvals, and guarded rollback. Those controls do not guarantee safe recovery, and local-first software is not automatically isolated or secure. They do make the unit of change more inspectable than one opaque stream of agent activity.&lt;/p&gt;

&lt;p&gt;A resume protocol can be simple. Here is an operating pattern, not a standard or a security guarantee:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auth-callback-2026-09-04-01&lt;/span&gt;
  &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;overnight-agent&lt;/span&gt;
  &lt;span class="na"&gt;repository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web-app&lt;/span&gt;
  &lt;span class="na"&gt;worktree&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;../worktrees/auth-callback&lt;/span&gt;

&lt;span class="na"&gt;contract&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;goal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prepare a reviewable login-callback patch&lt;/span&gt;
  &lt;span class="na"&gt;stop_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;named tests pass or a migration needs approval&lt;/span&gt;
  &lt;span class="na"&gt;time_budget_minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;90&lt;/span&gt;
  &lt;span class="na"&gt;allowed_effects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;edit_worktree&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;run_local_tests&lt;/span&gt;
  &lt;span class="na"&gt;forbidden_effects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;modify_production_data&lt;/span&gt;
  &lt;span class="na"&gt;expected_artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git_diff&lt;/span&gt;

&lt;span class="na"&gt;checkpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;last_completed_step&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;add receipt persistence&lt;/span&gt;
  &lt;span class="na"&gt;pending_action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inspect two retry test failures&lt;/span&gt;
  &lt;span class="na"&gt;changed_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;src/jobs/receipt.ts&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db/migrations/0042_add_job_receipts.sql&lt;/span&gt;

&lt;span class="na"&gt;side_effects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;services_started&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&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;web-dev-server&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3102&lt;/span&gt;
  &lt;span class="na"&gt;external_mutations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;

&lt;span class="na"&gt;evidence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm test --filter job-receipts&lt;/span&gt;
      &lt;span class="na"&gt;exit_code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;outcome&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2 retry tests failed&lt;/span&gt;

&lt;span class="na"&gt;recovery&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;inspect_first&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;git diff --stat&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pnpm test --filter job-receipts&lt;/span&gt;
  &lt;span class="na"&gt;resume_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;migration is unchanged and failures reproduce&lt;/span&gt;
  &lt;span class="na"&gt;rollback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;discard the isolated worktree&lt;/span&gt;
  &lt;span class="na"&gt;escalate_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;database state differs from the checkpoint&lt;/span&gt;

&lt;span class="na"&gt;receipt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;blocked&lt;/span&gt;
  &lt;span class="na"&gt;reviewer_action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;decide whether receipt creation must be idempotent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The schema is deliberately boring. Boring is good when a process wakes up at 3 a.m. and needs to decide whether a migration already ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finish with a receipt, not "done"
&lt;/h2&gt;

&lt;p&gt;A completion message is not evidence. The final receipt should contain the artifacts produced, the exact checks and outcomes, known failures, assumptions, and the next reviewer action.&lt;/p&gt;

&lt;p&gt;This also gives review tools a clean handoff. R3's launch describes a local interface that turns scattered comments into explicit feedback for a coding agent. It is a small, low-engagement project signal rather than adoption evidence, but the shape of the loop is useful: review state becomes an artifact that can follow the job into another session.&lt;/p&gt;

&lt;p&gt;A receipt does not prove correctness. It tells the next reviewer what was checked and what was not. That is enough to replace a vague claim of completion with a reviewable boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let old runs improve new contracts
&lt;/h2&gt;

&lt;p&gt;An archive earns its keep when it changes the next run.&lt;/p&gt;

&lt;p&gt;The ZeroShot launch describes local capture of agent sessions, clustering repeated friction, and drafting reusable workflow improvements. Those are author claims, not measured productivity results. The useful idea is narrower: repeated interruptions can reveal missing fields in the contract.&lt;/p&gt;

&lt;p&gt;If three runs stall because nobody recorded which browser profile owns port 3102, add that ownership to the template. If retries keep duplicating external actions, require idempotency keys or an escalation rule. If reviewers repeatedly ask which checks actually ran, make command outcomes mandatory in the receipt.&lt;/p&gt;

&lt;p&gt;The loop is practical: archive the run, find recurring ambiguity, then remove that ambiguity from the next contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apply the replacement-process test
&lt;/h2&gt;

&lt;p&gt;Before letting an agent run unattended for hours, imagine the current session vanishes halfway through.&lt;/p&gt;

&lt;p&gt;Can a different process inspect durable artifacts and determine the contract, current state, side effects, evidence, and next safe action? Can it choose resume, rollback, or escalation without treating the old transcript as ground truth?&lt;/p&gt;

&lt;p&gt;If the answer is no, a larger context window will only preserve more material to reread. Make the job resumable before making it longer.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Source notes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/orwamahmoud/i-stopped-treating-long-ai-coding-runs-like-chats-nightshift-now-treats-them-like-shifts-40ec"&gt;I Stopped Treating Long AI Coding Runs Like Chats — Nightshift Now Treats Them Like Shifts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MiviaLabs/mivia-agent" rel="noopener noreferrer"&gt;Mivia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vastsa/PI-Desktop/" rel="noopener noreferrer"&gt;PI-Desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=49113279" rel="noopener noreferrer"&gt;Show HN: ZeroShot — Agent session monitoring to make your team go faster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=48973898" rel="noopener noreferrer"&gt;Show HN: R3 — Review locally and send feedback back to your coding agent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>devops</category>
      <category>programming</category>
    </item>
    <item>
      <title>Four Coding Agents Need Four Workspaces, Not Four Chat Windows</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Mon, 31 Aug 2026 06:35:44 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/four-coding-agents-need-four-workspaces-not-four-chat-windows-l63</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/four-coding-agents-need-four-workspaces-not-four-chat-windows-l63</guid>
      <description>&lt;p&gt;Opening four coding-agent sessions feels like scaling. On a shared machine, it is closer to giving four fast contributors the same repository, shell, credentials, ports, caches, and merge queue without deciding who owns any of them.&lt;/p&gt;

&lt;p&gt;The first failure probably will not come from model quality. One task will restart a dev server while another is testing it. Two workers will touch the same lockfile. A branch will pass its own checks and still conflict with a migration waiting in the merge queue.&lt;/p&gt;

&lt;p&gt;Four chat windows create concurrency. Four owned workspaces plus one deliberate merge queue create a system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parallelism multiplies shared state
&lt;/h2&gt;

&lt;p&gt;Tasks that sound independent in a prompt can overlap in the environment.&lt;/p&gt;

&lt;p&gt;A frontend change and an API change may both edit generated types. Two test runs may expect the same database or browser profile. Separate worktrees can still launch services on the same port, read the same environment variables, and write to shared caches. The agents do not collide in the prompt. They collide in everything the prompt lets them touch.&lt;/p&gt;

&lt;p&gt;This is why adding a second agent changes the job. With one worker, the operator can keep a surprising amount of state in their head. With four, every unstated assumption becomes a race condition or a review problem.&lt;/p&gt;

&lt;p&gt;The fix is to make ownership visible before execution starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worktree is the start, not the boundary
&lt;/h2&gt;

&lt;p&gt;Git worktrees are a sensible first step. Each task gets its own branch and working files, so one agent is less likely to overwrite another agent's edits by accident.&lt;/p&gt;

&lt;p&gt;That is useful isolation, but it is narrow isolation.&lt;/p&gt;

&lt;p&gt;A worktree does not reserve a port. It does not separate process trees, temporary directories, credentials, network access, browser state, or external services. Treating it as a sandbox gives the workflow more confidence than the boundary deserves.&lt;/p&gt;

&lt;p&gt;Proliferate is an instructive project example because its documented design pairs isolated task worktrees with visible review state. The important idea is the pairing. Filesystem separation tells you where a patch was produced; task state tells you what should happen to that patch next. The project description is not independent proof that every boundary is solved, and it does not need to be. The pattern is useful on its own.&lt;/p&gt;

&lt;p&gt;For each concurrent task, define at least these ownership boundaries:&lt;/p&gt;

&lt;h3&gt;
  
  
  Workspace ownership
&lt;/h3&gt;

&lt;p&gt;Assign one repository scope, branch, and worktree. State which generated files or shared configuration the task may change. If two tasks own the same file, they are coupled work and should be queued accordingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Process ownership
&lt;/h3&gt;

&lt;p&gt;Reserve ports, dev servers, test databases, caches, temporary paths, and browser profiles. A process should have a named task owner and a cleanup rule instead of becoming shared background state.&lt;/p&gt;

&lt;h3&gt;
  
  
  Artifact ownership
&lt;/h3&gt;

&lt;p&gt;Name the output before the run begins: a patch, a report, a screenshot set, a migration plan, or some other reviewable object. "Improve the app" is not an artifact contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat authority as a task budget
&lt;/h2&gt;

&lt;p&gt;The easiest setup is to launch every worker from the operator's normal shell. It is also the setup with the least useful separation.&lt;/p&gt;

&lt;p&gt;A task that edits a local component rarely needs every token, deployment command, network destination, and destructive tool available to the human running it. Grant the repository, commands, credentials, and network surface required for that task. Leave the rest out.&lt;/p&gt;

&lt;p&gt;Current agent harnesses do not all enforce these boundaries in the same way. If a tool cannot restrict a credential or network path, write that limitation into the run record and reduce the task's authority. Do not silently treat the operator's full shell as a reasonable default.&lt;/p&gt;

&lt;p&gt;This also makes failures easier to understand. When a task has a small authority budget, the failure surface is smaller: you can see which files, processes, and external systems were in play without reconstructing the whole machine after the fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep integration serial on purpose
&lt;/h2&gt;

&lt;p&gt;Implementation can run in parallel. Integration should have one owner and an explicit order.&lt;/p&gt;

&lt;p&gt;Two patches can both be locally correct and still disagree about an API shape, migration sequence, dependency version, generated file, or user-visible behavior. Git may merge the text cleanly while the combined system is wrong. That is an integration conflict even when there are no conflict markers.&lt;/p&gt;

&lt;p&gt;Give one person, or one tightly bounded integration role, responsibility for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;choosing the review order&lt;/li&gt;
&lt;li&gt;resolving overlapping decisions&lt;/li&gt;
&lt;li&gt;rerunning checks against the combined state&lt;/li&gt;
&lt;li&gt;deciding what lands and what returns for another pass&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The merge queue is where parallel work becomes one product. Making it serial is coordination, not wasted parallelism.&lt;/p&gt;

&lt;h2&gt;
  
  
  Completion needs evidence, not a status message
&lt;/h2&gt;

&lt;p&gt;An agent saying "done" proves that it generated a completion message. It does not prove the patch works.&lt;/p&gt;

&lt;p&gt;Every task should return an evidence bundle with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the changed files and the intent of the diff&lt;/li&gt;
&lt;li&gt;the exact checks run and their real results&lt;/li&gt;
&lt;li&gt;screenshots or browser evidence when behavior is visual&lt;/li&gt;
&lt;li&gt;known failures, skipped checks, and unresolved assumptions&lt;/li&gt;
&lt;li&gt;merge-order or conflict notes for the integration owner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repository-native agent systems are starting to expose this control layer directly. GitHub Agentic Workflows defines bounded jobs and safe-output handling. Its August 24 update describes safe-output validation, run steering, inspectable model and catalog state, and clearer startup diagnostics. GitHub Copilot's August releases describe task management, queued prompts, plan/autopilot behavior, and rewind. These are product descriptions, not reliability benchmarks, but the direction is useful: long-running work needs intervention, recovery, and inspectable output.&lt;/p&gt;

&lt;p&gt;The evidence rule also applies to non-code artifacts. If a frontend task produces launch or social graphics, a narrow browser-local step such as &lt;a href="https://resizeimagefor.com" rel="noopener noreferrer"&gt;Resize Image For&lt;/a&gt; can handle resizing, fitting, cropping or padding, previews, and export while keeping source-image processing in the browser. That is easier to review than handing the source files to another remote worker with a broad instruction to "prepare the assets."&lt;/p&gt;

&lt;h2&gt;
  
  
  Write the contract before launching the second agent
&lt;/h2&gt;

&lt;p&gt;A small task record is enough. The exact schema matters less than forcing the decisions into the open.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fix-mobile-navigation&lt;/span&gt;
&lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agent-2&lt;/span&gt;
&lt;span class="na"&gt;stop_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mobile navigation passes the named browser checks&lt;/span&gt;

&lt;span class="na"&gt;workspace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;repository_scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/web&lt;/span&gt;
  &lt;span class="na"&gt;worktree&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;../worktrees/fix-mobile-navigation&lt;/span&gt;
  &lt;span class="na"&gt;shared_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pnpm-lock.yaml&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;process&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;3102&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;web-dev-server&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;browser_profile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agent-2-mobile&lt;/span&gt;

&lt;span class="na"&gt;authority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;credentials&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
  &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;localhost&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;destructive_tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="na"&gt;expected_artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;code-diff&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test-results&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mobile-screenshots&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;known-issues&lt;/span&gt;

&lt;span class="na"&gt;integration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;merge_owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;human-reviewer&lt;/span&gt;
  &lt;span class="na"&gt;review_after&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shared-design-token-change&lt;/span&gt;
  &lt;span class="na"&gt;rollback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;discard-worktree-and-branch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an operating record, not a universal security configuration. The point is to make shared state, authority, evidence, and merge order reviewable before they become an incident report.&lt;/p&gt;

&lt;p&gt;If the task cannot fill in these fields, it is probably too vague or too coupled to run concurrently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know when serial work wins
&lt;/h2&gt;

&lt;p&gt;Parallelize tasks with separate state and separate validation paths. A documentation change in one package and an isolated test addition in another may fit well. Shared-schema changes, coupled migrations, global dependency upgrades, and work that relies on one fragile validation environment usually deserve a queue.&lt;/p&gt;

&lt;p&gt;There is no prize for keeping every agent busy. If coordination and verification cost more than the execution time you saved, reduce the agent count.&lt;/p&gt;

&lt;p&gt;Before opening another session, provision its workspace, authority, integration path, and evidence contract. If that is too expensive for the task, keep the work serial.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Source notes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/eliseomdq/running-several-coding-agents-in-parallel-on-windows-without-wsl-or-tmux-1onh"&gt;Running several coding agents in parallel on Windows, without WSL or tmux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/proliferate-ai/proliferate" rel="noopener noreferrer"&gt;Proliferate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.github.com/gh-aw/" rel="noopener noreferrer"&gt;GitHub Agentic Workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.github.com/gh-aw/blog/2026-08-24-weekly-update/" rel="noopener noreferrer"&gt;Weekly Update - August 24, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2026-08-13-github-copilot-weekly-releases-august-10/" rel="noopener noreferrer"&gt;GitHub Copilot weekly releases - August 10&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Agent Plugins 1.0 Solves Packaging, Not Trust</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Sun, 30 Aug 2026 12:57:18 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/agent-plugins-10-solves-packaging-not-trust-1fmm</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/agent-plugins-10-solves-packaging-not-trust-1fmm</guid>
      <description>&lt;p&gt;A portable agent plugin can be identical on disk and still become a different operational system in two clients.&lt;/p&gt;

&lt;p&gt;One client may need its own manifest namespace or installation path. Another may expose a different capability set. Repository access, process execution, network policy, secret handling, failure behavior, and run evidence can all depend on the host.&lt;/p&gt;

&lt;p&gt;If a team reviews only the portable files, it has reviewed the package. It has not reviewed every runtime that can give that package power.&lt;/p&gt;

&lt;p&gt;Agent Plugins 1.0 addresses a useful problem: packaging Agent Skills and MCP servers in a vendor-neutral format. That should cut duplicated integration work. It does not make distribution, permissions, UX, or client-specific behavior identical, and the official overview leaves those concerns to each client.&lt;/p&gt;

&lt;p&gt;The practical rule is to standardize the package and test the host separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Packaging is real progress
&lt;/h2&gt;

&lt;p&gt;Agent integrations have accumulated plenty of one-off setup: tool definitions, skill directories, MCP configuration, marketplace metadata, and client-specific instructions. A portable core gives publishers and client authors a common shape to work with.&lt;/p&gt;

&lt;p&gt;That common shape is an interoperability floor. It can tell a client how a component is packaged and reduce the need to rebuild the same integration from scratch. It also gives reviewers a more stable object to inspect, version, and compare.&lt;/p&gt;

&lt;p&gt;The boundary matters, though. The Agent Plugins overview keeps distribution, permissions, UX, and client-specific capabilities under client control. Package compatibility and runtime equivalence are therefore separate claims.&lt;/p&gt;

&lt;p&gt;A client can support the package format without matching another client's install flow, defaults, effective authority, or operator experience. Both clients may be conforming to the same packaging idea while making different runtime decisions.&lt;/p&gt;

&lt;p&gt;This is not an argument for forcing every host into one security model. A local coding tool, a managed enterprise agent, and a restricted CI worker may need different policies. Teams just need to stop treating "portable" as shorthand for "already trusted everywhere."&lt;/p&gt;

&lt;h2&gt;
  
  
  The host turns files into authority
&lt;/h2&gt;

&lt;p&gt;Reviewing a package can establish useful facts: where it came from, which revision is present, and which skills or MCP components it contains. Those facts do not establish what a particular invocation can do.&lt;/p&gt;

&lt;p&gt;The host still decides how the component is discovered and started. It maps tools into the agent's working context, applies repository and filesystem scope, controls process and network access, and determines whether credentials are available. It also decides what happens after a tool error and what evidence survives the run.&lt;/p&gt;

&lt;p&gt;Consider a hypothetical plugin installed in two coding clients. Client A requires an explicit per-project setup and grants only the tools enabled for that workspace. Client B loads the component through a different adapter and applies a broader existing workspace policy. The package did not change. The effective authority did.&lt;/p&gt;

&lt;p&gt;That is where the trust decision lives: in the combination of package, client, environment, and invocation. A compatibility badge that names only the package leaves most of that decision unstated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Client adapters are production code
&lt;/h2&gt;

&lt;p&gt;Apache Magpie's marketplace documentation shows the compatibility work in concrete form. Its portable &lt;code&gt;plugin.json&lt;/code&gt;, skills, and MCP core coexist with client-specific manifests, namespaces, and installation paths.&lt;/p&gt;

&lt;p&gt;This is one project's implementation perspective, not the normative definition of Agent Plugins. It still demonstrates why adapters deserve a normal code review. They can affect how a client discovers the package, which setup path an operator follows, and which capabilities become available.&lt;/p&gt;

&lt;p&gt;Treat the adapter as part of the release:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pin its revision with the portable core.&lt;/li&gt;
&lt;li&gt;Review client namespaces and installation instructions.&lt;/li&gt;
&lt;li&gt;Record the tools and behavior the client is expected to expose.&lt;/li&gt;
&lt;li&gt;Test updates, removal, and rollback instead of checking only the first install.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Calling these files "setup glue" makes them easy to skip during review. That is a mistake. They sit on the path between portable metadata and a running component.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use four contracts instead of one compatibility label
&lt;/h2&gt;

&lt;p&gt;A single compatible/incompatible result cannot carry enough information for an operational trust decision. A more useful review separates four contracts. These are working terms for teams, not terminology from the Agent Plugins specification.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Package contract
&lt;/h3&gt;

&lt;p&gt;The package contract identifies the artifact being evaluated. Record its publisher or source, immutable revision, integrity information, and expected contents. A version label is useful only if it resolves to the same material during install and review.&lt;/p&gt;

&lt;p&gt;This contract answers: "Which package did we inspect?"&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Installation contract
&lt;/h3&gt;

&lt;p&gt;The installation contract covers how that artifact enters a client. It includes the marketplace or source, client adapter, review policy, update behavior, revocation path, and rollback procedure.&lt;/p&gt;

&lt;p&gt;Installing a reviewed version today should not silently authorize an unknown replacement tomorrow. Client-specific setup also belongs here because it can change without modifying the portable core.&lt;/p&gt;

&lt;p&gt;This contract answers: "How did this exact package become available in this client?"&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Runtime contract
&lt;/h3&gt;

&lt;p&gt;The runtime contract defines authority for one environment or invocation. It covers repository and filesystem scope, processes, network access, secrets, enabled tools, lifetime, and any approval boundary.&lt;/p&gt;

&lt;p&gt;Installation should not imply unlimited runtime authority. A component can be allowed in the environment while individual runs receive narrower capabilities. The host must enforce that distinction because the package format cannot know every workspace policy.&lt;/p&gt;

&lt;p&gt;This contract answers: "What can this installed component do here and now?"&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Evidence contract
&lt;/h3&gt;

&lt;p&gt;The evidence contract defines what the run must leave behind: actual tool calls, outputs, failures, changed resources, validation results, and policy exceptions. The receipt needs enough detail for a reviewer to compare expected behavior with what happened.&lt;/p&gt;

&lt;p&gt;A clean exit code is thin evidence. It says little about which tools ran, which resources changed, or whether the client recovered from an error by taking an unexpected path.&lt;/p&gt;

&lt;p&gt;This contract answers: "What proves the component behaved within the accepted boundary?"&lt;/p&gt;

&lt;p&gt;The four contracts can change independently. Updating a package affects the first. Moving to a new marketplace or adapter affects the second. Opening network access affects the third. Dropping tool-call logs affects the fourth. Each change deserves the review that matches it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small tool surfaces are easier to inspect
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;qwen-dap-mcp&lt;/code&gt; provides a useful adjacent example of capability design. Its project documentation describes a debugger-focused MCP surface for stacks, registers, locals, disassembly, dumps, and bounded fix-and-verify loops. Ordinary source editing and build or test authority remain with the coding agent.&lt;/p&gt;

&lt;p&gt;The project is not evidence of an Agent Plugins 1.0 requirement, nor should it be assumed to be an implementation of that standard. The useful lesson is narrower: a component can expose evidence without absorbing every nearby capability.&lt;/p&gt;

&lt;p&gt;A reviewer can reason about a small debugger surface more easily than an all-purpose integration with file editing, shell access, debugging, deployment, and unrestricted network calls bundled together. Packaging decides how a component travels. Capability design decides how much power the integration exposes.&lt;/p&gt;

&lt;p&gt;Review those decisions separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the same package in every supported client
&lt;/h2&gt;

&lt;p&gt;A package should earn acceptance per client and environment. Run the same pinned revision through a compact matrix and keep the results with the release record.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test area&lt;/th&gt;
&lt;th&gt;What to record&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Install identity&lt;/td&gt;
&lt;td&gt;Source, immutable package revision, client manifest or namespace, and adapter revision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effective capabilities&lt;/td&gt;
&lt;td&gt;Capabilities requested, capabilities granted, and any client defaults added during install or invocation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource scope&lt;/td&gt;
&lt;td&gt;Repository and filesystem boundaries, process execution, network access, and secret exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool behavior&lt;/td&gt;
&lt;td&gt;Tool schemas, validation rules, timeouts, cancellation, and visible error behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context cost&lt;/td&gt;
&lt;td&gt;Startup instructions and tool context consumed before useful task context is added&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verification&lt;/td&gt;
&lt;td&gt;Commands the host runs, stopping conditions, and behavior when validation fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lifecycle&lt;/td&gt;
&lt;td&gt;Update policy, revocation, removal, and rollback to a known revision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run evidence&lt;/td&gt;
&lt;td&gt;Actual tool calls, changed resources, results, exceptions, and reviewer-visible receipts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This matrix is an operational checklist, not a claim about fields mandated by Agent Plugins. Its purpose is to expose host differences before a real task finds them for you.&lt;/p&gt;

&lt;p&gt;Do not test only the happy path. Give a tool invalid input. Deny a requested capability. Interrupt a process. Remove network access. Check whether the client reports the failure clearly, stops at the declared boundary, and preserves enough evidence to diagnose the run.&lt;/p&gt;

&lt;p&gt;Two clients that both install the package may still produce different acceptance records. That is useful information, not a reason to hide the difference behind a shared compatibility label.&lt;/p&gt;

&lt;h2&gt;
  
  
  The harness still owns the boring controls
&lt;/h2&gt;

&lt;p&gt;Repository instructions, forbidden paths, validation commands, process isolation, review flows, and context budgets do not disappear when components become portable. They remain part of the harness around the model and its plugins.&lt;/p&gt;

&lt;p&gt;Current builder discussions reflect that split. A DEV.to workflow describes repository rules, memory, tools, and validation commands as startup context. Hacker News project posts include hook guards, persistent agent filesystems, guided review, and process isolation. Reddit users discuss MCP compatibility and context overhead as practical constraints on local coding setups.&lt;/p&gt;

&lt;p&gt;Those reports are workflow examples and community sentiment, not proof that one harness design works everywhere. They do point to work the package format does not perform. A portable component cannot choose the right forbidden paths for your repository, set your risk tolerance, or decide how much context its tools may consume before the task begins.&lt;/p&gt;

&lt;p&gt;Teams still need to design that environment. Portability simply gives them a cleaner component to place inside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Standardize the package, then verify the power
&lt;/h2&gt;

&lt;p&gt;Agent Plugins 1.0 can make skills and MCP servers easier to distribute across clients. That is worth having. Repeated bespoke packaging wastes publisher effort and makes integrations harder to inspect.&lt;/p&gt;

&lt;p&gt;The standard stops at a sensible boundary. The client still controls installation behavior, permissions, UX, and client-specific capabilities. The surrounding harness still controls repository rules, validation, context, and review. Runtime evidence still has to show what occurred.&lt;/p&gt;

&lt;p&gt;When a package passes the acceptance matrix in one client, keep that result attached to that client and environment. Do not copy the trust decision to another host just because the same files install there.&lt;/p&gt;

&lt;p&gt;The operating rule is simple: standardize the package, then verify every host that gives it power.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://agent-plugins.org/" rel="noopener noreferrer"&gt;Agent Plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/apache/magpie/blob/main/docs/setup/marketplaces.md" rel="noopener noreferrer"&gt;Magpie marketplace setup: Agent Plugins 1.0 and client-specific manifests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SLP-DEV1/qwen-dap-mcp" rel="noopener noreferrer"&gt;qwen-dap-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=49233423" rel="noopener noreferrer"&gt;Ask HN: What are you working on? (August 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/programming_withjackche/2026-q1-is-the-year-developers-still-build-the-agent-harness-2026-q3-2027-is-the-year-the-llm-359f"&gt;2026 Q1 is the year developers still build the agent harness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/LocalLLaMA/comments/1vukppf/whats_the_best_local_ai_harness_for_coding/" rel="noopener noreferrer"&gt;What's the best local AI harness for coding + general use?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>agents</category>
    </item>
    <item>
      <title>A Confirm Button Is Not a Coding-Agent Security Boundary</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Wed, 26 Aug 2026 07:13:33 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/a-confirm-button-is-not-a-coding-agent-security-boundary-5700</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/a-confirm-button-is-not-a-coding-agent-security-boundary-5700</guid>
      <description>&lt;p&gt;A coding agent asks for permission to modify &lt;code&gt;packages/web/generated/client.ts&lt;/code&gt;. The path looks harmless, the proposed diff sounds reasonable, and the user clicks Approve.&lt;/p&gt;

&lt;p&gt;That approval means very little if the system has not resolved where the write will land. A symlink or another layer of indirection can make the effective destination different from the path in the dialog. The human reviewed one operation while the machine executed another.&lt;/p&gt;

&lt;p&gt;A confirm button becomes a security boundary only when approval and execution refer to the same action. The action executed must be the action reviewed.&lt;/p&gt;

&lt;p&gt;This is narrower than the usual "keep a human in the loop" advice. A human can be present, attentive, and still approve the wrong thing because the interface showed a story about the action instead of the computed action itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approval needs an invariant
&lt;/h2&gt;

&lt;p&gt;There are three separate objects in an agent workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the user's intent&lt;/li&gt;
&lt;li&gt;the model's description of what it plans to do&lt;/li&gt;
&lt;li&gt;the operation the runtime has resolved and will execute&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teams often collapse them into one approval prompt. That works until a path resolves somewhere unexpected, a skill changes between review and execution, or a broad session permission gets reused for a materially different tool call.&lt;/p&gt;

&lt;p&gt;The model's narration is useful context. It is not the authorization object. Models summarize, omit details, and can be wrong. The runtime already knows more precise facts: the effective resource, operation, credentials, network access, loaded tool code, and environment that will receive the action.&lt;/p&gt;

&lt;p&gt;Approval should bind to those facts. If any material fact changes, the old approval is invalid. The system should prepare a new proposal and ask again.&lt;/p&gt;

&lt;p&gt;That rule also cuts through a lot of fuzzy permission design. "Allow file edits for this session" is easy to implement and difficult to reason about. "Allow this write to this resolved path, using this tool version, before this expiry" is much less convenient. It is also something a reviewer can understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prepare the operation before asking
&lt;/h2&gt;

&lt;p&gt;A practical approval envelope can stay small. It needs enough information to identify the proposed effect without pretending to be a universal protocol.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;proposal_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apv_7f31&lt;/span&gt;
&lt;span class="na"&gt;requested_resource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;packages/web/generated/client.ts&lt;/span&gt;
&lt;span class="na"&gt;resolved_resource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/workspace/task-184/packages/web/generated/client.ts&lt;/span&gt;
&lt;span class="na"&gt;operation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
&lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;filesystem:write:/workspace/task-184/packages/web/generated/client.ts&lt;/span&gt;
&lt;span class="na"&gt;skill&lt;/span&gt;&lt;span class="pi"&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;api-client-generator&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2.4.1&lt;/span&gt;
&lt;span class="na"&gt;expires_at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-08-26T06:15:00+08:00&lt;/span&gt;
&lt;span class="na"&gt;expected_evidence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;changed-paths&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;diff&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test:generated-client&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact fields will vary. A database migration needs a target database and transaction policy. A deployment needs an environment, artifact identity, and rollback path. A browser action may need an account, origin, and allowed side effect.&lt;/p&gt;

&lt;p&gt;The sequence matters more than the exact field names:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prepare: resolve resources, operation, capabilities, and tool identity.&lt;/li&gt;
&lt;li&gt;Display: show computed facts alongside the agent's explanation.&lt;/li&gt;
&lt;li&gt;Bind: attach consent to one proposal and invalidate it after material changes.&lt;/li&gt;
&lt;li&gt;Execute: run with the declared workspace, credentials, network policy, and lifetime.&lt;/li&gt;
&lt;li&gt;Verify: compare the actual effects with the approved proposal.&lt;/li&gt;
&lt;li&gt;Record: preserve the decision, result, exceptions, and review evidence.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A proposal hash can help detect mutation, but a hash does not prove that the underlying operation is safe. It only proves that the bytes did not change. The user still needs a readable view of the facts being authorized, and the runtime still needs to enforce them.&lt;/p&gt;

&lt;h2&gt;
  
  
  A loaded skill is part of the action
&lt;/h2&gt;

&lt;p&gt;Natural-language intent does not fully identify an agent operation. The same request can behave differently depending on the tool, plugin, MCP server, or reusable skill loaded into the run.&lt;/p&gt;

&lt;p&gt;That matters because agent skills have become a software supply-chain surface. Security reporting has described typosquatted skills that instructed agents to fetch credential-stealing code. The broad lesson is not that every shared skill is malicious. It is that "generate the API client" does not describe the full action when an external instruction package decides which commands to run.&lt;/p&gt;

&lt;p&gt;Bind the relevant identity into the proposal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;package or skill name&lt;/li&gt;
&lt;li&gt;source and owner&lt;/li&gt;
&lt;li&gt;version or immutable revision&lt;/li&gt;
&lt;li&gt;review or trust status&lt;/li&gt;
&lt;li&gt;capabilities requested for this run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Installation trust and run-time authority are different decisions. A team may allow a reviewed skill to exist in its environment without allowing every invocation to access credentials or the network. The reverse is also true: approving a task does not make a newly substituted dependency trustworthy.&lt;/p&gt;

&lt;p&gt;If the skill revision changes after approval, the proposal changed. Ask again. Quietly preserving consent across a tool update defeats the point of naming the tool in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Isolation contains mistakes; it does not validate consent
&lt;/h2&gt;

&lt;p&gt;Parallel coding-agent products increasingly give each task an isolated worktree, terminal, conversation, and review state. That is a sensible operating model. Vendor tooling is also moving toward persistent isolated environments and resumable agent state.&lt;/p&gt;

&lt;p&gt;Isolation limits the blast radius. It does not prove that the action inside the boundary matches what the human approved.&lt;/p&gt;

&lt;p&gt;An agent can execute the wrong command in the correct sandbox. It can write to an unexpected resolved path that still exists inside the worktree. It can use an untrusted skill with tightly scoped permissions. Containment may turn a severe failure into a recoverable one, which is worth doing, but approval integrity is a separate property.&lt;/p&gt;

&lt;p&gt;Treat the two controls as complementary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the approval envelope defines the authorized effect&lt;/li&gt;
&lt;li&gt;the execution boundary limits what can happen if the action, dependency, or runtime goes wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A worktree is useful for filesystem isolation and review. A sandbox can restrict process, network, and credential access. Neither should be presented as proof that the reviewer saw the exact operation that ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  The approval UI should show facts, not confidence
&lt;/h2&gt;

&lt;p&gt;Most approval interfaces spend too much space on the model's prose. "I will safely update the generated client and run the relevant tests" sounds reassuring, but it is not specific enough to authorize anything.&lt;/p&gt;

&lt;p&gt;Give the computed fields the visual priority:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requested path: packages/web/generated/client.ts
Resolved path:  /workspace/task-184/packages/web/generated/client.ts
Operation:      write
Capabilities:   one-file write, test command
Skill:          api-client-generator@2.4.1
Expires:        06:15 CST
Evidence:       changed paths, diff, generated-client test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Show a warning when requested and resolved resources differ. Make capability expansion obvious. Put the tool or skill revision near the approval control instead of burying it in a log panel. If the system cannot compute a field, label it unknown rather than filling the gap with the model's confidence.&lt;/p&gt;

&lt;p&gt;This interface problem is getting more relevant as agents render their own controls and task-specific surfaces. Builders comparing component catalogs, MCP UI tools, renderer patterns, and trusted-rendering approaches can use &lt;a href="https://awesomegenerativeui.com/resources" rel="noopener noreferrer"&gt;Generative UI resources&lt;/a&gt; as one reference set. Whatever stack you choose, keep the authorization facts under host control; the agent should not get to invent the fields that authorize its own action.&lt;/p&gt;

&lt;p&gt;Low-risk operations can still use broader policy approval. Formatting Markdown in a disposable branch does not need the same ceremony as rotating credentials or modifying a release workflow. The broader policy must still name its resource and capability bounds. "Do harmless things" is a preference, not an enforceable policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Execution needs a receipt
&lt;/h2&gt;

&lt;p&gt;Approval records intent. A receipt records what happened.&lt;/p&gt;

&lt;p&gt;At minimum, preserve the proposal identity, actual changed resources, tool calls, exit state, policy exceptions, and the evidence shown to the reviewer. For repository work, that often includes a diff and test output. It may also require checking effects that ordinary &lt;code&gt;git status&lt;/code&gt; does not reveal.&lt;/p&gt;

&lt;p&gt;This is where path-resolution failures become visible. Suppose the approved proposal names one resolved destination, but the receipt shows another. The system should not call the run successful and tuck the mismatch into a warning. It should mark the transaction failed or require a new approval before continuing.&lt;/p&gt;

&lt;p&gt;The same rule applies when execution discovers that it needs more authority. If a one-file edit now requires a package install and outbound network access, stop. Prepare another proposal. Do not stretch the first approval until it covers whatever the agent wants next.&lt;/p&gt;

&lt;p&gt;Receipts also make review state durable. Parallel tasks can resume without relying on a conversational summary of what supposedly happened. A reviewer can inspect the approved operation, the actual effect, and any divergence between them. Current developer skepticism around coding agents often lands here: humans still have to reconstruct and review the accepted result. Better evidence does not eliminate that work, but it makes the work bounded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consent should fail closed when the proposal moves
&lt;/h2&gt;

&lt;p&gt;The original dialog did not need a longer explanation. It needed a resolved destination, a bounded capability, a named skill revision, an expiry, and a promise about the evidence that would follow.&lt;/p&gt;

&lt;p&gt;Once those facts were bound to one proposal, any material change should have invalidated the click. After execution, the receipt should have proved whether the runtime honored the proposal.&lt;/p&gt;

&lt;p&gt;This model will not stop every prompt injection, dependency attack, credential leak, or runtime exploit. It does enforce one useful property that a plain confirm button cannot: the human approves an action the system can identify, constrain, and compare with the result.&lt;/p&gt;

&lt;p&gt;Do not ask people to approve a sentence the agent wrote about itself. Ask them to approve the exact operation the runtime is prepared to enforce.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://thehackernews.com/2026/07/ghostapproval-symlink-flaws-could-let.html" rel="noopener noreferrer"&gt;GhostApproval symlink flaws could let malicious repos run code in AI coding agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/proliferate-ai/proliferate" rel="noopener noreferrer"&gt;Proliferate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.csoonline.com/article/4206851/trojanized-ai-skills-gain-1.7m-installs-in-agent-targeted-attack.html" rel="noopener noreferrer"&gt;Trojanized AI skills gain 1.7M installs in agent-targeted attack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/google-io-2026-developer-highlights/" rel="noopener noreferrer"&gt;Building the agentic future: I/O 2026 developer highlights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=46691243" rel="noopener noreferrer"&gt;Ask HN: Do you have any evidence that agentic coding works?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>agents</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Your AI Coding Stack Needs Change Control, Not More Tuning</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Sun, 23 Aug 2026 06:38:59 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/your-ai-coding-stack-needs-change-control-not-more-tuning-599k</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/your-ai-coding-stack-needs-change-control-not-more-tuning-599k</guid>
      <description>&lt;h1&gt;
  
  
  Your AI Coding Stack Needs Change Control, Not More Tuning
&lt;/h1&gt;

&lt;p&gt;A coding agent has one bad run. The team swaps the model, rewrites the system prompt, adds an MCP server, upgrades the harness, and changes the context rules. The rerun passes.&lt;/p&gt;

&lt;p&gt;Everyone is relieved, but the result taught the team almost nothing. Nobody knows which change helped, whether the new setup costs more to operate, or whether it will survive a different task. Rolling back is awkward because five moving parts now depend on one another.&lt;/p&gt;

&lt;p&gt;An AI coding stack needs change control. Each adjustment should be a bounded experiment with a baseline, one named variable, visible human and machine costs, and a decision at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  An upgrade is still a configuration experiment
&lt;/h2&gt;

&lt;p&gt;The model is only one layer of the stack. Provider settings, harness versions, system instructions, MCP tools, repository memory, context selection, approval rules, and sandbox policy can all change the result.&lt;/p&gt;

&lt;p&gt;When several layers move together, a successful run cannot tell you which layer caused the improvement. The same pile of changes also makes a later regression harder to diagnose. You have traded one uncertain configuration for another.&lt;/p&gt;

&lt;p&gt;Start with a small task set drawn from work the team performs. A useful baseline task has a known starting state and an observable outcome. That might mean a named test turns green, a browser flow behaves correctly at specified viewports, or a patch satisfies an existing API contract without touching unrelated packages.&lt;/p&gt;

&lt;p&gt;Forget the universal benchmark. Pick a task that exposes the failure this configuration change is supposed to reduce.&lt;/p&gt;

&lt;p&gt;Change one layer at a time when that is practical. If a migration forces the model, provider adapter, and prompt format to move together, record them as one bundle. The bundle can still be evaluated, but it cannot support claims about which internal change deserves credit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve the decision, not only the latest config
&lt;/h2&gt;

&lt;p&gt;Most configuration files describe the stack as it exists now. They say little about why it exists, what it replaced, or which evidence justified the last change. Overwriting the file also overwrites part of the team's operational memory.&lt;/p&gt;

&lt;p&gt;A small, append-only stack-change record fixes that. Preserve the previous state, add corrections as later entries, and record both when an observation was made and when the configuration was active. The format can stay boring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;hypothesis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;What specific failure should this change reduce?&lt;/span&gt;
&lt;span class="na"&gt;baseline_task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Which fixed task and starting state will be compared?&lt;/span&gt;
&lt;span class="na"&gt;variable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Which layer or explicitly named bundle is changing?&lt;/span&gt;
&lt;span class="na"&gt;acceptance_checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;What observable result counts as success?&lt;/span&gt;
&lt;span class="na"&gt;outcome&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;What happened against those same checks?&lt;/span&gt;
&lt;span class="na"&gt;machine_cost&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Wall time, requests, billed usage, and cache behavior when available&lt;/span&gt;
&lt;span class="na"&gt;human_cost&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Steering time, review time, and reconstruction work&lt;/span&gt;
&lt;span class="na"&gt;regressions_and_uncertainty&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;What broke, what was not measured, and what weakened the comparison?&lt;/span&gt;
&lt;span class="na"&gt;decision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keep | revert | inconclusive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treat this as a working template. It makes the next decision explainable and reversible; it does not pretend to be an industry standard.&lt;/p&gt;

&lt;p&gt;The record should not decide for the team. Evidence can support a choice without becoming an automatic enforcement rule. A test result may prove that one behavior works under one setup; it does not prove that the configuration is better for every repository task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not let the changed stack grade itself
&lt;/h2&gt;

&lt;p&gt;Write the hypothesis and acceptance checks before running the new configuration. Otherwise it is easy to inspect whatever the agent happened to produce and invent a success criterion afterward.&lt;/p&gt;

&lt;p&gt;Keep the pre-run plan, execution artifacts, review, and final interpretation distinct. The changed stack can collect command output, diffs, traces, and browser observations. It should not turn its own confident summary into the pass condition.&lt;/p&gt;

&lt;p&gt;This separation also makes failures useful. A run that misses the acceptance check may still reveal a broken tool boundary or a context problem. Preserve that evidence, then let the reviewer decide whether it explains the failure. Collapsing execution and judgment into one chat transcript makes the persuasive final paragraph compete with the underlying facts.&lt;/p&gt;

&lt;p&gt;The checkpoints can stay small. Before execution, the record needs a hypothesis, a clean baseline, and acceptance checks. Before a keep decision, it needs the resulting patch or behavior, the evidence behind it, and a review performed against the original checks. Missing evidence should produce an inconclusive result rather than a story about why the run probably worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Count the costs the dashboard misses
&lt;/h2&gt;

&lt;p&gt;A configuration can generate more code and still make the workflow worse.&lt;/p&gt;

&lt;p&gt;Machine cost includes more than a token total. Record elapsed time, request count, billed usage, retries, and cache behavior when the provider exposes it. A recent issue for one Codex-on-Bedrock configuration reported unexpectedly high cache-write spend when the desired cache controls were unavailable. That report belongs to one provider path, not every coding-agent setup, but it shows why model names and aggregate token counts are too coarse for configuration work.&lt;/p&gt;

&lt;p&gt;Human cost is easier to hide. Count the time spent steering the run, checking its claims, and reconstructing code the reviewer no longer understands. One practitioner account describes AI-assisted output increasing while review became more cognitively expensive and code understanding weakened. That is personal experience rather than a controlled productivity result, but the cost category is worth tracking in a team's own work.&lt;/p&gt;

&lt;p&gt;Reviewer attention varies with task difficulty and familiarity, so fake precision will not help. A short note such as "the reviewer had to trace three unrelated packages to validate the patch" can be more useful than a made-up score. The comparison only needs enough detail to show whether the new setup moved work out of the agent and back onto the human.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run the comparison on a real repository task
&lt;/h2&gt;

&lt;p&gt;Suppose a team wants to change its context-selection policy for a monorepo. The hypothesis is that a generated dependency map will reduce incorrect edits outside the target package.&lt;/p&gt;

&lt;p&gt;The team chooses a known pagination regression from a clean commit. The acceptance checks are already available: the contract tests must pass, an existing query-count limit must hold, and the patch must not modify packages outside the API path. The model, harness, tools, and approval settings stay fixed. Only the context policy changes.&lt;/p&gt;

&lt;p&gt;The record now has something concrete to compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did both configurations satisfy the same contract tests?&lt;/li&gt;
&lt;li&gt;Did either run edit unrelated packages or require manual repair?&lt;/li&gt;
&lt;li&gt;How many retries and billed requests did each run use?&lt;/li&gt;
&lt;li&gt;How long did a reviewer need to understand and validate each patch?&lt;/li&gt;
&lt;li&gt;Did missing telemetry or environmental differences make the comparison weak?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions do not collapse into a universal score. They support a local decision. If the new policy passes the checks and lowers review reconstruction without introducing another cost, the team has a reason to keep it. If it fails a behavior the baseline handled, revert it. If the environment changed halfway through or the provider omitted the needed cost data, mark the result inconclusive and run a cleaner test only if the expected value justifies the time.&lt;/p&gt;

&lt;p&gt;Use the same discipline for larger migrations. Name the bundle, freeze what can be frozen, preserve the old configuration, and narrow the claim. A successful provider migration can justify adopting that bundle without proving that every model, prompt, and cache setting inside it is optimal.&lt;/p&gt;

&lt;h2&gt;
  
  
  End every change with a decision
&lt;/h2&gt;

&lt;p&gt;Configuration experiments tend to linger. A new MCP tool remains enabled because it might help later. A longer prompt survives because one run looked good. A second harness stays installed while the team debates which one to use. Each unresolved experiment adds another branch to the operating environment.&lt;/p&gt;

&lt;p&gt;Close the record with one of three decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep the change because it beat the baseline on the declared outcome without an unacceptable regression.&lt;/li&gt;
&lt;li&gt;Revert it because it failed the checks or moved too much cost onto the reviewer or infrastructure.&lt;/li&gt;
&lt;li&gt;Mark it inconclusive because the comparison was not strong enough to support either choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not preserve a change merely because it "feels better." Put that observation in the notes and design a task that can expose the suspected improvement. If the expected benefit is too small to justify another test, the old stable configuration wins by default.&lt;/p&gt;

&lt;p&gt;Timebox the tuning work as well. Current developer discussions describe model, harness, MCP, and prompt optimization becoming a job of its own. That is anecdotal sentiment, but the failure mode is easy to recognize: the stack consumes the time it was meant to return.&lt;/p&gt;

&lt;p&gt;The team in the opening example should have saved its starting configuration, named the failure, changed one layer, and compared the rerun with the same checks and costs. Without that record, a passing run is just a pleasant result. It is not evidence that the stack improved.&lt;/p&gt;

&lt;p&gt;If a configuration cannot beat a stable baseline on real work, revert it. Otherwise the next failure will be harder to explain than the last one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/kenwalger/designing-a-reasoning-ledger-record-22eo"&gt;Designing a Reasoning Ledger Record&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/TheStreamCode/agentic-rd-skill" rel="noopener noreferrer"&gt;Agentic R&amp;amp;D Skill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dev_michael/ai-didnt-make-me-a-worse-coder-it-made-me-a-worse-reviewer-48d0"&gt;AI didn't make me a worse coder. It made me a worse reviewer.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/issues/37674" rel="noopener noreferrer"&gt;Codex Bedrock cache-control issue #37674&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/LocalLLM/comments/1vrf9jr/whos_spending_more_time_optimising_ai_technology/" rel="noopener noreferrer"&gt;Who's spending more time optimising AI technology than using it?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Your First Coding Agent Should Be a Reviewer, Not an Author</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Wed, 19 Aug 2026 11:30:00 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/your-first-coding-agent-should-be-a-reviewer-not-an-author-3k1o</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/your-first-coding-agent-should-be-a-reviewer-not-an-author-3k1o</guid>
      <description>&lt;p&gt;Most teams introduce a coding agent backwards. They hand it a ticket, let it edit the repository, and only then ask a human to figure out whether the patch is correct.&lt;/p&gt;

&lt;p&gt;The model gets the fun job. The reviewer pays the reverse-engineering tax.&lt;/p&gt;

&lt;p&gt;Start with review instead. If an agent can find a concrete problem, attach evidence, expose its uncertainty, and give a human a cheap way to confirm the result, it has already created value. It can prove that value before the team makes code authorship its default role.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review can pay before the agent writes code
&lt;/h2&gt;

&lt;p&gt;A recent TechRadar report about Linux kernel work draws a useful line. It describes AI review and analysis agents surfacing actionable bug reports, while humans write the fixes and maintainers retain judgment over what lands.&lt;/p&gt;

&lt;p&gt;That is one reported workflow, not proof that AI review is universally accurate or cheaper. The role split is still worth examining: the agent can reduce uncertainty without owning the patch.&lt;/p&gt;

&lt;p&gt;Authorship bundles several questions together. Did the agent understand the bug? Did it choose the right fix? Did it preserve unrelated behavior? Did its tests prove what it says they proved? A generated patch forces the reviewer to answer all of them at once.&lt;/p&gt;

&lt;p&gt;A review finding is narrower. The agent can point to one behavior and the evidence behind it. A human can confirm or reject that finding without first untangling a proposed implementation. False positives still cost time, but a compact, falsifiable report limits that cost.&lt;/p&gt;

&lt;p&gt;The first test is whether the agent can make a decision easier before it starts changing code.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Reviewer" is a workflow, not a prompt
&lt;/h2&gt;

&lt;p&gt;Telling a model to "review this repository" is barely more specific than telling it to "write good code." Useful review needs a bounded surface, an environment that can produce evidence, and an output that another person can inspect.&lt;/p&gt;

&lt;p&gt;Proliferate is a concrete product signal here. Its project documentation lists isolated worktrees or sandboxes, diff review, and reviewer agents as parts of the operating surface for multiple coding harnesses. The README does not prove that those reviewers are accurate or production-safe. It does show that review and isolation are becoming explicit product features rather than chores left outside the agent loop.&lt;/p&gt;

&lt;p&gt;The surrounding controls matter as much as the reviewer model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give it one commit, diff, subsystem, or execution path to inspect.&lt;/li&gt;
&lt;li&gt;Let it run named checks in an isolated environment when the finding depends on behavior.&lt;/li&gt;
&lt;li&gt;Preserve test output, traces, browser observations, and repository history with the report.&lt;/li&gt;
&lt;li&gt;Require it to stop when missing context prevents a defensible finding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same operational concerns appear in practitioner guidance about production coding agents: tests, Git history, prompts before destructive actions, explicit verification, and knowing when to stop. Those are not benchmark results, but they are better selection criteria than raw generation quality.&lt;/p&gt;

&lt;p&gt;A reviewer with unlimited scope and no stop condition will produce commentary. A reviewer with a defined surface and inspectable evidence has a chance to produce a decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Require a review receipt
&lt;/h2&gt;

&lt;p&gt;A confident paragraph is not a review artifact. "There may be a serious race condition" gives the next person a claim to investigate and no cheap way to investigate it.&lt;/p&gt;

&lt;p&gt;Require a small receipt for every finding:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finding: one concrete issue rather than a broad quality opinion.&lt;/li&gt;
&lt;li&gt;Location: a file and line, execution path, or observable behavior.&lt;/li&gt;
&lt;li&gt;Evidence: a test, trace, command output, diff, or browser observation another person can inspect.&lt;/li&gt;
&lt;li&gt;Impact: what can fail and under which conditions, without inflating severity.&lt;/li&gt;
&lt;li&gt;Uncertainty: assumptions, missing context, and plausible alternative explanations.&lt;/li&gt;
&lt;li&gt;Next check: the smallest action that confirms or rejects the finding.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a proposed working format, not an industry standard. It makes a weak finding cheap to reject.&lt;/p&gt;

&lt;p&gt;Consider a hypothetical service with a role-change endpoint and cached authorization. A useful agent report could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Finding: A removed project member can retain the previous permission until the cache entry expires.
Location: The role-update path returns before the existing authorization cache is invalidated.
Evidence: After a successful role removal, the named integration scenario still receives a 200 response for the protected project request. The trace and test output are attached.
Impact: Access may remain stale for the configured cache lifetime after this update path.
Uncertainty: The report has not established whether a background invalidation event is expected to close the gap.
Next check: Run the same scenario with the invalidation worker enabled and inspect whether it receives the role-change event.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent has not proved the architecture is insecure, and it has not earned permission to rewrite the cache layer. It has produced a specific claim with a short rejection path. A maintainer can inspect the trace, check the event flow, and decide whether a patch is needed.&lt;/p&gt;

&lt;p&gt;A review that cannot fill the receipt should not silently graduate into an agent-authored fix. It should return the missing evidence or context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain context belongs inside the evidence loop
&lt;/h2&gt;

&lt;p&gt;Frontend review makes the weakness of vague judgment obvious. "This page looks wrong" is not a finding. Neither is "make it feel more polished."&lt;/p&gt;

&lt;p&gt;The reviewer needs a selected reference for the intended interaction, a named design-system constraint, a browser observation under stated conditions, and a next check. For generated interfaces, a curated set of &lt;a href="https://awesomegenerativeui.com/cases" rel="noopener noreferrer"&gt;Generative UI cases&lt;/a&gt; can help a team choose relevant examples and translate them into its own observable criteria.&lt;/p&gt;

&lt;p&gt;The examples are reference material, not proof and not an automated acceptance oracle. The team still has to state what matters in its product. That might be keyboard order, component usage, overflow at a named viewport, or the behavior of a streamed state transition. The agent's job is to compare the implementation with those declared constraints and show the mismatch.&lt;/p&gt;

&lt;p&gt;This is why domain context should be attached to the review task instead of hidden in a prompt like "use good UX." References become useful only after the team turns them into checks that can fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let the agent climb the role ladder
&lt;/h2&gt;

&lt;p&gt;Authorship does not need to be the starting position. Increase the agent's ability to mutate the repository only after its output is useful at the previous step:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Explain a bounded area of the code and cite the relevant paths.&lt;/li&gt;
&lt;li&gt;Reproduce one reported behavior without changing the repository.&lt;/li&gt;
&lt;li&gt;Review a selected diff or execution path and produce a receipt.&lt;/li&gt;
&lt;li&gt;Suggest a patch inside an isolated workspace, with the finding and evidence kept beside it.&lt;/li&gt;
&lt;li&gt;Author a bounded change when the team can evaluate both the diagnosis and the result.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Advancement should stay local to the workflow. An agent that reviews dependency updates well has not earned a global trust score for authentication changes. A good result on a backend test does not prove it can judge a generated interface.&lt;/p&gt;

&lt;p&gt;Ask practical questions at each step. How many findings did maintainers confirm? How quickly could they reject the wrong ones? Did the report remove uncertainty, or did it create another document to decode? These are evaluation questions, not universal metrics. Teams can answer them with their own repository history instead of importing a multiplier claim.&lt;/p&gt;

&lt;p&gt;Authorship then becomes a downstream privilege. The agent already knows how to locate evidence, state uncertainty, and stop when the task exceeds its context. The patch is connected to a diagnosis that survived review rather than appearing as the first artifact in the process.&lt;/p&gt;

&lt;h2&gt;
  
  
  More output will not repair expensive review
&lt;/h2&gt;

&lt;p&gt;Current developer discussion is skeptical of generation volume without validation. A Hacker News thread built around the "2x, not 10x" framing pushes toward experiments, constraints, and review. A Reddit post describes spending more time tuning models, harnesses, MCP tools, and prompts than completing the work the stack was meant to help with. Both are community sentiment, not measured productivity evidence.&lt;/p&gt;

&lt;p&gt;That frustration suggests a narrower move. Adding another authoring agent can increase the amount of code waiting for judgment. A focused reviewer can work on the expensive part directly by making one claim easier to inspect.&lt;/p&gt;

&lt;p&gt;The team that started by granting write access needed a finding a human could confirm, not a patch the human had to decipher. Once the agent can repeatedly make review cheaper for a named workflow, letting it propose the fix becomes a smaller step.&lt;/p&gt;

&lt;p&gt;If it cannot make review cheaper, letting it generate more code only increases the bill.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.techradar.com/pro/linus-torvalds-says-huge-linux-kernel-updates-are-now-the-status-quo-and-its-all-thanks-to-ai" rel="noopener noreferrer"&gt;Linus Torvalds says "huge" Linux kernel updates are now the status quo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/proliferate-ai/proliferate" rel="noopener noreferrer"&gt;Proliferate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/sonotommy/8-ai-coding-agents-that-actually-ship-production-code-in-2026-18ch"&gt;8 AI Coding Agents That Actually Ship Production Code in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=49047839" rel="noopener noreferrer"&gt;2x, not 10x: coding with LLMs in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/LocalLLM/comments/1vrf9jr/whos_spending_more_time_optimising_ai_technology/" rel="noopener noreferrer"&gt;Who's spending more time optimising AI technology than using it?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>softwareengineering</category>
      <category>reviews</category>
    </item>
    <item>
      <title>Give your coding agent a reproducible failure, not a vague prompt</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Sun, 16 Aug 2026 06:06:48 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/give-your-coding-agent-a-reproducible-failure-not-a-vague-prompt-57ad</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/give-your-coding-agent-a-reproducible-failure-not-a-vague-prompt-57ad</guid>
      <description>&lt;p&gt;"Fix checkout" is enough to start a conversation. It is a terrible unit of work for a coding agent.&lt;/p&gt;

&lt;p&gt;The agent can inspect the repository, find something suspicious, write a plausible patch, and report success. The reviewer still has no shared answer to two basic questions: what exactly was broken, and what observable behavior should now be different?&lt;/p&gt;

&lt;p&gt;That gap matters more as implementation gets cheaper. A coding task should begin with a known before-state and a declared after-state. The patch is only an attempt to move the system between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  A task is a state transition, not a sentence
&lt;/h2&gt;

&lt;p&gt;A vague prompt usually contains intent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fix the checkout timeout when a session expires.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does not contain a task contract. Which revision has the bug? Which fixture exposes it? Does the request hang, return the wrong status, or discard the cart? What behavior must remain unchanged? Which command evaluates the result?&lt;/p&gt;

&lt;p&gt;Without those details, the agent has to invent part of the acceptance test while implementing the fix. That is a bad delegation boundary. The same system is choosing what "done" means and announcing that it got there.&lt;/p&gt;

&lt;p&gt;A reviewable task has two observable states:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The starting state can be recreated before any edit.&lt;/li&gt;
&lt;li&gt;The target state can be evaluated after the edit without trusting the agent's summary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent can choose the implementation between those states, while the task author owns the surrounding contract.&lt;/p&gt;

&lt;p&gt;This framing also keeps the human out of low-value supervision. You do not need to narrate every code change if you have already defined the behavior, constraints, and evidence that will make the change acceptable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start from failure on purpose
&lt;/h2&gt;

&lt;p&gt;CLI-Gym is a useful example of failure-first task construction. Its project documentation describes a pipeline that begins with healthy repository environments, introduces controlled failures, and turns those states into reproducible command-line tasks. The README reports 1,655 tasks from 29 repositories.&lt;/p&gt;

&lt;p&gt;Those numbers are project-authored, and they do not prove benchmark quality or production reliability. The task design is more useful here than the headline count.&lt;/p&gt;

&lt;p&gt;A controlled failure gives the agent and reviewer the same starting point. It can be reset. It can be observed before the patch. It can be checked again afterward. If the failure disappears for reasons unrelated to the patch, that becomes visible too.&lt;/p&gt;

&lt;p&gt;Compare that with dropping an agent into a moving branch and saying, "The build is weird, please fix it." The agent may find a real problem. It may also repair an incidental symptom, update a flaky snapshot, or change enough code that nobody can tell which behavior mattered.&lt;/p&gt;

&lt;p&gt;Failure-first does not mean every assignment needs an existing failing test. Feature work often starts without one. In that case, define an observable before-state and a concrete acceptance example. A missing endpoint, an unsupported interaction, or a fixture that currently produces no result can still anchor the transition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put the contract in an artifact
&lt;/h2&gt;

&lt;p&gt;Chat is convenient for exploration. It is weak as the only record of a coding task.&lt;/p&gt;

&lt;p&gt;A durable setup keeps intent, scope, checks, and evidence in artifacts that survive the session. A task file can be reviewed before execution. A plan can be compared with the allowed scope. Test output and the final diff can stay attached to the same work unit.&lt;/p&gt;

&lt;p&gt;This changes the review from "Does the completion message sound convincing?" to a comparison:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the run begin from the declared base state?&lt;/li&gt;
&lt;li&gt;Does the original reproduction now reach the target behavior?&lt;/li&gt;
&lt;li&gt;Did the diff stay inside the stated boundaries?&lt;/li&gt;
&lt;li&gt;Which named checks ran, and which did not?&lt;/li&gt;
&lt;li&gt;Did the agent stop when the task became ambiguous?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat a confident completion paragraph as context, then verify it against the artifacts.&lt;/p&gt;

&lt;p&gt;The contract should also remain implementation-neutral where possible. "Add a retry around &lt;code&gt;refreshSession()&lt;/code&gt;" may be a reasonable plan, but it is already prescribing a patch. "An expired session returns the typed authentication error within the configured timeout and preserves the cart" gives the agent room to inspect the code before choosing a change.&lt;/p&gt;

&lt;h2&gt;
  
  
  A six-field task card
&lt;/h2&gt;

&lt;p&gt;You do not need a large specification system to get this benefit. A compact task card is enough for many repository changes.&lt;/p&gt;

&lt;p&gt;The following example is hypothetical. The commands and fixture names stand in for whatever your repository actually uses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Base
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Revision: &lt;code&gt;&amp;lt;commit SHA&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fixture: &lt;code&gt;expired-session.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Environment assumption: the local test services start with the documented setup command&lt;/li&gt;
&lt;li&gt;Initial state: the cart contains one item and the session token is expired&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reproduce
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;pnpm test checkout -- --grep "expired session"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Current result: the checkout request waits until the test timeout&lt;/li&gt;
&lt;li&gt;Save the pre-change failure output with the task&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Target
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Checkout returns the repository's existing typed authentication error before the configured timeout&lt;/li&gt;
&lt;li&gt;The cart remains intact so the user can authenticate and try again&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Boundaries
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Do not change the session lifetime&lt;/li&gt;
&lt;li&gt;Do not add a dependency&lt;/li&gt;
&lt;li&gt;Preserve checkout behavior for valid sessions&lt;/li&gt;
&lt;li&gt;Keep unrelated formatting and refactors out of the diff&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Checks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Re-run the exact reproduction command&lt;/li&gt;
&lt;li&gt;Run the existing checkout test group&lt;/li&gt;
&lt;li&gt;Run the repository's type check&lt;/li&gt;
&lt;li&gt;Inspect the final diff against the boundaries above&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stop
&lt;/h3&gt;

&lt;p&gt;Hand the task back unresolved if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the failure does not reproduce from the declared base&lt;/li&gt;
&lt;li&gt;the fixture or local setup is broken&lt;/li&gt;
&lt;li&gt;the expected result conflicts with the current API contract&lt;/li&gt;
&lt;li&gt;a required service or credential is unavailable&lt;/li&gt;
&lt;li&gt;the fix needs a wider product or architecture decision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Omitting the Stop section leaves the agent with no defined way to return an unresolved task. An agent that has only success criteria will keep searching for a patch. Explicit stop conditions let it return a useful failure report before it widens the change or guesses at product intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passing checks is evidence with a boundary
&lt;/h2&gt;

&lt;p&gt;Named checks make the transition reviewable. They do not certify the entire system.&lt;/p&gt;

&lt;p&gt;A green targeted test says something about the behavior encoded in that test. It does not prove that the architecture is healthy, that the change is secure, or that every product expectation has been captured. A reproducible failure narrows uncertainty around the named behavior while leaving architectural and product questions for review.&lt;/p&gt;

&lt;p&gt;The final diff still needs review. Compare the code with the declared target and non-goals, then decide whether broader tests or specialist review are needed. A two-line fix in an authentication path may deserve more scrutiny than a larger change in an isolated internal tool.&lt;/p&gt;

&lt;p&gt;The task card helps make that judgment legible. It shows what the checks were supposed to prove and where their authority ends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let an unresolved run count as a valid result
&lt;/h2&gt;

&lt;p&gt;The Hacker News and Reddit threads in the source notes are anecdotal, but some participants favor small, auditable loops: inspect, change, run a real check, review the diff, and preserve enough state for the next step. Tool preferences vary, while every unattended run still needs a clear handoff.&lt;/p&gt;

&lt;p&gt;A run that reports "cannot reproduce from the named revision" has produced useful information. So has one that finds contradictory acceptance checks or a missing service. Those results protect the repository from a guessed patch and give the task author a specific problem to resolve.&lt;/p&gt;

&lt;p&gt;Treating every run as patch-or-failure creates pressure to hide uncertainty. Treating a justified stop as part of the contract makes the workflow more honest. The agent can state what it inspected, where the transition broke down, and what decision or dependency is missing.&lt;/p&gt;

&lt;p&gt;That is a better result than green output from a check nobody agreed would define success.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define the transition before asking for the patch
&lt;/h2&gt;

&lt;p&gt;Return to "fix checkout." With a base revision, fixture, reproduction command, behavioral target, boundaries, checks, and stop conditions, the assignment becomes reviewable before the agent writes a line of code.&lt;/p&gt;

&lt;p&gt;The agent may discover that the expected fix is tiny. It may find that the task is underspecified. Both outcomes are easier to handle when the before-state and after-state are explicit.&lt;/p&gt;

&lt;p&gt;A stronger model can propose a better implementation. It cannot recover a success condition the team never wrote down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/LiberCoders/CLI-Gym" rel="noopener noreferrer"&gt;CLI-Gym&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/speccoding/your-ai-agents-ship-code-faster-than-you-can-review-it-heres-the-workflow-that-fixes-that-4ied"&gt;Your AI Agents Ship Code Faster Than You Can Review It&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kharonte/the-ai-coding-agent-workflow-that-actually-works-after-1000-hours-54jc"&gt;The AI Coding Agent Workflow That Actually Works After 1,000 Hours&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=48485669" rel="noopener noreferrer"&gt;Ask HN: What coding agents are you using?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/LLMDevs/comments/1vmmbiw/coding_agents_workflow/" rel="noopener noreferrer"&gt;Coding agents workflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>agents</category>
    </item>
    <item>
      <title>A coding agent needs an authority budget, not just a better model</title>
      <dc:creator>hefty</dc:creator>
      <pubDate>Fri, 14 Aug 2026 06:43:32 +0000</pubDate>
      <link>https://dev.to/hefty_69a4c2d631c9dd70724/a-coding-agent-needs-an-authority-budget-not-just-a-better-model-3131</link>
      <guid>https://dev.to/hefty_69a4c2d631c9dd70724/a-coding-agent-needs-an-authority-budget-not-just-a-better-model-3131</guid>
      <description>&lt;p&gt;A coding agent can produce a patch before your team has agreed on what it was allowed to read.&lt;/p&gt;

&lt;p&gt;That is a bad trade. A fast patch is not useful if nobody can explain which files shaped it, which tools it called, what data it retained, or what evidence makes the result trustworthy. The model may be capable. The workflow can still be unusable.&lt;/p&gt;

&lt;p&gt;I think about this as an authority budget. The budget is the set of permissions and obligations around an agent: what it can read, write, call, retain, ask approval for, and prove afterward. The model matters, but it is only one part of the operating design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model quality is only one axis
&lt;/h2&gt;

&lt;p&gt;Coding assistants now occupy different workflow lanes. Some live in an IDE. Some work in a terminal, browser, or pull-request flow. Privacy, team controls, cost, and the amount of context available also vary by tool.&lt;/p&gt;

&lt;p&gt;That variety makes a universal ranking less useful than it looks. Choosing an agent is also choosing a permission surface.&lt;/p&gt;

&lt;p&gt;An IDE assistant may see the file currently open and a slice of the repository. A terminal agent may be able to run commands and modify a wider set of paths. A browser-oriented workflow may have a different kind of access again. Each one creates a different review problem.&lt;/p&gt;

&lt;p&gt;The question is not only, "Which model writes the best code?" It is also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What context does this workflow expose?&lt;/li&gt;
&lt;li&gt;What can the agent change without asking?&lt;/li&gt;
&lt;li&gt;Which external systems can it call?&lt;/li&gt;
&lt;li&gt;How does a reviewer know what happened?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A model comparison can help with the first question. It does not answer the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading, writing, and reviewing are different powers
&lt;/h2&gt;

&lt;p&gt;The Pair documents a simple split between a Mentor, which acts as a read-only reviewer, and an Executor, which performs the writing work. Whether that project catches more mistakes is a separate question. The design still makes an important permission distinction visible.&lt;/p&gt;

&lt;p&gt;Inspection and mutation do not have to be the same authority.&lt;/p&gt;

&lt;p&gt;That distinction is easy to lose when one agent can inspect a repository, edit files, run commands, and summarize its own work. The same system that made the change can also decide that the change looks fine. A successful response then becomes a weak substitute for independent review.&lt;/p&gt;

&lt;p&gt;A stricter workflow can separate the powers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One step gathers context and proposes a change.&lt;/li&gt;
&lt;li&gt;Another step applies the change inside a bounded workspace.&lt;/li&gt;
&lt;li&gt;A reviewer, human or automated, inspects the diff and the required checks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This does not make the review correct by magic. It does make the review boundary explicit. Read access is not write access, and write access is not approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  The harness around the model is part of the product
&lt;/h2&gt;

&lt;p&gt;Google's developer highlights describe persistent isolated environments and Managed Agents as part of its developer tooling. The release signal matters because it treats execution space, persistence, and agent lifecycle as product concerns rather than details hidden behind a chat box.&lt;/p&gt;

&lt;p&gt;The Product Hunt page for prjct/ takes a similar direction from a different angle. Its product positioning combines intent briefs, bounded repository context, persistent memory, guardrails, and evaluations around coding agents.&lt;/p&gt;

&lt;p&gt;Those pages describe vendor or product-authored capabilities. They are not independent validation, and isolation or persistence does not automatically make a workflow safe. They do show where the engineering surface is moving: the wrapper around the model increasingly determines the context, tools, memory, and checks that shape a run.&lt;/p&gt;

&lt;p&gt;That wrapper deserves the same design attention as the prompt.&lt;/p&gt;

&lt;p&gt;If an agent has persistent memory, decide what enters it and how long it stays there. If it runs in an isolated environment, decide which credentials, network routes, and repositories can still reach the environment. If it has guardrails, make the restricted actions visible and test the failure path.&lt;/p&gt;

&lt;p&gt;A label such as "sandboxed" is not a permission model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why teams say no
&lt;/h2&gt;

&lt;p&gt;A recent Reddit discussion about a workplace that did not allow AI agents is anecdotal, not a measurement of how teams behave. It is still useful because the objections are concrete. People discuss code exfiltration, data retention, residency, and how a reviewer can examine agent-produced changes.&lt;/p&gt;

&lt;p&gt;Those are authority questions.&lt;/p&gt;

&lt;p&gt;A developer may want help with a repository. The organization may need to know whether source code leaves its boundary, whether prompts or logs persist, where artifacts are stored, and whether a human can reconstruct the change. Productivity does not remove those obligations.&lt;/p&gt;

&lt;p&gt;This is why "the model is good enough" rarely settles an adoption decision. A team can accept the coding capability and reject the surrounding authority. It can also approve a narrow local workflow while refusing broad repository or production access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write the six lines before widening access
&lt;/h2&gt;

&lt;p&gt;The authority budget does not need to be a grand governance program. Start with six explicit lines in the task definition.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read. Name the repositories, directories, files, secrets, and external context the agent may see. Keep sensitive material out of scope by default.&lt;/li&gt;
&lt;li&gt;Write. Name the paths and branches the agent may change. Make generated artifacts and protected files clear.&lt;/li&gt;
&lt;li&gt;Call. List the commands, tools, network destinations, and services available during the run. Treat a new network permission as a design change.&lt;/li&gt;
&lt;li&gt;Retain. Decide where prompts, source snippets, memory, logs, diffs, and output artifacts persist, and for how long.&lt;/li&gt;
&lt;li&gt;Approve. Mark the actions that require a person or a policy gate, such as changing dependencies, accessing production, or widening the workspace.&lt;/li&gt;
&lt;li&gt;Prove. Require the diff, named check results, relevant event or log evidence, and an explicit failure state before the run counts as complete.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The last line is where many workflows become honest. A process exit of zero is not the same as an accepted change. The agent's statement that it finished is not the same as a passing test suite. A useful result should let the next reviewer see what changed, what ran, what failed, and what the agent left untouched.&lt;/p&gt;

&lt;p&gt;For an automated coding task, I would start with a read-only repository slice or a narrow writable path. Then I would add one permission for one named workflow need. If the agent needs network access, record why. If it needs persistent memory, define its contents and lifetime. If it needs to edit a new directory, make that expansion reviewable.&lt;/p&gt;

&lt;p&gt;This keeps the failure radius small while the team learns how the workflow behaves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spend authority only when the run can show its receipt
&lt;/h2&gt;

&lt;p&gt;Better models will make agents more useful. They will not decide what a team should expose to an agent or what evidence should unlock the next step.&lt;/p&gt;

&lt;p&gt;That decision belongs in the workflow contract.&lt;/p&gt;

&lt;p&gt;The better coding agent is often not the one with the most impressive demo. It is the one whose authority a team can explain, whose changes fit inside that authority, and whose result leaves a receipt that another person or system can review.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/timwuhaotian/the-pair" rel="noopener noreferrer"&gt;The Pair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/google-io-2026-developer-highlights/" rel="noopener noreferrer"&gt;Google I/O 2026 developer highlights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/rahulxsingh/best-ai-coding-assistants-in-2026-we-tested-20-4416"&gt;Best AI Coding Assistants in 2026 (We Tested 20+)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/cscareerquestions/comments/1vi80px/recently_i_started_a_new_job_where_using_ai/" rel="noopener noreferrer"&gt;Recently I started a new job where using AI agents is not allowed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.producthunt.com/products/prjct-cli?launch=prjct-cli" rel="noopener noreferrer"&gt;prjct/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
