<?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: dengyier</title>
    <description>The latest articles on DEV Community by dengyier (@dengyier).</description>
    <link>https://dev.to/dengyier</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%2F4067563%2Fc9439042-cf75-40ad-bb0c-0397edd1d040.jpg</url>
      <title>DEV Community: dengyier</title>
      <link>https://dev.to/dengyier</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dengyier"/>
    <language>en</language>
    <item>
      <title>The Biggest Barrier to Enterprise AI Agents Is Not Intelligence. It Is Delegation.</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Tue, 25 Aug 2026 07:11:33 +0000</pubDate>
      <link>https://dev.to/dengyier/the-biggest-barrier-to-enterprise-ai-agents-is-not-intelligence-it-is-delegation-17d3</link>
      <guid>https://dev.to/dengyier/the-biggest-barrier-to-enterprise-ai-agents-is-not-intelligence-it-is-delegation-17d3</guid>
      <description>&lt;p&gt;An AI agent can now read a repository, modify code, run tests, prepare a release, update a ticket, and explain what it did.&lt;/p&gt;

&lt;p&gt;That is already enough intelligence to complete a surprising amount of useful work.&lt;/p&gt;

&lt;p&gt;Yet many companies still stop at the same boundary:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We are willing to let the agent assist. We are not yet willing to let it own the task.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The usual explanation is that the model needs to become more accurate. Sometimes that is true. But accuracy is no longer the whole problem.&lt;/p&gt;

&lt;p&gt;The deeper barrier is delegation.&lt;/p&gt;

&lt;p&gt;Can the company prove who assigned the work? What authority was granted? Which actions were forbidden? What actually happened? Which evidence supports the result? Who independently checked it? Who has the right to accept or reject the delivery?&lt;/p&gt;

&lt;p&gt;If those questions are answered only by a chat transcript, a dashboard, or the agent's own summary, the organization has not delegated the work. It has created a new form of supervision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intelligence and delegation are different capabilities
&lt;/h2&gt;

&lt;p&gt;Intelligence answers questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can the agent understand the task?&lt;/li&gt;
&lt;li&gt;Can it plan a sequence of actions?&lt;/li&gt;
&lt;li&gt;Can it use the required tools?&lt;/li&gt;
&lt;li&gt;Can it recover from ordinary errors?&lt;/li&gt;
&lt;li&gt;Can it produce a useful result?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Delegation answers a different set of questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who had the authority to assign this task?&lt;/li&gt;
&lt;li&gt;What exactly was the agent permitted to do?&lt;/li&gt;
&lt;li&gt;Which version of the task and policy governed the execution?&lt;/li&gt;
&lt;li&gt;Can another party reconstruct what actually ran?&lt;/li&gt;
&lt;li&gt;Who verifies the evidence?&lt;/li&gt;
&lt;li&gt;Who accepts the commercial result?&lt;/li&gt;
&lt;li&gt;What happens when the parties disagree?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A more capable model improves the first list. It does not automatically solve the second.&lt;/p&gt;

&lt;p&gt;In fact, increasing capability can make the delegation problem more expensive. An agent that can only draft text has a small blast radius. An agent that can change production systems, commit code, approve invoices, contact customers, or purchase services creates a much larger one.&lt;/p&gt;

&lt;p&gt;The more useful the agent becomes, the more important its authority boundary becomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delegation is a contract, not a prompt
&lt;/h2&gt;

&lt;p&gt;A prompt describes an intention. A delegation establishes an accountable relationship.&lt;/p&gt;

&lt;p&gt;"Fix the checkout bug" is an intention.&lt;/p&gt;

&lt;p&gt;A real delegation needs more structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the repository, issue, and acceptance criteria;&lt;/li&gt;
&lt;li&gt;the tools and resources the agent may use;&lt;/li&gt;
&lt;li&gt;the time, cost, and operational limits;&lt;/li&gt;
&lt;li&gt;the actions reserved for human approval;&lt;/li&gt;
&lt;li&gt;the evidence required for completion;&lt;/li&gt;
&lt;li&gt;the party responsible for verification;&lt;/li&gt;
&lt;li&gt;the party authorized to accept the delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not mean every agent task needs a legal document. It means consequential work needs a machine-readable agreement that the runtime can enforce and another party can inspect.&lt;/p&gt;

&lt;p&gt;Without that agreement, the organization is forced to rely on interpretation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the manager interprets what the request meant;&lt;/li&gt;
&lt;li&gt;the agent interprets which actions were allowed;&lt;/li&gt;
&lt;li&gt;the operator interprets the agent's summary;&lt;/li&gt;
&lt;li&gt;the customer interprets whether the result counts as complete;&lt;/li&gt;
&lt;li&gt;the auditor reconstructs the event after the fact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every interpretation adds cost. Every missing boundary creates a future dispute.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hidden cost is not execution. It is verification.
&lt;/h2&gt;

&lt;p&gt;Agent economics are often presented as a comparison between machine time and human labor.&lt;/p&gt;

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

&lt;p&gt;The real cost of delegated work includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;execution
+ supervision
+ evidence collection
+ result verification
+ exception handling
+ dispute resolution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An agent may complete a task in five minutes, while a senior engineer spends forty minutes reconstructing what changed and deciding whether the result is safe to accept.&lt;/p&gt;

&lt;p&gt;The execution is cheap. The verification is expensive.&lt;/p&gt;

&lt;p&gt;This is why a successful demo may not become a production workflow. The demo proves the agent can act. The enterprise still needs to know whether the action was authorized, whether the evidence is complete, and whether the result satisfies the business agreement.&lt;/p&gt;

&lt;p&gt;When those answers require manual reconstruction, the cost of trust rises with every task.&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete example: delegating a production fix
&lt;/h2&gt;

&lt;p&gt;Imagine a company delegates a production defect to a coding agent.&lt;/p&gt;

&lt;p&gt;The agent is permitted to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read the repository;&lt;/li&gt;
&lt;li&gt;modify files in a defined scope;&lt;/li&gt;
&lt;li&gt;run approved tests;&lt;/li&gt;
&lt;li&gt;prepare a release candidate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not permitted to deploy directly to production.&lt;/p&gt;

&lt;p&gt;The agent completes the patch and reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;All tests passed. Release ready.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That statement is useful, but it is not enough to accept the work.&lt;/p&gt;

&lt;p&gt;The company still needs to establish:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Was this agent assigned to the correct work order?&lt;/li&gt;
&lt;li&gt;Was the patch produced within the granted repository and file scope?&lt;/li&gt;
&lt;li&gt;Which commands and tests actually ran?&lt;/li&gt;
&lt;li&gt;Were the observed outputs bound to this exact patch?&lt;/li&gt;
&lt;li&gt;Did an independent verifier evaluate the relevant evidence?&lt;/li&gt;
&lt;li&gt;Did the authorized business or technical owner accept this exact result?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notice that these are not model-intelligence questions. They are delegation and delivery questions.&lt;/p&gt;

&lt;p&gt;A stronger model may write a better patch. It still should not be allowed to define its own authority, verify its own claims, and accept its own delivery.&lt;/p&gt;

&lt;h2&gt;
  
  
  The minimum trustworthy delegation chain
&lt;/h2&gt;

&lt;p&gt;For consequential agent work, the minimum chain looks 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;Intended work
    -&amp;gt; authorized capability
    -&amp;gt; pre-execution policy decision
    -&amp;gt; signed action receipt
    -&amp;gt; independent verification
    -&amp;gt; explicit acceptance or rejection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each stage answers a different question.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Intended work
&lt;/h3&gt;

&lt;p&gt;What outcome was requested, under which constraints, and with which acceptance criteria?&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Authorized capability
&lt;/h3&gt;

&lt;p&gt;Who delegated which tools, resources, scope, budget, and duration to the agent?&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pre-execution policy decision
&lt;/h3&gt;

&lt;p&gt;Was this exact action allowed at the moment before it ran?&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Signed action receipt
&lt;/h3&gt;

&lt;p&gt;What did the execution environment observe, and how is that record bound to the request, actor, evidence, and prior events?&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Independent verification
&lt;/h3&gt;

&lt;p&gt;Does the evidence support the required technical judgment, including honest &lt;code&gt;UNKNOWN&lt;/code&gt; outcomes when the evidence is insufficient?&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Explicit acceptance or rejection
&lt;/h3&gt;

&lt;p&gt;Does the authorized recipient accept this delivery as satisfying the work agreement?&lt;/p&gt;

&lt;p&gt;Combining these stages into one "success" flag destroys useful information. Technical verification is not commercial acceptance. Permission to use a tool is not permission to achieve any result by any method. A valid signature is not proof that the underlying judgment was correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where MCP fits — and where it does not
&lt;/h2&gt;

&lt;p&gt;MCP is important because it standardizes how models and agent applications connect to tools, data, and services. Its authorization specification addresses protected access at the transport layer, including OAuth-based flows and resource-bound tokens.&lt;/p&gt;

&lt;p&gt;That solves a necessary problem: may this client access this protected server?&lt;/p&gt;

&lt;p&gt;It does not, by itself, establish the full work agreement between the parties. A transport token does not necessarily answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Was this specific business task authorized?&lt;/li&gt;
&lt;li&gt;Did the action remain inside the agreed work order?&lt;/li&gt;
&lt;li&gt;What evidence proves the requested outcome?&lt;/li&gt;
&lt;li&gt;Who independently verified the result?&lt;/li&gt;
&lt;li&gt;Who accepted the delivery?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a criticism of MCP. It is a separation of responsibilities.&lt;/p&gt;

&lt;p&gt;MCP connects agents to capabilities. A verifiable work protocol can bind those capabilities to an accountable delegation and acceptance chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  How OpenWorkProof models delegation
&lt;/h2&gt;

&lt;p&gt;OpenWorkProof 1.3.0 represents the chain with explicit protocol objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WorkOrder
    -&amp;gt; CapabilityGrant
    -&amp;gt; PolicyDecision
    -&amp;gt; ActionReceipt
    -&amp;gt; VerificationDecision
    -&amp;gt; AcceptanceDecision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The names matter because they prevent several different claims from collapsing into one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;WorkOrder&lt;/code&gt; freezes the requested work and acceptance boundary.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CapabilityGrant&lt;/code&gt; delegates a limited capability to a named subject.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PolicyDecision&lt;/code&gt; records whether a proposed action was allowed before execution.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ActionReceipt&lt;/code&gt; binds observed execution to the request and causal history.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VerificationDecision&lt;/code&gt; records an independent judgment about the evidence.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AcceptanceDecision&lt;/code&gt; preserves the recipient's authority to accept or reject the delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Human Agency Profile further narrows which actions an agent may take autonomously and which decisions remain reserved for a person. It can reduce authority, but it cannot silently expand the underlying work order or capability grant.&lt;/p&gt;

&lt;p&gt;The resulting bundles can be verified offline without private keys. That matters when the customer, vendor, marketplace, or auditor does not share the same platform database.&lt;/p&gt;

&lt;p&gt;OpenWorkProof does not make the agent smarter. It makes the agent's work safer to delegate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What enterprises are actually buying
&lt;/h2&gt;

&lt;p&gt;Companies do not buy signatures, hashes, or state machines because those technologies are interesting.&lt;/p&gt;

&lt;p&gt;They buy lower delegation risk.&lt;/p&gt;

&lt;p&gt;More specifically, they may pay for the ability to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;move agents from advisory work into higher-value execution;&lt;/li&gt;
&lt;li&gt;reduce senior review time spent reconstructing activity;&lt;/li&gt;
&lt;li&gt;preserve a common evidence package across organizational boundaries;&lt;/li&gt;
&lt;li&gt;distinguish authorization, execution, verification, and acceptance;&lt;/li&gt;
&lt;li&gt;reject a delivery without losing the underlying record;&lt;/li&gt;
&lt;li&gt;investigate disputes without trusting a single vendor's dashboard;&lt;/li&gt;
&lt;li&gt;change agent providers without losing the verification format.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the commercial value of an open protocol layer. It lowers the cost of proving that delegated work stayed inside an agreed boundary.&lt;/p&gt;

&lt;p&gt;It does not eliminate the need for judgment. It makes judgment easier to exercise and harder to rewrite after the fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  The adoption test is simple
&lt;/h2&gt;

&lt;p&gt;The best market question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Would your company like more trustworthy AI?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Almost everyone will say yes, and the answer reveals very little.&lt;/p&gt;

&lt;p&gt;A better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which valuable task are you refusing to delegate to an agent today because you cannot reliably authorize, inspect, verify, or accept the work?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question identifies the boundary between an impressive assistant and an accountable worker.&lt;/p&gt;

&lt;p&gt;The next question is even more practical:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What minimum evidence would let you cross that boundary?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For one company, the answer may be a signed record of tool calls and test outputs. For another, it may require independent verification, human approval at a specific transition, or a portable acceptance package shared with a customer.&lt;/p&gt;

&lt;p&gt;Those differences should shape the protocol and the product. They should not be hidden behind a universal "Agent completed" status.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;OpenWorkProof is not an Agent OS, an observability dashboard, a payment custodian, or a legal-compliance certificate.&lt;/p&gt;

&lt;p&gt;It does not prove that an organization has adopted the protocol, paid for a deployment, transferred liability, or satisfied a regulator. Those are separate claims requiring separate evidence.&lt;/p&gt;

&lt;p&gt;The current goal is narrower and more useful:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make an agent's delegated work independently verifiable from authorization through acceptance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If that layer becomes interoperable, agent runtimes, marketplaces, enterprise workflows, and settlement systems can build on top of it without inventing a new trust format for every transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The future of enterprise agents depends on permission to trust
&lt;/h2&gt;

&lt;p&gt;The enterprise AI market will not be won only by the agent that reasons best.&lt;/p&gt;

&lt;p&gt;It will also be shaped by the system that makes consequential work safe to assign, cheap to verify, and clear to accept.&lt;/p&gt;

&lt;p&gt;Intelligence creates the capacity to act.&lt;/p&gt;

&lt;p&gt;Delegation creates the permission to rely on that action.&lt;/p&gt;

&lt;p&gt;The companies that solve both will move agents beyond demos and copilots. The companies that solve only intelligence will continue to produce increasingly capable systems surrounded by increasingly expensive human supervision.&lt;/p&gt;

&lt;p&gt;If you are building or buying enterprise agents, I would value your answer to two questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What high-value task are you still unwilling to delegate?&lt;/li&gt;
&lt;li&gt;What evidence would make you comfortable accepting the result?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;Explore OpenWorkProof on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://airc.nist.gov/airmf-resources/airmf/5-sec-core/" rel="noopener noreferrer"&gt;NIST AI Risk Management Framework Core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization" rel="noopener noreferrer"&gt;Model Context Protocol Authorization Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof/blob/main/README_en.md" rel="noopener noreferrer"&gt;OpenWorkProof Protocol Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof/blob/main/docs/protocol/human-agency-profile-v0.1.md" rel="noopener noreferrer"&gt;OpenWorkProof Human Agency Profile v0.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Series
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/dengyier/agent-autonomy-has-a-missing-layer-verifiable-human-authority-358f"&gt;Agent Autonomy Has a Missing Layer: Verifiable Human Authority&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dengyier/the-more-autonomous-ai-agents-become-the-more-humans-need-the-final-say-338p"&gt;The More Autonomous AI Agents Become, the More Humans Need the Final Say&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dengyier/a-signed-ai-agent-receipt-can-still-be-wrong-4jd3"&gt;A Signed AI Agent Receipt Can Still Be Wrong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dengyier/human-control-cannot-be-a-checkbox-in-an-autonomous-agent-system-1h6e"&gt;Human Control Cannot Be a Checkbox in an Autonomous Agent System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Biggest Barrier to Enterprise AI Agents Is Not Intelligence. It Is Delegation.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>Human Control Cannot Be a Checkbox in an Autonomous Agent System</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Mon, 24 Aug 2026 14:57:02 +0000</pubDate>
      <link>https://dev.to/dengyier/human-control-cannot-be-a-checkbox-in-an-autonomous-agent-system-1h6e</link>
      <guid>https://dev.to/dengyier/human-control-cannot-be-a-checkbox-in-an-autonomous-agent-system-1h6e</guid>
      <description>&lt;p&gt;An AI agent prepares a production deployment.&lt;/p&gt;

&lt;p&gt;It has changed twelve files, run several checks, and produced a confident summary. The interface now shows a green button:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Human approval required&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The operator clicks &lt;strong&gt;Approve&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It looks like a human remained in control. But what did that click actually mean?&lt;/p&gt;

&lt;p&gt;Did the operator see the exact patch? Were all required checks executed? Did the agent disclose what it could not measure? Was deployment still blocked before the click? Could the operator reject or narrow the action? Can anyone later prove which person approved which version under which authority?&lt;/p&gt;

&lt;p&gt;If those questions have no reliable answer, the button is not a control boundary. It is a ceremony.&lt;/p&gt;

&lt;p&gt;As AI agents move from generating text to changing code, sending messages, purchasing services, and operating business systems, this distinction becomes important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A button is an interface. Authority is a property of the system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The checkbox version of human oversight
&lt;/h2&gt;

&lt;p&gt;Many agent products add a human approval step near a consequential action. This is often useful, but the design can become superficial.&lt;/p&gt;

&lt;p&gt;The weak pattern looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the agent chooses the action and constructs its own explanation;&lt;/li&gt;
&lt;li&gt;the system presents a compressed summary;&lt;/li&gt;
&lt;li&gt;a person clicks approve or reject;&lt;/li&gt;
&lt;li&gt;the application stores an ordinary event log;&lt;/li&gt;
&lt;li&gt;the agent continues.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The person is present, but presence alone does not establish control.&lt;/p&gt;

&lt;p&gt;The approval may be bundled across unrelated actions. The summary may omit uncertainty. The person may not be the party authorized to accept the risk. The action may already have started. The audit log may be editable by the same system that produced it. The approval may not be bound to the exact request that was executed.&lt;/p&gt;

&lt;p&gt;This produces a dangerous ambiguity: the organization can say a human approved the action, while the human cannot prove what they were asked to approve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human authority needs five properties
&lt;/h2&gt;

&lt;p&gt;Human control becomes operational only when the system preserves five properties.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. A named authority
&lt;/h3&gt;

&lt;p&gt;"A human" is not a role.&lt;/p&gt;

&lt;p&gt;The system should identify who has the right to authorize a capability, who may execute work, who verifies evidence, and who accepts the result. These can be different people or systems.&lt;/p&gt;

&lt;p&gt;This matters because the developer who built an agent should not automatically become the customer who accepts its delivery. Likewise, an agent should not be allowed to execute, verify, and accept its own work simply because all three steps can be automated.&lt;/p&gt;

&lt;p&gt;NIST's AI Risk Management Framework calls for organizations to define and differentiate roles and responsibilities for human and AI configurations. That distinction is not paperwork. It determines whose decision is valid when the stakes are real.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A decision before execution
&lt;/h3&gt;

&lt;p&gt;An approval that arrives after an irreversible action is an explanation, not authorization.&lt;/p&gt;

&lt;p&gt;The control must be evaluated before the protected operation starts. If an action is reserved for human judgment, the handler should receive zero calls until the required decision exists.&lt;/p&gt;

&lt;p&gt;This sounds obvious, yet asynchronous queues, retries, cached permissions, and race conditions can quietly turn "approve before execution" into "approve near execution."&lt;/p&gt;

&lt;p&gt;A real boundary must survive concurrency. If a person revokes permission while the agent is preparing an action, the system must not use an earlier authorization check to cross the newly closed boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Enough evidence to make the decision meaningful
&lt;/h3&gt;

&lt;p&gt;An approval screen should not merely show what the agent claims happened. It should expose what was requested, what was observed, which checks ran, which checks did not run, and what remains uncertain.&lt;/p&gt;

&lt;p&gt;This connects directly to the previous article in this series: a signed receipt can still describe the wrong measurement. A human cannot exercise meaningful judgment if &lt;code&gt;not measured&lt;/code&gt; is displayed as &lt;code&gt;nothing wrong&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The person needs an evidence surface, not a confidence surface.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. An enforceable ability to refuse, narrow, or stop
&lt;/h3&gt;

&lt;p&gt;Human authority is not the right to watch an autonomous system. It is the ability to change what happens next.&lt;/p&gt;

&lt;p&gt;Depending on the context, that may include the ability to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reject a proposed action;&lt;/li&gt;
&lt;li&gt;reserve a category of decisions for human review;&lt;/li&gt;
&lt;li&gt;narrow the tools or scope an agent may use;&lt;/li&gt;
&lt;li&gt;revoke an active delegation;&lt;/li&gt;
&lt;li&gt;replace it with a stricter one;&lt;/li&gt;
&lt;li&gt;interrupt execution safely;&lt;/li&gt;
&lt;li&gt;decline final acceptance even when technical verification passed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Article 14 of the EU AI Act describes human oversight for high-risk systems in similarly operational terms. It includes understanding system limitations, remaining aware of automation bias, disregarding or reversing output, intervening, and stopping the system. This article is not a legal analysis, and a protocol implementation does not establish compliance. The useful design lesson is that oversight must affect system behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. A record that can be independently checked
&lt;/h3&gt;

&lt;p&gt;When a dispute occurs, a screenshot of an approval page is weak evidence.&lt;/p&gt;

&lt;p&gt;A stronger record binds the decision to the exact work order, request, evidence, actor, authority, and time. It should be possible for another party to verify that record without trusting the agent that performed the work or the platform that displayed the button.&lt;/p&gt;

&lt;p&gt;This is especially important across organizations. A customer, contractor, marketplace, insurer, or auditor may not share the same database or trust the same operator.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical example: an agent preparing a deployment
&lt;/h2&gt;

&lt;p&gt;Consider an agent assigned to fix a production defect.&lt;/p&gt;

&lt;p&gt;The work order permits four operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read the repository;&lt;/li&gt;
&lt;li&gt;apply a patch;&lt;/li&gt;
&lt;li&gt;run tests;&lt;/li&gt;
&lt;li&gt;deploy the approved release.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The technical capability grant also includes those four operations. A traditional permission system may conclude that the agent can perform all of them.&lt;/p&gt;

&lt;p&gt;But the responsible human may want a narrower arrangement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repository reads and tests can run autonomously;&lt;/li&gt;
&lt;li&gt;applying a patch requires review;&lt;/li&gt;
&lt;li&gt;production deployment always remains a human decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means effective permission should not equal the broadest capability available. It should equal the intersection of three boundaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WorkOrder permission
AND CapabilityGrant delegation
AND the active human authority profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If any layer denies the operation, the operation does not run.&lt;/p&gt;

&lt;p&gt;This model avoids two common mistakes.&lt;/p&gt;

&lt;p&gt;The first is treating one approval as permanent consent for every later action. The second is forcing a person to approve every harmless step, which creates alert fatigue and turns oversight into habitual clicking.&lt;/p&gt;

&lt;p&gt;Good human control is selective. It gives agents room to operate inside a defined boundary and preserves human judgment at consequential transitions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why more approval prompts can create less control
&lt;/h2&gt;

&lt;p&gt;The obvious response to agent risk is to add more prompts. But a system that asks for approval too often trains people to approve without reading.&lt;/p&gt;

&lt;p&gt;The problem is not simply the number of human interactions. It is whether each interaction carries a real decision.&lt;/p&gt;

&lt;p&gt;A useful approval should answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What exact action is proposed?&lt;/li&gt;
&lt;li&gt;Which work order and authority does it belong to?&lt;/li&gt;
&lt;li&gt;What evidence supports it?&lt;/li&gt;
&lt;li&gt;What uncertainty remains?&lt;/li&gt;
&lt;li&gt;What changes if I reject it?&lt;/li&gt;
&lt;li&gt;Can the agent route around my decision?&lt;/li&gt;
&lt;li&gt;Will this decision be verifiable later?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the interface cannot answer those questions, adding another checkbox does not add another layer of governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  How OpenWorkProof is approaching this boundary
&lt;/h2&gt;

&lt;p&gt;OpenWorkProof 1.3.0 includes a Human Agency Profile v0.1. It is an open protocol capability for expressing which actions an agent may take autonomously and which decisions remain reserved for a person.&lt;/p&gt;

&lt;p&gt;The current design has several concrete rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the profile is bound to one frozen work order;&lt;/li&gt;
&lt;li&gt;the designated Acceptor signs the profile;&lt;/li&gt;
&lt;li&gt;the profile can narrow existing authority but cannot expand the work order or capability grant;&lt;/li&gt;
&lt;li&gt;a reserved action fails before the handler runs with &lt;code&gt;AGENCY_HUMAN_DECISION_REQUIRED&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;signed transitions can revoke or replace the active profile;&lt;/li&gt;
&lt;li&gt;an appeal records a request for review but never restores permission by itself;&lt;/li&gt;
&lt;li&gt;a private-key-free bundle can be verified offline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verification and acceptance also remain separate. A Verifier may establish that evidence satisfies a defined technical judgment. The WorkOrder-bound Acceptor still decides whether to accept or reject the delivery.&lt;/p&gt;

&lt;p&gt;This is intentionally narrower than a general policy engine or an "Agent OS." It does not score employees, transfer legal liability, hold funds, or certify regulatory compliance. The repository also does not prove customer adoption or payment. Those are separate facts that require separate evidence.&lt;/p&gt;

&lt;p&gt;The aim is simpler: make the human boundary explicit enough for software to enforce and another party to verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  The business consequence is cheaper delegation
&lt;/h2&gt;

&lt;p&gt;Companies do not need cryptography for its own sake. They need to delegate important work without losing the ability to understand, limit, reject, and audit what was done.&lt;/p&gt;

&lt;p&gt;Weak human oversight raises the cost of delegation in several ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;senior staff must manually reconstruct agent activity;&lt;/li&gt;
&lt;li&gt;customers dispute what they approved;&lt;/li&gt;
&lt;li&gt;teams cannot distinguish technical verification from business acceptance;&lt;/li&gt;
&lt;li&gt;vendors and buyers keep separate, incompatible audit records;&lt;/li&gt;
&lt;li&gt;organizations restrict agents to low-value tasks because higher-value delegation feels unsafe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A verifiable authority boundary does not eliminate these risks. It makes the underlying decisions inspectable. That can reduce the cost of review and make cross-organization agent work easier to accept.&lt;/p&gt;

&lt;p&gt;This is the commercial reason human agency belongs in the protocol rather than only in the user interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human-centered AI needs machine-readable boundaries
&lt;/h2&gt;

&lt;p&gt;Fei-Fei Li has described AI as a responsibility and warned, "If we give up agency, it would be a freefall."&lt;/p&gt;

&lt;p&gt;That principle becomes more demanding when agents can act.&lt;/p&gt;

&lt;p&gt;Keeping humans at the center cannot mean adding a person-shaped icon to an automated pipeline. It must mean preserving a person's ability to define the boundary, understand the evidence, refuse the action, revise the delegation, and independently prove the decision later.&lt;/p&gt;

&lt;p&gt;The next generation of agent systems will not be judged only by what agents can do. It will also be judged by whether people can still say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You may do this, but not that.&lt;/li&gt;
&lt;li&gt;Stop here.&lt;/li&gt;
&lt;li&gt;Show me the evidence.&lt;/li&gt;
&lt;li&gt;I do not accept this result.&lt;/li&gt;
&lt;li&gt;This is the exact decision I made.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not a checkbox. It is authority.&lt;/p&gt;

&lt;p&gt;If you build agent runtimes, approval workflows, MCP servers, or enterprise automation, I would value your view on two questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which agent actions should always remain reserved for a named human authority?&lt;/li&gt;
&lt;li&gt;What evidence would you need before a human approval could be treated as a real control boundary?&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A Signed AI Agent Receipt Can Still Be Wrong</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Mon, 24 Aug 2026 12:19:10 +0000</pubDate>
      <link>https://dev.to/dengyier/a-signed-ai-agent-receipt-can-still-be-wrong-4jd3</link>
      <guid>https://dev.to/dengyier/a-signed-ai-agent-receipt-can-still-be-wrong-4jd3</guid>
      <description>&lt;p&gt;Your AI agent returns a signed receipt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;0 defects found.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The signature is valid. The receipt has not been altered. The agent was authorized to run the check.&lt;/p&gt;

&lt;p&gt;The result can still be wrong.&lt;/p&gt;

&lt;p&gt;Perhaps the scanner hit a rate limit and silently converted eleven failures into eleven empty results. Perhaps a watchdog inspected 8 machines and issued a conclusion about 68. Perhaps a database health check ran &lt;code&gt;select 1&lt;/code&gt; successfully while the application was failing because a required column did not exist.&lt;/p&gt;

&lt;p&gt;In every case, the software can produce a well-formed result. It can even sign that result correctly. What it cannot prove is that it measured the claim the business thinks it measured.&lt;/p&gt;

&lt;p&gt;That distinction is becoming one of the most important problems in agent infrastructure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;authentic receipt != adequate measurement
authorized action != correct conclusion
zero findings != complete inspection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A signature answers only part of the question
&lt;/h2&gt;

&lt;p&gt;Cryptographic signatures are valuable. They can prove who signed an object and whether its contents changed after signing.&lt;/p&gt;

&lt;p&gt;They do not prove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;that the check actually ran&lt;/li&gt;
&lt;li&gt;that it reached the intended target&lt;/li&gt;
&lt;li&gt;that it measured the right population&lt;/li&gt;
&lt;li&gt;that the sample supports the claimed conclusion&lt;/li&gt;
&lt;li&gt;that exceptions were not converted into zeros&lt;/li&gt;
&lt;li&gt;that a passing control answered the business question&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the difference between &lt;strong&gt;provenance integrity&lt;/strong&gt; and &lt;strong&gt;measurement integrity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Provenance integrity asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who made this statement, and was the statement altered?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Measurement integrity asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What was actually observed, how much of the target was covered, and is the conclusion justified by that observation?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An agent work protocol needs both. Otherwise, a signature can turn uncertainty into durable false confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three failures with the same shape
&lt;/h2&gt;

&lt;p&gt;This article grew out of a thoughtful &lt;a href="https://dev.to/heinrichneb/comment/3dema"&gt;comment from Heinrich Neb&lt;/a&gt; on the first article in this series.&lt;/p&gt;

&lt;p&gt;He described three incidents from one week.&lt;/p&gt;

&lt;p&gt;First, a harvesting tool scanned 16 public repositories. Five returned hundreds of results. Eleven returned zero because the tool hit a rate limit and swallowed the exceptions. The output file was valid. The process exited successfully. A failure to observe became a factual claim that nothing existed.&lt;/p&gt;

&lt;p&gt;Second, a production watchdog sampled 8 machines from a fleet of 68, then reported its verdict as if it covered all 68. The sample may have been measured correctly. The population-level conclusion was still unsupported.&lt;/p&gt;

&lt;p&gt;Third, a database health endpoint returned success because &lt;code&gt;select 1&lt;/code&gt; worked. At the same time, application screens were failing because a required column did not exist. The check was not false. It answered the wrong question.&lt;/p&gt;

&lt;p&gt;These are different systems, but the failure is the same:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;not observed -&amp;gt; zero
partial observation -&amp;gt; full-population claim
proxy check -&amp;gt; business conclusion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem is not simply bad code. Many systems have only two result states. If the answer is not &lt;code&gt;yes&lt;/code&gt;, the implementation eventually pushes it toward &lt;code&gt;no&lt;/code&gt;. Silence becomes a value.&lt;/p&gt;

&lt;p&gt;That is dangerous when the value controls a merge, deployment, payment, acceptance decision, or compliance report.&lt;/p&gt;

&lt;h2&gt;
  
  
  UNKNOWN must be an outcome, not an omission
&lt;/h2&gt;

&lt;p&gt;There is a crucial difference between an &lt;code&gt;UNKNOWN&lt;/code&gt; receipt and no receipt.&lt;/p&gt;

&lt;p&gt;No receipt can mean many things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the check never started&lt;/li&gt;
&lt;li&gt;the process crashed&lt;/li&gt;
&lt;li&gt;the target was unreachable&lt;/li&gt;
&lt;li&gt;the verifier could not measure the claim&lt;/li&gt;
&lt;li&gt;the result was created but lost in transport&lt;/li&gt;
&lt;li&gt;the result was suppressed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those states cannot safely be interpreted by a downstream system.&lt;/p&gt;

&lt;p&gt;A signed &lt;code&gt;UNKNOWN&lt;/code&gt; is different. It is an explicit epistemic statement:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A verification attempt occurred, but the available evidence does not justify VERIFIED or REFUTED.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That statement can carry a reason code, a measurement record, a timestamp, a verifier identity, and a causal link to the work being checked. It can be audited. It can also block acceptance without pretending that counter-evidence exists.&lt;/p&gt;

&lt;p&gt;The protocol rule should be simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every completed verification attempt produces a signed verdict. No receipt means no attestable outcome exists.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What OpenWorkProof already does
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/dengyier/verifying-the-verifier-how-an-independent-audit-hardened-openworkproof-v05-5a54"&gt;OpenWorkProof v0.5&lt;/a&gt; already treats &lt;code&gt;UNKNOWN&lt;/code&gt; as a signed, first-class verification decision.&lt;/p&gt;

&lt;p&gt;Its verdict is three-valued:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VERIFIED
REFUTED
UNKNOWN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The verification logic can derive &lt;code&gt;UNKNOWN&lt;/code&gt; when evidence is incomplete or unsuitable for the requested conclusion. Current examples include population drift, unavailable population evidence, control mismatch, unavailable control evidence, and insufficient verifier independence.&lt;/p&gt;

&lt;p&gt;That is useful, but Heinrich's examples reveal a gap that should not be hidden.&lt;/p&gt;

&lt;p&gt;The current protocol can sign the statement:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The evidence available is insufficient for this claim.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does not yet provide one general measurement-status field that cleanly separates every operational cause, such as:&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;measurement_status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;measured&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;not_run&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;not_measurable&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;interrupted&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;incomplete&lt;/span&gt;

&lt;span class="na"&gt;verdict&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;VERIFIED&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;REFUTED&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;UNKNOWN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These fields should remain separate.&lt;/p&gt;

&lt;p&gt;A check may be fully measured and still return &lt;code&gt;UNKNOWN&lt;/code&gt; because the evidence is inconclusive. Another check may be incomplete because only 8 of 68 targets were observed. A third may never have run. Collapsing those cases makes diagnosis harder and creates opportunities for downstream systems to interpret absence as success.&lt;/p&gt;

&lt;p&gt;This split is a design proposal, not a claim about what the current release already implements.&lt;/p&gt;

&lt;h2&gt;
  
  
  A receipt should bind what was actually measured
&lt;/h2&gt;

&lt;p&gt;A useful verification receipt should not contain only a verdict. It should bind the basis of the verdict.&lt;/p&gt;

&lt;p&gt;At minimum, that means recording:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the declared population&lt;/li&gt;
&lt;li&gt;the observed population&lt;/li&gt;
&lt;li&gt;the sampling rule&lt;/li&gt;
&lt;li&gt;measured coverage&lt;/li&gt;
&lt;li&gt;exclusions and their reasons&lt;/li&gt;
&lt;li&gt;verifier version and code identity&lt;/li&gt;
&lt;li&gt;the control that was used&lt;/li&gt;
&lt;li&gt;the negative-control result&lt;/li&gt;
&lt;li&gt;the distinction between execution failure and epistemic uncertainty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consider the 8-of-68 example.&lt;/p&gt;

&lt;p&gt;This can be a truthful receipt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Eight targets were measured under sampling rule S. No failure was found in those eight targets.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a different claim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All 68 targets are healthy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second conclusion is valid only if the verification contract explicitly permits that inference and the sampling method satisfies its conditions. A signed result must not blur the two.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable question: can your test suite fail?
&lt;/h2&gt;

&lt;p&gt;The same issue applies to verification systems themselves.&lt;/p&gt;

&lt;p&gt;A large green test count proves that the registered tests passed in the recorded environment. It does not prove that the suite is representative. It does not prove that each guard would reject a realistic bad input. It does not prove that the benchmark supports the business claim being made.&lt;/p&gt;

&lt;p&gt;So raw test count is not enough.&lt;/p&gt;

&lt;p&gt;Verification infrastructure should also report &lt;strong&gt;falsifiability coverage&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which conclusion-bearing guards were challenged?&lt;/li&gt;
&lt;li&gt;Which known-bad inputs were used?&lt;/li&gt;
&lt;li&gt;Did each guard reject the input?&lt;/li&gt;
&lt;li&gt;Did it reject for the expected reason?&lt;/li&gt;
&lt;li&gt;Which important failure modes remain untested?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenWorkProof already uses reason-bound negative controls in parts of its verification-integrity path. A mutation does not count as a successful control merely because something failed. The observed failure must match the registered failure semantics.&lt;/p&gt;

&lt;p&gt;But this is a direction, not a victory declaration. Test count and falsifiability coverage should be reported separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a business should care
&lt;/h2&gt;

&lt;p&gt;Companies do not buy signatures because signatures are elegant.&lt;/p&gt;

&lt;p&gt;They care about avoiding expensive false green states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accepting work that was not completely checked&lt;/li&gt;
&lt;li&gt;merging code because a verifier tested the wrong scope&lt;/li&gt;
&lt;li&gt;releasing payment for an unsupported conclusion&lt;/li&gt;
&lt;li&gt;trusting a dashboard that silently converted errors into zeros&lt;/li&gt;
&lt;li&gt;discovering later that nobody can explain what was actually measured&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The commercial value of verifiable agent work is not "more cryptography." It is a lower cost of delegation without turning uncertainty into a certificate.&lt;/p&gt;

&lt;p&gt;This is also why human final authority depends on honest machine uncertainty. A person cannot make a meaningful acceptance decision if the evidence surface hides the difference between &lt;code&gt;nothing found&lt;/code&gt; and &lt;code&gt;nothing measured&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Human control is not preserved merely because a person clicks the final button. It is preserved when the system tells that person the truth about what it knows, what it does not know, and what it never observed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The protocol principle I would keep
&lt;/h2&gt;

&lt;p&gt;The first two articles in this series argued that autonomous agents need verifiable human authority and that people should retain the final say at consequential boundaries.&lt;/p&gt;

&lt;p&gt;This discussion adds a necessary condition:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The human's final say is meaningful only when uncertainty is a first-class, signed state.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;OpenWorkProof is open source, and this measurement-status split is now a concrete design question for its next evolution.&lt;/p&gt;

&lt;p&gt;If you build agent runtimes, evaluation systems, MCP servers, or automated delivery pipelines, I would value your view on two questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Should &lt;code&gt;UNKNOWN&lt;/code&gt; always be a signed outcome for every completed verification attempt?&lt;/li&gt;
&lt;li&gt;Which measurement states must be separated before a downstream system is allowed to accept, merge, deploy, or pay?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;Explore OpenWorkProof on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Series
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/dengyier/agent-autonomy-has-a-missing-layer-verifiable-human-authority-358f"&gt;Agent Autonomy Has a Missing Layer: Verifiable Human Authority&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dengyier/the-more-autonomous-ai-agents-become-the-more-humans-need-the-final-say-338p"&gt;The More Autonomous AI Agents Become, the More Humans Need the Final Say&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Signed AI Agent Receipt Can Still Be Wrong&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The More Autonomous AI Agents Become, the More Humans Need the Final Say</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Mon, 24 Aug 2026 10:27:30 +0000</pubDate>
      <link>https://dev.to/dengyier/the-more-autonomous-ai-agents-become-the-more-humans-need-the-final-say-338p</link>
      <guid>https://dev.to/dengyier/the-more-autonomous-ai-agents-become-the-more-humans-need-the-final-say-338p</guid>
      <description>&lt;p&gt;&lt;strong&gt;Human control should not mean approving every step.&lt;/strong&gt;&lt;br&gt;
It should mean that people retain the power to stop, reserve, revoke, and accept the actions that carry real consequences.&lt;/p&gt;

&lt;p&gt;An agent that waits for approval before every tool call is not very autonomous. An agent that can do anything because someone once clicked "Allow" is not responsibly autonomous either.&lt;/p&gt;

&lt;p&gt;This is the design tension. We want agents to handle more work, but we do not want capability to turn into a blank check.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/dengyier/agent-autonomy-has-a-missing-layer-verifiable-human-authority-358f"&gt;Part 1 of this series&lt;/a&gt;, I argued that agent autonomy is missing a layer of verifiable human authority. This article asks a narrower question: what does the human's final say look like when an agent is expected to operate without constant supervision?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Human roles and responsibilities in decision making and overseeing AI systems need to be clearly defined and differentiated."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://airc.nist.gov/airmf-resources/airmf/appendices/app-c-ai-risk-management-and-human-ai-interaction/" rel="noopener noreferrer"&gt;NIST AI Risk Management Framework, Appendix C&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;NIST also makes a useful distinction. Some systems may not need human oversight. Others specifically do. That sounds obvious, but many agent products still use one generic approval pattern for everything.&lt;/p&gt;


&lt;h2&gt;
  
  
  The wrong model of human control
&lt;/h2&gt;

&lt;p&gt;When teams hear "human final say," they often picture a queue of confirmation dialogs. The agent proposes an action, a person clicks a button, and the same cycle repeats until everyone is tired of paying attention.&lt;/p&gt;

&lt;p&gt;This does not produce meaningful control. It produces approval fatigue.&lt;/p&gt;

&lt;p&gt;After enough prompts, people stop evaluating the action and start clearing the queue. The human remains technically present, but the system has trained that person to behave like an automatic approval service.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Weak control&lt;/th&gt;
&lt;th&gt;Useful control&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ask before every action&lt;/td&gt;
&lt;td&gt;Reserve actions that cross a defined risk boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use "important" as an undefined prompt word&lt;/td&gt;
&lt;td&gt;Specify tools, data, limits, deadlines, and effects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Record that a button was clicked&lt;/td&gt;
&lt;td&gt;Bind the decision to an identity, task, and proposed action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Let the same system act, verify, and accept&lt;/td&gt;
&lt;td&gt;Separate execution from final acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The goal is not to maximize human involvement. The goal is to preserve human decision rights where the outcome becomes hard to reverse, externally visible, financially meaningful, or capable of harming someone else.&lt;/p&gt;


&lt;h2&gt;
  
  
  Final say is a boundary, not a meeting
&lt;/h2&gt;

&lt;p&gt;A usable authority model needs four properties.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The decision maker is identifiable&lt;/strong&gt;&lt;br&gt;
The system knows which person or organizational role may authorize this class of action.&lt;br&gt;
&lt;strong&gt;The intervention happens before execution&lt;/strong&gt;&lt;br&gt;
A reserved action pauses before the side effect, not after a retrospective alert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The scope is explicit&lt;/strong&gt;&lt;br&gt;
The decision covers a named task, tool, target, limit, and time window.&lt;br&gt;
&lt;strong&gt;The decision survives the interface&lt;/strong&gt;&lt;br&gt;
A third party can verify what was authorized without trusting the original product's dashboard.&lt;/p&gt;

&lt;p&gt;None of these properties requires a committee. A person may approve an action in seconds. The important part is that the approval is precise enough for a machine to enforce and durable enough for another party to verify later.&lt;/p&gt;

&lt;p&gt;This changes the role of the human. The person is no longer supervising the agent's every move. The person is defining the limits of autonomous work and deciding the few transitions that the system is not allowed to make alone.&lt;/p&gt;


&lt;h2&gt;
  
  
  A risk ladder for agent actions
&lt;/h2&gt;

&lt;p&gt;OpenWorkProof resolves an action into three states before execution: allowed, reserved, or denied. The names are simple because the dispatcher needs an unambiguous answer.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Allowed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The current signed authority permits autonomous execution&lt;/td&gt;
&lt;td&gt;Read an approved repository inside the active work order&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reserved&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A designated human must make a fresh decision first&lt;/td&gt;
&lt;td&gt;Apply a patch that changes the candidate work product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Denied&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The action is outside the available authority&lt;/td&gt;
&lt;td&gt;Deploy to production when the work order grants no production access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The local Human Agency example in OpenWorkProof currently demonstrates this distinction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;profile verified  : True
resolved status   : active
owp.repo_read     : delegated -&amp;gt; allowed
owp.apply_patch   : reserved -&amp;gt; AGENCY_HUMAN_DECISION_REQUIRED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reserved patch does not execute and then ask for forgiveness. The dispatcher returns &lt;code&gt;AGENCY_HUMAN_DECISION_REQUIRED&lt;/code&gt; before the handler starts.&lt;/p&gt;

&lt;p&gt;This is how an agent can remain autonomous for routine work without receiving unlimited authority. Reading approved material may continue without interruption. Changing the deliverable crosses a boundary and pauses. Production deployment remains unavailable unless a new authority profile explicitly permits it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risk tiering is contextual.&lt;/strong&gt; A repository read may be harmless in one work order and sensitive in another. The protocol records the decision boundary; it does not pretend that one global list can classify every organization.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a prompt cannot carry final authority
&lt;/h2&gt;

&lt;p&gt;A prompt can tell an agent, "Ask me before doing anything important." The sentence is understandable to a person. It is weak as an authorization mechanism.&lt;/p&gt;

&lt;p&gt;The model must decide what "important" means. A framework update can change how the instruction is interpreted. Another agent may never see the same conversation. The approval may remain inside a vendor log that the customer, verifier, or downstream partner cannot independently inspect.&lt;/p&gt;

&lt;p&gt;A signed authority object behaves differently. It can bind the human decision to the work order, define the affected tools and targets, expire at a known time, and produce the same authorization result during offline verification.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What the WorkOrder permits
∩ What the CapabilityGrant delegates
∩ What the active HumanAgencyProfile allows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenWorkProof calls the third object a Human Agency Profile. It describes which part of the available capability a person is willing to let the agent use autonomously for this work.&lt;/p&gt;

&lt;p&gt;Only the designated Acceptor can sign a profile transition. An appeal is a signed request for review. It does not restore permission, expand the scope, or turn a denied action into an allowed one by itself.&lt;/p&gt;

&lt;p&gt;That last rule matters. If an agent could increase its own authority by filing an appeal, the safeguard would be decorative.&lt;/p&gt;




&lt;h2&gt;
  
  
  Keep the human out of the low-risk loop
&lt;/h2&gt;

&lt;p&gt;Good oversight is selective. The human should see decisions that require judgment, not a transcript of everything the agent already did correctly.&lt;/p&gt;

&lt;p&gt;A useful reserved-action request should answer concrete questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which work order is active?&lt;/li&gt;
&lt;li&gt;What exact action is waiting?&lt;/li&gt;
&lt;li&gt;Which resource, tool, or external party will be affected?&lt;/li&gt;
&lt;li&gt;What evidence and limits are already attached?&lt;/li&gt;
&lt;li&gt;What happens if the human does nothing?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final question is easy to miss. A reserved action needs a safe timeout. Silence should not become implicit permission.&lt;/p&gt;

&lt;p&gt;The system should also make denial cheap. If approval takes one click but rejection requires a long explanation, the interface is pushing the human toward the outcome the agent prefers. A signed denial can be brief. The record only needs to make the authority decision clear.&lt;/p&gt;

&lt;p&gt;NIST's AI RMF Core calls for documented roles, responsibilities, and lines of communication. For agent execution, those organizational rules need a machine-readable form. Otherwise the written policy and the runtime can drift apart.&lt;/p&gt;




&lt;h2&gt;
  
  
  What businesses gain from selective authority
&lt;/h2&gt;

&lt;p&gt;An enterprise does not want to choose between full manual review and unlimited autonomy. Both are expensive. The first consumes staff time. The second creates a risk that can surface after the action is irreversible.&lt;/p&gt;

&lt;p&gt;Selective authority lets a team expand the autonomous surface while keeping a smaller set of consequential transitions under human control.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Business requirement&lt;/th&gt;
&lt;th&gt;Protocol behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Routine work should stay fast&lt;/td&gt;
&lt;td&gt;Allowed actions execute without repeated approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-impact work needs accountable judgment&lt;/td&gt;
&lt;td&gt;Reserved actions require a designated human signature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agents must not negotiate their own permissions&lt;/td&gt;
&lt;td&gt;Denied actions remain denied until an authorized profile changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery disputes need independent evidence&lt;/td&gt;
&lt;td&gt;Authority and execution records can be verified offline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This does not prove that an agent's output is correct. It proves a narrower set of facts: which authority existed, which action was proposed, whether the runtime allowed it, and who made the decision at the reserved boundary.&lt;/p&gt;

&lt;p&gt;Verification and acceptance remain separate. A Verifier may confirm that the evidence supports the result. The Acceptor still decides whether the work meets the agreed delivery standard.&lt;/p&gt;




&lt;h2&gt;
  
  
  What exists in OpenWorkProof today
&lt;/h2&gt;

&lt;p&gt;OpenWorkProof is open source under Apache-2.0. The repository's 1.3.0 local candidate includes the Human Agency Profile, Acceptor-signed transitions, pre-execution resolution, signed appeals, and offline verification.&lt;/p&gt;

&lt;p&gt;The recorded repository snapshot reports 4,265 required-live tests and 183 candidate tests with zero failures or skips. These are local engineering results for that code and environment. They do not prove customer adoption, paid use, production reliability in another organization, legal compliance, or external acceptance.&lt;/p&gt;

&lt;p&gt;The publicly released package and MCP Registry version remain 1.2.0. The 1.3.0 candidate has not been publicly released at the time of writing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence boundary:&lt;/strong&gt; the implementation and local verification exist. Commercial adoption and production deployment require separate evidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Autonomy needs a stopping rule
&lt;/h2&gt;

&lt;p&gt;Agent autonomy should remove unnecessary supervision. It should not remove the human right to decide what the system may do on that person's or organization's behalf.&lt;/p&gt;

&lt;p&gt;The practical design is not "human in every loop." It is a defined stopping rule: the agent proceeds within signed limits, pauses at reserved boundaries, and cannot cross a denied boundary by persuasion or convenience.&lt;/p&gt;

&lt;p&gt;That gives the agent room to work. It also gives the human a final say that the runtime can enforce and an independent party can verify.&lt;/p&gt;

&lt;p&gt;If you are building an agent runtime, which actions would you allow, reserve, or deny by default? I am especially interested in where developers place the boundary for code changes, external communications, production access, and financial actions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;Explore OpenWorkProof on GitHub&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources and further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://airc.nist.gov/airmf-resources/airmf/appendices/app-c-ai-risk-management-and-human-ai-interaction/" rel="noopener noreferrer"&gt;NIST AI RMF Appendix C: AI Risk Management and Human-AI Interaction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://airc.nist.gov/airmf-resources/airmf/5-sec-core/" rel="noopener noreferrer"&gt;NIST AI RMF Core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof/blob/main/docs/protocol/human-agency-profile-v0.1.md" rel="noopener noreferrer"&gt;OpenWorkProof Human Agency Profile v0.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;OpenWorkProof repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Agent Autonomy Has a Missing Layer: Verifiable Human Authority</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Mon, 24 Aug 2026 09:55:32 +0000</pubDate>
      <link>https://dev.to/dengyier/agent-autonomy-has-a-missing-layer-verifiable-human-authority-358f</link>
      <guid>https://dev.to/dengyier/agent-autonomy-has-a-missing-layer-verifiable-human-authority-358f</guid>
      <description>&lt;p&gt;&lt;strong&gt;Autonomy is not just a capability question. It is a delegation question.&lt;/strong&gt;&lt;br&gt;
If an AI agent can act on our behalf, its authority should be explicit, bounded, signed, and independently verifiable.&lt;/p&gt;

&lt;p&gt;AI agents are moving from answering questions to changing the world around them. They can edit files, call APIs, operate business systems, deploy code, and coordinate with other agents. That is useful. It also changes the trust problem.&lt;/p&gt;

&lt;p&gt;A chatbot can give a bad answer and a person can reject it. An agent can take an action before anyone notices that the instruction, permission, or acceptance standard was unclear.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Technology does not exist in a vacuum."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hai.stanford.edu/news/fei-fei-li-wins-queen-elizabeth-prize-for-engineering" rel="noopener noreferrer"&gt;Fei-Fei Li, quoted by Stanford Human-Centered AI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sentence is especially important for agentic systems. Agent autonomy always exists inside a human, organizational, and economic context. Someone defines the task. Someone grants access. Someone bears the cost of failure. Someone decides whether the result counts as delivered.&lt;/p&gt;

&lt;p&gt;My argument is simple: &lt;strong&gt;human authority should be a protocol property, not a checkbox in a product interface.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Autonomy changes the business question
&lt;/h2&gt;

&lt;p&gt;Most discussion about agent autonomy starts with capability: Can the model plan? Can it use tools? Can it recover from errors? Can multiple agents collaborate?&lt;/p&gt;

&lt;p&gt;Those are engineering questions. Once the agent touches real work, businesses ask a different set of questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before execution&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who authorized this action?&lt;/li&gt;
&lt;li&gt;What exact task and scope were approved?&lt;/li&gt;
&lt;li&gt;Which tools, data, budget, and time window were permitted?
&lt;strong&gt;After execution&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;What actually happened?&lt;/li&gt;
&lt;li&gt;Did the evidence support the claimed result?&lt;/li&gt;
&lt;li&gt;Who verified it, and who accepted delivery?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions are not solved by making the model smarter. They require a durable relationship between human intent, machine permission, observed execution, verification, and acceptance.&lt;/p&gt;

&lt;p&gt;Without that relationship, autonomy becomes ambiguous delegation. The agent may be capable of acting, but nobody can later prove whether it was entitled to act in that way.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why "human in the loop" is not enough
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol is an important open standard for connecting AI applications to external systems. Its tool specification says that there should always be a human in the loop who can deny tool invocations. The same specification also makes clear that the protocol does not mandate one specific user interaction model.&lt;/p&gt;

&lt;p&gt;That is a reasonable boundary for a connectivity protocol. MCP helps an agent discover and invoke tools. It should not be blamed for every governance problem above it.&lt;/p&gt;

&lt;p&gt;But a confirmation dialog is not the same thing as verifiable human authority.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A UI approval can show&lt;/th&gt;
&lt;th&gt;A verifiable authority layer must prove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A user clicked "Allow"&lt;/td&gt;
&lt;td&gt;Which identity authorized which action under which work order&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A tool call was displayed&lt;/td&gt;
&lt;td&gt;Whether the call stayed inside the signed scope, limits, and deadline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A result appeared in the same product&lt;/td&gt;
&lt;td&gt;Whether a third party can verify the evidence without trusting that product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A person reviewed something&lt;/td&gt;
&lt;td&gt;Whether verification and business acceptance were performed by distinct authorities&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A prompt such as "ask me before doing anything important" is useful behavioral guidance. It is not a portable authorization record. It can be interpreted differently by different models, lost across systems, or hidden inside a vendor's private event log.&lt;/p&gt;

&lt;p&gt;The stronger the agent becomes, the less we should rely on informal intent as the only boundary.&lt;/p&gt;


&lt;h2&gt;
  
  
  What verifiable human authority looks like
&lt;/h2&gt;

&lt;p&gt;OpenWorkProof is exploring this missing layer as an open protocol for agent work contracts and verifiable execution. Its Human Agency Profile treats human choice as a machine-verifiable authorization boundary.&lt;/p&gt;

&lt;p&gt;The effective authority of an agent is not determined by one broad permission. It is the intersection of three signed objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WorkOrder
∩ CapabilityGrant
∩ HumanAgencyProfile
= allowed actions at this moment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WorkOrder&lt;/strong&gt; defines the task, acceptance criteria, and delivery context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CapabilityGrant&lt;/strong&gt; defines which capabilities the system may grant to the agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HumanAgencyProfile&lt;/strong&gt; records the human authority that remains active for this specific work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every proposed action can then resolve to one of three outcomes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Allowed&lt;/strong&gt;&lt;br&gt;
The action is inside the current signed authority and may proceed.&lt;br&gt;
&lt;strong&gt;Reserved&lt;/strong&gt;&lt;br&gt;
The action requires a fresh human decision before execution.&lt;br&gt;
&lt;strong&gt;Denied&lt;/strong&gt;&lt;br&gt;
The action is outside the authority boundary and must not execute.&lt;/p&gt;

&lt;p&gt;A reserved action returns &lt;code&gt;AGENCY_HUMAN_DECISION_REQUIRED&lt;/code&gt; before execution. This is different from detecting a policy violation after the damage is done.&lt;/p&gt;

&lt;p&gt;The profile is bound to a work order, signed by an Acceptor, and independently verifiable. An appeal is also explicit: it is a signed request for review, not a hidden mechanism that silently expands the agent's rights. Only an authorized, signed transition can supersede or revoke the active profile.&lt;/p&gt;

&lt;p&gt;This design does not make the human infallible. It makes the delegation legible.&lt;/p&gt;


&lt;h2&gt;
  
  
  Verification is not acceptance
&lt;/h2&gt;

&lt;p&gt;A cryptographic signature can prove who signed an object and whether it was altered. It cannot prove that the task was worth doing, that the test checked the right thing, or that the customer accepts the result.&lt;/p&gt;

&lt;p&gt;That distinction matters enough to make it explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VERIFIED != ACCEPTED != PAID
VERIFIED != SETTLED
VERIFIED != LEGAL AUDIT
VERIFIED != ADOPTION
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In OpenWorkProof, a Verifier evaluates evidence. An Acceptor makes the independent delivery decision. The verifier can conclude that the available evidence supports a claim, while the acceptor can still reject the delivery because the work does not meet the agreed business standard.&lt;/p&gt;

&lt;p&gt;This separation also exposes a harder problem: what if the receipt is authentic, but the judgment was based on the wrong test or the wrong population? Verification Integrity addresses that failure mode by preserving the evidence population and the control logic used by the verifier. When evidence is incomplete or the control does not match, the protocol can return &lt;strong&gt;UNKNOWN&lt;/strong&gt; rather than manufacture confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A signed receipt proves integrity and origin. It does not automatically prove correctness, customer acceptance, legal compliance, or payment.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a business would care
&lt;/h2&gt;

&lt;p&gt;Businesses are unlikely to buy cryptography for its own sake. They pay when a system lowers the cost and risk of delegation.&lt;/p&gt;

&lt;p&gt;Today, important agent work is often trapped between two weak choices. A company can keep a human manually checking every step, which removes much of the promised efficiency. Or it can trust the agent platform's own dashboard as the final account of what happened.&lt;/p&gt;

&lt;p&gt;A portable work contract and evidence layer creates a third option. The company can delegate defined work while preserving independent proof of authority, execution, verification, and acceptance.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Business friction&lt;/th&gt;
&lt;th&gt;Protocol-level response&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fear of giving an agent excessive permission&lt;/td&gt;
&lt;td&gt;Task-bound, time-bound, capability-bound authority&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual review of every action&lt;/td&gt;
&lt;td&gt;Machine-verifiable receipts and reserved human decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disputes over whether work was completed&lt;/td&gt;
&lt;td&gt;Separate verification and acceptance records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor dashboard as the only source of truth&lt;/td&gt;
&lt;td&gt;Offline verification using portable signed bundles&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The commercial promise is not "trust every agent." It is narrower and more useful: &lt;strong&gt;delegate important work without granting unlimited authority and without making the agent provider the sole judge of delivery.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What exists today
&lt;/h2&gt;

&lt;p&gt;OpenWorkProof is open source under Apache-2.0. The repository currently contains a local 1.3.0 candidate with the Human Agency Profile, six-role key separation, signed protocol objects, offline verification, and distinct verification and acceptance decisions.&lt;/p&gt;

&lt;p&gt;The local candidate has passed 4,265 required-live tests and 183 candidate tests with zero failures or skips in the recorded repository snapshot. These numbers are engineering evidence for that code and environment. They are not evidence of customer adoption, paid deployment, legal effect, or production reliability in another organization.&lt;/p&gt;

&lt;p&gt;The currently published public package and MCP Registry version remain 1.2.0. The 1.3.0 candidate has not been released at the time of writing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence boundary:&lt;/strong&gt; implementation and local verification exist. Customer adoption, payment, production deployment, and upstream standard adoption require separate evidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  The design question for the agent ecosystem
&lt;/h2&gt;

&lt;p&gt;Connectivity protocols make agents useful. Authority and acceptance protocols can make their work governable across organizational boundaries.&lt;/p&gt;

&lt;p&gt;The open design question is where this layer should live. Should signed authority remain inside the host application? Should it travel with a tool request? Should an agent carry a portable human authority profile? Should execution receipts be understandable across MCP hosts, agent frameworks, and independent verifiers?&lt;/p&gt;

&lt;p&gt;I do not think every tool call needs bureaucracy. Low-risk actions should remain cheap. But when an agent changes code, moves money, handles sensitive data, or delivers work across organizations, "the model decided" is not an adequate chain of authority.&lt;/p&gt;

&lt;p&gt;Human agency should survive the transition from conversation to execution.&lt;/p&gt;

&lt;p&gt;If you are building MCP servers, agent runtimes, approval systems, or multi-agent workflows, I would like to hear where you think verifiable human authority belongs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;Explore OpenWorkProof on GitHub&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources and further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hai.stanford.edu/news/fei-fei-li-wins-queen-elizabeth-prize-for-engineering" rel="noopener noreferrer"&gt;Stanford HAI: Fei-Fei Li Wins Queen Elizabeth Prize for Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro" rel="noopener noreferrer"&gt;Model Context Protocol: Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/specification/2025-06-18/server/tools" rel="noopener noreferrer"&gt;Model Context Protocol: Tools specification, 2025-06-18&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;OpenWorkProof repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Two Verifiers, One Verdict: Closing the 'Self-Reported Exit Code' Hole</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Thu, 20 Aug 2026 02:11:03 +0000</pubDate>
      <link>https://dev.to/dengyier/two-verifiers-one-verdict-closing-the-self-reported-exit-code-hole-1cmd</link>
      <guid>https://dev.to/dengyier/two-verifiers-one-verdict-closing-the-self-reported-exit-code-hole-1cmd</guid>
      <description>&lt;h1&gt;
  
  
  Two Verifiers, One Verdict: Closing the "Self-Reported Exit Code" Hole
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Repo: &lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;github.com/dengyier/OpenWorkProof&lt;/a&gt;&lt;br&gt;
This update: &lt;code&gt;04e62d5..ec0e72e&lt;/code&gt; (29 commits across three phases; candidate inventory &lt;code&gt;837dbb10a3fdc4…&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The problem: "two sub-agents reviewed it" is not independence
&lt;/h2&gt;

&lt;p&gt;In public code reviews of agent tooling, two objections keep coming back:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Two sub-agents reviewing the same work is not independence."&lt;/strong&gt; If both reviewers read the same log written by the same actor, they are two signatures on one story — not two executions of that story.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"The exit code is self-reported."&lt;/strong&gt; An agent says &lt;code&gt;tests all green&lt;/code&gt;. The report says so. The log says so. But nothing binds that claim to what actually ran. Nothing stops the agent from editing the test instead of the bug and then reporting green with a straight face.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;OpenWorkProof v0.5 now answers both with the same mechanism: &lt;strong&gt;two independent verifiers must each execute the work and each sign their own result — and their conclusion-bearing fields must agree field by field, or no decision is formed at all.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What "dual verifier" means here
&lt;/h2&gt;

&lt;p&gt;A high-risk decision (e.g. the kind you'd pay for) requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Two distinct verifier bindings&lt;/strong&gt; — different keys, different subjects, different controllers, different execution contexts (all enforced at profile construction).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each verifier covers every arm&lt;/strong&gt; — positive arm, negative controls, population observations, scope evidence. One verifier doing the positive arm and another doing the negative arm is rejected ("split coverage").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every conclusion-bearing field must converge&lt;/strong&gt;: &lt;code&gt;expectation_status&lt;/code&gt;, &lt;code&gt;execution_status&lt;/code&gt;, &lt;code&gt;mutation_status&lt;/code&gt;, &lt;code&gt;reason_codes&lt;/code&gt;, &lt;code&gt;action_receipt_ids&lt;/code&gt;, observed member count / population digest / required target ids, &lt;code&gt;scope_expectation_status&lt;/code&gt;, population observations, control observation, and the evidence snapshot digest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The decision references the full dual set.&lt;/strong&gt; Commit, chain replay, and the offline delivery package all recompose from the decision's own references — so an appended later run can never break an already-committed decision, and a verifier can never cite its own older passing run to hide a newer failing one (the commit's stale gate requires the referenced set to equal exactly what prepare would load).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the two verifiers disagree on any conclusion field, the decision &lt;strong&gt;cannot be formed&lt;/strong&gt; — this is a documented temporary compromise (the frozen v0.5 decision model holds one reference per arm; a formal on-ledger divergence state is the v0.6 path).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this closes the "self-reported exit code" hole
&lt;/h2&gt;

&lt;p&gt;The naive design compares the &lt;em&gt;evidence snapshot digests&lt;/em&gt; the two verifiers cite. But evidence refs are self-signed metadata — a lying verifier can copy the honest one's refs verbatim and flip &lt;code&gt;expectation_status&lt;/code&gt;. That was the hole. The fix is to compare &lt;strong&gt;every field that carries a conclusion&lt;/strong&gt;, not just the pointer to evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A verifier that fabricates an exit code now produces different conclusion fields from the honest verifier → divergence → no decision.&lt;/li&gt;
&lt;li&gt;A verifier that cites its own old run to suppress a newer failing one is stopped at commit: the referenced set must equal the set prepare would load (newest per (arm, verifier)).&lt;/li&gt;
&lt;li&gt;A verifier that signs but never produces results cannot turn a single-verifier UNKNOWN into a VERIFIED.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these was demonstrated by an adversarial probe first (RED), then fixed minimally (GREEN), then re-attacked by an independent reviewer for seven rounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 7-round audit
&lt;/h2&gt;

&lt;p&gt;Both a specification reviewer and a quality/security reviewer (separate agents) attacked the implementation across seven rounds each. Every round was either a probe that reproduced an attack, or a confirmation that a previous attack now fails. Representative probes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Probe&lt;/th&gt;
&lt;th&gt;Attack&lt;/th&gt;
&lt;th&gt;Result after fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Copy refs + flip &lt;code&gt;expectation_status&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Lying verifier fabricates exit code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VerificationInputError: high-risk verifiers diverged&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cite old PASS + newest other-verifier&lt;/td&gt;
&lt;td&gt;Suppress own newer FAILING run&lt;/td&gt;
&lt;td&gt;Commit blocked: &lt;code&gt;references arm results that are not the current set&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Second verifier co-signs only&lt;/td&gt;
&lt;td&gt;Single verifier + co-sign → VERIFIED&lt;/td&gt;
&lt;td&gt;Commit rejected (recompose → UNKNOWN ≠ signature)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Append a newer converged round&lt;/td&gt;
&lt;td&gt;Break replay of committed decision&lt;/td&gt;
&lt;td&gt;Old decision replays from its own references; new decision supersedes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same key twice&lt;/td&gt;
&lt;td&gt;Impersonate dual verifiers&lt;/td&gt;
&lt;td&gt;Shape gate rejects duplicate (arm, verifier) rows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Final state: &lt;strong&gt;required-live full gate 3543 passed / 0 failed / 0 skipped&lt;/strong&gt;, candidate inventory rebuilt and bound, v0.1–v0.5 frozen schemas untouched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest boundaries (kept)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This proves the &lt;em&gt;protocol requires&lt;/em&gt; dual-verifier convergence. It does not prove any actual delivery went through dual verification, that verifiers are honest, or that no collusion happened (the trust model assumes at least one honest verifier).&lt;/li&gt;
&lt;li&gt;Divergence currently means "no decision" (combination failure), not an on-ledger UNKNOWN — the frozen decision model can't hold two references per arm. This is a documented temporary compromise; a formal &lt;code&gt;DUAL_VERIFIER_DIVERGENCE&lt;/code&gt; state is the v0.6 path.&lt;/li&gt;
&lt;li&gt;No customer adoption, no paid work, no upstream adoption (all &lt;code&gt;not_evidenced&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it (5 minutes, offline)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/dengyier/OpenWorkProof
&lt;span class="nb"&gt;cd &lt;/span&gt;OpenWorkProof
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
python tests/evidence-bundles/verify_evidence_bundle.py &lt;span class="se"&gt;\&lt;/span&gt;
  tests/evidence-bundles/rich-4196-integrity-v05-delivery-package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then break it: change one byte anywhere in the evidence chain and watch the verdict stop being VERIFIED.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;OpenWorkProof is a Python protocol layer that makes agent work authorizable, verifiable, and offline-replayable. Apache-2.0. &lt;a href="https://github.com/sponsors/dengyier" rel="noopener noreferrer"&gt;Sponsors welcome&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Want a verification report for one of your agent deliveries? &lt;a href="https://dengyier.github.io/OpenWorkProof/landing/" rel="noopener noreferrer"&gt;Free first sample&lt;/a&gt; — you give a delivery, we produce a report you can replay offline in 5 minutes.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>python</category>
      <category>opensource</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>I Built a Self-Evolving Knowledge Base — Here's the Architecture</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Tue, 18 Aug 2026 13:45:40 +0000</pubDate>
      <link>https://dev.to/dengyier/i-built-a-self-evolving-knowledge-base-heres-the-architecture-4ld9</link>
      <guid>https://dev.to/dengyier/i-built-a-self-evolving-knowledge-base-heres-the-architecture-4ld9</guid>
      <description>&lt;p&gt;I've spent years accumulating notes across a dozen Obsidian vaults — projects, clients, research, half-finished ideas. Like most people, my "second brain" slowly became a second graveyard: searchable, yes, but it never &lt;em&gt;did&lt;/em&gt; anything on its own. It certainly never got smarter.&lt;/p&gt;

&lt;p&gt;A few weeks ago I decided to fix that. I wanted a knowledge base that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;remembers across sessions&lt;/strong&gt; (not just a fresh AI agent re-reading everything each time),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pulls in the outside world&lt;/strong&gt; (news, papers, releases — with real sources, not hallucinated summaries),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;distills&lt;/strong&gt; that into a stable, personalized knowledge core,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;runs a daily production loop&lt;/strong&gt; that's recoverable if it crashes halfway,&lt;/li&gt;
&lt;li&gt;and — the hard part — &lt;strong&gt;actually evolves&lt;/strong&gt; when I give it feedback.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This post is the architecture that came out of it. It's built on plain Markdown (Obsidian) plus a handful of open-source tools, and the honest conclusion at the end is probably the most useful part.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea: Markdown is the truth source, everything else is derived
&lt;/h2&gt;

&lt;p&gt;The first rule, and the one that saved me repeatedly: &lt;strong&gt;the Markdown files are the only source of truth.&lt;/strong&gt; The database, the index, the embeddings, the summaries — all of it can be deleted and rebuilt. If every service dies tomorrow, the vault still opens and reads fine.&lt;/p&gt;

&lt;p&gt;That single decision made every later step safe. You can rebuild the brain from scratch, you can move directories, you can break a tool — the knowledge survives.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five layers
&lt;/h2&gt;

&lt;p&gt;I reorganized everything into five top-level layers, each with one job:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;00_资源库&lt;/code&gt; (Resources)&lt;/td&gt;
&lt;td&gt;Raw evidence&lt;/td&gt;
&lt;td&gt;Read-only. Never edited.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;01_主题Wiki&lt;/code&gt; (Topic Wiki)&lt;/td&gt;
&lt;td&gt;Stable knowledge, methods, cases&lt;/td&gt;
&lt;td&gt;Distilled, cited, confidence-tagged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;02_项目库&lt;/code&gt; (Projects)&lt;/td&gt;
&lt;td&gt;Active projects &amp;amp; decisions&lt;/td&gt;
&lt;td&gt;Status always explicit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;03_输出库&lt;/code&gt; (Outputs)&lt;/td&gt;
&lt;td&gt;Real, usable deliverables&lt;/td&gt;
&lt;td&gt;A draft is &lt;em&gt;not&lt;/em&gt; an output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;04_系统维护&lt;/code&gt; (System)&lt;/td&gt;
&lt;td&gt;Rules, profiles, state, feedback, logs&lt;/td&gt;
&lt;td&gt;The nervous system&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The root directory keeps only three things: &lt;code&gt;AGENTS.md&lt;/code&gt;, the home page, and an inbox. Everything else has a home.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 1: Long-term memory (cross-session retrieval)
&lt;/h2&gt;

&lt;p&gt;The goal: a brand-new AI session should be able to answer a question by &lt;strong&gt;querying memory first&lt;/strong&gt;, then verifying against the original file — not by re-reading 700 files.&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;&lt;a href="https://github.com/garrytan/gbrain" rel="noopener noreferrer"&gt;GBrain&lt;/a&gt;&lt;/strong&gt; — Garry Tan's open-source agent brain. It runs on &lt;strong&gt;PGLite&lt;/strong&gt; (Postgres-in-WASM), so there's no server and no Docker. The whole thing is a single local file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# install (Bun is required)&lt;/span&gt;
bun &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; github:garrytan/gbrain
gbrain init                 &lt;span class="c"&gt;# PGLite, zero config&lt;/span&gt;
gbrain import ~/vault/ &lt;span class="nt"&gt;--no-embed&lt;/span&gt;
gbrain search &lt;span class="s2"&gt;"who pays for this and how fast"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The import was honest about what it did and didn't index: it skipped dot-directories (nested &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;.venv&lt;/code&gt;) and README/index files, and I verified the exact count reconciliation rather than trusting it. Idempotency was tested by re-running the import — 0 new pages, 0 errors.&lt;/p&gt;

&lt;p&gt;Key insight: I run it &lt;strong&gt;keyless&lt;/strong&gt;. Keyword search + agent-written memory costs $0 and sends &lt;strong&gt;nothing&lt;/strong&gt; to a third party. Semantic search (embeddings) is a paid upgrade you can add later, but the core loop works without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 2: The outside world (a personal knowledge radar)
&lt;/h2&gt;

&lt;p&gt;A knowledge base that never gets new input rots. I added &lt;strong&gt;&lt;a href="https://github.com/Thysrael/Horizon" rel="noopener noreferrer"&gt;Horizon&lt;/a&gt;&lt;/strong&gt; — an AI-powered news radar that fetches RSS/Hacker News/GitHub, deduplicates, scores with an LLM, and generates bilingual daily briefings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Python + uv&lt;/span&gt;
git clone https://github.com/Thysrael/Horizon.git
uv &lt;span class="nb"&gt;sync
&lt;/span&gt;uv run horizon &lt;span class="nt"&gt;--hours&lt;/span&gt; 24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I started with six sources (official RSS + one high-signal personal blog), and configured it to output to the Resources layer with per-item metadata: unique ID, title, author, publish time, source URL, source type, fetch time — with the &lt;strong&gt;AI summary stored separately from the original&lt;/strong&gt;, never mixed.&lt;/p&gt;

&lt;p&gt;Two honesty tests mattered more than the happy path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A failing source must report "fetch failed", not "nothing new".&lt;/strong&gt; One of my feeds returned HTTP 403 — the system logged it as a failure, I swapped it out. Silence would have been a lie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An AI-provider failure must not lose the raw material.&lt;/strong&gt; With no API key set, it fetched everything first and &lt;em&gt;then&lt;/em&gt; failed loudly at the scoring step. Raw data was preserved either way.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The distillation: from notes to knowledge cards
&lt;/h2&gt;

&lt;p&gt;This is where most systems stop — they &lt;em&gt;store&lt;/em&gt;, but they don't &lt;em&gt;think&lt;/em&gt;. I built templates for eight card types (resource / knowledge / project / decision / output / feedback / evolution-proposal / case-closure), each with mandatory fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;created&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;updated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;confidence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sensitivity&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And every card's body separates &lt;strong&gt;facts&lt;/strong&gt; from &lt;strong&gt;judgments&lt;/strong&gt; from &lt;strong&gt;opportunities&lt;/strong&gt; from &lt;strong&gt;risks&lt;/strong&gt; — with a &lt;code&gt;source&lt;/code&gt; link back to the original note, a confidence level, and an explicit invalidation condition ("what would make this wrong?").&lt;/p&gt;

&lt;p&gt;Then I distilled a core sample of my vault into real cards. The discipline that made it work: &lt;strong&gt;nothing without a source gets promoted to fact — it gets demoted to "hypothesis".&lt;/strong&gt; Contradictions are stored side by side, not merged. The original files are never moved or overwritten.&lt;/p&gt;

&lt;h2&gt;
  
  
  The personalized layer: a career pack built from &lt;em&gt;your&lt;/em&gt; evidence, not stereotypes
&lt;/h2&gt;

&lt;p&gt;Instead of assuming what "a consultant" or "a creator" should do, the system generates a &lt;strong&gt;career pack&lt;/strong&gt; from your own history: your stated role, your real deliverables, your &lt;em&gt;rejected&lt;/em&gt; work, your explicit preferences.&lt;/p&gt;

&lt;p&gt;Each rule in the pack carries its evidence and an invalidation condition. For example, one of my confirmed rules:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"First ask: who pays, what do they buy, how fast do they pay, what does delivery cost — &lt;em&gt;before&lt;/em&gt; discussing market size or vision."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not a generic platitude — it's extracted from my own project records where I repeatedly watched "local artifacts complete" vs "customer accepted and paid" be two entirely different gates.&lt;/p&gt;

&lt;p&gt;The important safeguard: &lt;strong&gt;without real historical material, the pack stays a &lt;em&gt;candidate&lt;/em&gt;, never &lt;code&gt;active&lt;/code&gt;.&lt;/strong&gt; No invented persona.&lt;/p&gt;

&lt;h2&gt;
  
  
  The production loop + a recoverable state machine
&lt;/h2&gt;

&lt;p&gt;The daily loop is: precheck → ingest → distill → link → route → produce → feedback → close. Every round must end in exactly one of three closures: &lt;strong&gt;a real output, stable knowledge, or an explicit drop.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I then wrapped it in a state machine that makes it crash-safe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;single-instance lock&lt;/strong&gt; (two agents can't run the same round),&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;run_id&lt;/code&gt;, target date, and &lt;strong&gt;input-list hash&lt;/strong&gt; written at start,&lt;/li&gt;
&lt;li&gt;every phase &lt;strong&gt;idempotent&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resume from a recovery point&lt;/strong&gt; after interruption (no duplicate artifacts),&lt;/li&gt;
&lt;li&gt;"missed a day" is recorded as &lt;em&gt;pending catch-up&lt;/em&gt;, not &lt;em&gt;system failure&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;skip if already closed within 24h.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I ran fault injection: a source failing, the brain failing, a mid-run kill, two simultaneous instances, an interruption between state-write and output-write, and a missed schedule. All six recovered correctly. That's the difference between "automation that runs when nothing goes wrong" and "automation you can actually trust."&lt;/p&gt;

&lt;h2&gt;
  
  
  Quality gates that fail loudly
&lt;/h2&gt;

&lt;p&gt;Finally, a set of gates that run against the vault and fail loudly on violations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;resource layer never overwritten,&lt;/li&gt;
&lt;li&gt;secret scan (no API keys in the repo),&lt;/li&gt;
&lt;li&gt;every card has a source + valid dates,&lt;/li&gt;
&lt;li&gt;facts separated from judgments,&lt;/li&gt;
&lt;li&gt;no duplicate outputs,&lt;/li&gt;
&lt;li&gt;exactly one closure per round,&lt;/li&gt;
&lt;li&gt;brain index consistency,&lt;/li&gt;
&lt;li&gt;a draft must never be marked "published".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tested these against both clean samples (8/8 pass) and deliberately broken samples (missing source, missing sections, a draft masquerading as delivered) — the gates caught all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;Here's the thing nobody tells you: &lt;strong&gt;you cannot automate self-evolution into existence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The system's evolution loop — feedback → proposal → approval → rule upgrade → measurable behavior change — only activates on &lt;strong&gt;real feedback&lt;/strong&gt;. A single opinion doesn't change global rules; a repeated signal or real outcome data does. I built the entire mechanism, but it sits idle until I actually &lt;em&gt;use&lt;/em&gt; the outputs and say "this worked / this didn't."&lt;/p&gt;

&lt;p&gt;The tutorial I followed was explicit about this, and it's the most valuable lesson of the whole build:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Without 30 days of real running, without real feedback on outputs, without an activated personal pack, you should describe the system as "same-tier architecture and loop, but &lt;em&gt;your own&lt;/em&gt; instance" — not a finished product.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's exactly where mine is: the architecture, the loop, and the gates are all built and tested. The &lt;em&gt;evolving&lt;/em&gt; part starts the day I start giving it honest feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Make Markdown the truth source&lt;/strong&gt; — everything else becomes safely disposable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate memory, ingestion, distillation, and production&lt;/strong&gt; into layers with one job each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the failure paths, not just the happy path&lt;/strong&gt; — a tool that fakes "nothing new" is worse than one that crashes loudly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distill with sources and confidence, never with vibes&lt;/strong&gt; — and demote unsourced claims to hypotheses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-evolution is a feedback problem, not an engineering problem.&lt;/strong&gt; You can build the loop, but only you can feed it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The stack is all open source: &lt;a href="https://obsidian.md" rel="noopener noreferrer"&gt;Obsidian&lt;/a&gt;, &lt;a href="https://github.com/garrytan/gbrain" rel="noopener noreferrer"&gt;GBrain&lt;/a&gt;, &lt;a href="https://github.com/Thysrael/Horizon" rel="noopener noreferrer"&gt;Horizon&lt;/a&gt;, PGLite, and a couple of small Python scripts for the state machine and quality gates. None of the interesting parts are proprietary — the interesting part is the discipline.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's your knowledge base doing for you that you're not doing for it?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>obsidian</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Asked 'Do You Trust an Agent That Says the Tests Passed?' — 68 Comments Later, Here's What I Learned</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Mon, 17 Aug 2026 09:26:47 +0000</pubDate>
      <link>https://dev.to/dengyier/i-asked-do-you-trust-an-agent-that-says-the-tests-passed-68-comments-later-heres-what-i-40an</link>
      <guid>https://dev.to/dengyier/i-asked-do-you-trust-an-agent-that-says-the-tests-passed-68-comments-later-heres-what-i-40an</guid>
      <description>&lt;h1&gt;
  
  
  I Asked "Do You Trust an Agent That Says the Tests Passed?" — 68 Comments Later, Here's What I Learned
&lt;/h1&gt;

&lt;p&gt;On August 7 I posted a question that had been nagging me: when an AI agent says &lt;em&gt;"I ran the tests and they passed,"&lt;/em&gt; on what authority do you accept the delivery?&lt;/p&gt;

&lt;p&gt;It got 68 comments. The interesting part: almost nobody argued about &lt;em&gt;whether&lt;/em&gt; to trust the agent. The comments kept circling a much harder question underneath. Three of them kept coming back, over and over.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. "Proving the test ran isn't the same as proving the test could catch the bug."
&lt;/h2&gt;

&lt;p&gt;This was the sharpest one. As &lt;a href="https://dev.to/glenallen"&gt;@glenallen&lt;/a&gt; put it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The harder problem isn't proving that a test command executed; it's proving that the test was capable of catching the failure it was supposed to catch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://dev.to/sizzlebop"&gt;@sizzlebop&lt;/a&gt; said it in one line: &lt;em&gt;"the bigger issue is if the 'test' actually tests anything."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's a &lt;strong&gt;negative-control&lt;/strong&gt; problem. A test that has never once failed is indistinguishable from a test that &lt;em&gt;can't&lt;/em&gt; fail. So we made it a first-class requirement: every verifiable claim must carry a registered negative control, and that control must fail &lt;strong&gt;for the registered reason&lt;/strong&gt; — the right exit code, the right failure signature. "Failed by accident" does not count as "failed as designed."&lt;/p&gt;

&lt;h2&gt;
  
  
  2. "It can report green because the thing it should have checked never got checked."
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/julianneagu"&gt;@julianneagu&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I've seen tools report green simply because the thing they needed to check never made it into the input set.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the empty-input / population problem — a pipeline that selects &lt;strong&gt;zero&lt;/strong&gt; tests and calls it success. So we bind the &lt;em&gt;eligible&lt;/em&gt; population before selection: if the executor saw N eligible tests and the selector picked zero, the verdict is not &lt;code&gt;VERIFIED&lt;/code&gt;. Selecting nothing is not "done."&lt;/p&gt;

&lt;h2&gt;
  
  
  3. "Immutable evidence ≠ immutable truth."
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/mansio"&gt;@mansio&lt;/a&gt; turned a comment into a design aphorism: &lt;strong&gt;"immutable evidence ≠ immutable truth."&lt;/strong&gt; A tamper-proof record of a wrong conclusion is still a wrong conclusion.&lt;/p&gt;

&lt;p&gt;That's why our verdict is three-valued — &lt;code&gt;VERIFIED / REFUTED / UNKNOWN&lt;/code&gt; — and why &lt;a href="https://dev.to/reidmarlow"&gt;@reidmarlow&lt;/a&gt;'s observation landed hard:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The UNKNOWN exit code is the bit I wish more agent tooling copied… making uncertainty a first-class verdict.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the evidence can't support a conclusion, we say so, instead of quietly teaching callers to retry until the dashboard is green.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we did with those three answers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An independent &lt;strong&gt;third-round audit&lt;/strong&gt; (2 critical + 5 important findings), each closed attack-by-attack: first write the attack, watch it pass, then make the smallest fix that rejects it.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;five-minute challenge&lt;/strong&gt; so you can verify it yourself — we changed exactly one byte in a delivery that still claims &lt;code&gt;VERIFIED&lt;/code&gt;, and one command catches it: &lt;a href="https://dev.to/dengyier/i-tampered-with-a-verified-ai-agent-delivery-can-you-find-it-in-5-minutes-4kp0"&gt;find the tampered byte&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The parts we have &lt;em&gt;not&lt;/em&gt; solved — because our own readers said so
&lt;/h2&gt;

&lt;p&gt;The comment section was also the most honest roadmap I've been handed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/navid_gh_gh"&gt;@navid_gh_gh&lt;/a&gt;: &lt;em&gt;"the complexity is unacceptable… I want the process to be fast."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/designbynaima"&gt;@designbynaima&lt;/a&gt;: &lt;em&gt;"cryptographic receipts for every single tool call sounds like it'd kill adoption."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/skillselion"&gt;@skillselion&lt;/a&gt;: &lt;em&gt;"a deliberately broken fixture becomes a merely invalid one two schema migrations later"&lt;/em&gt; — the rot problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those aren't rebuttals. They're the next milestones.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question I'd ask you now
&lt;/h2&gt;

&lt;p&gt;The comments forced a better question on me. Not &lt;em&gt;"can I trust the agent?"&lt;/em&gt; but:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can the test fail for the right reason — and can I re-run the evidence myself, offline, without trusting anyone's server?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're carrying that question too, the challenge is five minutes: &lt;a href="https://dev.to/dengyier/i-tampered-with-a-verified-ai-agent-delivery-can-you-find-it-in-5-minutes-4kp0"&gt;dev.to/dengyier/i-tampered-with-a-verified-ai-agent-delivery&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you've been burned — "tests green but it shipped broken," "the agent claimed it finished but didn't" — tell me how you caught it. That's the input I'm actually collecting.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>I Tampered With a 'VERIFIED' AI-Agent Delivery. Can You Find It in 5 Minutes?</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Sun, 16 Aug 2026 14:57:20 +0000</pubDate>
      <link>https://dev.to/dengyier/i-tampered-with-a-verified-ai-agent-delivery-can-you-find-it-in-5-minutes-4kp0</link>
      <guid>https://dev.to/dengyier/i-tampered-with-a-verified-ai-agent-delivery-can-you-find-it-in-5-minutes-4kp0</guid>
      <description>&lt;p&gt;You're paying an agent (or a freelancer, or an internal pipeline) to do work.&lt;br&gt;
The agent says: &lt;em&gt;"all tests pass, the change is verified."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A few things that already happen, in public, today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An agent &lt;strong&gt;"fixed the test instead of the bug"&lt;/strong&gt; — tests passed, production broke. (&lt;a href="https://www.producthunt.com/p/vibecoding/the-ai-agent-fixed-the-test-instead-of-the-bug-tests-passed-prod-broke" rel="noopener noreferrer"&gt;Product Hunt vibecoding thread&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;An agent &lt;strong&gt;claimed it finished a codebase analysis while only doing 21% of it&lt;/strong&gt;. (&lt;a href="https://github.com/anthropics/claude-code/issues/3376" rel="noopener noreferrer"&gt;claude-code #3376&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;An agent &lt;strong&gt;reviewed its own code and passed itself — and it was wrong&lt;/strong&gt;. (&lt;a href="https://dev.to/stkremen/the-agent-reviewed-its-own-code-and-passed-itself-it-was-wrong-4b94"&gt;dev.to&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The common thread is not "the test was bad." It's: &lt;strong&gt;nobody independently re-verified what the&lt;br&gt;
agent actually did, offline, without trusting the agent's own machine.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The challenge
&lt;/h2&gt;

&lt;p&gt;Here is a frozen delivery package that claims &lt;code&gt;VERIFIED&lt;/code&gt;. It is a real,&lt;br&gt;
offline-replayable evidence chain: signed work order → signed scope → signed&lt;br&gt;
arm results → three-state decision (&lt;code&gt;VERIFIED / REFUTED / UNKNOWN&lt;/code&gt;), including&lt;br&gt;
&lt;em&gt;which population was eligible before selection&lt;/em&gt; and &lt;em&gt;whether the negative&lt;br&gt;
control failed for the registered reason&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I changed exactly one byte in it.&lt;/strong&gt; It still &lt;em&gt;claims&lt;/em&gt; &lt;code&gt;VERIFIED&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Your job, in under 5 minutes, without editing any source code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/dengyier/OpenWorkProof
&lt;span class="nb"&gt;cd &lt;/span&gt;OpenWorkProof
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;          &lt;span class="c"&gt;# installs the protocol from source&lt;/span&gt;
python tests/evidence-bundles/verify_evidence_bundle.py &lt;span class="se"&gt;\&lt;/span&gt;
  tests/evidence-bundles/rich-4196-integrity-v05-delivery-package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then answer two questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What did I tamper with?&lt;/strong&gt; (Which file / which field.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why does the verifier still catch it?&lt;/strong&gt; (What breaks first — the byte hash,
or the signature / decision chain?)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No network. No ledger. No Docker. No agent's server to trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;This is not a benchmark. It is a &lt;strong&gt;verification-of-the-verifier&lt;/strong&gt; artifact. The&lt;br&gt;
protocol (&lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;OpenWorkProof&lt;/a&gt;) freezes four&lt;br&gt;
things per unit of work — authorization, scope evidence, &lt;em&gt;eligible population&lt;br&gt;
completeness&lt;/em&gt; (selecting zero tests is not "done"), and &lt;em&gt;negative-control&lt;br&gt;
semantics&lt;/em&gt; ("failed by accident" ≠ "failed as designed") — into a chain you can&lt;br&gt;
replay offline.&lt;/p&gt;

&lt;p&gt;Two claims I am &lt;strong&gt;not&lt;/strong&gt; making, honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is a self-owned demo (a real Rich #4196 regression), &lt;strong&gt;not&lt;/strong&gt; evidence of
any customer adoption, payment, or deployment. Those are &lt;code&gt;not_evidenced&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It is a complement to identity / payment rails, not a payment or settlement
system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The real ask
&lt;/h2&gt;

&lt;p&gt;I'm collecting the &lt;strong&gt;failure modes people actually hit when they can't verify an&lt;br&gt;
agent's work&lt;/strong&gt;. If you've been burned — "tests were green but it shipped broken",&lt;br&gt;
"the agent claimed it finished but didn't", "I re-ran it myself because I didn't&lt;br&gt;
trust the report" — tell me in the comments, in one line: &lt;strong&gt;what happened, and how&lt;br&gt;
you caught it (or didn't).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the input I actually want. The challenge is just the appetizer.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Verifying the Verifier: How an Independent Audit Hardened OpenWorkProof v0.5</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Sat, 15 Aug 2026 16:06:28 +0000</pubDate>
      <link>https://dev.to/dengyier/verifying-the-verifier-how-an-independent-audit-hardened-openworkproof-v05-5a54</link>
      <guid>https://dev.to/dengyier/verifying-the-verifier-how-an-independent-audit-hardened-openworkproof-v05-5a54</guid>
      <description>&lt;h2&gt;
  
  
  What this is for (the 30-second version for everyone)
&lt;/h2&gt;

&lt;p&gt;Increasingly, the person "doing the work" is an agent, and the person "checking the work" is also an agent. The moment you pay, merge, deploy, or ship on an agent's say-so, you have a new question: &lt;strong&gt;who verifies the verifier?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenWorkProof is a Python protocol layer that answers that question with evidence instead of vibes. It takes one unit of agent work — a task, a git change, a test run — and freezes four things into a signed, append-only, &lt;strong&gt;offline-replayable&lt;/strong&gt; chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Authorization&lt;/strong&gt; — who was allowed to do this work, signed by keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope&lt;/strong&gt; — exactly which files and which tests were claimed, and what was actually observed; the two must be byte-identical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Population completeness&lt;/strong&gt; — if the engine saw &lt;em&gt;N&lt;/em&gt; eligible tests but the selector picked &lt;em&gt;zero&lt;/em&gt;, that run does not pass. (Call this the "tested nothing, reported green" blind spot.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negative-control semantics&lt;/strong&gt; — a deliberately injected mutation must not merely &lt;em&gt;fail&lt;/em&gt;; it must fail &lt;em&gt;for the registered reason&lt;/em&gt; (error code / predicate signature). "Failed by accident" ≠ "failed as designed".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The verdict is deliberately three-valued and monotonic: &lt;code&gt;VERIFIED&lt;/code&gt;, &lt;code&gt;REFUTED&lt;/code&gt;, &lt;code&gt;UNKNOWN&lt;/code&gt; — where &lt;code&gt;UNKNOWN&lt;/code&gt; is a safe conclusion, not a crash. The CLI is fail-closed: &lt;code&gt;VERIFIED=0&lt;/code&gt;, &lt;code&gt;UNKNOWN=3&lt;/code&gt;, &lt;code&gt;REFUTED=4&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For business readers: this is &lt;strong&gt;not&lt;/strong&gt; a payment rail, not an auto-settlement system, and not a claim that any customer adopted it. It is a protocol capability, demonstrated on our own work item (Rich #4196). What it buys you is a concrete answer to "what exactly was verified, by whom, against which inputs — and can I replay that myself without trusting anyone's server?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Why v0.5 is designed this way
&lt;/h2&gt;

&lt;p&gt;v0.3 proved "claimed scope == observed scope, exactly." The design of v0.5 follows from two attacks v0.3 could not see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The population blind spot.&lt;/strong&gt; An executor sees many eligible tests; a selector may legally choose a subset — or zero. A run that selects nothing ends successfully and, under older semantics, looked green. v0.5 therefore binds &lt;em&gt;what was eligible, what was excluded, and why&lt;/em&gt; into the signed selector spec, and requires a positive match before &lt;code&gt;VERIFIED&lt;/code&gt; is reachable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negative-control corruption.&lt;/strong&gt; A registered mutation "failing" is meaningless unless the &lt;em&gt;failure signature&lt;/em&gt; matches the registered one. v0.5 stores the signature and requires &lt;code&gt;observed == signed == expected&lt;/code&gt; before a control arm is &lt;code&gt;proven&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two engineering principles carry the rest of the design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Never trust the agent's self-report.&lt;/strong&gt; Every decision is recomposed from canonical signed rows and re-signed; a plain JSON report with a self-hash is treated as untrusted input, not truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence must survive offline.&lt;/strong&gt; Deliveries are bundles you can re-verify with no network and no original ledger, against an &lt;strong&gt;immutable candidate inventory&lt;/strong&gt; — a supply-chain record bound to exact source bytes and fully-qualified image digests. Any source change invalidates the old inventory by construction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The audit: we invited someone to break it
&lt;/h2&gt;

&lt;p&gt;After the implementation was "done," we commissioned an independent external review — and it declined to take our word for anything. It reproduced attacks by hand and returned &lt;strong&gt;2 Critical + 5 Important + minors&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Critical 1 — offline package authenticity.&lt;/strong&gt; The &lt;code&gt;scope-coverage-report.json&lt;/code&gt; was self-hashed JSON. The customer-private view replayed the signed objects and then &lt;strong&gt;threw away the recomputed decision&lt;/strong&gt;, returning fields from the report instead; the public/diagnostic views had no signed objects at all yet could still return &lt;code&gt;READY_FOR_ACCEPTANCE&lt;/code&gt;. Reproduction: tamper the report's decision, re-sync the manifest hash/size — signature verification still passes; a public package can be forged into &lt;code&gt;VERIFIED&lt;/code&gt; from zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critical 2 — selector inputs not frozen.&lt;/strong&gt; The git selector's spec digest omitted allowlist/excluded/required locators; pytest's omitted &lt;code&gt;selector_args&lt;/code&gt;/&lt;code&gt;required_node_ids&lt;/code&gt;; the pytest adapter treated &lt;em&gt;any stdout line containing &lt;code&gt;::&lt;/code&gt;&lt;/em&gt; as an authoritative node id. Reproduction: two different allowlists (or argument sets) with identical output produced byte-identical observations and evidence — both satisfied.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important 1&lt;/strong&gt; — decision loading checked only the Decision ↔ parent ID link; it never loaded or validated Arm Results, never recomposed, never checked &lt;code&gt;committed_at&lt;/code&gt;. Deleting every Arm Result row still loaded &lt;code&gt;VERIFIED&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important 2&lt;/strong&gt; — control evidence &lt;code&gt;PROVEN&lt;/code&gt; required only non-empty refs + a self-reported matching signature: any &lt;code&gt;{"arm": "negative"}&lt;/code&gt; JSON could be proven.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important 3&lt;/strong&gt; — &lt;code&gt;Path.resolve()&lt;/code&gt; dereferenced &lt;code&gt;.venv/bin/python&lt;/code&gt; into the base interpreter; &lt;code&gt;-m pytest&lt;/code&gt; lost site-packages and died with ModuleNotFoundError.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important 4&lt;/strong&gt; — the CLI could exit 0 on &lt;code&gt;UNKNOWN&lt;/code&gt;/&lt;code&gt;REFUTED&lt;/code&gt;, and audit-explain/compare bypassed the v0.5 derived functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important 5&lt;/strong&gt; — several matrix entries "existed as test names" without covering what they claimed; the plan referenced phantom test filenames.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How we closed it: attack tests first (RED → minimal fix → dual review)
&lt;/h2&gt;

&lt;p&gt;Every finding was handled the same way: write an &lt;strong&gt;attack-shaped test&lt;/strong&gt;, confirm it is RED against the old code, apply the smallest fix, commit, then have two independent sub-agents review — one against the spec, one for quality/security. Critical and Important findings blocked progress until closed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Batch A — offline packages trust only replayed signed truth.&lt;/strong&gt; The customer-private verdict now comes solely from the recomposed, signature-verified &lt;code&gt;Decision&lt;/code&gt;; the report is compared field-by-field against the replay and any divergence fails closed. Public/diagnostic views — which carry no signed redacted attestation — return &lt;code&gt;UNAUTHENTICATED&lt;/code&gt; / &lt;code&gt;NOT_READY&lt;/code&gt;. Attack tests: forged report decision + synced manifest; from-zero forgery of a public package.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch B — freeze every selector input into the digest.&lt;/strong&gt; Allow/exclude/require parameters are canonicalized into &lt;code&gt;selector_spec_digest&lt;/code&gt; for both selectors; node ids come only from a &lt;strong&gt;controlled canonical collector&lt;/strong&gt; (a closed JSON file written at &lt;code&gt;pytest_collection_finish&lt;/code&gt;); stdout is never parsed. Reviewers then demonstrated two further bypasses — a nested &lt;code&gt;conftest.py&lt;/code&gt; (trylast hook) and a root-level &lt;code&gt;pytest.py&lt;/code&gt; shadowing the real pytest — closed with &lt;strong&gt;conftest-free refusal&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;-I&lt;/code&gt; isolation&lt;/strong&gt;, each with its own regression test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch C — decision history is fully replayed at every entry point.&lt;/strong&gt; &lt;code&gt;_load_current_decision_v05&lt;/code&gt; now loads canonical Arm Results by parent chain, validates each row (id/digest/authority/signature/evidence), recomposes every chain link from its predecessor requiring identical signing bytes, and enforces canonical &lt;code&gt;committed_at&lt;/code&gt; plus causal/monotonic ordering (leap seconds rejected). Attack tests: deleted parent rows, row swaps, timestamp tampering, relation drift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch D — a closed control-evidence resolver.&lt;/strong&gt; A 9-key canonical document (&lt;code&gt;openworkproof-control-evidence/0.5&lt;/code&gt;) is now the only accepted shape; ledger and offline package share one resolver; &lt;code&gt;proven&lt;/code&gt; requires &lt;code&gt;evidence fact == signed observation == registered expectation&lt;/code&gt;. Attack tests: legacy blob shapes, contradictory facts, missing evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch E — respect the venv launcher.&lt;/strong&gt; Keep the absolute invocation path (no final-symlink dereference), bind the real target, &lt;code&gt;pyvenv.cfg&lt;/code&gt;, and executable digest separately; a real &lt;code&gt;.venv&lt;/code&gt; regression test drives a real pytest collection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch F — CLI parity.&lt;/strong&gt; Unified exit map (&lt;code&gt;VERIFIED=0 / UNKNOWN=3 / REFUTED=4&lt;/code&gt;, unrecognized values fail closed to 3); audit-explain/compare reuse the v0.5 derived functions; end-to-end CLI tests cover all three verdicts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch G — matrix, supply chain, and plan truth.&lt;/strong&gt; Added fault injection (insert / before-COMMIT / readback) and same-id concurrency for Profile/Arm/Decision, physical tampering across all six v0.5 table families; the archive converter rejects duplicate tar members, absolute paths, and &lt;code&gt;..&lt;/code&gt;, and derives platform from the real config; eliminated pytest tmpdir cleanup noise; corrected phantom test filenames and the &lt;code&gt;_ledger_delivery_protocol&lt;/code&gt; text in the plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Re-freezing the release: immutable inventory + five gates
&lt;/h2&gt;

&lt;p&gt;Because any source change invalidates the old inventory (by design), we rebuilt the candidate after the minors closed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Candidate inventory: &lt;code&gt;supply-chain/images/candidates/d460c876a7f3046fd1d338951d964bce6d1a6be1.json&lt;/code&gt; (fully qualified &lt;code&gt;docker.io/openworkproof/execution-test@sha256:2acf4820…&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;focused v0.5: &lt;strong&gt;370 passed&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;frozen v0.2–v0.4 compatibility: &lt;strong&gt;216 passed&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;portable full suite: &lt;strong&gt;3348 passed / 0 failed / 6 skipped&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;candidate live-Docker suites: &lt;strong&gt;173 passed&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;required-live full run: 3456 passed / 0 failed / 0 skipped, zero warnings&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Rich #4196 offline delivery bundle: &lt;strong&gt;VERIFICATION PASSED&lt;/strong&gt; (no network, no original ledger)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this does not claim
&lt;/h2&gt;

&lt;p&gt;Green tests and offline replays do &lt;strong&gt;not&lt;/strong&gt; equal customer adoption, paid SOW, deposits, upstream adoption, or commercial validation — those states remain &lt;code&gt;not_evidenced&lt;/code&gt;. OpenWorkProof is a complementary layer: it freezes authorization, scope evidence, population completeness, and negative-control semantics for one unit of work. It does not replace MCP/A2A interoperability or identity, and it does not execute payment or settlement.&lt;/p&gt;

&lt;p&gt;If you have been burned by "the agent said it verified it," we'd like to hear from you — and we invite independent reproduction of both the attack tests and the candidate supply chain.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>OpenWorkProof Protocol Specification</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Wed, 12 Aug 2026 14:53:14 +0000</pubDate>
      <link>https://dev.to/dengyier/openworkproof-protocol-specification-3k8e</link>
      <guid>https://dev.to/dengyier/openworkproof-protocol-specification-3k8e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This specification is the product of a public design conversation (2026-08-08 → 2026-08-12) across LinkedIn and Dev.to. Every primitive below was shaped by named community contributions; each section cites its origin. The protocol's governing principle, stated by the community and adopted here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification must itself be tested.&lt;/strong&gt; A check that never fails has never been checked.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Purpose
&lt;/h2&gt;

&lt;p&gt;OpenWorkProof is a protocol for &lt;strong&gt;verifying AI agent work&lt;/strong&gt;: producing signed, auditable evidence that a piece of agent execution happened as claimed, and that the verifier producing that evidence is capable of detecting failure.&lt;/p&gt;

&lt;p&gt;Two distinct claims are always separated in this protocol:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Authenticity&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Signature over a receipt&lt;/td&gt;
&lt;td&gt;This work was executed and attested as stated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Verifier capability&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Negative control arm in the receipt&lt;/td&gt;
&lt;td&gt;The verifier would have caught a lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Signatures alone prove the first. They say nothing about the second — the &lt;code&gt;ln.strip()&lt;/code&gt; lesson (Section 4.1).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Scope &amp;amp; Non-Goals
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;In scope:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receipt formats for verified executions (positive arm + negative arm).&lt;/li&gt;
&lt;li&gt;Guard definitions and guard inventory semantics.&lt;/li&gt;
&lt;li&gt;Negative control contracts (provocation contract, digest pinning).&lt;/li&gt;
&lt;li&gt;Population manifests (sampling honesty).&lt;/li&gt;
&lt;li&gt;Temporal validity: retraction, policy state, scope change.&lt;/li&gt;
&lt;li&gt;Trust model and bootstrap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Non-goals (for now):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model evaluation or benchmarking (evals measure models; we measure executions).&lt;/li&gt;
&lt;li&gt;Tracing / observability (logs record what happened; receipts let third parties verify it).&lt;/li&gt;
&lt;li&gt;Attestation of &lt;em&gt;environment&lt;/em&gt; (TEE / enclave proofs prove where something ran, not that it was correct).&lt;/li&gt;
&lt;li&gt;Policy &lt;em&gt;judgment&lt;/em&gt; semantics (that is the JPS layer; OWP carries authorization bindings).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Terminology
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Guard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A verification check: command + assertion + expected failure behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Guard inventory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The set of guards an operator runs, classified proven / unproven / broken&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Negative control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A deliberately broken input, run on every CI pass, asserting the guard goes red&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Provocation contract&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The formal spec of what a negative control provokes (exit code, stderr pattern, schema scope)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Receipt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Signed evidence of one verification event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Positive arm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The "did it pass" side of a receipt: test suite, result, population&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Negative arm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The "would it catch a lie" side: control fixture, control result, control target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Population manifest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The honest enumeration of what a check was supposed to examine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eligible seen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pre-selection count: what reached the gate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Selection loss&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The auditable gap between &lt;code&gt;eligible_seen&lt;/code&gt; and &lt;code&gt;population_size&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Silent decay of a check's capability while output stays green (three kinds: guard, control, population)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. Failure Model
&lt;/h2&gt;

&lt;p&gt;The protocol exists because verification can be &lt;strong&gt;green and structurally meaningless&lt;/strong&gt;. The failure model is explicit.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Structural death (&lt;code&gt;ln.strip()&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A production gateway ran a signed, audited check that reported &lt;code&gt;verified: true&lt;/code&gt; on every run for months. The bug: a stray newline pushed an &lt;code&gt;assert&lt;/code&gt; below a &lt;code&gt;return&lt;/code&gt;, so the assertion never executed. Exit code 0. Verdict verified.&lt;/p&gt;

&lt;p&gt;Measured impact (fintech engineer's post, 2026-08-09):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Guards total&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proven (can detect failure)&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broken&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unproven&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;33&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five of eight caller-test shapes produced false passes. The agent had "passed 2,283 tests" and failed in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; the verifier is part of the system being verified. It must be tested with inputs designed to make it fail.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 The three decay modes (rot)
&lt;/h3&gt;

&lt;p&gt;Even with negative controls in place, a check can go silently dead three ways (community taxonomy, 2026-08-12):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rot&lt;/th&gt;
&lt;th&gt;Failure&lt;/th&gt;
&lt;th&gt;Countermeasure&lt;/th&gt;
&lt;th&gt;Origin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Guard rot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Guard stops catching real failures&lt;/td&gt;
&lt;td&gt;Continuous negative control on every CI pass&lt;/td&gt;
&lt;td&gt;Max Quimby&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control rot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Control stops testing the right failure (recall/precision of the test itself)&lt;/td&gt;
&lt;td&gt;Digest pinning + &lt;code&gt;control_schema_version&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Skillselion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Population rot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Guard examines the wrong population, or none at all&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;eligible_seen&lt;/code&gt; in the population manifest&lt;/td&gt;
&lt;td&gt;Tom Jones&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three can produce a green checkmark while being structurally meaningless. All three need different countermeasures.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 Catch-rate measurability (23 of 41)
&lt;/h3&gt;

&lt;p&gt;Production data (Ethan Walker, 2026-08-12): a gate caught &lt;strong&gt;23 of 41&lt;/strong&gt; known degradations — a 56% catch rate — across eleven green weeks in which nobody asked what fraction it catches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; every guard must be measurable against known-bad inputs. The negative control is the cheap, proactive version of the expensive forensic replay Ethan had to do retroactively.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Core Primitives
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Guard &amp;amp; Guard Inventory
&lt;/h3&gt;

&lt;p&gt;A guard is a check plus a control:&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;guard&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;gw_check_response_shape&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Every&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;gateway&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;matches&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;documented&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;schema"&lt;/span&gt;
  &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_response.sh"&lt;/span&gt;
  &lt;span class="na"&gt;assertion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;schema_validate&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;$INPUT"&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;unproven&lt;/span&gt;        &lt;span class="c1"&gt;# proven | unproven | broken — set by control runs&lt;/span&gt;
  &lt;span class="na"&gt;controls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;gw_control_null_handling&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;guard inventory&lt;/strong&gt; is a published, versioned list — not a private detail. It is the unit of honesty:&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;guard_inventory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schema_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0"&lt;/span&gt;
  &lt;span class="na"&gt;generated_at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-08-12T00:00:00Z&lt;/span&gt;
  &lt;span class="na"&gt;totals&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;guards&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40&lt;/span&gt;
    &lt;span class="na"&gt;proven&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;
    &lt;span class="na"&gt;unproven&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;33&lt;/span&gt;
    &lt;span class="na"&gt;broken&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;guards&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;...&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Proven" is defined operationally: &lt;strong&gt;a guard is proven only while its negative control fails as expected.&lt;/strong&gt; The moment the control passes (green on broken input), the guard is reclassified &lt;code&gt;unproven&lt;/code&gt; or &lt;code&gt;broken&lt;/code&gt;. Proven is a time-decaying label, not a permanent badge (Max Quimby: guard rot).&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 Negative Control (provocation contract)
&lt;/h3&gt;

&lt;p&gt;A negative control pins the exact broken input and the exact expected failure, and scopes itself to schema versions (Skillselion: control rot / digest pinning):&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;negative_control&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;fixture_digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:abc123...&lt;/span&gt;            &lt;span class="c1"&gt;# The exact broken input&lt;/span&gt;
  &lt;span class="na"&gt;expected_failure_digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:def456...&lt;/span&gt;   &lt;span class="c1"&gt;# The exact failure signature&lt;/span&gt;
  &lt;span class="na"&gt;control_schema_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;                   &lt;span class="c1"&gt;# For schema migration tracking&lt;/span&gt;
  &lt;span class="na"&gt;control_spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;target_schema_version&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;gt;=1.0,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;3.0"&lt;/span&gt;      &lt;span class="c1"&gt;# Valid for these schema versions&lt;/span&gt;
    &lt;span class="na"&gt;provocation_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;null_handling&lt;/span&gt;           &lt;span class="c1"&gt;# What class of failure it tests&lt;/span&gt;
    &lt;span class="na"&gt;expected_exit_code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;non-zero&lt;/span&gt;              &lt;span class="c1"&gt;# Minimum bar&lt;/span&gt;
    &lt;span class="na"&gt;expected_stderr_pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NullPointerException"&lt;/span&gt;  &lt;span class="c1"&gt;# Specific signal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pin by digest, never by path.&lt;/strong&gt; The fixture and the expected failure are referenced by digest so "proven" is a verifiable claim, not a historical observation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every control declares its provocation type.&lt;/strong&gt; A control that stops testing the right failure class (recall) or that tolerates wrong failures (precision) is control rot — detected by comparing &lt;code&gt;control_schema_version&lt;/code&gt; and &lt;code&gt;expected_failure_digest&lt;/code&gt; over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A control is valid only within its &lt;code&gt;target_schema_version&lt;/code&gt; range.&lt;/strong&gt; Two schema migrations later, the old control is not silently reused — it must be re-blessed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5.3 Population Manifest (sampling honesty)
&lt;/h3&gt;

&lt;p&gt;A guard's scope must be auditable. The manifest distinguishes &lt;em&gt;what reached the gate&lt;/em&gt; from &lt;em&gt;what passed selection&lt;/em&gt; (Tom Jones, third round):&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;population_manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selection_rule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;threads&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;we&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;have&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;commented&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in"&lt;/span&gt;   &lt;span class="c1"&gt;# What we HOLD&lt;/span&gt;
  &lt;span class="na"&gt;eligible_seen&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400&lt;/span&gt;                               &lt;span class="c1"&gt;# What reached the gate (pre-selection)&lt;/span&gt;
  &lt;span class="na"&gt;population_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;                              &lt;span class="c1"&gt;# What passed selection (post-selection)&lt;/span&gt;
  &lt;span class="na"&gt;population_digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;merkle_root&amp;gt;&lt;/span&gt;                 &lt;span class="c1"&gt;# Tamper-evident enumeration&lt;/span&gt;
  &lt;span class="na"&gt;sampling_rate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt;                               &lt;span class="c1"&gt;# 100% = no sampling&lt;/span&gt;
  &lt;span class="na"&gt;effective_from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;timestamp&amp;gt;&lt;/span&gt;                      &lt;span class="c1"&gt;# When the rule was authoritative&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Semantics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eligible_seen&lt;/code&gt; — &lt;strong&gt;pre-selection count&lt;/strong&gt;: did the collector even see the things it was supposed to check?&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;population_size&lt;/code&gt; — &lt;strong&gt;post-selection count&lt;/strong&gt;: of the things it saw, how many passed the filter?&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;gap is selection loss&lt;/strong&gt; — the auditable delta that turns a silent failure into a detectable one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Canonical decision table (Tom Jones):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;&lt;code&gt;eligible_seen&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;population_size&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Healthy instrument&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Nothing to do, nothing expected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broken collector&lt;/td&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;400 things should have been checked, 0 were&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Without &lt;code&gt;eligible_seen&lt;/code&gt;, both scenarios produce the same receipt. With it, the broken case is a &lt;strong&gt;live, self-reporting rot signal on the day it happens&lt;/strong&gt; — not at the next review.&lt;/p&gt;

&lt;p&gt;Operational rule: &lt;strong&gt;check the set you HOLD, not the set you FETCHED.&lt;/strong&gt; The &lt;code&gt;selection_rule&lt;/code&gt; must be defined over the population you intend to cover, and &lt;code&gt;eligible_seen&lt;/code&gt; proves the collector reached it.&lt;/p&gt;

&lt;p&gt;Reference scenarios (included in Appendix A with attribution): the thread monitor and the sampler.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 Receipt — DualArmReceipt v1
&lt;/h3&gt;

&lt;p&gt;The signed unit of verification. One payload, two arms (Cophy Origin: the receipt–content gap; Mikhail: dual-arm verification):&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;dual_arm_receipt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schema_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0"&lt;/span&gt;
  &lt;span class="na"&gt;claim&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;task_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owp-task-20260812-001&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Refund&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;processed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;order&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;R-4491"&lt;/span&gt;
    &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;done&lt;/span&gt;
    &lt;span class="na"&gt;output_digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:9f8e...&lt;/span&gt;               &lt;span class="c1"&gt;# What was actually produced&lt;/span&gt;
  &lt;span class="na"&gt;positive_arm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;test_suite_digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:77aa...&lt;/span&gt;
    &lt;span class="na"&gt;test_result&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pass&lt;/span&gt;
    &lt;span class="na"&gt;population_manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                       &lt;span class="c1"&gt;# 5.3 — what the pass covered&lt;/span&gt;
      &lt;span class="na"&gt;selection_rule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;refunds&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0"&lt;/span&gt;
      &lt;span class="na"&gt;eligible_seen&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;113&lt;/span&gt;
      &lt;span class="na"&gt;population_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;113&lt;/span&gt;
      &lt;span class="na"&gt;population_digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:31cd...&lt;/span&gt;
      &lt;span class="na"&gt;sampling_rate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt;
      &lt;span class="na"&gt;effective_from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-08-12T00:00:00Z&lt;/span&gt;
  &lt;span class="na"&gt;negative_arm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                                &lt;span class="c1"&gt;# 5.2 — would the verifier catch a lie?&lt;/span&gt;
    &lt;span class="na"&gt;control_fixture_digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:abc123...&lt;/span&gt;
    &lt;span class="na"&gt;control_result&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fail-as-expected&lt;/span&gt;
    &lt;span class="na"&gt;control_schema_version&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;control_target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;guard:gw_check_response_shape&lt;/span&gt;
  &lt;span class="na"&gt;signature&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;algorithm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ed25519&lt;/span&gt;
    &lt;span class="na"&gt;key_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owp-key-issuer-01&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0x...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A receipt without a negative arm is a log, not evidence.&lt;/strong&gt; The negative arm is what lets a third party check the verifier's capability — it answers "would this receipt have screamed on a lie?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File existence ≠ content correctness.&lt;/strong&gt; A receipt must pin &lt;code&gt;output_digest&lt;/code&gt; (what was produced), not merely record that a file exists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;control_target&lt;/code&gt; ties the control to the specific guard&lt;/strong&gt; it proves, so arm and guard cannot drift apart.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5.5 Temporal Validity — RetractionReceipt v0.2
&lt;/h3&gt;

&lt;p&gt;A receipt is a &lt;strong&gt;bounded claim&lt;/strong&gt;: "this was true under these conditions at this time" (Suraj Suradkar). Obsolescence is tracked, not hidden.&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;retraction_receipt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;parent_receipt_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owp-receipt-20260812-001&lt;/span&gt;
  &lt;span class="na"&gt;retraction_auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;PolicyDecision&amp;gt;&lt;/span&gt;            &lt;span class="c1"&gt;# Independent trust boundary; co-signed&lt;/span&gt;
  &lt;span class="na"&gt;propagation_class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;none | downstream_causal | same_predicate&lt;/span&gt;
  &lt;span class="na"&gt;semantic_cause&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                              &lt;span class="c1"&gt;# Open, versioned enum&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;superseded_by | refuted_by | scope_changed&lt;/span&gt;
    &lt;span class="na"&gt;superseding_receipt_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owp-receipt-20260812-009&lt;/span&gt;
    &lt;span class="na"&gt;valid_until&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-08-20T00:00:00Z&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Categories (Suraj, refining Mikhail's v0.2):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Consequence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;superseded_by&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Decision was correct then, no longer current&lt;/td&gt;
&lt;td&gt;Old receipts: not invalid, bounded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;refuted_by&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Old evidence was wrong&lt;/td&gt;
&lt;td&gt;Old receipts: retrospective scope loss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scope_changed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Population/policy shifted&lt;/td&gt;
&lt;td&gt;Old receipts: incomplete relative to new scope&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Design constraints (Mikhail):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;REVOKED / SUPERSEDED / EXPIRED&lt;/code&gt; are &lt;strong&gt;overlapping flags, not a mutually exclusive enum&lt;/strong&gt; — a receipt can be superseded and expired simultaneously.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;retraction_auth&lt;/code&gt; is an &lt;strong&gt;independent trust boundary&lt;/strong&gt;: the key that issued a guarantee should not be able to unilaterally cancel it (co-signed by a non-issuer).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;propagation_class&lt;/code&gt; lives in the protocol layer; &lt;code&gt;semantic_cause&lt;/code&gt; in the application layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.6 Policy-State Registry &amp;amp; PolicyAnchor
&lt;/h3&gt;

&lt;p&gt;Policies and their checkpoints are versioned in a monotonic registry (Brian Jin, rounds 2–3):&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;policy_checkpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;policy_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pol-refund-eligibility&lt;/span&gt;
  &lt;span class="na"&gt;revision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;
  &lt;span class="na"&gt;artifact_digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:e0b1...&lt;/span&gt;
  &lt;span class="na"&gt;effective_from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-08-12T00:00:00Z&lt;/span&gt;
  &lt;span class="na"&gt;previous_checkpoint_digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:c2a9...&lt;/span&gt;    &lt;span class="c1"&gt;# Monotonic chain&lt;/span&gt;
  &lt;span class="na"&gt;signature&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;key_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owp-key-policy-01&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0x...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monotonic revision chain&lt;/strong&gt;: every checkpoint references its predecessor, so policy authority has a tamper-evident history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dual timestamps on receipts&lt;/strong&gt;: a receipt's validity has an execution time (when the agent ran) &lt;em&gt;and&lt;/em&gt; a policy time (which policy revision was authoritative). If a policy is retracted, anchored receipts become retrospectively scoped — bounded, not invalid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PolicyAnchor&lt;/strong&gt; sits at Layer −1 of the stack (Section 8): it is the point where authority itself is pinned, not an output of the verification pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Verification Flow (end-to-end)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─ Every CI pass ─────────────────────────────────────────────┐
│ 1. Define  guard + negative_control (provocation contract)   │
│ 2. Run positive arm:   suite → test_result, population_manifest
│ 3. Run negative arm:   broken fixture → control_result        │
│    — control must FAIL as expected, else guard reclassified   │
│ 4. Package DualArmReceipt (claim + positive + negative)       │
│ 5. Sign with issuer key; publish to registry                  │
│ 6. On policy/scope change: emit RetractionReceipt             │
└──────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;guard inventory&lt;/strong&gt; updated every run (proven/unproven/broken counts).&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;receipt chain&lt;/strong&gt; with temporal validity.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;policy registry&lt;/strong&gt; with monotonic revisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Trust Model &amp;amp; Bootstrap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal bootstrap&lt;/strong&gt;: a trusted authority key + a signed initial checkpoint. Nothing more is required to start; nothing less is honest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-operator registry&lt;/strong&gt; is a &lt;strong&gt;consistency proof, not a uniqueness proof&lt;/strong&gt;: it proves all checkpoints descend from one chain; it does not prove no other chain exists. Multi-operator/multi-key registries are a future work item.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparency log&lt;/strong&gt;: checkpoints are appended publicly so that retroactive editing is detectable even by parties who do not trust the operator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retraction authority is independent&lt;/strong&gt; (5.5): the issuer cannot unilaterally revoke its own guarantees.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Layered Architecture
&lt;/h2&gt;

&lt;p&gt;Causal order (community-corrected model; PolicyAnchor is Layer −1, not the top):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;Primitive&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Policy history / authority&lt;/td&gt;
&lt;td&gt;What rules were in force when&lt;/td&gt;
&lt;td&gt;Policy-State Registry, PolicyAnchor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Judgment&lt;/td&gt;
&lt;td&gt;What decision was authorized&lt;/td&gt;
&lt;td&gt;JPS layer (external)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution&lt;/td&gt;
&lt;td&gt;What the agent did&lt;/td&gt;
&lt;td&gt;claim + output_digest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence&lt;/td&gt;
&lt;td&gt;That verification worked&lt;/td&gt;
&lt;td&gt;DualArmReceipt (positive + negative arm)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Evidence is the &lt;em&gt;result&lt;/em&gt; of the pipeline; authority is its &lt;em&gt;input&lt;/em&gt;. Confusing the two was the original &lt;code&gt;ln.strip()&lt;/code&gt; error — evidence was signed while authority was dead.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Verification Maturity Model (Level 0–5)
&lt;/h2&gt;

&lt;p&gt;(Glen Allen: "verification must itself be tested".)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Trust the agent's own report&lt;/td&gt;
&lt;td&gt;No independent evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Logs exist&lt;/td&gt;
&lt;td&gt;"It ran" (unverifiable claim)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Signed receipts&lt;/td&gt;
&lt;td&gt;Authenticity proven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Negative controls&lt;/td&gt;
&lt;td&gt;Verifier capability proven for fixtures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Continuous controls + guard inventory published&lt;/td&gt;
&lt;td&gt;Capability continuously re-proven; rot visible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Controls are themselves tested (control rot guarded)&lt;/td&gt;
&lt;td&gt;The verifier's verifier is verified&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Target for production adoption: &lt;strong&gt;Level 4&lt;/strong&gt;, with Level 5 as the differentiator.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Adoption Path (two tiers)
&lt;/h2&gt;

&lt;p&gt;(Sri Ramya: layered adoption — execution evidence first, signed receipts second.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tier 1 — Human-verifiable evidence&lt;/strong&gt;: logs, video, replay. Zero protocol cost; establishes the habit of "show the work."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 2 — Machine-verifiable receipts&lt;/strong&gt;: signed &lt;code&gt;DualArmReceipt&lt;/code&gt;s, continuous controls, published inventory. What this specification defines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teams adopt Tier 1 first; Tier 2 is the upgrade path, not the entry requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Open Questions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;eligible_seen&lt;/code&gt;: is it total events or matched events? Do we need a third count, &lt;code&gt;total_seen&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Multi-operator registry: how do independent signers converge on one chain?&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;control_schema_version&lt;/code&gt; migration: what is the deprecation protocol for a control whose &lt;code&gt;target_schema_version&lt;/code&gt; range expires?&lt;/li&gt;
&lt;li&gt;Interaction between TEE attestation and the negative arm: does environment attestation strengthen or complicate control claims?&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;semantic_cause&lt;/code&gt; enum: who curates versions, and how do downstream consumers handle unknown values?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  12. Acknowledgements
&lt;/h2&gt;

&lt;p&gt;This specification was co-designed in public. Contributions by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The fintech engineer behind &lt;code&gt;ln.strip()&lt;/code&gt;&lt;/strong&gt; — the 40/7/33 guard inventory and the negative control that exposed structural death&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ethan Walker&lt;/strong&gt; — 23 of 41, eleven green weeks, catch-rate measurability (4.3)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JinHyuk Sung&lt;/strong&gt; — false-Done measurements motivating verifier capability as a first-class claim&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max Quimby&lt;/strong&gt; — guard rot, continuous negative control (4.2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tom Jones&lt;/strong&gt; — population manifest, &lt;code&gt;eligible_seen&lt;/code&gt;, FETCHED vs HOLD, reference scenarios (5.3, Appendix A)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skillselion&lt;/strong&gt; — control rot, digest pinning, provocation contract (5.2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glen Allen&lt;/strong&gt; — verification must itself be tested, maturity model (§9)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suraj Suradkar&lt;/strong&gt; — decision lifecycle, bounded claims, retraction categories (5.5)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cophy Origin&lt;/strong&gt; — receipt–content gap, &lt;code&gt;DualArmReceipt&lt;/code&gt; (5.4)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brian Jin&lt;/strong&gt; — Policy-State Registry, bootstrap, PolicyAnchor (5.6, §7)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mikhail&lt;/strong&gt; — RetractionReceipt v0.2, dual-arm verification, independent retraction auth (5.5)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sri Ramya&lt;/strong&gt; — two-tier adoption path (§10)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Appendix A. Reference Scenarios (population manifest)
&lt;/h2&gt;

&lt;p&gt;Attributed to Tom Jones (2026-08-12), canonical for the population manifest:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1 — The thread monitor.&lt;/strong&gt; A sampler configured to measure, on 100% of eligible events, how often two models agree on correctness. Four days produced zero rows, while the box served 113–209 requests/day. Every part of the receipt was valid: selection rule correct, tool ran, exit 0, signature valid. The population was empty because the &lt;em&gt;eligible shape was too narrow&lt;/em&gt;. &lt;code&gt;eligible_seen = 400, population_size = 0&lt;/code&gt; exposes the broken collector the day it happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2 — The sampler.&lt;/strong&gt; An invite sampler claims to have sampled 12 threads. Without a manifest, the claim is unfalsifiable. With &lt;code&gt;selection_rule + eligible_seen + population_size&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You sampled 12 of 400" invites an argument. "You sampled 12" ends one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Appendix B. Schema Versioning Policy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Every YAML primitive carries a &lt;code&gt;schema_version&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;negative_control.control_schema_version&lt;/code&gt; tracks migration of control fixtures; a control is only valid within &lt;code&gt;control_spec.target_schema_version&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Receipts pin the schema versions of both arms, so old receipts remain interpretable after migration.&lt;/li&gt;
&lt;li&gt;Breaking changes require a new major schema version; old versions remain valid for verification but are deprecated for issuance.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>opensource</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>When Your AI Agent Passes 2,283 Tests — And Still Fails in Production</title>
      <dc:creator>dengyier</dc:creator>
      <pubDate>Mon, 10 Aug 2026 14:20:13 +0000</pubDate>
      <link>https://dev.to/dengyier/when-your-ai-agent-passes-2283-tests-and-still-fails-in-production-2dga</link>
      <guid>https://dev.to/dengyier/when-your-ai-agent-passes-2283-tests-and-still-fails-in-production-2dga</guid>
      <description>&lt;p&gt;&lt;em&gt;A real-world production bug, a protocol-design insight from the community, and why cryptographic signatures alone can't save you.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Two weeks ago, I posted on LinkedIn about OpenWorkProof, a verification protocol for AI agent work. I expected maybe a dozen likes. I did not expect a global community of engineers, protocol designers, and security researchers to spend 72 hours dismantling our assumptions in public — and then rebuilding them into something better.&lt;/p&gt;

&lt;p&gt;One comment, from a senior engineer at a large fintech company, stands out as the single most valuable piece of feedback we've ever received. He described a production bug that had survived for months:&lt;/p&gt;




&lt;h2&gt;
  
  
  The Verifier That Couldn't Fail
&lt;/h2&gt;

&lt;p&gt;Their gateway ran a verification check on every API response. The check was signed, audited, and reported &lt;code&gt;verified: true&lt;/code&gt; on every run. For months, nobody questioned it.&lt;/p&gt;

&lt;p&gt;Then someone wrote a &lt;strong&gt;negative control&lt;/strong&gt;: a deliberately broken input designed to provoke a failure. The check should have returned &lt;code&gt;verified: false&lt;/code&gt;. It didn't.&lt;/p&gt;

&lt;p&gt;The bug was a single line: &lt;code&gt;ln.strip()&lt;/code&gt;. A stray newline character had pushed an &lt;code&gt;assert&lt;/code&gt; statement after a &lt;code&gt;return&lt;/code&gt; — nested inside a function body where it would never execute. Exit code: 0. Gateway verdict: verified.&lt;/p&gt;

&lt;p&gt;Eight different caller-test shapes ran against this check. &lt;strong&gt;Five of them produced false passes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The numbers he shared are sobering:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Guards total&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proven (can detect failure)&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broken&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unproven&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;33&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No agent lied. No log was tampered with. Every signature would have verified. The checker was &lt;strong&gt;structurally incapable of failing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's not a bug. That's a category error.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Signatures Can't Prove
&lt;/h2&gt;

&lt;p&gt;This is the gap we've been wrestling with for weeks — and the community has now named it with precision.&lt;/p&gt;

&lt;p&gt;A cryptographic signature can prove three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Who&lt;/strong&gt; signed the claim&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When&lt;/strong&gt; the claim was signed&lt;/li&gt;
&lt;li&gt;That the claim hasn't been &lt;strong&gt;tampered with&lt;/strong&gt; since signing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It cannot prove that the claim was &lt;strong&gt;correct&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;ln.strip()&lt;/code&gt; bug illustrates this perfectly. The signature verified that the check ran. It verified that the exit code was 0. It verified that the result hadn't been altered. Every cryptographic guarantee held. The answer was still wrong.&lt;/p&gt;

&lt;p&gt;This is what ANP2, another community contributor, called the difference between &lt;strong&gt;reproducibility&lt;/strong&gt; and &lt;strong&gt;falsifiability&lt;/strong&gt;. Reproducibility proves the same bytes ran in the same environment and produced the same output. It does not prove that the output was &lt;em&gt;meaningful&lt;/em&gt;. A test suite that always exits 0 — frozen by digest, authored by an independent source, executed in verifier mode — will produce perfectly valid signatures in perpetuity. Every digest will match. Every chain will verify. Nothing will be tested.&lt;/p&gt;

&lt;p&gt;Mikhail, who has contributed some of the most precise protocol-design insights in the entire thread, captured this with an aphorism that has become our design principle: &lt;strong&gt;immutable evidence ≠ immutable truth.&lt;/strong&gt; A receipt can prove a thing happened. It cannot prove the thing was right.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Missing Layer: Negative Controls
&lt;/h2&gt;

&lt;p&gt;The fintech engineer's response to his own bug was elegant in its simplicity: &lt;strong&gt;every guard must declare a negative control that must exit non-zero.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is not a nice-to-have. It is a prerequisite for meaningful verification. A check that cannot demonstrate it &lt;em&gt;can&lt;/em&gt; fail is a check whose passing results tell you nothing.&lt;/p&gt;

&lt;p&gt;In protocol terms, this translates to what we're now calling &lt;strong&gt;dual-arm verification&lt;/strong&gt;. Any claim-bearing receipt must reference two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arm 1&lt;/strong&gt;: A pinned test suite that passes (proves the system works on the happy path)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arm 2&lt;/strong&gt;: A pinned mutant or negative control that fails (proves the instrumentation has discriminative power)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The verifier checks both arms independently. Arm 1 passing proves the claim is &lt;em&gt;consistent&lt;/em&gt;. Arm 2 failing proves the claim is &lt;em&gt;discriminating&lt;/em&gt;. Either arm failing its expected outcome invalidates the receipt.&lt;/p&gt;

&lt;p&gt;This isn't theoretical. It's been battle-tested. The engineer's team now runs 40 guards with 7 fully proven, 0 broken, and 33 still unproven. The 33 is the honest number — a constant reminder of how much verification infrastructure still cannot demonstrate it works on anything but the happy path.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Four Layers of Verification Trust
&lt;/h2&gt;

&lt;p&gt;After integrating feedback from the entire thread, here's how we've come to understand the verification stack for AI agent work:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Solution Layer&lt;/th&gt;
&lt;th&gt;What It Proves&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Does this check have discriminative power?"&lt;/td&gt;
&lt;td&gt;Negative controls&lt;/td&gt;
&lt;td&gt;The checker can actually fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Was this the check that was actually run?"&lt;/td&gt;
&lt;td&gt;Receipt chain (digest binding)&lt;/td&gt;
&lt;td&gt;The claimed execution matches the actual execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Was the result altered after execution?"&lt;/td&gt;
&lt;td&gt;Cryptographic signatures&lt;/td&gt;
&lt;td&gt;Integrity of the evidence chain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Who authorized this check to run in the first place?"&lt;/td&gt;
&lt;td&gt;PolicyDecision (capability grant)&lt;/td&gt;
&lt;td&gt;Authority, scope, and time window&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each layer solves a failure mode that the layer below it cannot see. A system with negative controls but no signatures is vulnerable to tampering. A system with signatures but no negative controls is vulnerable to — well, to &lt;code&gt;ln.strip()&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means for AI Agent Verification
&lt;/h2&gt;

&lt;p&gt;The AI agent ecosystem is rapidly building infrastructure for connecting agents to tools (MCP) and agents to agents (A2A). But neither protocol addresses the verification gap. They answer &lt;em&gt;what an agent can do&lt;/em&gt;. They don't answer &lt;em&gt;whether what it did was correct, authorized, and auditable.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is where verification protocols like OpenWorkProof enter the picture. But the key insight from this community discussion is that &lt;strong&gt;verification without falsifiability is theater.&lt;/strong&gt; A receipt chain that can't distinguish between "the check ran" and "the check worked" is just expensive logging.&lt;/p&gt;

&lt;p&gt;The minimum viable verification stack for any AI agent producing claims is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Negative controls&lt;/strong&gt; that prove the verification instrumentation itself can detect failure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receipt chains&lt;/strong&gt; that bind every execution step to a specific config, environment, and authorization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independent recomposition&lt;/strong&gt; that allows any third party to reconstruct the execution environment and re-verify without trusting the original executor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retraction receipts&lt;/strong&gt; that allow previously accepted claims to be marked as refuted — because even correctly verified claims can become wrong as context shifts&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Thanks to Tom Jones, ANP2, Mikhail, Giulio D'Erme, Zira, Brian Jin, Puneet, and the rest of the LinkedIn thread for the feedback that drove these insights.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
