<?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: Bobai Kato</title>
    <description>The latest articles on DEV Community by Bobai Kato (@bobaikato).</description>
    <link>https://dev.to/bobaikato</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%2F661554%2F4a338586-db17-473a-9765-46cf00fc51bd.jpg</url>
      <title>DEV Community: Bobai Kato</title>
      <link>https://dev.to/bobaikato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bobaikato"/>
    <language>en</language>
    <item>
      <title>mise Resolves Tools. Ota Governs Repository Acceptance.</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Mon, 27 Jul 2026 12:25:30 +0000</pubDate>
      <link>https://dev.to/otaready/mise-resolves-tools-ota-governs-repository-acceptance-3c39</link>
      <guid>https://dev.to/otaready/mise-resolves-tools-ota-governs-repository-acceptance-3c39</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mise&lt;/code&gt; is one of the cleanest ways to make a repository's tool environment explicit.&lt;/p&gt;

&lt;p&gt;It can tell contributors, CI, and agents which runtime versions and command environment a project expects.&lt;/p&gt;

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

&lt;p&gt;But a resolved environment is not the same thing as accepted repository execution.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mise&lt;/code&gt; helps answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which tools and versions should this repo use?&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Is the selected repo path ready, safe, canonical, and verified?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those two layers work well together because they solve different parts of the same operational problem.&lt;/p&gt;

&lt;p&gt;For modern repositories, especially ones touched by AI agents, that distinction matters. The failure is not always "wrong Node version" or "missing Python". Many repo failures happen after the right tools are already present.&lt;/p&gt;

&lt;p&gt;The repo still needs to declare setup, task truth, readiness, verification, agent safety, runtime mode, and proof boundaries.&lt;/p&gt;

&lt;p&gt;That is Ota's layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What mise Is Good At
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mise.jdx.dev/" rel="noopener noreferrer"&gt;mise&lt;/a&gt; is good at environment and tool resolution.&lt;/p&gt;

&lt;p&gt;It gives a repo a compact way to declare things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which Node version should be used&lt;/li&gt;
&lt;li&gt;which Python, Go, Ruby, or other tools matter&lt;/li&gt;
&lt;li&gt;which tool versions should be installed or activated&lt;/li&gt;
&lt;li&gt;which command environment should be entered&lt;/li&gt;
&lt;li&gt;which repo-owned task aliases should exist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is valuable for contributors and agents because it reduces host guesswork.&lt;/p&gt;

&lt;p&gt;Without a tool manager, a new contributor may have the wrong runtime, a stale global binary, or an old package manager sitting on &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;mise&lt;/code&gt;, the repo can make more of that explicit.&lt;/p&gt;

&lt;p&gt;That is a strong foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Environment Resolution Stops
&lt;/h2&gt;

&lt;p&gt;The problem starts when teams treat environment resolution as repository acceptance.&lt;/p&gt;

&lt;p&gt;They are not the same thing.&lt;/p&gt;

&lt;p&gt;The right tools can be installed and the repo can still be ambiguous about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which setup path is canonical&lt;/li&gt;
&lt;li&gt;whether dependencies have been hydrated&lt;/li&gt;
&lt;li&gt;whether services are required&lt;/li&gt;
&lt;li&gt;whether &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;check&lt;/code&gt;, &lt;code&gt;ci&lt;/code&gt;, or &lt;code&gt;verify&lt;/code&gt; is the accepted lane&lt;/li&gt;
&lt;li&gt;whether local and CI execution agree&lt;/li&gt;
&lt;li&gt;whether a task is safe for an agent&lt;/li&gt;
&lt;li&gt;whether a green command proves a narrow slice or the full repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;mise&lt;/code&gt; can help run commands in the right environment. It does not, by itself, decide which command should count as the repo's acceptance path.&lt;/p&gt;

&lt;p&gt;That is not a weakness in &lt;code&gt;mise&lt;/code&gt;. It is a layer boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repository Acceptance Is A Different Contract
&lt;/h2&gt;

&lt;p&gt;Repository acceptance means the repo can answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what must exist before work begins&lt;/li&gt;
&lt;li&gt;how prerequisites are materialized&lt;/li&gt;
&lt;li&gt;which task or workflow is canonical&lt;/li&gt;
&lt;li&gt;which runtime mode is selected&lt;/li&gt;
&lt;li&gt;what readiness means&lt;/li&gt;
&lt;li&gt;what proof was produced&lt;/li&gt;
&lt;li&gt;what was explicitly not proved&lt;/li&gt;
&lt;li&gt;what an AI agent is allowed to run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why Ota uses &lt;code&gt;ota.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The contract is not just a list of commands. It is an operating model for the repo.&lt;/p&gt;

&lt;p&gt;Ota can declare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;toolchains&lt;/li&gt;
&lt;li&gt;setup and dependency hydration&lt;/li&gt;
&lt;li&gt;tasks and workflows&lt;/li&gt;
&lt;li&gt;native and container modes&lt;/li&gt;
&lt;li&gt;services and readiness checks&lt;/li&gt;
&lt;li&gt;safe tasks for agents&lt;/li&gt;
&lt;li&gt;protected and writable paths&lt;/li&gt;
&lt;li&gt;proof and receipt output&lt;/li&gt;
&lt;li&gt;CI drift and governance findings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives the repo a shared acceptance surface for humans, CI, and agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Strongest Shape: mise For Tools, Ota For Acceptance
&lt;/h2&gt;

&lt;p&gt;The mature pattern is not "Ota instead of mise."&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mise&lt;/code&gt; owns tool and environment resolution where the repo uses it.&lt;/li&gt;
&lt;li&gt;Ota owns repository readiness, canonical tasks, execution boundaries, and acceptance proof.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That lets each layer do its real job.&lt;/p&gt;

&lt;p&gt;If a repo already uses &lt;code&gt;mise.toml&lt;/code&gt;, Ota should not flatten that truth into vague shell glue. The contract should preserve that &lt;code&gt;mise&lt;/code&gt; is the environment authority, then model what the repo does inside that environment.&lt;/p&gt;

&lt;p&gt;For example:&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;orchestrators&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mise&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mise&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;config_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;mise.toml&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;activation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;trust&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;prepare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;install&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;toolchains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;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;22"&lt;/span&gt;
    &lt;span class="na"&gt;fulfillment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mise&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;run&lt;/span&gt;

&lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run the accepted verification lane&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm&lt;/span&gt;
      &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
    &lt;span class="na"&gt;execution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;orchestrator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mise&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;exec&lt;/span&gt;
    &lt;span class="na"&gt;safe_for_agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here &lt;code&gt;mise&lt;/code&gt; owns tool activation and the runner invokes &lt;code&gt;pnpm test&lt;/code&gt; through &lt;code&gt;mise exec&lt;/code&gt;. Ota still owns the selected verification lane and its agent-admission posture. The point is not that every repo should use this exact shape; it is that the environment authority remains explicit instead of being hidden in shell glue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters For AI Agents
&lt;/h2&gt;

&lt;p&gt;AI agents are bad at unspoken repository assumptions.&lt;/p&gt;

&lt;p&gt;They can read many files, but reading more does not create authority.&lt;/p&gt;

&lt;p&gt;If the repo has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;code&gt;mise.toml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;a README command&lt;/li&gt;
&lt;li&gt;a package script&lt;/li&gt;
&lt;li&gt;a CI workflow&lt;/li&gt;
&lt;li&gt;an &lt;code&gt;AGENTS.md&lt;/code&gt; instruction&lt;/li&gt;
&lt;li&gt;a local shell wrapper&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the agent still has to decide which signal is authoritative.&lt;/p&gt;

&lt;p&gt;That is where Ota helps. It can detect and surface repo evidence, but the &lt;a href="https://ota.run/docs/reference/contract" rel="noopener noreferrer"&gt;Ota contract reference&lt;/a&gt; gives the final declared path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run &lt;code&gt;ota doctor&lt;/code&gt; to inspect readiness&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;ota tasks --use&lt;/code&gt; to see canonical usage&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;ota up&lt;/code&gt; to prepare the selected path&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;ota run verify --agent&lt;/code&gt; when the task is admitted for agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent does not have to infer from scattered signals. It follows the repo contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safe Environment Resolution Is Not Safe Execution
&lt;/h2&gt;

&lt;p&gt;There is a safety distinction here too.&lt;/p&gt;

&lt;p&gt;A correctly resolved environment does not make every command safe.&lt;/p&gt;

&lt;p&gt;An agent inside the right &lt;code&gt;mise&lt;/code&gt; environment can still run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a destructive migration&lt;/li&gt;
&lt;li&gt;a publish command&lt;/li&gt;
&lt;li&gt;a broad cleanup script&lt;/li&gt;
&lt;li&gt;a task that mutates external state&lt;/li&gt;
&lt;li&gt;a verification lane that assumes secrets or live services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tool correctness is not execution permission.&lt;/p&gt;

&lt;p&gt;Ota's agent boundary exists because safe execution needs more than the right runtime. It needs a declared safe surface and a runner that can enforce it.&lt;/p&gt;

&lt;p&gt;That is why Ota separates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;human command usage&lt;/li&gt;
&lt;li&gt;agent-admitted command usage&lt;/li&gt;
&lt;li&gt;safe task closure&lt;/li&gt;
&lt;li&gt;effects and protected paths&lt;/li&gt;
&lt;li&gt;proof and refusal output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;mise&lt;/code&gt; can make the environment correct. Ota's contract declares what the selected path may claim as safe, ready, and proved; Ota evaluates that claim and carries its explicit proof boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Ota Uses mise Evidence
&lt;/h2&gt;

&lt;p&gt;When Ota sees &lt;code&gt;mise.toml&lt;/code&gt;, it does not treat it as random configuration.&lt;/p&gt;

&lt;p&gt;It treats supported tool declarations as repo-owned evidence with provenance.&lt;/p&gt;

&lt;p&gt;That evidence can help answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which toolchains are expected&lt;/li&gt;
&lt;li&gt;which versions are pinned or ranged&lt;/li&gt;
&lt;li&gt;whether the contract's declared runtime differs from the repo-owned tool source&lt;/li&gt;
&lt;li&gt;whether a declared task is explicitly mediated by &lt;code&gt;mise&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;whether supported CI and contract evidence disagree&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But Ota should stay honest.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mise.toml&lt;/code&gt; is strong evidence for environment resolution. It is not complete evidence for repository acceptance.&lt;/p&gt;

&lt;p&gt;That means Ota should preserve provenance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mise&lt;/code&gt; evidence can support toolchain truth and reveal runtime drift&lt;/li&gt;
&lt;li&gt;the contract still owns selected setup, tasks, workflows, and proof&lt;/li&gt;
&lt;li&gt;a task runs through &lt;code&gt;mise&lt;/code&gt; only when its contract declares the mise orchestrator&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;doctor&lt;/code&gt; surfaces conflicts Ota can establish from supported repo-owned sources&lt;/li&gt;
&lt;li&gt;unsupported or ambiguous claims should remain visible instead of inferred away&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between helpful detection and overconfident automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Looks Like In Practice
&lt;/h2&gt;

&lt;p&gt;In a serious repo, the flow should feel boring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota doctor
ota tasks &lt;span class="nt"&gt;--use&lt;/span&gt;
ota up
ota run verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the contract declares &lt;code&gt;mise&lt;/code&gt; as the selected task orchestrator, Ota invokes the task through&lt;br&gt;
&lt;code&gt;mise&lt;/code&gt; on that path.&lt;/p&gt;

&lt;p&gt;If the host runtime differs from a high-confidence &lt;code&gt;mise.toml&lt;/code&gt; declaration, &lt;code&gt;doctor&lt;/code&gt; can name that&lt;br&gt;
drift. It does not silently convert a host mismatch into acceptance: the selected task must still&lt;br&gt;
run and produce its declared evidence.&lt;/p&gt;

&lt;p&gt;Where Ota can recover both CI and toolchain evidence, it can surface a supported conflict rather&lt;br&gt;
than asking an operator to reconstruct it from a later failing build.&lt;/p&gt;

&lt;p&gt;If a task only works because a developer already has a warmed environment, Ota should not call that accepted readiness.&lt;/p&gt;

&lt;p&gt;The goal is not more YAML for its own sake. The goal is fewer hidden assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Clear Boundary
&lt;/h2&gt;

&lt;p&gt;The clean distinction is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mise&lt;/code&gt; resolves the environment.&lt;/li&gt;
&lt;li&gt;Ota governs repository acceptance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means &lt;code&gt;mise&lt;/code&gt; can be a strong input to Ota, but it should not be forced to carry all execution meaning.&lt;/p&gt;

&lt;p&gt;Do not overload an environment manager with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;agent safety&lt;/li&gt;
&lt;li&gt;proof breadth&lt;/li&gt;
&lt;li&gt;readiness semantics&lt;/li&gt;
&lt;li&gt;CI drift governance&lt;/li&gt;
&lt;li&gt;protected path policy&lt;/li&gt;
&lt;li&gt;runtime receipts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are Ota concerns.&lt;/p&gt;

&lt;p&gt;The repo needs both layers when it wants both reliable environments and trustworthy execution.&lt;/p&gt;

&lt;p&gt;Read the &lt;a href="https://ota.run/docs/reference/command" rel="noopener noreferrer"&gt;Ota command reference&lt;/a&gt; for the doctor, preparation,&lt;br&gt;
and execution surfaces that apply the contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  When To Use Ota With mise
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;mise&lt;/code&gt; when the repo needs strong tool and environment resolution.&lt;/p&gt;

&lt;p&gt;Use Ota when the repo needs to make that environment operationally useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accepted setup&lt;/li&gt;
&lt;li&gt;canonical tasks&lt;/li&gt;
&lt;li&gt;safe agent lanes&lt;/li&gt;
&lt;li&gt;verification after changes&lt;/li&gt;
&lt;li&gt;local and CI alignment&lt;/li&gt;
&lt;li&gt;machine-readable proof&lt;/li&gt;
&lt;li&gt;bounded claims about what passed and what did not&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For AI-agent work, that combination is stronger than either layer alone.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mise&lt;/code&gt; gets the agent into the declared environment. Ota tells it which lane is admitted, what that&lt;br&gt;
lane must prove, and where the claim ends. Environment resolution is necessary; repository&lt;br&gt;
acceptance is the bar.&lt;/p&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/mise-resolves-tools-ota-governs-repository-acceptance" rel="noopener noreferrer"&gt;https://ota.run/blog/mise-resolves-tools-ota-governs-repository-acceptance&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mise</category>
      <category>reporeadiness</category>
      <category>environmentmanagement</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>AI Agent Contracts Cannot Define Repository Acceptance</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Sat, 25 Jul 2026 17:00:13 +0000</pubDate>
      <link>https://dev.to/otaready/ai-agent-contracts-cannot-define-repository-acceptance-19fk</link>
      <guid>https://dev.to/otaready/ai-agent-contracts-cannot-define-repository-acceptance-19fk</guid>
      <description>&lt;h2&gt;
  
  
  The Missing Half Of An Agent Contract
&lt;/h2&gt;

&lt;p&gt;Most agent contracts answer an important question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How should an agent change this repository?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They can protect sensitive directories, ask for smaller diffs, require a handoff, and tell an&lt;br&gt;
agent when to stop and ask a human.&lt;/p&gt;

&lt;p&gt;But a repository has a second question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What must happen before this change counts as accepted?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not a writing-style question. It is an execution question: the setup path, the selected&lt;br&gt;
services, the canonical verification lane, the execution mode, and the evidence a green result&lt;br&gt;
actually carries.&lt;/p&gt;

&lt;p&gt;An agent contract can guide edits. It cannot, by itself, define repository acceptance.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Failure Mode
&lt;/h2&gt;

&lt;p&gt;Consider an agent contract that says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; Do not edit generated clients.
&lt;span class="p"&gt;-&lt;/span&gt; Keep migrations small and explain them.
&lt;span class="p"&gt;-&lt;/span&gt; Run tests before handoff.
&lt;span class="p"&gt;-&lt;/span&gt; Ask before changing infrastructure.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are good contribution rules. They do not answer whether “run tests” means &lt;code&gt;pnpm test&lt;/code&gt;, a&lt;br&gt;
service-backed workflow, a container lane, or CI's actual verification closure. They do not say&lt;br&gt;
whether dependencies are materialized, a database is ready, or a zero exit proves more than one&lt;br&gt;
narrow check.&lt;/p&gt;

&lt;p&gt;The dangerous outcome is a plausible handoff: the agent followed the instructions, ran a command,&lt;br&gt;
and reported success. Nobody can tell whether it used the accepted path.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ota Defines The Acceptance Path
&lt;/h2&gt;

&lt;p&gt;Ota gives that operational truth a machine-readable home in &lt;code&gt;ota.yaml&lt;/code&gt;:&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;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;prepare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dependency_hydration&lt;/span&gt;
      &lt;span class="na"&gt;medium&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;package_dependencies&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node_package_manager&lt;/span&gt;
        &lt;span class="na"&gt;manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;install&lt;/span&gt;
        &lt;span class="na"&gt;frozen_lockfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

  &lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm&lt;/span&gt;
      &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;safe_for_agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;safe_tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;verify&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;verify_after_changes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;verify&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not an instruction to “remember to install dependencies.” It declares one accepted setup&lt;br&gt;
and verification path that Ota can inspect, dry-run, execute, and record.&lt;/p&gt;

&lt;p&gt;An agent can discover the declared surface, then execute it through the enforced lane:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota doctor
ota tasks &lt;span class="nt"&gt;--safe&lt;/span&gt; &lt;span class="nt"&gt;--use&lt;/span&gt;
ota run verify &lt;span class="nt"&gt;--agent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important distinction is that &lt;code&gt;--agent&lt;/code&gt; asks Ota to resolve the selected task closure before&lt;br&gt;
anything starts. If the requested task, dependency, or workflow path is outside the effective safe&lt;br&gt;
surface, Ota refuses it and emits a structured result rather than relying on the agent to obey&lt;br&gt;
prose.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Boundary Is Real, But Scoped
&lt;/h2&gt;

&lt;p&gt;Ota does not claim to sandbox every process an agent could launch. An agent with unrestricted shell&lt;br&gt;
access can still bypass Ota by not using it.&lt;/p&gt;

&lt;p&gt;The enforcement point is the Ota runner boundary: &lt;code&gt;ota run &amp;lt;task&amp;gt; --agent&lt;/code&gt; and, for an&lt;br&gt;
agent-admitted workflow, &lt;code&gt;ota up --workflow &amp;lt;name&amp;gt; --agent&lt;/code&gt;. That gives developers and CI fast,&lt;br&gt;
inspectable execution control now. A stronger organization-wide boundary comes when CI gates and&lt;br&gt;
agent harnesses consume the same contract truth.&lt;/p&gt;

&lt;p&gt;That honesty matters. A declared safe task is useful; a runner that refuses an unsafe closure is&lt;br&gt;
stronger; an org-level harness or merge gate that requires the same result is stronger again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Contracts, Two Jobs
&lt;/h2&gt;

&lt;p&gt;Use an agent contract for contribution behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;editing and review rules&lt;/li&gt;
&lt;li&gt;sensitive files and escalation&lt;/li&gt;
&lt;li&gt;coding conventions and handoff expectations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use Ota for repository acceptance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dependency hydration and setup order&lt;/li&gt;
&lt;li&gt;services, readiness, tasks, and workflows&lt;/li&gt;
&lt;li&gt;native or container execution selection&lt;/li&gt;
&lt;li&gt;agent-admitted execution paths&lt;/li&gt;
&lt;li&gt;receipts, proof boundaries, and CI drift checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither replaces the other. A repository with only agent guidance still asks the agent to infer&lt;br&gt;
how the software runs. A repository with only Ota can still need human collaboration rules.&lt;/p&gt;

&lt;p&gt;The durable model is simple: let the agent contract govern edits, and let Ota govern whether the&lt;br&gt;
repository was prepared, verified, and evidenced through an accepted path.&lt;/p&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/ai-agent-contracts-cannot-define-repository-acceptance" rel="noopener noreferrer"&gt;https://ota.run/blog/ai-agent-contracts-cannot-define-repository-acceptance&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agentcontract</category>
      <category>aiagents</category>
      <category>reporeadiness</category>
      <category>agentsafety</category>
    </item>
    <item>
      <title>Testing the Proof System: Negative Controls and Dependency Evidence in Ota</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Fri, 24 Jul 2026 14:37:52 +0000</pubDate>
      <link>https://dev.to/otaready/testing-the-proof-system-negative-controls-and-dependency-evidence-in-ota-38mp</link>
      <guid>https://dev.to/otaready/testing-the-proof-system-negative-controls-and-dependency-evidence-in-ota-38mp</guid>
      <description>&lt;h2&gt;
  
  
  A green call does not prove the dependency mattered
&lt;/h2&gt;

&lt;p&gt;A service can be reachable without being exercised. An application can call a dependency without&lt;br&gt;
proving the dependency shaped the tested obligation. A control can fail for an unrelated reason.&lt;/p&gt;

&lt;p&gt;Flatten those outcomes into one green or red status and a proof system will eventually claim more&lt;br&gt;
than it observed.&lt;/p&gt;

&lt;p&gt;Ota &lt;code&gt;1.6.24&lt;/code&gt; separates three levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;reachable&lt;/code&gt;: the selected path reached a declared dependency boundary;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;exercised&lt;/code&gt;: a finite observer recovered evidence produced through that dependency in the current
proof transaction;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fault_tested&lt;/code&gt;: a separate control proved the same obligation failed for the declared
missing-effect reason.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each level answers a different question. None may be inferred from a command label or exit code.&lt;/p&gt;
&lt;h2&gt;
  
  
  The contract names the seam and the control
&lt;/h2&gt;

&lt;p&gt;The runtime workflow declares the positive observation and the negative control independently:&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;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-proof&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
    &lt;span class="na"&gt;readiness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;surfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;proof&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;seam_observations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres-marker&lt;/span&gt;
          &lt;span class="na"&gt;dependency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
          &lt;span class="na"&gt;producer_task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;proof:marker-produce&lt;/span&gt;
          &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;proof:marker-observe&lt;/span&gt;
          &lt;span class="na"&gt;marker_env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OTA_PROOF_DEPENDENCY_MARKER&lt;/span&gt;
      &lt;span class="na"&gt;negative_controls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres-unavailable&lt;/span&gt;
          &lt;span class="na"&gt;dependency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
          &lt;span class="na"&gt;obligation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres-marker&lt;/span&gt;
          &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;proof:postgres-unavailable&lt;/span&gt;
          &lt;span class="na"&gt;intervention&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dependency_endpoint_override&lt;/span&gt;
          &lt;span class="na"&gt;expected_failure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dependency_unavailable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the ordinary proof first. Select the control explicitly when the causal claim is required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota proof runtime &lt;span class="nt"&gt;--workflow&lt;/span&gt; app-proof &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--archive&lt;/span&gt;
ota proof runtime &lt;span class="nt"&gt;--workflow&lt;/span&gt; app-proof &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--negative-control&lt;/span&gt; postgres-unavailable &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--archive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ota does not silently inject failure into every runtime check. Negative controls are separate proof&lt;br&gt;
runs because they answer a stronger question and may mutate or disrupt the selected dependency.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;exercised&lt;/code&gt; requires current-transaction evidence
&lt;/h2&gt;

&lt;p&gt;The do-nothing observer is the first adversary.&lt;/p&gt;

&lt;p&gt;If an observer can exit zero without reading evidence from the dependency, it has not proved the&lt;br&gt;
seam was exercised. If it can reuse a value from yesterday's run, it has not proved this execution&lt;br&gt;
used the seam.&lt;/p&gt;

&lt;p&gt;For marker-bound observations, Ota creates an opaque marker and gives it only to the declared&lt;br&gt;
producer. The observer receives the transaction context but not the marker. It must recover the&lt;br&gt;
marker through the dependency and write the runner-owned attestation.&lt;/p&gt;

&lt;p&gt;Ota verifies the observation identity, transaction identity, marker, and evidence digest before it&lt;br&gt;
emits &lt;code&gt;level: exercised&lt;/code&gt;. The transient marker is then removed. A clean observer exit, guessed&lt;br&gt;
value, stale record, or caller-side trace cannot earn that level.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;fault_tested&lt;/code&gt; requires the right red
&lt;/h2&gt;

&lt;p&gt;The negative control has its own adversary: an unrelated failure.&lt;/p&gt;

&lt;p&gt;A broken setup step, timeout, DNS failure, crash, or generic non-zero exit may turn the lane red. It&lt;br&gt;
does not prove that removing PostgreSQL invalidated the same obligation that passed in the green&lt;br&gt;
run.&lt;/p&gt;

&lt;p&gt;Ota promotes the seam only when the canonical control record is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bound to the same proof transaction and obligation;&lt;/li&gt;
&lt;li&gt;run under the declared intervention;&lt;/li&gt;
&lt;li&gt;classified as &lt;code&gt;expected_missing_effect&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;backed by a matching failure-attestation digest;&lt;/li&gt;
&lt;li&gt;emitted with &lt;code&gt;status: validated&lt;/code&gt; and &lt;code&gt;outcome: expected_obligation_failed&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dependency record carries only a derived projection of that canonical control. This prevents a&lt;br&gt;
nested object from becoming a second, weaker authority.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependency_evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"dependency_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"service:postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"proof_obligation_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres-marker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fault_tested"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"observation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"origin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"round_trip_effect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"evidence_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"attested"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"negative_control"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"validated"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"same_obligation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"failure_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"expected_missing_effect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"failure_attestation_digest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:..."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Ota cannot validate that chain, the control remains &lt;code&gt;invalid&lt;/code&gt; or &lt;code&gt;unrun&lt;/code&gt;. An unclassified red&lt;br&gt;
never upgrades evidence to &lt;code&gt;fault_tested&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Strong seam proof is still bounded proof
&lt;/h2&gt;

&lt;p&gt;A PostgreSQL marker round trip can establish that the selected obligation depended on PostgreSQL.&lt;br&gt;
It cannot establish that PostgreSQL shaped every response, migration, query result, or user-visible&lt;br&gt;
output in the repository.&lt;/p&gt;

&lt;p&gt;Ota therefore retains the obligation-scoped boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proof_verdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"passed_with_unproven_boundaries"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"not_proved"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dependency_output_shaping_not_proved"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"proof_obligation_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres-marker"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a caveat hidden in prose. It travels with the artifact so CI and agents cannot honestly&lt;br&gt;
turn one controlled seam into repo-global proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Athena API supplied the real pressure
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/bobaikato/athena-api" rel="noopener noreferrer"&gt;athena-api&lt;/a&gt; forced this model through a Rails and&lt;br&gt;
PostgreSQL runtime rather than a synthetic fixture. Its released Ota &lt;code&gt;1.6.24&lt;/code&gt; matrix&lt;br&gt;
&lt;a href="https://github.com/bobaikato/athena-api/actions/runs/29572074325" rel="noopener noreferrer"&gt;run #29572074325&lt;/a&gt; proved native and&lt;br&gt;
container lanes while keeping Windows intentionally static. The later PostgreSQL pressure retained&lt;br&gt;
&lt;code&gt;dependency_output_shaping_not_proved&lt;/code&gt; even after the marker-bound seam and matching control became&lt;br&gt;
stronger.&lt;/p&gt;

&lt;p&gt;Read the full engineering note: &lt;a href="https://ota.run/blog/pressure-testing-ota-on-athena-api-2t6k" rel="noopener noreferrer"&gt;Pressure-testing Ota on athena-api&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design rule
&lt;/h2&gt;

&lt;p&gt;Proof must be able to fail its own strongest claim.&lt;/p&gt;

&lt;p&gt;Reachability proves contact. Transaction-bound observation proves the selected seam was exercised.&lt;br&gt;
A validated same-obligation control proves the dependency was necessary for that obligation. Ota&lt;br&gt;
keeps those claims separate because automation becomes dangerous when evidence levels collapse into&lt;br&gt;
one optimistic green.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/runtime-proof-evidence" rel="noopener noreferrer"&gt;Runtime Proof Evidence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/contract" rel="noopener noreferrer"&gt;Contract Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/json-output" rel="noopener noreferrer"&gt;JSON Output Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/execution-receipt" rel="noopener noreferrer"&gt;Execution Receipt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/releases/v1.6.24" rel="noopener noreferrer"&gt;Ota v1.6.24&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally published here: &lt;a href="https://ota.run/blog/testing-the-proof-system-negative-controls-and-dependency-evidence" rel="noopener noreferrer"&gt;https://ota.run/blog/testing-the-proof-system-negative-controls-and-dependency-evidence&lt;/a&gt; &lt;/p&gt;

</description>
      <category>negativecontrols</category>
      <category>dependencyevidence</category>
      <category>runtimeproof</category>
      <category>testing</category>
    </item>
    <item>
      <title>Ota 1.6.24: Replayable Proof for Real Repository Execution</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Wed, 22 Jul 2026 20:49:31 +0000</pubDate>
      <link>https://dev.to/otaready/ota-1624-replayable-proof-for-real-repository-execution-1f85</link>
      <guid>https://dev.to/otaready/ota-1624-replayable-proof-for-real-repository-execution-1f85</guid>
      <description>&lt;h2&gt;
  
  
  A rerun is not automatically a replay
&lt;/h2&gt;

&lt;p&gt;Running the same command twice does not prove that the same execution happened twice.&lt;/p&gt;

&lt;p&gt;The contract may have changed. A lockfile may have moved. CI may have selected another backend. A&lt;br&gt;
live API may have returned different state. Even a green result can describe a different operational&lt;br&gt;
world.&lt;/p&gt;

&lt;p&gt;Ota 1.6.24 takes a strict position: &lt;strong&gt;replay is a comparison against an archived execution witness,&lt;br&gt;
not a synonym for rerun&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The selected workflow, backend, provider, lifecycle, contract snapshot, and captured inputs must be&lt;br&gt;
comparable before Ota will call the result verified.&lt;/p&gt;
&lt;h2&gt;
  
  
  The command starts from an archived witness
&lt;/h2&gt;

&lt;p&gt;Archive the original execution receipt, then select it as the replay baseline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota up &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="nt"&gt;--json&lt;/span&gt;
ota receipt &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--archive&lt;/span&gt;
ota up &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="nt"&gt;--replay-baseline&lt;/span&gt; latest &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The replay result is explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;replay_verified&lt;/code&gt;: the selected scope reconciled with the baseline;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;replay_failed&lt;/code&gt;: comparable execution produced material drift or failure;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;replay_unavailable&lt;/code&gt;: Ota could not make an honest comparison.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;replay_unavailable&lt;/code&gt; is not a weak error message. It is a trust boundary. A baseline from another&lt;br&gt;
workflow, backend, provider, remote target, or lifecycle must not be promoted to last-known-good&lt;br&gt;
evidence for the selected lane.&lt;/p&gt;
&lt;h2&gt;
  
  
  Declare inputs separately from observed behavior
&lt;/h2&gt;

&lt;p&gt;Ota contracts can name the repo-owned artifacts that define a replay lane:&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;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;gate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;replay_inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recorded_sql&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;static_file&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data/fixture.jsonl&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;frozen_store&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;static_file&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data/store.db&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;runtime-presentation&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;presentation_profile&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replay/presentation-profile.yaml&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;equivalence&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;comparator_profile&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replay/comparator-profile.yaml&lt;/span&gt;
    &lt;span class="na"&gt;witnessed_observations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;query_traces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recorded_queries&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;evidence/query-trace.jsonl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are not interchangeable fields.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;replay_inputs[]&lt;/code&gt; records what the selected lane consumed before execution.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;witnessed_observations.query_traces[]&lt;/code&gt; records behavior observed from an execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If observed SQL is silently treated as a current-run input, the replay can confirm itself. Ota&lt;br&gt;
keeps the evidence linked but separate so a later comparison can distinguish changed inputs from&lt;br&gt;
changed behavior.&lt;/p&gt;

&lt;p&gt;In 1.6.24, Ota captures the observed SHA-256 identity of each declared replay input. That tells a&lt;br&gt;
later replay exactly which bytes the original lane used and exposes identity drift between receipts.&lt;br&gt;
It does not let the 1.6.24 contract declare an expected digest that blocks the very first execution.&lt;br&gt;
That distinction matters: observed identity is execution evidence, not a maintainer-authored pin.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a verified replay actually says
&lt;/h2&gt;

&lt;p&gt;A verified replay says that Ota reconciled the selected execution scope and the named evidence it&lt;br&gt;
knows how to compare. It does not automatically mean the lane was hermetic.&lt;/p&gt;

&lt;p&gt;Matching static inputs remain scoped evidence. Undeclared environment state, live services, remote&lt;br&gt;
APIs, clocks, randomness, and other ambient inputs can still matter. Ota therefore reports replay&lt;br&gt;
posture and hermeticity separately instead of turning one matching hash into a repo-wide claim.&lt;/p&gt;

&lt;p&gt;The machine consumer should inspect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"replay"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"posture"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replay_verified"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hermeticity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"partly_ambient"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"baseline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"last_known_good"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replay_verified"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact payload contains more scope and comparison detail. The important point is that&lt;br&gt;
&lt;code&gt;replay_verified&lt;/code&gt; and &lt;code&gt;partly_ambient&lt;/code&gt; can both be true. One describes the comparison Ota completed;&lt;br&gt;
the other prevents that result from claiming the rest of the world was frozen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bedrock made the distinction concrete
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/vinimabreu/bedrock" rel="noopener noreferrer"&gt;Bedrock&lt;/a&gt;, created by Vinicius Pereira, is a natural-language&lt;br&gt;
to SQL stability harness. Its deterministic lane consumes a recorded SQL fixture, a frozen SQLite&lt;br&gt;
store, and a defended baseline. The SQL records also contain useful witnessed query behavior.&lt;/p&gt;

&lt;p&gt;That repo forced the product question: should historical model output become a replay input, or&lt;br&gt;
remain witnessed evidence?&lt;/p&gt;

&lt;p&gt;Ota keeps both roles explicit. The released-version pressure matrix passed native Ubuntu, macOS,&lt;br&gt;
Windows, and the container replay lane in&lt;br&gt;
&lt;a href="https://github.com/bobaikato/bedrock/actions/runs/29572073749" rel="noopener noreferrer"&gt;run #29572073749&lt;/a&gt;. That matrix proves&lt;br&gt;
the bounded offline replay path. It does not prove Bedrock's live model-recording lane or a live&lt;br&gt;
database.&lt;/p&gt;

&lt;p&gt;Read the full engineering note: &lt;a href="https://ota.run/blog/pressure-testing-ota-on-bedrock-4b7q" rel="noopener noreferrer"&gt;Pressure-testing Ota on Bedrock: query identity as replay&lt;br&gt;
evidence&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The operational rule
&lt;/h2&gt;

&lt;p&gt;Use replay when you need to answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did this selected execution still hold against the archived contract, scope, and named inputs?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Do not use it to imply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nothing outside this receipt could have affected the result.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction is why Ota archives execution evidence, preserves semantic contract identity, and&lt;br&gt;
publishes unavailable or partly ambient outcomes instead of manufacturing certainty.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/execution-receipt" rel="noopener noreferrer"&gt;Execution Receipt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/semantic-snapshots-and-correlation" rel="noopener noreferrer"&gt;Semantic Snapshots and Correlation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/contract" rel="noopener noreferrer"&gt;Contract Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/json-output" rel="noopener noreferrer"&gt;JSON Output Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/releases/v1.6.24" rel="noopener noreferrer"&gt;Ota v1.6.24&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/ota-v1-6-24-replayable-proof-for-real-repository-execution" rel="noopener noreferrer"&gt;https://ota.run/blog/ota-v1-6-24-replayable-proof-for-real-repository-execution&lt;/a&gt; &lt;/p&gt;

</description>
      <category>replay</category>
      <category>executionproof</category>
      <category>receipts</category>
      <category>repositorygovernance</category>
    </item>
    <item>
      <title>Why ok: true Is Not Enough for AI Agent Execution</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Tue, 21 Jul 2026 12:26:17 +0000</pubDate>
      <link>https://dev.to/otaready/why-ok-true-is-not-enough-for-ai-agent-execution-229a</link>
      <guid>https://dev.to/otaready/why-ok-true-is-not-enough-for-ai-agent-execution-229a</guid>
      <description>&lt;h2&gt;
  
  
  A successful command is not broad authorization
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ok: true&lt;/code&gt; answers one useful question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did the selected Ota execution complete successfully?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does not answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did this lane prove every dependency mattered?&lt;/li&gt;
&lt;li&gt;Did it cover every workflow in the repository?&lt;/li&gt;
&lt;li&gt;Did it exercise a live external integration?&lt;/li&gt;
&lt;li&gt;Is an agent now authorized to publish, deploy, or migrate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Humans often carry those distinctions in context. Automated systems usually do not. If the only&lt;br&gt;
machine signal is a Boolean, a narrow green result will eventually be consumed as a broader claim.&lt;/p&gt;

&lt;p&gt;Ota 1.6.24 keeps execution success, proof breadth, and remaining uncertainty separate.&lt;/p&gt;
&lt;h2&gt;
  
  
  Read the proof carrier, not one field
&lt;/h2&gt;

&lt;p&gt;Run the declared workflow through Ota's proof boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota proof runtime &lt;span class="nt"&gt;--workflow&lt;/span&gt; app &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--archive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful but bounded result can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"phase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"readiness"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proof_verdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"passed_with_unproven_boundaries"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proof_scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runtime_path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"proof_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"slice_proof"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workflow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"serve"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"not_proved"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"broader_repo_completion_not_proved"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"relative_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runtime_path"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These fields are intentionally different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ok&lt;/code&gt; reports selected execution success;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;phase&lt;/code&gt; says where that result was established;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proof_verdict&lt;/code&gt; reports the derived proof posture;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proof_scope&lt;/code&gt; names the lane the artifact can speak for;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;not_proved[]&lt;/code&gt; carries material boundaries that remain outside the claim.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An agent that reads only &lt;code&gt;ok&lt;/code&gt; is not consuming the Ota proof contract correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a qualified pass is not a failure
&lt;/h2&gt;

&lt;p&gt;Suppose Ota starts an API and verifies its declared HTTP listener. That is useful runtime evidence.&lt;br&gt;
It may prove the selected service became ready on the declared path.&lt;/p&gt;

&lt;p&gt;It does not automatically prove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a neighbouring release workflow;&lt;/li&gt;
&lt;li&gt;a live payment or model API;&lt;/li&gt;
&lt;li&gt;production data behavior;&lt;/li&gt;
&lt;li&gt;a database's complete output-shaping role;&lt;/li&gt;
&lt;li&gt;repository-wide completion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Returning &lt;code&gt;ok: false&lt;/code&gt; would discard the real success. Returning an unqualified pass would overstate&lt;br&gt;
it. &lt;code&gt;passed_with_unproven_boundaries&lt;/code&gt; preserves both truths.&lt;/p&gt;

&lt;p&gt;The boundary is part of the result, not an apology after it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an agent should do next
&lt;/h2&gt;

&lt;p&gt;An agent or CI integration should evaluate the result in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Require &lt;code&gt;ok: true&lt;/code&gt; for the selected execution.&lt;/li&gt;
&lt;li&gt;Confirm &lt;code&gt;proof_scope&lt;/code&gt; matches the task or workflow it intended to prove.&lt;/li&gt;
&lt;li&gt;Read &lt;code&gt;proof_verdict&lt;/code&gt;; do not translate every green execution into an unqualified proof pass.&lt;/li&gt;
&lt;li&gt;Inspect &lt;code&gt;not_proved[]&lt;/code&gt; for a boundary relevant to the next action.&lt;/li&gt;
&lt;li&gt;Apply policy before crossing into a heavier lane such as deployment, migration, publishing, or
live external effects.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last step matters. Proof and authorization are related, but they are not the same object. A&lt;br&gt;
runtime receipt can establish what happened. It should not silently grant permission for a more&lt;br&gt;
dangerous task.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verdict is derived, not narrated
&lt;/h2&gt;

&lt;p&gt;Ota derives the terminal proof verdict at the decision boundary. A materially bounded proof cannot&lt;br&gt;
serialize as an unqualified pass merely because an output formatter prefers a simpler status.&lt;/p&gt;

&lt;p&gt;The same principle applies to dependency evidence. Caller-side activity, dependency readiness,&lt;br&gt;
transaction-bound exercise, and negative-control causality retain different evidence levels. A&lt;br&gt;
consumer does not get to upgrade them by ignoring the accompanying boundary.&lt;/p&gt;

&lt;p&gt;That is the practical difference between execution logs and governance evidence: the artifact&lt;br&gt;
carries enough structure for another system to refuse an over-broad interpretation.&lt;/p&gt;

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

&lt;p&gt;Ota cannot stop a general-purpose agent from bypassing Ota and invoking an arbitrary shell directly.&lt;br&gt;
The repository contract is the specification; enforcement must also exist at the callable runner,&lt;br&gt;
sandbox, CI, or merge-gate chokepoint.&lt;/p&gt;

&lt;p&gt;Within Ota, agent mode restricts execution to the declared safe closure. Outside Ota, a harness must&lt;br&gt;
expose Ota's governed lanes instead of handing the agent an unrestricted shell and hoping it behaves.&lt;/p&gt;

&lt;p&gt;That boundary is important because &lt;code&gt;ok: true&lt;/code&gt; is evidence, not a universal capability token.&lt;/p&gt;

&lt;h2&gt;
  
  
  The operational rule
&lt;/h2&gt;

&lt;p&gt;For humans, agents, and CI:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Treat &lt;code&gt;ok&lt;/code&gt; as execution status. Treat &lt;code&gt;proof_verdict&lt;/code&gt;, &lt;code&gt;proof_scope&lt;/code&gt;, and &lt;code&gt;not_proved&lt;/code&gt; as the&lt;br&gt;
authority on what that success established.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This makes a green result more useful, not less. It can safely drive automation because its limits&lt;br&gt;
are available to the same machine that reads its success.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/runtime-proof-evidence" rel="noopener noreferrer"&gt;Runtime Proof Evidence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/execution-receipt" rel="noopener noreferrer"&gt;Execution Receipt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/json-output" rel="noopener noreferrer"&gt;JSON Output Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/execution-governance-loop" rel="noopener noreferrer"&gt;Execution Governance Loop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/releases/v1.6.24" rel="noopener noreferrer"&gt;Ota v1.6.24&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/why-ok-true-is-not-enough-for-ai-agent-execution" rel="noopener noreferrer"&gt;https://ota.run/blog/why-ok-true-is-not-enough-for-ai-agent-execution&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>runtimeproof</category>
      <category>governance</category>
      <category>executionsafety</category>
    </item>
    <item>
      <title>Pressure-testing Ota on Open WebUI: proof cleanup ownership, bootstrap truth, and native vs Compose runtime boundaries</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Mon, 20 Jul 2026 18:43:02 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-open-webui-proof-cleanup-ownership-bootstrap-truth-and-native-vs-compose-2ff4</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-open-webui-proof-cleanup-ownership-bootstrap-truth-and-native-vs-compose-2ff4</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Open WebUI exposed a real Ota lifecycle boundary.&lt;/p&gt;

&lt;p&gt;This was not mainly a parsing or contract-shape repo. The contract was already strong enough to model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;source-checkout verification&lt;/li&gt;
&lt;li&gt;packaged native runtime through &lt;code&gt;uv run open-webui serve&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;frontend development runtime&lt;/li&gt;
&lt;li&gt;default Docker Compose runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What the repo exposed was operational truth after proof:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a successful native proof still left a host workload alive&lt;/li&gt;
&lt;li&gt;the first cleanup fix then widened too far and treated a Compose-owned runtime as the same class of host workload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That made Open WebUI a valuable pressure repo.&lt;/p&gt;

&lt;p&gt;It forced Ota to get more precise about cleanup ownership instead of treating all successful runtime proof as one generic teardown problem.&lt;/p&gt;

&lt;p&gt;The current pressure contract pins released Ota &lt;code&gt;v1.6.24&lt;/code&gt;. Its latest green matrix run proves&lt;br&gt;
the release surface at the exact contract and workflow revision linked below.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Open WebUI exposed in Ota
&lt;/h2&gt;

&lt;p&gt;This repo exposed four meaningful weaknesses.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. proof success was weaker than it looked
&lt;/h3&gt;

&lt;p&gt;The first issue was not that runtime proof failed.&lt;/p&gt;

&lt;p&gt;It was that runtime proof succeeded and still left the native workload alive afterward.&lt;/p&gt;

&lt;p&gt;In this repo, the packaged native workflow launches:&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;serve:native&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;launch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;command&lt;/span&gt;
    &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;uv&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;run&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;open-webui&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;serve&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--host&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--port&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ota proved that workflow, but the launched process tree was still alive after proof completed.&lt;/p&gt;

&lt;p&gt;In GitHub Actions, that surfaced through &lt;code&gt;setup-uv&lt;/code&gt; post-job cleanup, which blocked while the &lt;code&gt;uv&lt;/code&gt; cache was still in use.&lt;/p&gt;

&lt;p&gt;That was an Ota gap.&lt;/p&gt;

&lt;p&gt;If proof succeeds but leaves behind repo-owned runtime state that later breaks CI cleanup, the proof surface is still incomplete.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. native service cleanup widened past its real ownership boundary
&lt;/h3&gt;

&lt;p&gt;The first core fix made Ota clean selected native service workloads after successful proof.&lt;/p&gt;

&lt;p&gt;That was directionally correct, but Open WebUI immediately exposed the next boundary.&lt;/p&gt;

&lt;p&gt;The Docker workflow uses a native task shape to launch Compose:&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;compose:up&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;launch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;command&lt;/span&gt;
    &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;compose&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;up&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a native command surface, but it is not the same kind of ownership as a host-managed runtime like &lt;code&gt;uv run open-webui serve&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The first cleanup widening treated it as if Ota should reclaim the resulting listener directly like a host workload. That was too broad.&lt;/p&gt;

&lt;p&gt;This repo made the distinction unavoidable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;host-owned native process workload&lt;/li&gt;
&lt;li&gt;adapter-owned Compose runtime&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  3. contract-owned CI bootstrap truth still matters
&lt;/h3&gt;

&lt;p&gt;The workflow was already using &lt;code&gt;ota-run/setup&lt;/code&gt; with contract mode, which is the right direction.&lt;/p&gt;

&lt;p&gt;The contract bootstrap truth also had to stay aligned so the setup surface consumed the same install story the repo intended to publish.&lt;/p&gt;

&lt;p&gt;That was not the original runtime bug, but it was still real governance drift.&lt;/p&gt;

&lt;p&gt;A pressure repo should not say one thing in &lt;code&gt;ota.yaml&lt;/code&gt; and effectively rely on another in CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. mixed-runtime repos punish vague lifecycle ownership
&lt;/h3&gt;

&lt;p&gt;Open WebUI combines several legitimate paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python ownership through &lt;code&gt;uv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Node ownership for frontend/build work&lt;/li&gt;
&lt;li&gt;a packaged native runtime&lt;/li&gt;
&lt;li&gt;a frontend-only runtime&lt;/li&gt;
&lt;li&gt;a Docker Compose runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination matters because it punishes sloppy lifecycle assumptions quickly.&lt;/p&gt;

&lt;p&gt;If Ota collapses all of that into “run a process and then stop something later,” the product boundary is still too weak.&lt;/p&gt;

&lt;h2&gt;
  
  
  What had to be fixed in Ota core
&lt;/h2&gt;

&lt;p&gt;Open WebUI led to three real Ota fixes.&lt;/p&gt;

&lt;h3&gt;
  
  
  proof success-path cleanup for host-owned native workloads
&lt;/h3&gt;

&lt;p&gt;Ota's proof teardown was tightened so it no longer stops only the outer &lt;code&gt;ota up&lt;/code&gt; process.&lt;/p&gt;

&lt;p&gt;It now also cleans selected native host service workloads that Ota actually owns for the chosen workflow.&lt;/p&gt;

&lt;p&gt;That closes the gap where proof succeeded but left the packaged native runtime process tree alive after completion.&lt;/p&gt;

&lt;h3&gt;
  
  
  cleanup narrowing for Compose-owned runtime lanes
&lt;/h3&gt;

&lt;p&gt;The first cleanup fix exposed a second Ota boundary, and that also had to be corrected.&lt;/p&gt;

&lt;p&gt;Ota now skips that host-workload cleanup path for Compose-owned native service tasks such as &lt;code&gt;docker compose up&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That matters because Compose runtime cleanup belongs to adapter-owned repo cleanup surfaces, not to host-process workload reclamation.&lt;/p&gt;

&lt;p&gt;Without that distinction, Ota was overreaching past the lifecycle it actually owned.&lt;/p&gt;

&lt;h3&gt;
  
  
  proof cleanup now respects workflow-owned active execution scope
&lt;/h3&gt;

&lt;p&gt;The last failure was subtler.&lt;/p&gt;

&lt;p&gt;Docker proof itself was healthy, but teardown still failed because cleanup hit Ota's active execution registry and treated the proved &lt;code&gt;compose:up&lt;/code&gt; service task as an unrelated blocker.&lt;/p&gt;

&lt;p&gt;That was also an Ota gap.&lt;/p&gt;

&lt;p&gt;The selected workflow had launched that runtime, proved it, and was now trying to clean up its own owned execution surface.&lt;/p&gt;

&lt;p&gt;Ota now scopes workflow cleanup to the active execution ownership actually selected by the proof lane.&lt;/p&gt;

&lt;p&gt;That keeps ordinary &lt;code&gt;ota clean&lt;/code&gt; strict while allowing proof teardown to reclaim the workflow-owned execution it just created.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in the contract
&lt;/h2&gt;

&lt;p&gt;The final contract is stronger because it uses cleaner contract-owned truth in the same places where the product now got stronger.&lt;/p&gt;

&lt;p&gt;The packaged native workflow stays explicit:&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;native&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;intent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local_development&lt;/span&gt;
  &lt;span class="na"&gt;prepare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup:env&lt;/span&gt;
  &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;serve:native&lt;/span&gt;
  &lt;span class="na"&gt;readiness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;surfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;native-web&lt;/span&gt;
  &lt;span class="na"&gt;exposes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;surface&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;native-web&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Docker workflow stays separate instead of pretending it is the same runtime family:&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;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;intent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;packaged_runtime&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;compose:up&lt;/span&gt;
  &lt;span class="na"&gt;readiness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;surfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker-web&lt;/span&gt;
  &lt;span class="na"&gt;exposes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;surface&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-web&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That separation matters because the repo is not publishing one runtime claim.&lt;/p&gt;

&lt;p&gt;It is publishing at least two different runtime claims with different lifecycle owners.&lt;/p&gt;

&lt;p&gt;The contract bootstrap truth was also aligned so CI, humans, and agents all read the same Ota install intent from the repo contract.&lt;/p&gt;

&lt;p&gt;The branch carries a &lt;code&gt;1.6.24&lt;/code&gt; contract floor and structured bootstrap source, so CI, humans,&lt;br&gt;
and agents use the same released Ota surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the matrix now proves
&lt;/h2&gt;

&lt;p&gt;The matrix does more than parse the contract, but each OS lane has an explicit scope.&lt;/p&gt;

&lt;p&gt;All three lanes run &lt;code&gt;ota validate&lt;/code&gt;, capture &lt;code&gt;ota doctor&lt;/code&gt;, show task and workflow usage, inspect&lt;br&gt;
execution topology, and dry-run the &lt;code&gt;verify&lt;/code&gt; task and native workflow. They also dry-run the&lt;br&gt;
finite backend-format and frontend-test tasks.&lt;/p&gt;

&lt;p&gt;Ubuntu is the &lt;code&gt;proof&lt;/code&gt; lane. It additionally runs the full frontend verification aggregate, the&lt;br&gt;
finite backend-format and frontend-test tasks, then proves both the packaged native runtime and&lt;br&gt;
the Docker Compose runtime. It also dry-runs the Docker workflow before executing its proof lane.&lt;/p&gt;

&lt;p&gt;macOS and Windows are deliberately &lt;code&gt;audit-only&lt;/code&gt;: they do not claim task execution, native runtime&lt;br&gt;
proof, Compose proof, or Docker-workflow coverage. That is an explicit matrix boundary, not an&lt;br&gt;
implicit gap hidden behind a green OS label.&lt;/p&gt;

&lt;p&gt;The contract also models the frontend development runtime and the Playwright-enabled Compose&lt;br&gt;
overlay. Neither is runtime-proved by this matrix. GPU and API-exposure overlays remain outside the&lt;br&gt;
declared pressure scope. Those are modeled paths, not evidence that every Open WebUI runtime family&lt;br&gt;
has been proved.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/bobaikato/open-webui/actions/runs/29758665089" rel="noopener noreferrer"&gt;green v1.6.24 matrix run&lt;/a&gt;&lt;br&gt;
proved the tightened lifecycle boundaries on Ubuntu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the native proof succeeded and cleaned up its host-owned runtime&lt;/li&gt;
&lt;li&gt;the Docker Compose proof succeeded and tore down without tripping over its own active execution record&lt;/li&gt;
&lt;li&gt;the contract-owned bootstrap, real verification tasks, and runtime-proof lanes agreed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this repo mattered
&lt;/h2&gt;

&lt;p&gt;Open WebUI mattered because it is exactly the kind of repo that exposes whether a readiness system really understands lifecycle ownership.&lt;/p&gt;

&lt;p&gt;It is not enough to support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Node&lt;/li&gt;
&lt;li&gt;a native service task&lt;/li&gt;
&lt;li&gt;a Compose runtime task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The product also has to know which cleanup responsibility belongs to which path.&lt;/p&gt;

&lt;p&gt;This repo forced Ota to answer that cleanly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proof success should not leave host-owned native workloads behind&lt;/li&gt;
&lt;li&gt;Compose-owned runtimes should not be reclaimed as if they were the same class of host process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not cosmetic polish.&lt;/p&gt;

&lt;p&gt;That is operational trust.&lt;/p&gt;

&lt;p&gt;If Ota says a runtime path was proved, it should also leave the repo and CI environment in a truthful post-proof state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remaining boundary
&lt;/h2&gt;

&lt;p&gt;The pressure pass also exposed a separate dependency-hydration limitation. Open WebUI's committed&lt;br&gt;
&lt;code&gt;uv.lock&lt;/code&gt; was stale, and a normal project &lt;code&gt;uv sync&lt;/code&gt; can rewrite it before an unrelated verification&lt;br&gt;
task inspects the working tree. The contract avoids that mutation for the upstream Ruff formatting&lt;br&gt;
gate by using an isolated &lt;code&gt;uvx&lt;/code&gt; tool bootstrap.&lt;/p&gt;

&lt;p&gt;That is a truthful contract choice, not a complete Ota solution. Ota still needs a typed &lt;code&gt;uv&lt;/code&gt;&lt;br&gt;
frozen-lockfile posture for dependency hydration so a contract can require &lt;code&gt;uv&lt;/code&gt; to refuse stale lock&lt;br&gt;
state before execution rather than relying on task-specific avoidance. This remains an Ota product&lt;br&gt;
gap; it was not hidden to make the matrix green.&lt;/p&gt;

&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Upstream repository: &lt;a href="https://github.com/open-webui/open-webui" rel="noopener noreferrer"&gt;Open WebUI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pressure branch contract: &lt;a href="https://github.com/bobaikato/open-webui/blob/7bd9c409243bfc7b86b96a3d24761ff5252298c6/ota.yaml" rel="noopener noreferrer"&gt;open-webui &lt;code&gt;ota.yaml&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Matrix workflow: &lt;a href="https://github.com/bobaikato/open-webui/blob/7bd9c409243bfc7b86b96a3d24761ff5252298c6/.github/workflows/test-ota-contract-matrix.yml" rel="noopener noreferrer"&gt;test-ota-contract-matrix.yml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Green release-proof matrix: &lt;a href="https://github.com/bobaikato/open-webui/actions/runs/29758665089" rel="noopener noreferrer"&gt;#29758665089&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/pressure-testing-ota-on-open-webui-2p8w" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-open-webui-2p8w&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pressuretesting</category>
      <category>openwebui</category>
      <category>reporeadiness</category>
      <category>runtimeproof</category>
    </item>
    <item>
      <title>Pressure-testing Ota on Kylrix: Next.js runtime projection and dual-mode contributor proof</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Sat, 18 Jul 2026 15:36:41 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-kylrix-nextjs-runtime-projection-and-dual-mode-contributor-proof-365h</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-kylrix-nextjs-runtime-projection-and-dual-mode-contributor-proof-365h</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Kylrix is a large Next.js workspace with two materially different local stories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a contributor path backed by SQLite&lt;/li&gt;
&lt;li&gt;a self-hosted Compose topology with Appwrite and supporting services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That distinction made it a useful Ota pressure target. A contract that treated both paths as one&lt;br&gt;
generic “run the app” command would either hide the contributor truth or overclaim the self-hosted&lt;br&gt;
one.&lt;/p&gt;

&lt;p&gt;The useful outcome was not more shell automation. It was a narrower contributor contract and an&lt;br&gt;
honest production-topology boundary.&lt;/p&gt;
&lt;h2&gt;
  
  
  The contributor path needed one source of listener truth
&lt;/h2&gt;

&lt;p&gt;The contributor runtime is a Next.js service on port &lt;code&gt;3005&lt;/code&gt;. Before this pressure pass, a contract&lt;br&gt;
author had to duplicate that bind truth in two places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js launch flags&lt;/li&gt;
&lt;li&gt;the listener used for readiness and projected URLs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That duplication drifts easily. The stronger Ota shape is to keep the listener canonical and project&lt;br&gt;
known server flags from it:&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;surfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contributor:web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3005&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;

&lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;launch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;command&lt;/span&gt;
      &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm&lt;/span&gt;
      &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;exec&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;next&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;dev&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;--turbopack&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;runtime_projection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;listener&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;contributor:web&lt;/span&gt;
        &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nextjs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ota derives the supported Next.js bind flags from the declared listener. Readiness and the rendered&lt;br&gt;
external URL now describe the same runtime truth as the process command.&lt;/p&gt;
&lt;h2&gt;
  
  
  Native and container verification should not fight over state
&lt;/h2&gt;

&lt;p&gt;Kylrix also needed a real dual-mode contributor path. The finite verification workflow runs the&lt;br&gt;
same SQLite-backed test, lint, and build tasks on the host or in Ota's pinned Node container.&lt;/p&gt;

&lt;p&gt;The important detail is attachment isolation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;execution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backends&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node@sha256:a25c9934ff6382cd4f08b6bc26c82bf4ea69b1e6f8dabfb2ead457374127c365&lt;/span&gt;
  &lt;span class="na"&gt;contexts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;contributor:container&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;container&lt;/span&gt;
      &lt;span class="na"&gt;lifecycle&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;persistent&lt;/span&gt;
      &lt;span class="na"&gt;attachments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;isolated_paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;node_modules&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;.next&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;.pnpm-store&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That makes the mode boundary operational instead of cosmetic. Container verification does not reuse&lt;br&gt;
or corrupt native dependency and build state, while both lanes still execute the same declared&lt;br&gt;
verification closure.&lt;/p&gt;
&lt;h2&gt;
  
  
  The self-hosted topology is governed, but bounded
&lt;/h2&gt;

&lt;p&gt;Kylrix's full self-hosted stack is not a second contributor runtime. It uses Compose to build and&lt;br&gt;
launch Kylrix, Appwrite, MariaDB, Redis, and Caddy. Ota owns the interpolation env file, Compose&lt;br&gt;
file selection, image build, lifecycle, and readiness surface:&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;selfhost:up&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;launch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;compose&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;up&lt;/span&gt;
    &lt;span class="na"&gt;detach&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service&lt;/span&gt;
    &lt;span class="na"&gt;surfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;selfhost&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The contract does not claim that it has provisioned Appwrite credentials, completed the interactive&lt;br&gt;
setup wizard, or proved application-level self-hosted behavior. Those steps require operator&lt;br&gt;
credentials and are explicitly outside this workflow.&lt;/p&gt;

&lt;p&gt;That boundary is as important as the Compose ownership. A green lifecycle proof should not be read&lt;br&gt;
as a green product deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the matrix proves
&lt;/h2&gt;

&lt;p&gt;The Kylrix Ota matrix proves the narrow contributor surface across native and container lanes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contract validation, doctor, and task discovery&lt;/li&gt;
&lt;li&gt;safe-agent task and workflow previews&lt;/li&gt;
&lt;li&gt;real SQLite-backed test, lint, and build verification&lt;/li&gt;
&lt;li&gt;native and container workflow receipts&lt;/li&gt;
&lt;li&gt;native and container runtime proof for the Next.js contributor service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The self-hosted Compose workflow is modeled and dry-run covered, but not matrix-executed. It remains&lt;br&gt;
deliberately outside the contributor proof claim because its Appwrite provisioning is operator-owned.&lt;/p&gt;

&lt;p&gt;The released &lt;code&gt;v1.6.24&lt;/code&gt; pressure run is &lt;a href="https://github.com/bobaikato/kylrix/actions/runs/29572073845" rel="noopener noreferrer"&gt;#29572073845&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this repo mattered
&lt;/h2&gt;

&lt;p&gt;Kylrix reinforced two Ota design rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;listener truth should be declared once and projected into supported launch adapters&lt;/li&gt;
&lt;li&gt;native, container, and self-hosted paths must be governed as distinct execution realities, not
flattened into one optimistic “works locally” claim&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is a contract that helps contributors start with the finite SQLite path, gives Ota a&lt;br&gt;
truthful container equivalent, and keeps the heavier Appwrite topology visible without pretending it&lt;br&gt;
has been fully proved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Contract: &lt;a href="https://github.com/bobaikato/kylrix/blob/bobai/kylrix-ota-pressure/ota.yaml" rel="noopener noreferrer"&gt;Kylrix &lt;code&gt;ota.yaml&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pressure workflow: &lt;a href="https://github.com/bobaikato/kylrix/blob/bobai/kylrix-ota-pressure/.github/workflows/ota-governance.yml" rel="noopener noreferrer"&gt;ota-governance.yml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Released-version pressure matrix: &lt;a href="https://github.com/bobaikato/kylrix/actions/runs/29572073845" rel="noopener noreferrer"&gt;#29572073845&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/pressure-testing-ota-on-kylrix-4k5r" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-kylrix-4k5r&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pressuretesting</category>
      <category>nextjs</category>
      <category>runtimeproof</category>
      <category>reporeadiness</category>
    </item>
    <item>
      <title>Pressure-testing Ota on lead-quorum: native Python truth, repo-local fulfillment, and runtime bind projection</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Fri, 17 Jul 2026 12:51:03 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-lead-quorum-native-python-truth-repo-local-fulfillment-and-runtime-bind-4345</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-lead-quorum-native-python-truth-repo-local-fulfillment-and-runtime-bind-4345</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;lead-quorum&lt;/code&gt; was a strong pilot repo because it was small enough to reason about and real enough to fail honestly.&lt;/p&gt;

&lt;p&gt;It has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repo-local Python environment ownership&lt;/li&gt;
&lt;li&gt;pinned dependency installation&lt;/li&gt;
&lt;li&gt;env bootstrap from example truth&lt;/li&gt;
&lt;li&gt;a deterministic local test surface&lt;/li&gt;
&lt;li&gt;live external verification&lt;/li&gt;
&lt;li&gt;a local web runtime&lt;/li&gt;
&lt;li&gt;a distributed demo path&lt;/li&gt;
&lt;li&gt;a Docker build lane&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is exactly the kind of repo where a contract can look clean while still hiding real setup and execution drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this repo mattered
&lt;/h2&gt;

&lt;p&gt;The useful pressure here was not “can Ota run one Python command.”&lt;/p&gt;

&lt;p&gt;The useful pressure was whether Ota could stay truthful when the repo itself owns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;.venv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the dependency install lane&lt;/li&gt;
&lt;li&gt;the local executable path&lt;/li&gt;
&lt;li&gt;the runtime listener truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If Ota probes or fulfills those in the wrong order, the contract is not trustworthy even if the repo itself is valid.&lt;/p&gt;

&lt;p&gt;That is what made &lt;code&gt;lead-quorum&lt;/code&gt; valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the contract now models
&lt;/h2&gt;

&lt;p&gt;The final contract is explicit about the repo’s real setup split.&lt;/p&gt;

&lt;p&gt;Setup is not one opaque shell step. It is three different ownership surfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;copy &lt;code&gt;.env&lt;/code&gt; from &lt;code&gt;.env.example&lt;/code&gt; only if missing&lt;/li&gt;
&lt;li&gt;create the repo-local virtual environment&lt;/li&gt;
&lt;li&gt;hydrate dependencies through typed &lt;code&gt;uv&lt;/code&gt; requirements-file installation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That looks like this in the contract:&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;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;aggregate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;setup:env&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;setup:venv&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;setup:deps&lt;/span&gt;

&lt;span class="na"&gt;setup:env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;copy_if_missing&lt;/span&gt;
    &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.env.example&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt;

&lt;span class="na"&gt;setup:venv&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ensure_virtualenv&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.venv&lt;/span&gt;
    &lt;span class="na"&gt;python&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.12"&lt;/span&gt;

&lt;span class="na"&gt;setup:deps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;prepare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dependency_hydration&lt;/span&gt;
    &lt;span class="na"&gt;medium&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;package_dependencies&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;uv&lt;/span&gt;
      &lt;span class="na"&gt;cwd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip_requirements&lt;/span&gt;
      &lt;span class="na"&gt;requirements_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;requirements.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The contract also keeps verification and external-runtime claims separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;verify&lt;/code&gt; for deterministic local validation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;live&lt;/code&gt; for Gemini-backed end-to-end testing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app&lt;/code&gt; for the local web service&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;distributed&lt;/code&gt; for the A2A demo path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters because a working local scoring test and a live distributed runtime are not the same readiness claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  What lead-quorum exposed in Ota
&lt;/h2&gt;

&lt;p&gt;This repo exposed three real Ota gaps.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. native repo-local fulfillment and probing were ordered incorrectly
&lt;/h3&gt;

&lt;p&gt;Older Ota could still probe repo-local Python executables too early.&lt;/p&gt;

&lt;p&gt;That is the wrong trust order for a repo that creates its own &lt;code&gt;.venv&lt;/code&gt; as part of setup. If the repo-local interpreter path is declared 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;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.venv/bin/python&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then Ota has to materialize the dependency/setup closure before treating that path as a fulfilled runtime command.&lt;/p&gt;

&lt;p&gt;Otherwise a valid contract can fail just because Ota asked the question too early.&lt;/p&gt;

&lt;p&gt;That is exactly what this repo exposed.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. native Python candidate selection was too weak
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;lead-quorum&lt;/code&gt; also exposed a narrower but important gap in typed Python hydration.&lt;/p&gt;

&lt;p&gt;When Ota selected a local Python candidate for setup and hydration, it could still choose the wrong host interpreter path instead of the repo’s intended environment. In practice that meant a dependency like &lt;code&gt;cryptography&lt;/code&gt; could start building against the wrong target environment instead of the repo-owned Python lane.&lt;/p&gt;

&lt;p&gt;That is not a repo bug. That is a readiness engine selecting the wrong execution truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. runtime bind truth was duplicated between launch args and runtime listeners
&lt;/h3&gt;

&lt;p&gt;The local web service made a third weakness obvious.&lt;/p&gt;

&lt;p&gt;Before widening, the contract still had to repeat bind truth in two places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;command-line runtime args such as &lt;code&gt;--host&lt;/code&gt; and &lt;code&gt;--port&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the declared runtime listener surface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That duplication is fragile.&lt;/p&gt;

&lt;p&gt;The stronger product shape is for the runtime listener to stay canonical and for Ota to project the supported bind flags for known servers. &lt;code&gt;lead-quorum&lt;/code&gt; became the first real repo to pressure that widening cleanly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in Ota
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;lead-quorum&lt;/code&gt; drove platform fixes, not repo-local workarounds.&lt;/p&gt;

&lt;h3&gt;
  
  
  native repo-local fulfillment now respects setup materialization order
&lt;/h3&gt;

&lt;p&gt;Ota now runs the selected setup closure before probing repo-local backend/runtime commands that depend on that materialized state.&lt;/p&gt;

&lt;p&gt;That closes the gap where a repo could declare a truthful &lt;code&gt;.venv/bin/python&lt;/code&gt; lane and still fail because Ota evaluated it before the repo-local environment existed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python candidate selection is now stricter and more truthful
&lt;/h3&gt;

&lt;p&gt;Ota also now prefers version-matching Python candidates before falling back to weaker generic host candidates.&lt;/p&gt;

&lt;p&gt;That makes typed Python hydration much less likely to drift onto the wrong interpreter family when the contract has already declared the intended Python lane.&lt;/p&gt;

&lt;h3&gt;
  
  
  runtime listener truth can now project bind args
&lt;/h3&gt;

&lt;p&gt;This repo also helped widen Ota’s runtime-to-launch projection.&lt;/p&gt;

&lt;p&gt;The local web service can now declare listener truth once and let Ota project supported bind args for a known adapter:&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;launch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;command&lt;/span&gt;
  &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.venv/bin/uvicorn&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web.app:app&lt;/span&gt;
  &lt;span class="na"&gt;runtime_projection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;listener&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
    &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;uvicorn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a cleaner long-term shape than duplicating &lt;code&gt;--host&lt;/code&gt; and &lt;code&gt;--port&lt;/code&gt; in every Python service contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the matrix now proves
&lt;/h2&gt;

&lt;p&gt;The released &lt;code&gt;v1.6.24&lt;/code&gt; pressure matrix on Ota's fork is green across Ubuntu, macOS, Windows, and&lt;br&gt;
a Dockerfile-owned Ubuntu container lane. Ubuntu and macOS execute the native deterministic and&lt;br&gt;
runtime-proof lanes. Windows is intentionally audit-only in this matrix: it validates the contract&lt;br&gt;
and discovers the task surface, but does not execute native tasks or runtime proof.&lt;/p&gt;

&lt;p&gt;That matters because this repo’s truth is not only “tests pass on one machine.” The matrix proves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ota validate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ota doctor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ota tasks --use&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ota tasks --safe --use&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;task dry-run coverage for setup, deterministic test, live test, distributed demo, and Docker build lanes&lt;/li&gt;
&lt;li&gt;workflow dry-run coverage for &lt;code&gt;verify&lt;/code&gt;, &lt;code&gt;app&lt;/code&gt;, &lt;code&gt;live&lt;/code&gt;, and &lt;code&gt;distributed&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;real &lt;code&gt;setup&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;real deterministic &lt;code&gt;test&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;real &lt;code&gt;verify&lt;/code&gt; workflow proof&lt;/li&gt;
&lt;li&gt;real local &lt;code&gt;app&lt;/code&gt; workflow proof&lt;/li&gt;
&lt;li&gt;real &lt;code&gt;docker:build&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;real &lt;code&gt;verify:container&lt;/code&gt; workflow against the repository Dockerfile image&lt;/li&gt;
&lt;li&gt;contract-modeled and dry-run-covered live external and distributed workflows; their real matrix execution is conditional on &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt; and was skipped in this released-version run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a much stronger outcome than “the contract parses.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this repo was a good pilot
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;lead-quorum&lt;/code&gt; did exactly what a first pilot should do.&lt;/p&gt;

&lt;p&gt;It did not mainly expose repo noise. It exposed trust gaps in Ota itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setup before probe&lt;/li&gt;
&lt;li&gt;correct interpreter selection&lt;/li&gt;
&lt;li&gt;one canonical runtime bind truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are real product boundaries.&lt;/p&gt;

&lt;p&gt;That is why this repo was worth pressure-testing.&lt;/p&gt;

&lt;p&gt;It also reinforced an important standard for future pilots:&lt;/p&gt;

&lt;p&gt;a receipt or contract is only useful if it stays aligned with the actual decision and execution path, not just with what the repo intended in prose.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lead-quorum&lt;/code&gt; is created and maintained by &lt;a href="https://github.com/vinimabreu" rel="noopener noreferrer"&gt;Vinicius Pereira&lt;/a&gt;. The&lt;br&gt;
Ota integration is proposed upstream; the forked matrix below is pre-merge pressure evidence, not&lt;br&gt;
evidence from the canonical repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Upstream repository: &lt;a href="https://github.com/vinimabreu/lead-quorum" rel="noopener noreferrer"&gt;vinimabreu/lead-quorum&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Integration PR: &lt;a href="https://github.com/vinimabreu/lead-quorum/pull/3" rel="noopener noreferrer"&gt;#3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pre-merge pressure contract: &lt;a href="https://github.com/bobaikato/lead-quorum/blob/bobai/lead-quorum-ota-pressure/ota.yaml" rel="noopener noreferrer"&gt;fork branch &lt;code&gt;ota.yaml&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pre-merge released-version matrix: &lt;a href="https://github.com/bobaikato/lead-quorum/actions/runs/29572074145" rel="noopener noreferrer"&gt;#29572074145&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally post here: &lt;a href="https://ota.run/blog/pressure-testing-ota-on-lead-quorum-3x2p" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-lead-quorum-3x2p&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pressuretesting</category>
      <category>python</category>
      <category>uv</category>
      <category>reporeadiness</category>
    </item>
    <item>
      <title>Pressure-testing Ota on Bedrock: query identity as replay evidence</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Fri, 17 Jul 2026 12:48:25 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-bedrock-query-identity-as-replay-evidence-4e0o</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-bedrock-query-identity-as-replay-evidence-4e0o</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Bedrock, created and maintained by &lt;a href="https://github.com/vinimabreu" rel="noopener noreferrer"&gt;Vinicius Pereira&lt;/a&gt;, is not a&lt;br&gt;
normal application test repo.&lt;/p&gt;

&lt;p&gt;It is a natural-language-to-SQL stability harness. It records generated SQL across repeated runs,&lt;br&gt;
replays the committed fixture against a frozen SQLite store, compares the results with a defended&lt;br&gt;
answer key, and blocks a candidate when reliability regresses.&lt;/p&gt;

&lt;p&gt;That made it a strong pressure target for a more specific Ota question:&lt;/p&gt;

&lt;p&gt;when a verification lane replays prior model behavior, how should Ota distinguish the inputs that&lt;br&gt;
defined the replay from observations that explain what happened?&lt;/p&gt;

&lt;p&gt;The answer cannot be one undifferentiated receipt field.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Bedrock mattered
&lt;/h2&gt;

&lt;p&gt;Bedrock already had the useful artifacts in its repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;data/fixture.jsonl&lt;/code&gt;: one recorded SQL query per question and run&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;data/store.db&lt;/code&gt;: the frozen SQLite state&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;data/baseline.json&lt;/code&gt;: the defended regression baseline&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/scorecard.md&lt;/code&gt;: the rendered stability result&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those artifacts answer different questions.&lt;/p&gt;

&lt;p&gt;A committed fixture, store, and baseline are replay inputs. They define the deterministic lane.&lt;br&gt;
A repeated SQL trace is observed behavior. It can show that one question produced different query&lt;br&gt;
shapes, but it is not an input Ota used to decide whether the current command could start. In this&lt;br&gt;
repo, &lt;code&gt;fixture.jsonl&lt;/code&gt; has a valid dual role: the deterministic replay consumes it and Ota parses it&lt;br&gt;
as historical query evidence. That does not make it independent corroboration; it is one captured&lt;br&gt;
artifact with two explicitly separate meanings.&lt;/p&gt;

&lt;p&gt;That distinction became the pressure boundary.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the contract models
&lt;/h2&gt;

&lt;p&gt;The deterministic gate now declares the replay inputs explicitly:&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;gate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replay_inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recorded_sql&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;static_file&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data/fixture.jsonl&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;frozen_store&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;static_file&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data/store.db&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;defended_baseline&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;static_file&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data/baseline.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those files are captured as declared, static replay truth.&lt;/p&gt;

&lt;p&gt;The recorded query trace is declared separately:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```yaml | Witnessed Query Trace&lt;br&gt;
gate:&lt;br&gt;
  witnessed_observations:&lt;br&gt;
    query_traces:&lt;br&gt;
      - id: recorded_sql&lt;br&gt;
        path: data/fixture.jsonl&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


That is the important Ota boundary.

- `replay_inputs[]` says what the deterministic gate consumed
- `witnessed_observations.query_traces[]` says what behavior the fixture contains

The second must not be promoted into the first. Otherwise a receipt can make historical model
output look like a pre-execution decision input, which weakens replay and evidence semantics.

## What the replay can honestly prove

Bedrock's offline path is deliberately narrow and useful:

- replay the committed SQL fixture
- execute it against the committed SQLite store
- compare the result set with the defended answer key
- compare the candidate score with the committed baseline

The contract makes that boundary visible:



```yaml | Offline Gate
gate:
  command:
    exe: python
    args:
      - -B
      - main.py
      - gate
  safe_for_agent: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That proves the declared fixture, store, and baseline path. It does not prove that a live model&lt;br&gt;
will generate the same SQL tomorrow, or that a live database has not changed.&lt;/p&gt;

&lt;p&gt;Those claims remain separate in the contract's &lt;code&gt;record:live&lt;/code&gt; lane:&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;record:live&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;effects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;writes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;data/fixture.jsonl&lt;/span&gt;
    &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;network_kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integration_test&lt;/span&gt;
    &lt;span class="na"&gt;external_state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;anthropic_api&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That lane reaches a live model and rewrites the recorded fixture. It is intentionally outside the&lt;br&gt;
deterministic, agent-safe replay workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Bedrock exposed in Ota
&lt;/h2&gt;

&lt;p&gt;Bedrock helped close an Ota evidence-model gap.&lt;/p&gt;

&lt;p&gt;The initial temptation was to place per-record query identity under receipt&lt;br&gt;
&lt;code&gt;evaluated_inputs[]&lt;/code&gt;. That would have been wrong. A query trace is execution evidence, not a&lt;br&gt;
current-run input.&lt;/p&gt;

&lt;p&gt;Ota now keeps the split explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;declared static files stay under receipt &lt;code&gt;evaluated_inputs[]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;historical query identities and divergence summaries live under receipt
&lt;code&gt;witnessed_observations.query_traces[]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives later comparison and correlation a cleaner foundation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inputs can remain unchanged&lt;/li&gt;
&lt;li&gt;observed query behavior can still diverge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither fact is allowed to impersonate the other.&lt;/p&gt;

&lt;p&gt;Bedrock also made one remaining boundary clear: its live recording path depends on a generic,&lt;br&gt;
unpinned pip requirements lane. Ota does not yet own that as typed dependency hydration. The&lt;br&gt;
contract names it as outside the deterministic proof instead of hiding it in setup shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the matrix proves
&lt;/h2&gt;

&lt;p&gt;The pressure matrix is intentionally offline and cross-platform:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ota validate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ota doctor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ota tasks --use&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ota tasks --safe --use&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;agent-mode task dry-run for the stability gate&lt;/li&gt;
&lt;li&gt;agent-mode workflow dry-run and preparation for &lt;code&gt;verify&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;deterministic test execution&lt;/li&gt;
&lt;li&gt;scorecard replay against the committed SQL fixture&lt;/li&gt;
&lt;li&gt;baseline gate execution&lt;/li&gt;
&lt;li&gt;archived receipt for the declared workflow&lt;/li&gt;
&lt;li&gt;native coverage on Ubuntu, macOS, and Windows&lt;/li&gt;
&lt;li&gt;the same replay workflow in Ota's pinned Python container context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a claim that Bedrock's live model lane is hermetic. It is proof that the deterministic&lt;br&gt;
replay lane is explicit about its inputs, output evidence, and boundary. The contract's file checks&lt;br&gt;
assert artifact presence; Ota then captures SHA-256 source identities before execution and compares&lt;br&gt;
them during replay. Those observed identities are not yet contract-declared expected digests, so&lt;br&gt;
they attest what the lane used rather than pinning a separate immutable contract assertion.&lt;/p&gt;

&lt;p&gt;The released &lt;code&gt;v1.6.24&lt;/code&gt; pressure matrix passed across native Ubuntu, macOS, Windows, and the&lt;br&gt;
container replay lane on Ota's fork: &lt;a href="https://github.com/bobaikato/bedrock/actions/runs/29572073749" rel="noopener noreferrer"&gt;run #29572073749&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this repo mattered
&lt;/h2&gt;

&lt;p&gt;Bedrock clarified a product rule that applies beyond AI evaluation:&lt;/p&gt;

&lt;p&gt;do not collapse observed behavior into declared execution inputs.&lt;/p&gt;

&lt;p&gt;For this repository, a clean replay input can narrow or acquit the input class it actually names.&lt;br&gt;
A divergent query trace can explain a flap. Neither artifact should overclaim the other role.&lt;/p&gt;

&lt;p&gt;That is the right foundation for Ota's replay and receipt model: declared truth, execution truth,&lt;br&gt;
and witnessed evidence remain linked, but separate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Upstream repository: &lt;a href="https://github.com/vinimabreu/bedrock" rel="noopener noreferrer"&gt;vinimabreu/bedrock&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Integration PR: &lt;a href="https://github.com/vinimabreu/bedrock/pull/1" rel="noopener noreferrer"&gt;#1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pre-merge pressure contract: &lt;a href="https://github.com/bobaikato/bedrock/blob/bobai/bedrock-ota-pressure/ota.yaml" rel="noopener noreferrer"&gt;fork branch &lt;code&gt;ota.yaml&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pre-merge released-version matrix: &lt;a href="https://github.com/bobaikato/bedrock/actions/runs/29572073749" rel="noopener noreferrer"&gt;#29572073749&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally post here: &lt;a href="https://ota.run/blog/pressure-testing-ota-on-bedrock-4b7q" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-bedrock-4b7q&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pressuretesting</category>
      <category>aievaluation</category>
      <category>replay</category>
      <category>sql</category>
    </item>
    <item>
      <title>Ota v1.6.24 Now Available: Runtime Proof, Replay Trust, and Typed Execution</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Fri, 17 Jul 2026 12:44:38 +0000</pubDate>
      <link>https://dev.to/otaready/ota-v1624-now-available-runtime-proof-replay-trust-and-typed-execution-2m8h</link>
      <guid>https://dev.to/otaready/ota-v1624-now-available-runtime-proof-replay-trust-and-typed-execution-2m8h</guid>
      <description>&lt;h2&gt;
  
  
  Idea
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;v1.6.24&lt;/code&gt; is an execution-evidence release.&lt;/p&gt;

&lt;p&gt;The pressure behind it was a trust problem: a green command is useful, but it does not automatically prove that a declared dependency shaped the result, that the same material inputs can be replayed, or that a new run still represents the same operational truth.&lt;/p&gt;

&lt;p&gt;Ota now draws those boundaries more sharply.&lt;/p&gt;

&lt;p&gt;This release strengthens three connected questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;did the selected runtime start and become ready?&lt;/li&gt;
&lt;li&gt;did the proof actually exercise the declared dependency seam?&lt;/li&gt;
&lt;li&gt;can a later run identify and replay the material inputs that shaped the original execution?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also moves more setup and runtime behavior from shell convention into typed contract ownership, so the evidence has stronger declared truth beneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;v1.6.24&lt;/code&gt; strengthens six connected parts of Ota's execution-governance model.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Runtime proof now distinguishes readiness, exercise, and causality
&lt;/h3&gt;

&lt;p&gt;Runtime proof should not overstate what a green lane established.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;v1.6.24&lt;/code&gt; adds a stronger evidence ladder for declared dependency seams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;reachable&lt;/code&gt; means the selected path reached the dependency boundary&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;exercised&lt;/code&gt; requires transaction-bound evidence that the dependency participated in the current run&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fault_tested&lt;/code&gt; requires a separate, same-obligation negative control that fails for the declared missing-effect reason&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For marker-bound seams, Ota now creates an opaque transaction marker for the producer path and requires the observer to recover it from the dependency. A clean observer exit is not enough. The evidence has to match the current transaction and declared obligation.&lt;/p&gt;

&lt;p&gt;Negative controls are strict too. An unrelated timeout, setup failure, crash, or generic non-zero exit cannot promote a seam to &lt;code&gt;fault_tested&lt;/code&gt;. The control must be valid, bound to the same obligation, and classified as the expected obligation failure or missing effect.&lt;/p&gt;

&lt;p&gt;The resulting proof can remain honestly qualified:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proof_verdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"passed_with_unproven_boundaries"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependency_evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"dependency_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"service:postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fault_tested"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"not_proved"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dependency_output_shaping_not_proved"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That distinction matters. Ota can prove that a declared PostgreSQL seam was causally exercised without pretending that PostgreSQL shaped every application output or that one narrow proof covered the whole repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Replay became execution-authored instead of reconstructed later
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;v1.6.24&lt;/code&gt; adds first-class replay against archived execution truth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota up &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="nt"&gt;--replay-baseline&lt;/span&gt; latest &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The replay surface reports one of three explicit outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;replay_verified&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;replay_failed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;replay_unavailable&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ota compares the selected workflow, backend, provider, remote target, and lifecycle against the archived baseline before treating it as comparable execution. It also classifies last-known-good evidence as verified, stale, or unavailable rather than silently treating any old green receipt as current proof.&lt;/p&gt;

&lt;p&gt;Receipts now retain more of the material input identity needed for honest replay and diagnosis, including clean Git state, policy rulesets, environment-source identity, lockfiles, Node runtime identity, immutable Compose image identity, and dependency-hydration provenance where available.&lt;/p&gt;

&lt;p&gt;The evidence model also keeps inputs separate from witnessed output. Declared replay inputs belong under &lt;code&gt;replay_inputs&lt;/code&gt;; observed query behavior belongs under &lt;code&gt;witnessed_observations.query_traces&lt;/code&gt;. That lets later comparisons distinguish changed inputs from changed runtime behavior instead of mixing both into one evidence list.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Dependency provenance became more explicit
&lt;/h3&gt;

&lt;p&gt;Dependency hydration is not fully described by the package-manager verb alone.&lt;/p&gt;

&lt;p&gt;This release widens typed hydration with source posture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;uv&lt;/code&gt; hydration can declare a default index, ordered additional indexes, and offline intent&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.NET restore&lt;/code&gt; records runner-resolved NuGet feed identity when it can establish it&lt;/li&gt;
&lt;li&gt;pnpm workspace hydration can declare a first-class &lt;code&gt;filter&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trust rule remains conservative. If Ota cannot recover authoritative feed identity, the evidence narrows the diagnosis; it does not become a false hermeticity claim.&lt;/p&gt;

&lt;p&gt;This gives receipts and replay a better answer to a common drift question: not only &lt;em&gt;which package manager ran&lt;/em&gt;, but &lt;em&gt;which declared or resolved dependency source shaped the run&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. More execution truth moved into typed contract ownership
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;v1.6.24&lt;/code&gt; removes more reasons to hide important repo behavior in opaque shell commands.&lt;/p&gt;

&lt;p&gt;The release adds or widens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;action.kind: build_container_image&lt;/code&gt; for typed image file, context, tag, and provider ownership&lt;/li&gt;
&lt;li&gt;generated artifact lineage through declared producers, outputs, inputs, and consumer requirements&lt;/li&gt;
&lt;li&gt;task-level &lt;code&gt;only_on&lt;/code&gt; platform constraints&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;launch.runtime_projection&lt;/code&gt; adapters for Uvicorn and Next.js&lt;/li&gt;
&lt;li&gt;closure-aware execution modes for tasks and aggregates&lt;/li&gt;
&lt;li&gt;aggregate dry-run governance derived from the actual dependency closure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Execution-mode admission is stricter as well. If a task does not advertise a requested mode, Ota refuses it instead of quietly selecting a different execution path.&lt;/p&gt;

&lt;p&gt;Together, these changes strengthen the relationship between declared contract truth, the selected runtime path, and the evidence Ota emits afterward.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Task discovery and execution now agree more closely
&lt;/h3&gt;

&lt;p&gt;Humans and agents need to see the same callable surface that the runner will enforce.&lt;/p&gt;

&lt;p&gt;Task discovery now reports closure-aware run guidance, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;human execution commands&lt;/li&gt;
&lt;li&gt;agent execution commands&lt;/li&gt;
&lt;li&gt;agent policy posture&lt;/li&gt;
&lt;li&gt;machine-readable &lt;code&gt;use.modes[]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ota also tightened CI verification recovery and governance reconciliation so merge-gate output can explain the required verification lanes, the cited inputs behind the decision, and the decision basis instead of publishing a verdict with weak provenance.&lt;/p&gt;

&lt;p&gt;The result is a cleaner path from discovery to execution: task listings, dry-run governance, runtime admission, and receipts are less likely to describe competing truths.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Runtime cleanup and interruption became safer
&lt;/h3&gt;

&lt;p&gt;Some of the most important trust work in this release is deliberately unglamorous.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;v1.6.24&lt;/code&gt; improves runtime correctness around interruption and cleanup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ctrl+C is classified consistently as an interrupted execution with exit code &lt;code&gt;130&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;signal forwarding targets the selected child process tree without killing the invoking shell&lt;/li&gt;
&lt;li&gt;interrupt state is scoped to the active execution epoch&lt;/li&gt;
&lt;li&gt;native command services publish clearer readiness and endpoint truth&lt;/li&gt;
&lt;li&gt;runtime proof starts and stops only proof-owned Compose dependencies&lt;/li&gt;
&lt;li&gt;services that were already running before proof are preserved&lt;/li&gt;
&lt;li&gt;container proof cleanup follows the selected effective execution mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because evidence is only trustworthy when the runner also owns failure, interruption, and cleanup boundaries correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pressure-tested on real repositories
&lt;/h3&gt;

&lt;p&gt;The release was shaped through real repository pressure rather than fixtures alone.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Athena API forced marker-bound PostgreSQL seam proof, same-obligation controls, and typed production image ownership.&lt;/li&gt;
&lt;li&gt;Bedrock pressured replay inputs, presentation and comparator profiles, and witnessed query traces.&lt;/li&gt;
&lt;li&gt;Lead Quorum pressured &lt;code&gt;uv&lt;/code&gt; source posture, runtime projection, and image-build ownership.&lt;/li&gt;
&lt;li&gt;Kylrix pressured Next.js runtime projection and truthful native/container mode admission.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those repos exposed the places where a structurally valid contract could still produce evidence that was too broad, too weakly attributed, or too dependent on shell convention. The fixes in &lt;code&gt;v1.6.24&lt;/code&gt; are the product response to that pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docs
&lt;/h2&gt;

&lt;p&gt;Use the live references for the shipped surface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get started: &lt;a href="https://ota.run/docs/install" rel="noopener noreferrer"&gt;Install Ota&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Proof semantics: &lt;a href="https://ota.run/docs/reference/runtime-proof-evidence" rel="noopener noreferrer"&gt;Runtime Proof Evidence&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Execution evidence: &lt;a href="https://ota.run/docs/reference/execution-receipt" rel="noopener noreferrer"&gt;Execution Receipt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Contract fields: &lt;a href="https://ota.run/docs/reference/contract" rel="noopener noreferrer"&gt;Contract Reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Command behavior: &lt;a href="https://ota.run/docs/reference/command" rel="noopener noreferrer"&gt;Command Reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Machine output: &lt;a href="https://ota.run/docs/reference/json-output" rel="noopener noreferrer"&gt;JSON Output Reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Governance architecture: &lt;a href="https://ota.run/docs/reference/execution-governance-loop" rel="noopener noreferrer"&gt;Execution Governance Loop&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The published schemas and public examples have also been updated for replay inputs, witnessed query traces, dependency evidence, seam observations, negative controls, and explicit &lt;code&gt;not_proved&lt;/code&gt; boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Release
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;v1.6.24&lt;/code&gt; is live here: &lt;a href="https://ota.run/releases/v1.6.24" rel="noopener noreferrer"&gt;https://ota.run/releases/v1.6.24&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upgrade and verify the selected repo path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota upgrade
ota &lt;span class="nt"&gt;--version&lt;/span&gt;
ota validate
ota doctor &lt;span class="nt"&gt;--json&lt;/span&gt;
ota tasks &lt;span class="nt"&gt;--safe&lt;/span&gt; &lt;span class="nt"&gt;--use&lt;/span&gt;
ota run &amp;lt;task&amp;gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
ota proof runtime &lt;span class="nt"&gt;--workflow&lt;/span&gt; &amp;lt;workflow&amp;gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;v1.6.24&lt;/code&gt; moves Ota further from “the command passed” toward the stronger question: &lt;em&gt;what did this execution actually prove, which inputs shaped it, and what remains unproved?&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/ota-v1-6-24-release-essay" rel="noopener noreferrer"&gt;https://ota.run/blog/ota-v1-6-24-release-essay&lt;/a&gt;&lt;/p&gt;

</description>
      <category>release</category>
      <category>runtimeproof</category>
      <category>replay</category>
      <category>executiongovernance</category>
    </item>
    <item>
      <title>Why AI Agent PRs Get Rejected And How Repo Contracts Help</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Thu, 16 Jul 2026 21:18:31 +0000</pubDate>
      <link>https://dev.to/otaready/why-ai-agent-prs-get-rejected-and-how-repo-contracts-help-h10</link>
      <guid>https://dev.to/otaready/why-ai-agent-prs-get-rejected-and-how-repo-contracts-help-h10</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;A recent &lt;a href="https://arxiv.org/abs/2606.13468" rel="noopener noreferrer"&gt;study of agent-generated pull-request fixes&lt;/a&gt; reported&lt;br&gt;
that 46.41% of fixes proposed by Copilot, Devin, Cursor, and Claude were rejected.&lt;/p&gt;

&lt;p&gt;That number matters, but the more useful question is why.&lt;/p&gt;

&lt;p&gt;Some rejected PRs are simple model failures: the implementation is wrong, incomplete, or low&lt;br&gt;
priority.&lt;/p&gt;

&lt;p&gt;Ota addresses a separate, avoidable class of failure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the agent ran the wrong verification path&lt;/li&gt;
&lt;li&gt;the repo needed a service or env var that was never declared clearly&lt;/li&gt;
&lt;li&gt;the change passed one local command but failed the real CI lane&lt;/li&gt;
&lt;li&gt;the repo never made safe boundaries explicit&lt;/li&gt;
&lt;li&gt;the agent stopped at "the code compiles" instead of "the repo's declared acceptance path passed"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not only an intelligence problem.&lt;/p&gt;

&lt;p&gt;It is also a repo-governance problem.&lt;/p&gt;

&lt;p&gt;No contract can make an incorrect or low-priority implementation worth merging. It can remove the&lt;br&gt;
avoidable execution uncertainty around it: whether the repo was ready, the right lane ran, the&lt;br&gt;
required services existed, and the completion claim matched the repo's declared acceptance path.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Hidden Failure Is Usually Not The Diff
&lt;/h2&gt;

&lt;p&gt;When an agent opens a PR, maintainers are not only reviewing the code diff.&lt;/p&gt;

&lt;p&gt;They are also reviewing whether the agent understood the repo well enough to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prepare the repo correctly&lt;/li&gt;
&lt;li&gt;choose the right workflow&lt;/li&gt;
&lt;li&gt;run the right checks&lt;/li&gt;
&lt;li&gt;avoid unsafe changes&lt;/li&gt;
&lt;li&gt;prove that the change is actually complete&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where a lot of agent PRs fall apart.&lt;/p&gt;

&lt;p&gt;The repo may have the truth, but the truth is scattered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setup instructions in one README&lt;/li&gt;
&lt;li&gt;real verification logic in CI&lt;/li&gt;
&lt;li&gt;service assumptions in Docker files&lt;/li&gt;
&lt;li&gt;extra post-change steps in shell scripts&lt;/li&gt;
&lt;li&gt;path sensitivity in maintainer memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An agent sees all of that and still has to decide:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What does done mean here?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the repo does not answer that clearly, the PR is already risky before the code review starts.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Rejected Agent PRs Should Be Framed As Repo Governance
&lt;/h2&gt;

&lt;p&gt;The useful framing is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Agents need better prompts."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The useful framing is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Repos need better execution truth."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A maintainer should be able to declare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how the repo becomes ready&lt;/li&gt;
&lt;li&gt;which tasks are canonical&lt;/li&gt;
&lt;li&gt;which workflow should be used after a change&lt;/li&gt;
&lt;li&gt;which services and env are required&lt;/li&gt;
&lt;li&gt;which tasks are safe for an agent&lt;/li&gt;
&lt;li&gt;which paths are protected&lt;/li&gt;
&lt;li&gt;which verification lane proves completion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that, every agent run is partly reconstruction work.&lt;/p&gt;

&lt;p&gt;That reconstruction cost shows up later as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI failures&lt;/li&gt;
&lt;li&gt;incomplete implementations&lt;/li&gt;
&lt;li&gt;wrong runtime assumptions&lt;/li&gt;
&lt;li&gt;reviewer fatigue&lt;/li&gt;
&lt;li&gt;rejected PRs that were never fully grounded in repo truth&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What Ota Changes
&lt;/h2&gt;

&lt;p&gt;Ota is not trying to make agents magically smarter.&lt;/p&gt;

&lt;p&gt;Ota gives the repo an execution contract so the agent has less to guess.&lt;/p&gt;

&lt;p&gt;That contract can declare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;toolchains and runtime requirements&lt;/li&gt;
&lt;li&gt;dependency hydration and setup&lt;/li&gt;
&lt;li&gt;services and readiness&lt;/li&gt;
&lt;li&gt;tasks and workflows&lt;/li&gt;
&lt;li&gt;safe task boundaries&lt;/li&gt;
&lt;li&gt;protected and writable paths&lt;/li&gt;
&lt;li&gt;verification paths after changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of asking an agent to infer "probably run tests," a repo can say what the acceptance path&lt;br&gt;
actually is.&lt;/p&gt;

&lt;p&gt;For example:&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;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify&lt;/span&gt;
  &lt;span class="na"&gt;default_task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify&lt;/span&gt;
  &lt;span class="na"&gt;safe_tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;lint&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
  &lt;span class="na"&gt;verify_after_changes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;verify&lt;/span&gt;
  &lt;span class="na"&gt;protected_paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.github/workflows&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;production/**&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;secrets/**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And:&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;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;intent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local_development&lt;/span&gt;
    &lt;span class="na"&gt;prepare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And:&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;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;aggregate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;lint&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the repo is saying something operationally useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;start from this task&lt;/li&gt;
&lt;li&gt;these are the safe tasks&lt;/li&gt;
&lt;li&gt;this is the post-change verification lane&lt;/li&gt;
&lt;li&gt;these paths are not for autonomous editing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That does not guarantee the agent will write the right code.&lt;/p&gt;

&lt;p&gt;But it does remove a large class of avoidable failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  How This Reduces Rejected PRs
&lt;/h2&gt;

&lt;p&gt;There are four concrete ways this helps.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The agent runs the repo's real verification path
&lt;/h3&gt;

&lt;p&gt;The agent no longer has to guess whether &lt;code&gt;pytest&lt;/code&gt;, &lt;code&gt;npm test&lt;/code&gt;, &lt;code&gt;go test&lt;/code&gt;, or one CI script is the&lt;br&gt;
real acceptance lane.&lt;/p&gt;

&lt;p&gt;The repo can declare the exact task or workflow that must pass.&lt;/p&gt;

&lt;p&gt;That reduces PRs that fail because the agent validated the wrong thing.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. The agent prepares the repo correctly before editing
&lt;/h3&gt;

&lt;p&gt;A lot of wasted agent work starts before the code change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dependencies were not hydrated correctly&lt;/li&gt;
&lt;li&gt;a service was missing&lt;/li&gt;
&lt;li&gt;env files were never prepared&lt;/li&gt;
&lt;li&gt;the runtime was not actually ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If readiness and setup are declared structurally, the agent has a better chance of operating on a&lt;br&gt;
real working repo instead of a half-prepared one.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. The agent stays inside explicit safety boundaries
&lt;/h3&gt;

&lt;p&gt;Some changes should not happen autonomously.&lt;/p&gt;

&lt;p&gt;That may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;workflow files&lt;/li&gt;
&lt;li&gt;deployment config&lt;/li&gt;
&lt;li&gt;secrets surfaces&lt;/li&gt;
&lt;li&gt;destructive tasks&lt;/li&gt;
&lt;li&gt;data-reset lanes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those boundaries are explicit, the agent can stop, escalate, or stay on the safe path instead&lt;br&gt;
of wandering into a high-review or high-risk change set. A consuming runner or CI gate can then&lt;br&gt;
enforce the same declared boundary where that enforcement is configured.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Reviewers get evidence, not reconstruction work
&lt;/h3&gt;

&lt;p&gt;A reviewer should not have to reverse-engineer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what the agent should have run&lt;/li&gt;
&lt;li&gt;whether it used the right workflow&lt;/li&gt;
&lt;li&gt;whether a failure came from code, setup drift, or missing services&lt;/li&gt;
&lt;li&gt;whether the repo even exposed the right operational truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ota moves that toward explicit evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contract validation&lt;/li&gt;
&lt;li&gt;doctor output&lt;/li&gt;
&lt;li&gt;task dry-run&lt;/li&gt;
&lt;li&gt;workflow proof&lt;/li&gt;
&lt;li&gt;execution receipts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes rejected PRs easier to understand and good PRs easier to trust.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Real Wedge Is Not "AI Coding"
&lt;/h2&gt;

&lt;p&gt;The real wedge is execution governance.&lt;/p&gt;

&lt;p&gt;If AI agents are going to work across unfamiliar repos, those repos need a way to say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what is required&lt;/li&gt;
&lt;li&gt;what is safe&lt;/li&gt;
&lt;li&gt;what should run&lt;/li&gt;
&lt;li&gt;what success looks like&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why this matters beyond agents.&lt;/p&gt;

&lt;p&gt;The same contract truth helps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;new contributors&lt;/li&gt;
&lt;li&gt;CI systems&lt;/li&gt;
&lt;li&gt;remote sandboxes&lt;/li&gt;
&lt;li&gt;internal automation&lt;/li&gt;
&lt;li&gt;future maintainers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent use case just makes the pain impossible to ignore.&lt;/p&gt;
&lt;h2&gt;
  
  
  What A Better Agent PR Flow Looks Like
&lt;/h2&gt;

&lt;p&gt;A stronger flow is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota doctor
ota validate &lt;span class="nb"&gt;.&lt;/span&gt;
ota tasks &lt;span class="nt"&gt;--use&lt;/span&gt;
ota up &lt;span class="nt"&gt;--workflow&lt;/span&gt; app
ota run verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is materially different from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Look around, pick some commands, and hope the repo agrees."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first flow is governed.&lt;br&gt;
The second is guesswork.&lt;/p&gt;
&lt;h2&gt;
  
  
  Final Point
&lt;/h2&gt;

&lt;p&gt;If nearly half of agent-generated PR fixes are being rejected, the response should not only be to&lt;br&gt;
measure model quality harder.&lt;/p&gt;

&lt;p&gt;We should also ask whether repos are giving agents a trustworthy path to completion.&lt;/p&gt;

&lt;p&gt;The stronger question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can the agent write code?"&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;"Can the repo tell the agent what a correct, safe, complete change looks like?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the layer Ota is built for.&lt;/p&gt;
&lt;h2&gt;
  
  
  Get Started With Ota
&lt;/h2&gt;

&lt;p&gt;Install Ota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://dist.ota.run/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;irm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://dist.ota.run/install.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota doctor
ota init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/why-ai-agent-prs-get-rejected-and-how-repo-contracts-help-4h2m" rel="noopener noreferrer"&gt;https://ota.run/blog/why-ai-agent-prs-get-rejected-and-how-repo-contracts-help-4h2m&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>reporeadiness</category>
      <category>verification</category>
      <category>agentsafety</category>
    </item>
    <item>
      <title>AI Coding's Real Bottleneck Is Repository Execution Trust</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Mon, 13 Jul 2026 20:20:02 +0000</pubDate>
      <link>https://dev.to/bobaikato/ai-codings-real-bottleneck-is-repository-execution-trust-5gah</link>
      <guid>https://dev.to/bobaikato/ai-codings-real-bottleneck-is-repository-execution-trust-5gah</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;For a while, the central question in AI coding felt obvious:&lt;/p&gt;

&lt;p&gt;Can the model generate good code?&lt;/p&gt;

&lt;p&gt;That is still important, but it is no longer the main bottleneck in many real workflows.&lt;/p&gt;

&lt;p&gt;The bigger problem now is repository execution trust.&lt;/p&gt;

&lt;p&gt;Can the agent trust the repository enough to act correctly?&lt;/p&gt;

&lt;p&gt;Can the repository tell the agent what setup is required, what task is canonical, what workflow proves readiness, and what evidence should count when something fails?&lt;/p&gt;

&lt;p&gt;If the answer is no, better generation alone does not solve the problem.&lt;/p&gt;

&lt;p&gt;It just produces higher-quality guesses inside an ungoverned environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generation Improved Faster Than Execution Trust
&lt;/h2&gt;

&lt;p&gt;Agents are already reasonably good at many code-local tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;writing small features&lt;/li&gt;
&lt;li&gt;fixing obvious bugs&lt;/li&gt;
&lt;li&gt;updating tests&lt;/li&gt;
&lt;li&gt;refactoring narrow modules&lt;/li&gt;
&lt;li&gt;tracing stack-level failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not where most teams feel the sharpest friction anymore.&lt;/p&gt;

&lt;p&gt;The friction appears when the agent has to move from code generation into repository operation.&lt;/p&gt;

&lt;p&gt;That is where questions like these start to matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what has to run first&lt;/li&gt;
&lt;li&gt;which package manager is authoritative&lt;/li&gt;
&lt;li&gt;which services need to be running&lt;/li&gt;
&lt;li&gt;what environment values are real requirements&lt;/li&gt;
&lt;li&gt;which task is safe to execute&lt;/li&gt;
&lt;li&gt;which verification path is canonical&lt;/li&gt;
&lt;li&gt;whether a failure came from code, setup, or contract drift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not model-completion problems.&lt;/p&gt;

&lt;p&gt;They are execution-trust problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hard Part Is No Longer Writing The Patch
&lt;/h2&gt;

&lt;p&gt;In many repos, the hard part is no longer producing a plausible patch.&lt;/p&gt;

&lt;p&gt;The hard part is knowing whether the patch was exercised against the right path.&lt;/p&gt;

&lt;p&gt;An agent can write a technically good change and still fail the actual job if it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ran the wrong test command&lt;/li&gt;
&lt;li&gt;skipped setup that CI assumes&lt;/li&gt;
&lt;li&gt;missed a required service&lt;/li&gt;
&lt;li&gt;followed a stale README path&lt;/li&gt;
&lt;li&gt;treated an environment problem as a code defect&lt;/li&gt;
&lt;li&gt;passed a narrow local check while the real repo gate stayed unproven&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When that happens, the failure is often blamed on the agent.&lt;/p&gt;

&lt;p&gt;But the repo is usually part of the problem too.&lt;/p&gt;

&lt;p&gt;The repo did not expose enough trustworthy execution truth for the agent to operate with confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Executable Trust Actually Means
&lt;/h2&gt;

&lt;p&gt;Executable trust is the condition where a repository can answer operational questions clearly enough that humans, CI, and agents can take the same path and understand the result.&lt;/p&gt;

&lt;p&gt;That means the repo can declare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what it needs&lt;/li&gt;
&lt;li&gt;how it becomes ready&lt;/li&gt;
&lt;li&gt;what is safe to run&lt;/li&gt;
&lt;li&gt;what should verify a change&lt;/li&gt;
&lt;li&gt;what runtime path is primary&lt;/li&gt;
&lt;li&gt;what evidence should be preserved&lt;/li&gt;
&lt;li&gt;what failures mean&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that, an agent is still reconstructing the repo from incomplete signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;README prose&lt;/li&gt;
&lt;li&gt;shell scripts&lt;/li&gt;
&lt;li&gt;CI workflow fragments&lt;/li&gt;
&lt;li&gt;package manifests&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.env.example&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;local conventions&lt;/li&gt;
&lt;li&gt;tribal knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That reconstruction can look intelligent while still being fragile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bigger Context Windows Do Not Eliminate This
&lt;/h2&gt;

&lt;p&gt;A larger context window helps an agent read more of the repo before deciding.&lt;/p&gt;

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

&lt;p&gt;But it does not create authority.&lt;/p&gt;

&lt;p&gt;If five different files imply five different setup paths, more context just lets the agent inspect more disagreement.&lt;/p&gt;

&lt;p&gt;If CI, local scripts, and contributor docs have drifted apart, a larger window helps the agent see the drift. It does not tell the agent which path the repo actually considers correct.&lt;/p&gt;

&lt;p&gt;This is why the bottleneck has shifted.&lt;/p&gt;

&lt;p&gt;The question is no longer only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can the agent generate a good answer?&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Can the repository expose a trustworthy execution path?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Repository Execution Trust Looks Like In Practice
&lt;/h2&gt;

&lt;p&gt;A repository with executable trust should make some things explicit instead of implied.&lt;/p&gt;

&lt;p&gt;For example:&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;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;prepare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dependency_hydration&lt;/span&gt;
      &lt;span class="na"&gt;medium&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;package_dependencies&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node_package_manager&lt;/span&gt;
        &lt;span class="na"&gt;manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;install&lt;/span&gt;

  &lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;aggregate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;lint&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;typecheck&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;

&lt;span class="na"&gt;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify&lt;/span&gt;
  &lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That does not just give the agent commands.&lt;/p&gt;

&lt;p&gt;It gives the repo a declared setup path, a declared verification path, and a shared operational story for humans and automation.&lt;/p&gt;

&lt;p&gt;And it gives Ota an executable path instead of a prose hint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota up &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify
ota run verify
ota receipt &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--archive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota up --workflow verify&lt;/code&gt; can take the declared setup path instead of guessing what must run first&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota run verify&lt;/code&gt; can execute the canonical verification lane instead of picking between README, CI, or shell drift&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota receipt --json --archive&lt;/code&gt; can preserve the execution and readiness evidence instead of leaving the result as unstructured terminal output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now compare that with a weaker setup where the agent has to guess between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm test&lt;/code&gt; from the README&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pnpm lint &amp;amp;&amp;amp; pnpm test:ci&lt;/code&gt; from CI&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;make check&lt;/code&gt; target that may or may not still be current&lt;/li&gt;
&lt;li&gt;a hidden service dependency no one wrote down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That second repo does not have a generation problem first.&lt;/p&gt;

&lt;p&gt;It has a trust problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failures Need To Become Evidence
&lt;/h2&gt;

&lt;p&gt;Once agents begin operating repos instead of just suggesting edits, output quality is no longer enough.&lt;/p&gt;

&lt;p&gt;The system also needs evidence.&lt;/p&gt;

&lt;p&gt;When setup fails, the useful artifact is not only stderr.&lt;/p&gt;

&lt;p&gt;It is something closer to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what contract or workflow was selected&lt;/li&gt;
&lt;li&gt;what task actually ran&lt;/li&gt;
&lt;li&gt;what readiness was expected&lt;/li&gt;
&lt;li&gt;what service or env assumption was missing&lt;/li&gt;
&lt;li&gt;whether the failure came from declared truth, hidden dependency, or drift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the level where repositories become governable instead of just runnable.&lt;/p&gt;

&lt;p&gt;It is also the level where agents become more trustworthy, because their actions are bounded by declared paths and their failures are easier to interpret honestly.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is Why Ota Repo Contracts Matter
&lt;/h2&gt;

&lt;p&gt;At Ota, this is the problem space we care about.&lt;/p&gt;

&lt;p&gt;The value of a repo contract is not that it gives an agent one more config file to read.&lt;/p&gt;

&lt;p&gt;The value is that it makes execution truth explicit and runnable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setup&lt;/li&gt;
&lt;li&gt;tasks&lt;/li&gt;
&lt;li&gt;workflows&lt;/li&gt;
&lt;li&gt;services&lt;/li&gt;
&lt;li&gt;readiness&lt;/li&gt;
&lt;li&gt;boundaries&lt;/li&gt;
&lt;li&gt;receipts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives the agent something stronger than raw context.&lt;/p&gt;

&lt;p&gt;It gives it an operating contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Next Phase Of AI Coding
&lt;/h2&gt;

&lt;p&gt;The next phase of AI coding is not only about larger models, longer context windows, or better patch generation.&lt;/p&gt;

&lt;p&gt;It is about whether repositories can support trustworthy operation.&lt;/p&gt;

&lt;p&gt;That means moving from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"the agent can write code"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"the agent can act inside a repo with clear execution truth"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are different maturity levels.&lt;/p&gt;

&lt;p&gt;The first is impressive.&lt;/p&gt;

&lt;p&gt;The second is what teams actually need if they want agents to work reliably beyond small edits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;AI coding's bottleneck is no longer only generation quality.&lt;/p&gt;

&lt;p&gt;In many real repos, the larger constraint is whether the repository can expose a trustworthy path from change to verified execution.&lt;/p&gt;

&lt;p&gt;Until that trust layer exists, better generation will still run into the same wall:&lt;/p&gt;

&lt;p&gt;good patches inside unclear repos.&lt;/p&gt;

&lt;p&gt;That is why the next real improvement is not just more model capability.&lt;/p&gt;

&lt;p&gt;It is a repo that can declare, execute, and preserve the same trustworthy path for developers, CI, and AI agents.&lt;/p&gt;

&lt;p&gt;That is the operational layer Ota is building.&lt;/p&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/ai-codings-real-bottleneck-is-repository-execution-trust" rel="noopener noreferrer"&gt;https://ota.run/blog/ai-codings-real-bottleneck-is-repository-execution-trust&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>reporeadiness</category>
      <category>executiongovernance</category>
      <category>agentsafety</category>
    </item>
  </channel>
</rss>
