<?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 (@b0bai).</description>
    <link>https://dev.to/b0bai</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/b0bai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/b0bai"/>
    <language>en</language>
    <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/b0bai/why-ok-true-is-not-enough-for-ai-agent-execution-229a</link>
      <guid>https://dev.to/b0bai/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/b0bai/ai-codings-real-bottleneck-is-repository-execution-trust-5gah</link>
      <guid>https://dev.to/b0bai/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>
    <item>
      <title>Why Agent Safety Needs Enforced Boundaries, Not Just Declared Ones</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Sat, 11 Jul 2026 15:38:05 +0000</pubDate>
      <link>https://dev.to/otaready/why-agent-safety-needs-enforced-boundaries-not-just-declared-ones-2ob2</link>
      <guid>https://dev.to/otaready/why-agent-safety-needs-enforced-boundaries-not-just-declared-ones-2ob2</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Agent safety does not get real the moment a repo declares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;safe tasks&lt;/li&gt;
&lt;li&gt;protected paths&lt;/li&gt;
&lt;li&gt;review-required lanes&lt;/li&gt;
&lt;li&gt;external-effect lanes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is only the first half.&lt;/p&gt;

&lt;p&gt;The second half is whether anything fails when those declarations are wrong, stale, or bypassed.&lt;/p&gt;

&lt;p&gt;That is the real line between repo governance and well-formatted advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Declared Boundaries Are Necessary
&lt;/h2&gt;

&lt;p&gt;A repo should absolutely declare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which tasks are safe for routine agent use&lt;/li&gt;
&lt;li&gt;which workflows are review-required&lt;/li&gt;
&lt;li&gt;which files are writable&lt;/li&gt;
&lt;li&gt;which files are protected&lt;/li&gt;
&lt;li&gt;which commands can mutate external state&lt;/li&gt;
&lt;li&gt;which verification paths are finite and meaningful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that, the agent has to infer boundaries from README prose, CI jobs, helper scripts, and old maintainer habits.&lt;/p&gt;

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

&lt;p&gt;It is guesswork with better intentions.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Declared Boundaries Are Not Enough
&lt;/h2&gt;

&lt;p&gt;If the repo contract says one thing and the actual execution path does another, the declaration degrades quickly.&lt;/p&gt;

&lt;p&gt;It becomes one more soft signal beside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.env.example&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;a stale contributor guide&lt;/li&gt;
&lt;li&gt;a CI workflow nobody meant to be canonical&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why a repo contract only stays true if it lives inside the execution loop.&lt;/p&gt;

&lt;p&gt;The local runner has to consume it.&lt;/p&gt;

&lt;p&gt;CI has to consume it.&lt;/p&gt;

&lt;p&gt;Receipts have to record the path that actually ran.&lt;/p&gt;

&lt;p&gt;Otherwise the repo has declared boundaries, but no enforced boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Failure Shape
&lt;/h2&gt;

&lt;p&gt;Imagine a repo declares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;test&lt;/code&gt; is safe for agents&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;publish&lt;/code&gt; is not&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;migrations/&lt;/code&gt; is protected&lt;/li&gt;
&lt;li&gt;production-facing tasks require review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds fine on paper.&lt;/p&gt;

&lt;p&gt;But now imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the runner still lets an agent invoke &lt;code&gt;publish&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CI never checks whether the declared verification lane was the one that passed&lt;/li&gt;
&lt;li&gt;the agent edits a protected file and nothing complains&lt;/li&gt;
&lt;li&gt;the receipt only says "task completed" without recording the contract path or refusal state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point the repo has not actually governed anything.&lt;/p&gt;

&lt;p&gt;It has just documented preferred behavior.&lt;/p&gt;

&lt;p&gt;The dangerous part is that this can still look disciplined. The contract exists. The docs look good. The review story sounds serious.&lt;/p&gt;

&lt;p&gt;But the boundary has no teeth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Execution Is What Keeps Safety Truth Honest
&lt;/h2&gt;

&lt;p&gt;A boundary becomes real when crossing it changes behavior.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;an unsafe lane is refused by the runner in agent mode&lt;/li&gt;
&lt;li&gt;a protected path boundary is enforced or surfaced by the consuming runner or harness instead of
staying as passive metadata&lt;/li&gt;
&lt;li&gt;a required verification lane is enforced at merge&lt;/li&gt;
&lt;li&gt;a runtime capability boundary only exposes the callable surface the contract allows&lt;/li&gt;
&lt;li&gt;the receipt shows whether execution was allowed, refused, blocked, or only advisory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the important shift:&lt;/p&gt;

&lt;p&gt;agent safety is not only about what the repo can declare.&lt;/p&gt;

&lt;p&gt;It is about what the repo can enforce.&lt;/p&gt;

&lt;p&gt;Execution is the preservative for safety truth.&lt;/p&gt;

&lt;p&gt;The settings the engine actually reads stay accurate far longer than the settings a team merely writes down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Local Runner Enforcement Matters
&lt;/h2&gt;

&lt;p&gt;The local runner is the fastest place to stop bad routine behavior.&lt;/p&gt;

&lt;p&gt;If an agent asks for a task outside the declared safe surface, the runner should be able to refuse before the task starts.&lt;/p&gt;

&lt;p&gt;That matters because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the agent gets a clear stop signal early&lt;/li&gt;
&lt;li&gt;the repo does not have to rely on prompt obedience&lt;/li&gt;
&lt;li&gt;refusal becomes evidence, not folklore&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where declared safe tasks stop being metadata and start becoming a real execution boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why CI Enforcement Matters
&lt;/h2&gt;

&lt;p&gt;Local runner enforcement is not enough on its own.&lt;/p&gt;

&lt;p&gt;Teams can use different agents.&lt;br&gt;
People can route around local conventions.&lt;br&gt;
Tools can drift.&lt;/p&gt;

&lt;p&gt;The merge gate is where the repo gets one mandatory chokepoint.&lt;/p&gt;

&lt;p&gt;That is why CI has to enforce the same contract truth too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which verification lanes are required&lt;/li&gt;
&lt;li&gt;which proof must exist&lt;/li&gt;
&lt;li&gt;which workflow is canonical&lt;/li&gt;
&lt;li&gt;whether contract and CI wiring have drifted apart&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the contract lies, the build should break visibly.&lt;/p&gt;

&lt;p&gt;That is much stronger than hoping the next human or agent notices the mismatch by reading more context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Receipts Matter
&lt;/h2&gt;

&lt;p&gt;Safety also needs evidence.&lt;/p&gt;

&lt;p&gt;If a boundary was crossed, refused, or bypassed, someone should not have to reconstruct that from chat logs or terminal fragments later.&lt;/p&gt;

&lt;p&gt;Receipts are the durable layer that can say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which contract path ran&lt;/li&gt;
&lt;li&gt;which actor mode was used&lt;/li&gt;
&lt;li&gt;whether the lane was allowed or refused&lt;/li&gt;
&lt;li&gt;what evidence was collected&lt;/li&gt;
&lt;li&gt;whether execution stayed inside the declared boundary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what makes enforcement auditable instead of anecdotal.&lt;/p&gt;

&lt;p&gt;For the public receipt surface, see:&lt;/p&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;/ul&gt;

&lt;h2&gt;
  
  
  This Is Why Ota Is Not Just A Better Instruction File
&lt;/h2&gt;

&lt;p&gt;The weaker model is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;write better guidance&lt;/li&gt;
&lt;li&gt;tell the agent to be careful&lt;/li&gt;
&lt;li&gt;document what should happen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The stronger model is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;declare the boundary once&lt;/li&gt;
&lt;li&gt;enforce it locally&lt;/li&gt;
&lt;li&gt;enforce it at merge&lt;/li&gt;
&lt;li&gt;emit evidence when the boundary is crossed, blocked, or refused&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between declared agent safety and enforced agent safety.&lt;/p&gt;

&lt;p&gt;Ota is trying to live on the stronger side of that line.&lt;/p&gt;

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

&lt;p&gt;Agent safety needs declared boundaries.&lt;/p&gt;

&lt;p&gt;But it does not stop there.&lt;/p&gt;

&lt;p&gt;If nothing consumes those boundaries, nothing fails when they drift, and no evidence is emitted when they are crossed, the repo has not built a safety system.&lt;/p&gt;

&lt;p&gt;It has built documentation.&lt;/p&gt;

&lt;p&gt;That is why agent safety needs enforced boundaries, not just declared ones.&lt;/p&gt;




&lt;p&gt;Original posted here: &lt;a href="https://ota.run/blog/why-agent-safety-needs-enforced-boundaries-not-just-declared-ones-4m7q" rel="noopener noreferrer"&gt;https://ota.run/blog/why-agent-safety-needs-enforced-boundaries-not-just-declared-ones-4m7q&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>agentsafety</category>
      <category>executiongovernance</category>
      <category>reporeadiness</category>
    </item>
    <item>
      <title>From Execution Logs to Governance Verdicts in Ota</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Thu, 09 Jul 2026 12:10:16 +0000</pubDate>
      <link>https://dev.to/otaready/from-execution-logs-to-governance-verdicts-in-ota-kbh</link>
      <guid>https://dev.to/otaready/from-execution-logs-to-governance-verdicts-in-ota-kbh</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Most execution tooling still makes operators do too much reconstruction work.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;command output&lt;/li&gt;
&lt;li&gt;step logs&lt;/li&gt;
&lt;li&gt;maybe a receipt&lt;/li&gt;
&lt;li&gt;maybe a CI summary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the hardest governance questions are usually left implicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;was this lane allowed or only runnable&lt;/li&gt;
&lt;li&gt;should this path have been refused&lt;/li&gt;
&lt;li&gt;was review required&lt;/li&gt;
&lt;li&gt;was proof expected&lt;/li&gt;
&lt;li&gt;did the result satisfy the declared governance bar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the gap Ota is closing.&lt;/p&gt;

&lt;p&gt;The point is not to replace logs.&lt;/p&gt;

&lt;p&gt;The point is to stop treating logs as the primary governance artifact.&lt;/p&gt;

&lt;p&gt;Logs are still useful for detail. But governance should be emitted as structured truth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what Ota decided before execution&lt;/li&gt;
&lt;li&gt;what basis that decision used&lt;/li&gt;
&lt;li&gt;what evidence was expected after execution&lt;/li&gt;
&lt;li&gt;what evidence was actually present&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a better operator surface, a better CI surface, and a much better agent surface.&lt;/p&gt;

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

&lt;p&gt;Ota’s governance output is now moving from flat status reporting toward explicit verdict records.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;ota up --json&lt;/code&gt;, the shipped governance surface is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;governance.preflight&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;governance.post_execution&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For selected-task preview and discovery surfaces such as &lt;code&gt;ota run &amp;lt;task&amp;gt; --dry-run --json&lt;/code&gt;, the&lt;br&gt;
same phase split is exposed under:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;governance.evaluation.preflight&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;governance.evaluation.post_execution&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Preflight answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is this lane allowed&lt;/li&gt;
&lt;li&gt;is it refused&lt;/li&gt;
&lt;li&gt;is it blocked&lt;/li&gt;
&lt;li&gt;is review required&lt;/li&gt;
&lt;li&gt;is a receipt or proof expected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Post-execution answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;did execution happen&lt;/li&gt;
&lt;li&gt;was it refused before execution&lt;/li&gt;
&lt;li&gt;was the evidence bar satisfied&lt;/li&gt;
&lt;li&gt;is proof missing&lt;/li&gt;
&lt;li&gt;is there a receipt-linked crossing record&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is stronger than asking an operator, CI job, or agent to infer all of that from prose.&lt;/p&gt;
&lt;h2&gt;
  
  
  The important product shift
&lt;/h2&gt;

&lt;p&gt;The important shift is not just “more JSON.”&lt;/p&gt;

&lt;p&gt;It is that Ota is turning governance into a first-class output surface instead of an accidental by-product of command execution.&lt;/p&gt;

&lt;p&gt;That means a machine consumer can now read stable fields such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;governance.preflight.state&lt;/code&gt; on &lt;code&gt;ota up --json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;governance.preflight.decision_basis[]&lt;/code&gt; on &lt;code&gt;ota up --json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;governance.post_execution.state&lt;/code&gt; on &lt;code&gt;ota up --json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;governance.post_execution.decision_basis[]&lt;/code&gt; on &lt;code&gt;ota up --json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And on selected-task preview surfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;governance.evaluation.preflight.state&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;governance.evaluation.preflight.decision_basis[]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;governance.evaluation.post_execution.state&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;governance.evaluation.post_execution.decision_basis[]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And, in the newer trust-refinement layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;governance.preflight.evidence_classes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;governance.post_execution.evidence_classes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;governance.evaluation.preflight.evidence_classes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;governance.evaluation.post_execution.evidence_classes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those fields let downstream consumers distinguish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;caller-asserted intent&lt;/li&gt;
&lt;li&gt;Ota-derived governance truth&lt;/li&gt;
&lt;li&gt;boundary-attested evidence such as receipt attachment state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That distinction matters because a structured field is only valuable if it is honest about what kind of truth it carries.&lt;/p&gt;
&lt;h2&gt;
  
  
  What this looks like
&lt;/h2&gt;

&lt;p&gt;Here is the shipped shape from &lt;code&gt;ota up --json&lt;/code&gt; when Ota can already distinguish preflight posture&lt;br&gt;
from post-execution evidence posture:&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;"governance"&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;"preflight"&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;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allowed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"crossing_required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"crossing_classification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"routine"&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_classes"&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;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"derived"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"crossing_required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"derived"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"crossing_classification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"derived"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"receipt_expected"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"derived"&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_expected"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"derived"&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;"receipt_expected"&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_expected"&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="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;"post_execution"&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;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"evidence_missing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"execution_attempted"&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;"refusal_occurred"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"decision_basis"&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;"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;"evidence:receipt_present"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"family"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"evidence_gate"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"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;"receipt_status:ready"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"family"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"receipt_evidence"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"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;"evidence:proof_missing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"family"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"evidence_gate"&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;"derived"&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;"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;"crossing_record:not_required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"family"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"crossing_evidence"&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;"derived"&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;"evidence_classes"&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;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"derived"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"execution_attempted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"derived"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"refusal_occurred"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"derived"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"crossing_record_state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"derived"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"receipt_present"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"proof_present"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"derived"&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;"receipt_present"&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_present"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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 field set still varies by command surface. &lt;code&gt;ota up --json&lt;/code&gt; uses &lt;code&gt;governance.preflight&lt;/code&gt; /&lt;br&gt;
&lt;code&gt;governance.post_execution&lt;/code&gt;, while selected-task preview surfaces keep the same split under&lt;br&gt;
&lt;code&gt;governance.evaluation.*&lt;/code&gt;. What is now shipped consistently is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preflight verdict&lt;/li&gt;
&lt;li&gt;cited basis&lt;/li&gt;
&lt;li&gt;post-execution evidence verdict&lt;/li&gt;
&lt;li&gt;cited evidence basis&lt;/li&gt;
&lt;li&gt;provenance on authoritative fields&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this is better than logs alone
&lt;/h2&gt;

&lt;p&gt;Logs are still where you go for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;full process output&lt;/li&gt;
&lt;li&gt;stack traces&lt;/li&gt;
&lt;li&gt;backend-specific details&lt;/li&gt;
&lt;li&gt;raw command detail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But logs are weak as the primary governance surface because they force reconstruction.&lt;/p&gt;

&lt;p&gt;A governance verdict should let an operator, CI system, or agent answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;was this refusal expected&lt;/li&gt;
&lt;li&gt;which policy or boundary actually blocked it&lt;/li&gt;
&lt;li&gt;was proof required here&lt;/li&gt;
&lt;li&gt;did the final state satisfy the declared bar&lt;/li&gt;
&lt;li&gt;is the result authoritative or only advisory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not log-parsing questions.&lt;/p&gt;

&lt;p&gt;They are governance questions.&lt;/p&gt;

&lt;p&gt;That is why Ota should emit them directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for AI agents
&lt;/h2&gt;

&lt;p&gt;This matters even more for agents than for humans.&lt;/p&gt;

&lt;p&gt;A human can read logs and infer intent.&lt;/p&gt;

&lt;p&gt;An agent needs a stable contract.&lt;/p&gt;

&lt;p&gt;If an agent only sees:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;command succeeded&lt;/li&gt;
&lt;li&gt;command failed&lt;/li&gt;
&lt;li&gt;here is some text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then it still has to guess:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether a lane was safe&lt;/li&gt;
&lt;li&gt;whether it crossed a boundary&lt;/li&gt;
&lt;li&gt;whether it should stop&lt;/li&gt;
&lt;li&gt;whether the missing artifact is proof, setup, or review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is exactly the kind of ambiguity that produces unsafe automation and noisy PRs.&lt;/p&gt;

&lt;p&gt;A structured governance verdict is stronger because it gives the agent a machine-readable stop&lt;br&gt;
sign or green light.&lt;/p&gt;

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

&lt;p&gt;CI also gets better when governance is structured.&lt;/p&gt;

&lt;p&gt;Without a real verdict surface, CI usually ends up proving only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;some workflow ran&lt;/li&gt;
&lt;li&gt;some job passed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is weaker than:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the repo’s declared lane was allowed&lt;/li&gt;
&lt;li&gt;the required lane actually ran&lt;/li&gt;
&lt;li&gt;the expected evidence bar was satisfied&lt;/li&gt;
&lt;li&gt;the repo did not silently drift away from its declared governance truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the direction Ota is taking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repo contract as the source of truth&lt;/li&gt;
&lt;li&gt;local runner as fast feedback&lt;/li&gt;
&lt;li&gt;machine-readable governance verdict as the integration surface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then CI, agents, and later harnesses can all consume the same truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  What still matters
&lt;/h2&gt;

&lt;p&gt;This does not mean Ota is done the moment a JSON block exists.&lt;/p&gt;

&lt;p&gt;A governance verdict only earns trust if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it is emitted where the decision is made&lt;/li&gt;
&lt;li&gt;it cites the real decision basis&lt;/li&gt;
&lt;li&gt;it distinguishes derived truth from asserted truth&lt;/li&gt;
&lt;li&gt;it stays reconciled with the actual execution path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why later trust work matters too.&lt;/p&gt;

&lt;p&gt;The bar is not just machine-readable governance.&lt;/p&gt;

&lt;p&gt;The bar is machine-readable governance that is authoritative enough to stop a human or agent from&lt;br&gt;
having to reopen the logs for the first question.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader point
&lt;/h2&gt;

&lt;p&gt;Execution logs tell you what happened.&lt;/p&gt;

&lt;p&gt;Governance verdicts should tell you what Ota allowed, refused, required, and verified.&lt;/p&gt;

&lt;p&gt;That is the difference between command output and execution governance.&lt;/p&gt;

&lt;p&gt;And that is where Ota gets stronger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;not by hiding logs&lt;/li&gt;
&lt;li&gt;not by narrating more prose&lt;/li&gt;
&lt;li&gt;but by emitting the governance truth directly&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally post here: &lt;a href="https://ota.run/blog/from-execution-logs-to-governance-verdicts-in-ota" rel="noopener noreferrer"&gt;https://ota.run/blog/from-execution-logs-to-governance-verdicts-in-ota&lt;/a&gt;&lt;/p&gt;

</description>
      <category>executiongovernance</category>
      <category>reporeadiness</category>
      <category>receipts</category>
      <category>diagnostics</category>
    </item>
    <item>
      <title>Pressure-testing Ota on OrchardCore: first-class dotnet restore and honest narrow .NET proof</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Wed, 08 Jul 2026 20:26:51 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-orchardcore-first-class-dotnet-restore-and-honest-narrow-net-proof-2nlk</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-orchardcore-first-class-dotnet-restore-and-honest-narrow-net-proof-2nlk</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;OrchardCore mattered because it is a real .NET repo, not a toy starter.&lt;/p&gt;

&lt;p&gt;Even a narrow slice of the repo carries several different truths at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dotnet&lt;/code&gt; as the real toolchain owner&lt;/li&gt;
&lt;li&gt;restore as a real dependency-hydration lane&lt;/li&gt;
&lt;li&gt;build and test as finite CLI surfaces, not shell glue&lt;/li&gt;
&lt;li&gt;native and container execution both advertised by the contract&lt;/li&gt;
&lt;li&gt;a much larger repo outside the selected slice that the contract should not pretend to own&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That made OrchardCore a useful pressure repo for a simple question:&lt;/p&gt;

&lt;p&gt;can Ota represent a serious .NET contributor path cleanly without collapsing back into raw shell&lt;br&gt;
or overclaiming the whole repository?&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this repo mattered
&lt;/h2&gt;

&lt;p&gt;OrchardCore is a broad ASP.NET Core codebase with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;many projects&lt;/li&gt;
&lt;li&gt;broader CI workflows&lt;/li&gt;
&lt;li&gt;functional and browser-heavy test surfaces&lt;/li&gt;
&lt;li&gt;asset and documentation paths outside the selected unit-project slice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is exactly why the repo is useful.&lt;/p&gt;

&lt;p&gt;A weak readiness contract would try to flatten all of that into one vague “build and test”&lt;br&gt;
surface. A stronger contract narrows intentionally and says what it really owns.&lt;/p&gt;

&lt;p&gt;The selected OrchardCore slice is honest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;restore one unit-test project&lt;/li&gt;
&lt;li&gt;build that same project&lt;/li&gt;
&lt;li&gt;test that same project&lt;/li&gt;
&lt;li&gt;prove the slice on host and container paths where the contract advertises them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the right pressure bar for this repo.&lt;/p&gt;
&lt;h2&gt;
  
  
  What OrchardCore proved
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Ota's .NET story is stronger when restore is first-class
&lt;/h3&gt;

&lt;p&gt;The mature setup lane is not:&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;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet restore test/OrchardCore.Abstractions.Tests/OrchardCore.Abstractions.Tests.csproj&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The stronger contract shape is:&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;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;dotnet_restore&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;test/OrchardCore.Abstractions.Tests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That matters because the contract now owns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the hydration lane itself&lt;/li&gt;
&lt;li&gt;the fact that it is package dependency preparation&lt;/li&gt;
&lt;li&gt;the requirement on the &lt;code&gt;dotnet&lt;/code&gt; toolchain&lt;/li&gt;
&lt;li&gt;the network semantics of the lane&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of leaving all of that implicit inside one shell string.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Finite .NET task bodies should stay structured
&lt;/h3&gt;

&lt;p&gt;OrchardCore also proved that plain &lt;code&gt;dotnet build&lt;/code&gt; and &lt;code&gt;dotnet test&lt;/code&gt; lanes do not need to stay as&lt;br&gt;
raw &lt;code&gt;run&lt;/code&gt; bodies.&lt;/p&gt;

&lt;p&gt;The stronger shape is:&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;build&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;dotnet&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;build&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--no-restore&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;test/OrchardCore.Abstractions.Tests&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;test&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;dotnet&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="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--no-restore&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--verbosity&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;minimal&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;test/OrchardCore.Abstractions.Tests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives Ota a better execution boundary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;executable identity is explicit&lt;/li&gt;
&lt;li&gt;arguments are explicit&lt;/li&gt;
&lt;li&gt;working directory is explicit&lt;/li&gt;
&lt;li&gt;mode branches only need to vary context, not duplicate command text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is more mature governance than copying the same shell body across native and container modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Honest narrowing is more valuable than fake full-repo coverage
&lt;/h3&gt;

&lt;p&gt;OrchardCore did not force a dramatic new Ota core bug.&lt;/p&gt;

&lt;p&gt;What it proved instead is equally useful:&lt;/p&gt;

&lt;p&gt;Ota can already carry a real .NET repo slice cleanly when the contract is disciplined about what&lt;br&gt;
it is and is not claiming.&lt;/p&gt;

&lt;p&gt;This contract does not pretend to own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the entire OrchardCore solution&lt;/li&gt;
&lt;li&gt;every functional test lane&lt;/li&gt;
&lt;li&gt;every database-backed or browser-backed path&lt;/li&gt;
&lt;li&gt;every asset or documentation workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It owns one clear contributor-readiness slice and proves that slice well.&lt;/p&gt;

&lt;p&gt;That is better than a broader but less trustworthy contract.&lt;/p&gt;
&lt;h2&gt;
  
  
  What changed in the contract
&lt;/h2&gt;

&lt;p&gt;The important changes were not dramatic. They were governance upgrades.&lt;/p&gt;

&lt;p&gt;Toolchain ownership is 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;toolchains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dotnet&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;10.0"&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;dotnet&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow now owns the setup boundary directly:&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;verify&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;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;And verification stays aggregate-owned instead of shell-chained:&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;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;build&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;That final shape is small, but it is honest and machine-readable.&lt;/p&gt;

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

&lt;p&gt;The current green OrchardCore matrix run for this narrowed slice is &lt;a href="https://github.com/bobaikato/OrchardCore/actions/runs/28971743168" rel="noopener noreferrer"&gt;#28971743168&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That run is enough to support the note because it proved the slice the contract actually claims:&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;dry-run task coverage&lt;/li&gt;
&lt;li&gt;dry-run workflow coverage&lt;/li&gt;
&lt;li&gt;native execution on the selected unit-project slice&lt;/li&gt;
&lt;li&gt;container planning and execution for the same declared task surfaces&lt;/li&gt;
&lt;li&gt;matrix coverage across Ubuntu, macOS, and Windows for the contract branch at that time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters more than pretending the branch should already prove every broader OrchardCore lane.&lt;/p&gt;

&lt;p&gt;The linked pressure branch is now pinned to released Ota &lt;code&gt;v1.6.23&lt;/code&gt; for stable reference. This&lt;br&gt;
green matrix run is the proof artifact for the narrowed slice this note describes.&lt;/p&gt;

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

&lt;p&gt;OrchardCore helped confirm that Ota's current &lt;code&gt;.NET&lt;/code&gt; surfaces are no longer theoretical.&lt;/p&gt;

&lt;p&gt;They are strong enough to model a real ASP.NET Core repo slice with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;first-class restore hydration&lt;/li&gt;
&lt;li&gt;structured finite dotnet commands&lt;/li&gt;
&lt;li&gt;workflow-owned setup&lt;/li&gt;
&lt;li&gt;explicit host/container mode truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without falling back to raw shell or overclaiming repo coverage.&lt;/p&gt;

&lt;p&gt;That is the real value of this pressure repo.&lt;/p&gt;

&lt;p&gt;It did not need to expose a dramatic bug to matter. It proved that Ota's newer &lt;code&gt;.NET&lt;/code&gt; contract&lt;br&gt;
story is mature enough to use on a serious repository, provided the contract narrows honestly.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Contract: &lt;a href="https://github.com/bobaikato/OrchardCore/blob/bobai/OrchardCore-ota-pressure/ota.yaml" rel="noopener noreferrer"&gt;OrchardCore &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/OrchardCore/blob/bobai/OrchardCore-ota-pressure/.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;Current green matrix run: &lt;a href="https://github.com/bobaikato/OrchardCore/actions/runs/28971743168" rel="noopener noreferrer"&gt;#28971743168&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-orchardcore-3d2m" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-orchardcore-3d2m&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pressuretesting</category>
      <category>reporeadiness</category>
      <category>dependencyhydration</category>
      <category>runtimeproof</category>
    </item>
    <item>
      <title>Making Ota Governance Output Machine-Readable</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Tue, 07 Jul 2026 14:02:27 +0000</pubDate>
      <link>https://dev.to/otaready/making-ota-governance-output-machine-readable-73e</link>
      <guid>https://dev.to/otaready/making-ota-governance-output-machine-readable-73e</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Most engineering teams already have governance.&lt;/p&gt;

&lt;p&gt;They just cannot execute it reliably.&lt;/p&gt;

&lt;p&gt;The rules are split across &lt;code&gt;README&lt;/code&gt; sections, CI snippets, old shell scripts, and internal memory. Humans can sometimes stitch that together. Agents usually cannot. New teammates definitely should not have to.&lt;/p&gt;

&lt;p&gt;Ota takes a different position:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;governance should be declared&lt;/li&gt;
&lt;li&gt;execution should be selected from declared truth&lt;/li&gt;
&lt;li&gt;outcomes should be emitted as machine-readable proof&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what makes governance operational instead of aspirational.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real problem with "documented" governance
&lt;/h2&gt;

&lt;p&gt;In many repos, governance sounds clear until a real run starts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setup is "documented," but there is no canonical execution surface&lt;/li&gt;
&lt;li&gt;verification exists, but no one can say which path is safe, default, or complete&lt;/li&gt;
&lt;li&gt;CI is green, but local and agent workflows drift from the CI lane&lt;/li&gt;
&lt;li&gt;failures appear, but output does not explain which governance rule failed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where delivery slows down and trust drops.&lt;/p&gt;

&lt;p&gt;The issue is not missing effort. The issue is missing machine-readable ownership.&lt;/p&gt;

&lt;h2&gt;
  
  
  What machine-readable governance output means in Ota
&lt;/h2&gt;

&lt;p&gt;Ota separates governance into explicit operational layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contract truth in &lt;code&gt;ota.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;executable task and workflow truth through &lt;code&gt;ota tasks&lt;/code&gt;, &lt;code&gt;ota run&lt;/code&gt;, and &lt;code&gt;ota up&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;proof truth through receipts and JSON output surfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives one declared system for both humans and automation.&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
ota tasks &lt;span class="nt"&gt;--use&lt;/span&gt;
ota run verify
ota receipt &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When this is modeled correctly, operators and agents stop guessing which command is "the real one."&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually shipped in &lt;code&gt;v1.6.23&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This is not just a philosophy note.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;v1.6.23&lt;/code&gt; widened the real machine-readable governance surface in concrete ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota doctor --json&lt;/code&gt; now publishes &lt;code&gt;governance.merge_gate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota doctor --json&lt;/code&gt; now publishes &lt;code&gt;governance.required_verification_lanes&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;projected verification lanes now carry stable &lt;code&gt;metadata.governance.merge_check_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota tasks --json&lt;/code&gt; and &lt;code&gt;ota workflows --json&lt;/code&gt; now publish &lt;code&gt;capability_profile&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;execution and proof artifacts now carry clearer &lt;code&gt;stage_family&lt;/code&gt; / &lt;code&gt;phase&lt;/code&gt; truth&lt;/li&gt;
&lt;li&gt;agent-mode governance output now distinguishes non-execution states like &lt;code&gt;not_run_reason&lt;/code&gt; and &lt;code&gt;crossing_record_state&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters because downstream systems no longer need to scrape prose and guess:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which verification lane is merge-relevant&lt;/li&gt;
&lt;li&gt;which lanes are callable or refused for an agent&lt;/li&gt;
&lt;li&gt;which governance phase they are looking at&lt;/li&gt;
&lt;li&gt;which follow-up artifact or proof path is canonical&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the difference between “the repo has governance” and “other systems can consume the repo’s governance directly.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is a major shift for AI agents
&lt;/h2&gt;

&lt;p&gt;Agents fail when repos force them to infer policy from prose.&lt;/p&gt;

&lt;p&gt;Ota gives agents bounded, declared surfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what they are allowed to run&lt;/li&gt;
&lt;li&gt;what each path requires&lt;/li&gt;
&lt;li&gt;what side effects are expected&lt;/li&gt;
&lt;li&gt;what happened after execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That changes the quality of automation from "best effort shell guessing" to governed execution.&lt;/p&gt;

&lt;p&gt;It also reduces risk for maintainers because agent behavior can be reviewed against contract and receipt truth, not just prompt intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opinionated by design: one truthful path beats five clever ones
&lt;/h2&gt;

&lt;p&gt;Ota is intentionally opinionated here.&lt;/p&gt;

&lt;p&gt;If governance is duplicated in scripts, docs, and CI YAML with no single owner, governance is already drifting.&lt;/p&gt;

&lt;p&gt;The stronger pattern is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one contract surface for readiness and execution truth&lt;/li&gt;
&lt;li&gt;one set of canonical task/workflow entrypoints&lt;/li&gt;
&lt;li&gt;one machine-readable output model for diagnostics and receipts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is less "flexible" on paper and far more reliable in production engineering practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete before-and-after
&lt;/h2&gt;

&lt;p&gt;Before Ota, teams typically debug governance with archaeology:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read docs&lt;/li&gt;
&lt;li&gt;inspect scripts&lt;/li&gt;
&lt;li&gt;compare CI behavior&lt;/li&gt;
&lt;li&gt;rerun commands until something works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Ota, governance becomes inspectable output:&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;"governance"&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;"required_verification_lanes"&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;"merge_check_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;"ota.verify.verify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lane_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;"verify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lane_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;"aggregate"&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;"merge_gate"&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;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"projected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"lanes"&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;"merge_check_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;"ota.verify.verify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"lane_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;"verify"&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;span class="nl"&gt;"capability_profile"&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;"actor_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;"agent"&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 fields vary by command, but the important point is that this is real Ota output shape, not a second narrated explanation layered on top afterward.&lt;/p&gt;

&lt;p&gt;The value is deterministic, parseable operational truth that CI, UIs, automation, and operators can all consume consistently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is an engineering note and not just a product opinion
&lt;/h2&gt;

&lt;p&gt;The engineering issue is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prose can describe governance&lt;/li&gt;
&lt;li&gt;scripts can enact governance&lt;/li&gt;
&lt;li&gt;CI can partially enforce governance&lt;/li&gt;
&lt;li&gt;but if none of that is emitted as stable machine-readable truth, every consumer rebuilds the model differently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is how drift starts.&lt;/p&gt;

&lt;p&gt;The practical bar for Ota is higher:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;governance should be declared once&lt;/li&gt;
&lt;li&gt;execution should select from that declared truth&lt;/li&gt;
&lt;li&gt;machine-readable output should preserve what was selected, what was enforced, and what evidence exists afterward&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what lets one repo surface drive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local operator flows&lt;/li&gt;
&lt;li&gt;CI and merge consumers&lt;/li&gt;
&lt;li&gt;agent harnesses&lt;/li&gt;
&lt;li&gt;later auditing and receipt review&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;As AI agents become part of daily engineering execution, human-only governance is no longer enough.&lt;/p&gt;

&lt;p&gt;If your repo cannot emit machine-readable readiness and proof, your automation stack will stay fragile no matter how good your prompts are.&lt;/p&gt;

&lt;p&gt;Ota's approach is practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;declare the operational truth once&lt;/li&gt;
&lt;li&gt;execute declared truth explicitly&lt;/li&gt;
&lt;li&gt;emit evidence that can be consumed by people and machines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is how governance scales without losing trust.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Execution Governance Loop: &lt;a href="https://ota.run/docs/reference/execution-governance-loop" rel="noopener noreferrer"&gt;https://ota.run/docs/reference/execution-governance-loop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Governance reference: &lt;a href="https://ota.run/docs/reference/governance" rel="noopener noreferrer"&gt;https://ota.run/docs/reference/governance&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JSON output reference: &lt;a href="https://ota.run/docs/reference/json-output" rel="noopener noreferrer"&gt;https://ota.run/docs/reference/json-output&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Execution receipt reference: &lt;a href="https://ota.run/docs/reference/execution-receipt" rel="noopener noreferrer"&gt;https://ota.run/docs/reference/execution-receipt&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/making-ota-governance-output-machine-readable-4m8q" rel="noopener noreferrer"&gt;https://ota.run/blog/making-ota-governance-output-machine-readable-4m8q&lt;/a&gt;&lt;/p&gt;

</description>
      <category>reporeadiness</category>
      <category>governance</category>
      <category>machinereadable</category>
      <category>aiagents</category>
    </item>
  </channel>
</rss>
