<?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: Ota</title>
    <description>The latest articles on DEV Community by Ota (otaready).</description>
    <link>https://dev.to/otaready</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%2Forganization%2Fprofile_image%2F13336%2F550b6b86-9e5e-4da6-a747-80a7dd35ead3.png</url>
      <title>DEV Community: Ota</title>
      <link>https://dev.to/otaready</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/otaready"/>
    <language>en</language>
    <item>
      <title>Pressure-testing Ota on Grafana: bounded Go proof and a staged Compose slice</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Wed, 05 Aug 2026 17:37:56 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-grafana-bounded-go-proof-and-a-staged-compose-slice-2hf8</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-grafana-bounded-go-proof-and-a-staged-compose-slice-2hf8</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Grafana is a large mixed repository. Its upstream CI spans sharded backend and frontend tests,&lt;br&gt;
multiple databases, end-to-end paths, release builds, and a Tilt-owned development environment.&lt;/p&gt;

&lt;p&gt;That makes it a useful pressure target precisely because a plausible-looking single &lt;code&gt;verify&lt;/code&gt;&lt;br&gt;
command would be dishonest.&lt;/p&gt;

&lt;p&gt;The Ota 1.6.25 contract owns two specific surfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Go package build path rooted at &lt;code&gt;./pkg/...&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a separately declared Compose dependency slice for PostgreSQL, Prometheus, Loki, and Tempo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else remains outside the claim.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Contract
&lt;/h2&gt;

&lt;p&gt;The backend proof is intentionally narrow. Ota hydrates Go modules, then runs the named package&lt;br&gt;
build rather than guessing at Grafana's full sharded test matrix:&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;go_modules&lt;/span&gt;

  &lt;span class="na"&gt;build:backend:pkg&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;go&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;build&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;./pkg/...&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;proof:backend:pkg&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;build:backend:pkg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Go range is also honest about the claimed lane:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;=1.26.3 &amp;lt;1.27&lt;/code&gt;, not an artificial patch pin;&lt;/li&gt;
&lt;li&gt;native and ephemeral-container modes for the package build;&lt;/li&gt;
&lt;li&gt;no claim that this range proves every Grafana build or test path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The named lane matters. &lt;code&gt;build:backend:pkg&lt;/code&gt; says what it owns. A generic &lt;code&gt;build&lt;/code&gt; or &lt;code&gt;verify&lt;/code&gt;&lt;br&gt;
would blur frontend, release, and backend truth in a repository where those are different paths.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Compose Boundary
&lt;/h2&gt;

&lt;p&gt;The development workflow is equally bounded. Grafana's frontend-service environment uses more than&lt;br&gt;
the four observability dependencies in this contract, including application and proxy behavior&lt;br&gt;
owned by Tilt. Ota therefore models only the selected Compose services:&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;devenv:observability:up&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;compose&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;up&lt;/span&gt;
      &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;prometheus&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;loki&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;tempo&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;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;container_image_hydration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ota captures the Compose adapter inputs, starts only that selection, inspects it with a separate&lt;br&gt;
safe status task, archives a receipt, and stops it again. This is not a claim that Grafana itself,&lt;br&gt;
its frontend, its proxy, or its Tilt orchestration became ready.&lt;/p&gt;
&lt;h2&gt;
  
  
  Released Install Truth
&lt;/h2&gt;

&lt;p&gt;The pressure matrix consumes the Ota version declared 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;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ota&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;minimum_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.6.25"&lt;/span&gt;

&lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;bootstrap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ota&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="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;version&lt;/span&gt;
        &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1.6.25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The GitHub workflow installs via &lt;code&gt;ota-run/setup&lt;/code&gt; with &lt;code&gt;source: contract&lt;/code&gt;, checks that the installed&lt;br&gt;
binary is exactly &lt;code&gt;v1.6.25&lt;/code&gt;, and retains the version record, topology, receipts, and proof output&lt;br&gt;
for seven days on every result. The workflow actions themselves are pinned to immutable revisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What The Matrix Covers
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;v1.6.25&lt;/code&gt; requalification matrix covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contract validation, Doctor, task discovery, safe-task discovery, workflow discovery, and execution-topology export on Ubuntu, macOS, and Windows;&lt;/li&gt;
&lt;li&gt;native task and workflow dry-runs across that matrix;&lt;/li&gt;
&lt;li&gt;container task and workflow dry-runs on Ubuntu;&lt;/li&gt;
&lt;li&gt;real native and ephemeral-container execution of the selected Go build on Ubuntu;&lt;/li&gt;
&lt;li&gt;real start, safe status inspection, archived receipt, receipt diff, and stop for the selected observability Compose dependencies on Ubuntu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The released-&lt;code&gt;v1.6.25&lt;/code&gt; requalification is green: &lt;a href="https://github.com/bobaikato/grafana/actions/runs/30965322618" rel="noopener noreferrer"&gt;Grafana matrix run&lt;br&gt;
30965322618&lt;/a&gt;. All three legs&lt;br&gt;
recorded &lt;code&gt;ota v1.6.25&lt;/code&gt; at source commit &lt;code&gt;a3e9f98f3&lt;/code&gt;. The Ubuntu evidence also retains the Compose&lt;br&gt;
receipt and its unchanged baseline comparison, including the selected image digests. That comparison&lt;br&gt;
is witness-only: it does not execute a replay or establish hermeticity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does Not Prove
&lt;/h2&gt;

&lt;p&gt;This is selected-lane evidence, not a Grafana-wide readiness verdict. It does not prove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grafana's sharded backend unit, integration, frontend, E2E, or release workflows;&lt;/li&gt;
&lt;li&gt;application readiness, user-visible dashboards, API correctness, or migration behavior;&lt;/li&gt;
&lt;li&gt;the Tilt-managed frontend-service application, proxy, or lifecycle;&lt;/li&gt;
&lt;li&gt;Docker Desktop behavior on macOS or Windows;&lt;/li&gt;
&lt;li&gt;registry availability, external services, or host capacity beyond each selected execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The material uncovered behavior is therefore explicitly repo-owned or unproved, not silently&lt;br&gt;
absorbed into a green label.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Upstream repository: &lt;a href="https://github.com/grafana/grafana" rel="noopener noreferrer"&gt;grafana/grafana&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pressure contract: &lt;a href="https://github.com/bobaikato/grafana/blob/bobai/grafana-ota-pressure/ota.yaml" rel="noopener noreferrer"&gt;grafana &lt;code&gt;ota.yaml&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pressure matrix: &lt;a href="https://github.com/bobaikato/grafana/blob/bobai/grafana-ota-pressure/.github/workflows/test-ota-contract-matrix.yml" rel="noopener noreferrer"&gt;Grafana Ota contract matrix&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Released Ota evidence: &lt;a href="https://github.com/bobaikato/grafana/actions/runs/30965322618" rel="noopener noreferrer"&gt;green matrix run 30965322618&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-grafana-2v3h" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-grafana-2v3h&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pressuretesting</category>
      <category>grafana</category>
      <category>reporeadiness</category>
      <category>go</category>
    </item>
    <item>
      <title>Why Heavier Repository Execution Needs Audited Boundary Crossings</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Mon, 03 Aug 2026 12:03:38 +0000</pubDate>
      <link>https://dev.to/otaready/why-heavier-repository-execution-needs-audited-boundary-crossings-41gb</link>
      <guid>https://dev.to/otaready/why-heavier-repository-execution-needs-audited-boundary-crossings-41gb</guid>
      <description>&lt;h2&gt;
  
  
  Safe by default is only half the execution-governance problem
&lt;/h2&gt;

&lt;p&gt;A repository needs a routine execution lane.&lt;/p&gt;

&lt;p&gt;That lane should cover the work developers, CI systems, and AI agents perform repeatedly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lint&lt;/li&gt;
&lt;li&gt;test&lt;/li&gt;
&lt;li&gt;bounded verification&lt;/li&gt;
&lt;li&gt;local readiness checks&lt;/li&gt;
&lt;li&gt;finite generated-output checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But serious repositories also have heavier lanes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;publish a package&lt;/li&gt;
&lt;li&gt;run a migration&lt;/li&gt;
&lt;li&gt;deploy an environment&lt;/li&gt;
&lt;li&gt;modify external state&lt;/li&gt;
&lt;li&gt;execute a destructive recovery&lt;/li&gt;
&lt;li&gt;call a black-box production dependency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pretending those lanes should never run is not governance.&lt;/p&gt;

&lt;p&gt;Treating them like routine verification is not governance either.&lt;/p&gt;

&lt;p&gt;Ota's position is that leaving the default-safe lane should become an explicit, auditable execution&lt;br&gt;
event.&lt;/p&gt;

&lt;p&gt;That event is a &lt;strong&gt;boundary crossing&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  A crossing is not the same as a refusal
&lt;/h2&gt;

&lt;p&gt;Agent safety and audited crossings solve different problems.&lt;/p&gt;

&lt;p&gt;Agent mode answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this complete task or workflow closure safe for an agent to execute?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer is no, Ota refuses it before selected work begins.&lt;/p&gt;

&lt;p&gt;Audited crossing answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This heavier non-agent lane may be allowed, but what boundary was crossed, why was it crossed, and&lt;br&gt;
what execution evidence belongs to that decision?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A grant must never turn an agent-unsafe lane into an agent-safe one. Crossing is not a bypass around&lt;br&gt;
safe-task enforcement.&lt;/p&gt;

&lt;p&gt;It is a separate governance path for allowed-but-non-routine non-agent execution.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Ota publishes today
&lt;/h2&gt;

&lt;p&gt;Ota's released governance and receipt surfaces can distinguish routine execution from a selected&lt;br&gt;
lane that requires a crossing.&lt;/p&gt;

&lt;p&gt;The important fields are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;crossing_required&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crossing_classification&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;runner-authored crossing evidence linked to the selected execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, current governance JSON can make the boundary visible before execution:&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;"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;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;"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;"escalated"&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_boundary_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;"unsafe_task"&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 is a governance decision, not approval and not evidence that the task ran. Agent-mode safety&lt;br&gt;
still decides whether the selected closure is callable by an agent.&lt;/p&gt;

&lt;p&gt;The released classification distinguishes routine posture from escalated posture. Ota does not&lt;br&gt;
publish an &lt;code&gt;exceptional&lt;/code&gt; machine classification today.&lt;/p&gt;

&lt;p&gt;The crossing record belongs to one execution. It is evidence that the boundary was crossed. It is&lt;br&gt;
not reusable approval authority for the next run.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;authority answers whether this execution may cross&lt;/li&gt;
&lt;li&gt;the crossing record says what actually crossed&lt;/li&gt;
&lt;li&gt;the receipt links the decision to execution outcome&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reusing a crossing record as authority would let yesterday's evidence authorize tomorrow's work.&lt;br&gt;
Ota rejects that model.&lt;/p&gt;
&lt;h2&gt;
  
  
  The stronger authority carrier is implemented but still in development
&lt;/h2&gt;

&lt;p&gt;On the &lt;code&gt;1.6.26-implementation&lt;/code&gt; branch, Core implements the first preview signed-authority carrier.&lt;br&gt;
V11.7 remains partial because that carrier has not completed its live-grant pressure bar and the&lt;br&gt;
separate one-use broker carrier remains planned.&lt;/p&gt;

&lt;p&gt;The preview contract names an independently managed authority:&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;governance&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;crossing_authority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;authority_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;platform-release-authority&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository does not carry the trust key, signed bundle path, revocation state, or sequence&lt;br&gt;
state.&lt;/p&gt;

&lt;p&gt;That is deliberate. If the caller can edit both the lane and the authority that approves it, the&lt;br&gt;
approval is self-issued.&lt;/p&gt;

&lt;p&gt;The preview invocation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota run publish &lt;span class="nt"&gt;--grant&lt;/span&gt; approved-publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The current preview admission binds the grant to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the exact semantic contract identity&lt;/li&gt;
&lt;li&gt;the complete selected task or workflow closure&lt;/li&gt;
&lt;li&gt;the crossing family and classification&lt;/li&gt;
&lt;li&gt;bounded actor posture&lt;/li&gt;
&lt;li&gt;mode, lifecycle, target platform, and declared effects&lt;/li&gt;
&lt;li&gt;a short validity window&lt;/li&gt;
&lt;li&gt;current signed revocation and sequence truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A missing, stale, revoked, rolled-back, or out-of-scope grant must refuse before the selected lane&lt;br&gt;
starts.&lt;/p&gt;

&lt;p&gt;Real admitted execution must create a fresh runner-owned crossing transaction before selected-lane&lt;br&gt;
mutation and finalize that transaction on success, failure, interruption, or recoverable&lt;br&gt;
abandonment. Dry-run and refusal must not mint a crossing record.&lt;/p&gt;

&lt;p&gt;The first carrier is deliberately bounded as &lt;code&gt;current_process_filesystem_guarded&lt;/code&gt;. It verifies a&lt;br&gt;
fixed system trust binding, signed bundle, revocation state, and sequence state protected from the&lt;br&gt;
current unprivileged Ota process. It does not prove provider-attested privilege separation or a&lt;br&gt;
verified human, CI, or platform identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is not complete yet
&lt;/h2&gt;

&lt;p&gt;This signed authority surface is implemented in Core, but it is not released or complete.&lt;/p&gt;

&lt;p&gt;GitHub-hosted &lt;a href="https://github.com/bobaikato/create-chrome-extension/actions/runs/30714738522" rel="noopener noreferrer"&gt;create-chrome-extension pressure&lt;/a&gt;&lt;br&gt;
already proves that missing fixed authority refuses before selected work. That is useful fail-closed&lt;br&gt;
evidence, but it does not prove that a live grant is protected from the job that consumes it.&lt;/p&gt;

&lt;p&gt;The remaining gates include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;valid, expired, revoked, and out-of-scope live-grant pressure on a pre-provisioned hardened non-root runner&lt;/li&gt;
&lt;li&gt;a broker-backed, atomically consumed one-use work-unit lifetime&lt;/li&gt;
&lt;li&gt;independently authenticated per-use transaction state beyond same-user local reconciliation&lt;/li&gt;
&lt;li&gt;broader protected-system authority support across platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are trust boundaries, not documentation polish.&lt;/p&gt;

&lt;p&gt;Until they close, Ota should describe the grant carrier as active development, not as shipped&lt;br&gt;
enterprise approval infrastructure.&lt;/p&gt;

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

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

&lt;ul&gt;
&lt;li&gt;for the bounded signed-file carrier, reuse a still-live grant only while its exact scope remains valid&lt;/li&gt;
&lt;li&gt;for the planned broker carrier, issue and atomically consume one lease for one exact crossing&lt;/li&gt;
&lt;li&gt;never reuse the crossing record&lt;/li&gt;
&lt;li&gt;mint fresh runner-authored crossing evidence for every execution&lt;/li&gt;
&lt;li&gt;recheck grant liveness at the boundary&lt;/li&gt;
&lt;li&gt;keep principal, authorizer, and runner context separate&lt;/li&gt;
&lt;li&gt;refuse when Ota cannot verify the authority it would need to make the stronger claim&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That keeps routine work cheap and makes non-routine execution explicit without turning every command&lt;br&gt;
into approval ceremony.&lt;/p&gt;

&lt;p&gt;It also gives reviewers a better artifact than a log line saying someone ran &lt;code&gt;deploy&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Execution governance cannot stop at "allowed" and "denied."&lt;/p&gt;

&lt;p&gt;Real repositories need a third answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;allowed only through an explicit, attributable, bounded crossing&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ota already makes the crossing visible. The active authority work is about making admission&lt;br&gt;
trustworthy without letting the repository or caller approve itself.&lt;/p&gt;

&lt;p&gt;That is the difference between recording that a risky command ran and governing how it was allowed&lt;br&gt;
to run.&lt;/p&gt;

&lt;p&gt;Where does your repository record that distinction today: a workflow approval, a ticket, a CI log,&lt;br&gt;
or nowhere?&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/audited-execution-boundary-crossings" rel="noopener noreferrer"&gt;Audited Execution Boundary Crossings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/safe-agent-execution-and-refusal" rel="noopener noreferrer"&gt;Safe Agent Execution and Refusal&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/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/docs/reference/prebound-crossing-authority" rel="noopener noreferrer"&gt;Prebound Crossing Authority&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ota-run/examples/tree/1.6.26-implementation/reference/audited-crossing-authority" rel="noopener noreferrer"&gt;Preview example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/why-heavier-repository-execution-needs-audited-boundary-crossings" rel="noopener noreferrer"&gt;https://ota.run/blog/why-heavier-repository-execution-needs-audited-boundary-crossings&lt;/a&gt;&lt;/p&gt;

</description>
      <category>executiongovernance</category>
      <category>audit</category>
      <category>aiagents</category>
      <category>policy</category>
    </item>
    <item>
      <title>One Contract, Multiple Enforcement Points for Safe AI Agent Execution</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Thu, 30 Jul 2026 16:20:35 +0000</pubDate>
      <link>https://dev.to/otaready/one-contract-multiple-enforcement-points-for-safe-ai-agent-execution-15o8</link>
      <guid>https://dev.to/otaready/one-contract-multiple-enforcement-points-for-safe-ai-agent-execution-15o8</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;A lot of AI agent safety discussion still stops too early.&lt;/p&gt;

&lt;p&gt;People talk about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prompts&lt;/li&gt;
&lt;li&gt;instructions&lt;/li&gt;
&lt;li&gt;guardrails&lt;/li&gt;
&lt;li&gt;whether the agent "knows better"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those things matter, but they are not where the real control lives.&lt;/p&gt;

&lt;p&gt;If an agent can ignore the instructions, pick the wrong execution path, skip the real verification&lt;br&gt;
lane, or claim success without independent evidence, then the repo does not have enforcement.&lt;/p&gt;

&lt;p&gt;It has suggestions.&lt;/p&gt;

&lt;p&gt;That is why the stronger shape is not "better prompting."&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;one declared contract&lt;/li&gt;
&lt;li&gt;multiple enforcement points&lt;/li&gt;
&lt;li&gt;no second hand-maintained execution policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ota provides the declared repo contract and local execution boundary. CI projection and runtime&lt;br&gt;
providers can consume that truth, but they do not become competing execution contracts. A provider&lt;br&gt;
still owns its triggers, credentials, runner selection, deployment policy, and branch-protection&lt;br&gt;
settings. Ota owns the contract-derived execution lane, its admission, and the evidence it can&lt;br&gt;
honestly emit about that lane.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Local Runner Is Useful. It Is Not The Final Teeth.
&lt;/h2&gt;

&lt;p&gt;A local runner is valuable because it gives fast feedback.&lt;/p&gt;

&lt;p&gt;It can tell an agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this task is safe&lt;/li&gt;
&lt;li&gt;this workflow is not callable&lt;/li&gt;
&lt;li&gt;this path is blocked&lt;/li&gt;
&lt;li&gt;this repo is not ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is already much stronger than a plain instruction file.&lt;/p&gt;

&lt;p&gt;But a local runner is still optional.&lt;/p&gt;

&lt;p&gt;If one team uses the contract-aware runner and another team points a different agent at the same&lt;br&gt;
repo, local enforcement alone does not scale. The same is true if someone simply bypasses the&lt;br&gt;
preferred agent flow and uses a different tool.&lt;/p&gt;

&lt;p&gt;That makes the local runner the fast-feedback layer, not the final teeth.&lt;/p&gt;

&lt;p&gt;Its job is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;early refusal&lt;/li&gt;
&lt;li&gt;early visibility&lt;/li&gt;
&lt;li&gt;local proof and receipts&lt;/li&gt;
&lt;li&gt;safer routine execution before review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is important. It is just not the last enforcement boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Teeth Live At Mandatory Chokepoints
&lt;/h2&gt;

&lt;p&gt;The durable version is when an organization makes contract-owned lanes mandatory at the places&lt;br&gt;
people cannot opt out of.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Ota projects the declared CI verification lane&lt;/li&gt;
&lt;li&gt;branch policy makes that check required at merge time&lt;/li&gt;
&lt;li&gt;an identified runtime provider applies the compatible capability and sandbox controls at execution
time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those chokepoints do not care which agent was used.&lt;/p&gt;

&lt;p&gt;They do not care which local runner someone prefers.&lt;/p&gt;

&lt;p&gt;They sit at the points the organization already relies on to keep human changes and automated&lt;br&gt;
changes inside the same review and execution boundary.&lt;/p&gt;

&lt;p&gt;So the stronger stack is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota.yaml&lt;/code&gt; as the declared spec&lt;/li&gt;
&lt;li&gt;local runner enforcement for immediate feedback&lt;/li&gt;
&lt;li&gt;contract-owned CI checks, made mandatory by provider branch policy&lt;/li&gt;
&lt;li&gt;runtime capability boundaries, only where the selected provider can apply and attest them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between repo guidance and repo governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why CI Comes First
&lt;/h2&gt;

&lt;p&gt;If you want to move higher in the stack, CI is the first practical enforcement point that can be&lt;br&gt;
made mandatory.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because the merge gate already exists.&lt;/p&gt;

&lt;p&gt;Most teams already have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI runs&lt;/li&gt;
&lt;li&gt;required checks&lt;/li&gt;
&lt;li&gt;branch protection&lt;/li&gt;
&lt;li&gt;some notion of mergeability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once provider branch policy requires the contract-owned check, CI becomes the first non-optional&lt;br&gt;
place where repo truth can become enforcement instead of convention.&lt;/p&gt;

&lt;p&gt;What CI should answer is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;did a random workflow happen to pass&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It should answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;did the repo's declared merge-relevant verification lanes pass&lt;/li&gt;
&lt;li&gt;is the required proof present&lt;/li&gt;
&lt;li&gt;did the execution path stay inside contract-owned governance truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A green required CI check should mean:&lt;/p&gt;

&lt;p&gt;this change is merge-compliant with the repo contract.&lt;/p&gt;

&lt;p&gt;That is a much stronger statement than:&lt;/p&gt;

&lt;p&gt;someone ran something and the job happened to go green.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Green Check Is Not A Runtime Boundary
&lt;/h2&gt;

&lt;p&gt;CI is the right first gate, but it is not the whole answer.&lt;/p&gt;

&lt;p&gt;CI can tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether the declared merge checks passed&lt;/li&gt;
&lt;li&gt;whether the required evidence exists&lt;/li&gt;
&lt;li&gt;whether the contract and CI wiring agree&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CI cannot tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what an agent will try at runtime&lt;/li&gt;
&lt;li&gt;whether the harness still exposes undeclared actions&lt;/li&gt;
&lt;li&gt;whether the execution boundary is actually constrained&lt;/li&gt;
&lt;li&gt;whether the agent can still reach external effects you did not intend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why the second mandatory enforcement point matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sandbox and capability policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repo contract should not only describe what is mergeable.&lt;/p&gt;

&lt;p&gt;It should also be consumable by the runtime boundary.&lt;/p&gt;

&lt;p&gt;But a declaration is not enforcement by itself. If the selected runtime provider cannot apply and&lt;br&gt;
attest a declared control, Ota must refuse that lane rather than print a stronger claim than the&lt;br&gt;
provider earned. This is why capability-aware admission matters: the contract declares the&lt;br&gt;
boundary; the runner verifies that the chosen provider can actually hold it.&lt;/p&gt;

&lt;p&gt;That means a harness or sandbox should be able to enforce things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this task is callable in agent mode&lt;/li&gt;
&lt;li&gt;this task is not callable in agent mode&lt;/li&gt;
&lt;li&gt;this path is writable&lt;/li&gt;
&lt;li&gt;this path is protected&lt;/li&gt;
&lt;li&gt;this execution lane implies external effects&lt;/li&gt;
&lt;li&gt;this execution lane requires review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the runtime-side equivalent of required checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Contract, Not Three Policies
&lt;/h2&gt;

&lt;p&gt;The biggest failure to avoid is not just weak enforcement.&lt;/p&gt;

&lt;p&gt;It is split-brain enforcement.&lt;/p&gt;

&lt;p&gt;If:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the local runner has one understanding of safe execution&lt;/li&gt;
&lt;li&gt;CI has another&lt;/li&gt;
&lt;li&gt;the sandbox has a third&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then the repo is back to drift.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;one contract&lt;/li&gt;
&lt;li&gt;multiple enforcement consumers&lt;/li&gt;
&lt;li&gt;no duplicated Ota execution policy&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;the contract is the source of truth&lt;/li&gt;
&lt;li&gt;the local runner consumes it for fast feedback&lt;/li&gt;
&lt;li&gt;CI consumes it for a contract-owned merge check&lt;/li&gt;
&lt;li&gt;the harness or sandbox consumes it for compatible runtime capability boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Provider configuration still retains provider-owned truth: triggers, permissions, runners,&lt;br&gt;
credentials, deployment environments, and the branch policy that makes a check mandatory. The&lt;br&gt;
point is not to erase those boundaries. It is to stop duplicating Ota-owned bootstrap,&lt;br&gt;
verification, admission, and proof truth across them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means For AI Agent Governance
&lt;/h2&gt;

&lt;p&gt;This is where repo governance gets more serious than &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;An instruction file can say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;be careful&lt;/li&gt;
&lt;li&gt;run tests&lt;/li&gt;
&lt;li&gt;avoid dangerous commands&lt;/li&gt;
&lt;li&gt;ask before touching infrastructure&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;But it is still prose.&lt;/p&gt;

&lt;p&gt;What scales is when the repo can declare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which lanes are safe&lt;/li&gt;
&lt;li&gt;which verification path is merge-relevant&lt;/li&gt;
&lt;li&gt;which evidence is required&lt;/li&gt;
&lt;li&gt;which tasks are callable in agent mode&lt;/li&gt;
&lt;li&gt;which effects require review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then the rest of the stack can enforce that declared truth.&lt;/p&gt;

&lt;p&gt;That is how a repo contract stops being a suggestion and starts becoming infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stronger Direction
&lt;/h2&gt;

&lt;p&gt;The most durable shape is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"everyone uses the same runner"&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;one repo contract&lt;/li&gt;
&lt;li&gt;local enforcement for speed&lt;/li&gt;
&lt;li&gt;CI checks made required by provider merge policy&lt;/li&gt;
&lt;li&gt;runtime capability boundaries where a provider can enforce and attest them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the real higher-stack version of execution governance.&lt;/p&gt;

&lt;p&gt;It does not depend on trusting agent behavior.&lt;/p&gt;

&lt;p&gt;It depends on making repo truth explicit enough that the mandatory chokepoints already sitting in&lt;br&gt;
the stack can consume it, and on refusing when a selected enforcement point cannot hold the&lt;br&gt;
declared boundary.&lt;/p&gt;

&lt;p&gt;If you want the deeper boundary between instructions and governed execution, read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ota.run/blog/agents-md-is-not-enough-for-safe-ai-agent-execution" rel="noopener noreferrer"&gt;AGENTS.md Is Not Enough for Safe AI Agent Execution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/blog/what-belongs-in-agents-md-vs-ota-yaml" rel="noopener noreferrer"&gt;What Belongs in AGENTS.md vs ota.yaml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/blog/how-to-align-local-ci-and-agent-execution" rel="noopener noreferrer"&gt;How to Align Local, CI, and Agent Execution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/one-contract-multiple-enforcement-points-for-safe-ai-agent-execution" rel="noopener noreferrer"&gt;https://ota.run/blog/one-contract-multiple-enforcement-points-for-safe-ai-agent-execution&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>executiongovernance</category>
      <category>ci</category>
      <category>sandbox</category>
    </item>
    <item>
      <title>Pressure-testing Ota on Hasura: raw Kubernetes manifests and honest kubectl proof</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Tue, 28 Jul 2026 11:46:24 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-hasura-raw-kubernetes-manifests-and-honest-kubectl-proof-pj4</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-hasura-raw-kubernetes-manifests-and-honest-kubectl-proof-pj4</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/hasura/graphql-engine" rel="noopener noreferrer"&gt;Hasura&lt;/a&gt; exposed a useful execution-governance boundary:&lt;br&gt;
raw Kubernetes manifests without Helm or Compose owning the operational path.&lt;/p&gt;

&lt;p&gt;That sounds simple. It is also easy to overclaim.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl&lt;/code&gt; can parse and render a manifest locally without contacting a cluster. A Kubernetes API&lt;br&gt;
can accept those objects without proving that Hasura became ready. A green command can therefore&lt;br&gt;
mean at least three different things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the manifests were interpreted locally;&lt;/li&gt;
&lt;li&gt;a cluster accepted the declared resources;&lt;/li&gt;
&lt;li&gt;the application started and became usable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pressure test asked whether Ota could govern the first two claims while refusing to imply the&lt;br&gt;
third. The contract now installs released Ota &lt;code&gt;v1.6.24&lt;/code&gt; directly, so the version used by humans,&lt;br&gt;
agents, and CI is contract truth rather than workflow-local bootstrap glue.&lt;/p&gt;
&lt;h2&gt;
  
  
  The pressure slice
&lt;/h2&gt;

&lt;p&gt;The work stayed deliberately scoped to&lt;br&gt;
&lt;a href="https://github.com/hasura/graphql-engine/tree/master/install-manifests/kubernetes" rel="noopener noreferrer"&gt;&lt;code&gt;install-manifests/kubernetes&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
That directory contains the raw Hasura deployment and service manifests used by this test.&lt;/p&gt;

&lt;p&gt;The Ota contract owns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;released Ota &lt;code&gt;v1.6.24&lt;/code&gt; bootstrap identity;&lt;/li&gt;
&lt;li&gt;cross-platform &lt;code&gt;kubectl&lt;/code&gt; acquisition;&lt;/li&gt;
&lt;li&gt;non-mutating local manifest tasks;&lt;/li&gt;
&lt;li&gt;explicit cluster-mutating apply tasks;&lt;/li&gt;
&lt;li&gt;a safe verification workflow;&lt;/li&gt;
&lt;li&gt;a separate deployment workflow;&lt;/li&gt;
&lt;li&gt;task and workflow dry-run coverage;&lt;/li&gt;
&lt;li&gt;the task and workflow truth consumed by the three-OS pressure matrix.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It did not attempt to govern all of Hasura or turn this narrow infrastructure directory into an&lt;br&gt;
application-readiness contract.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the contract says
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Ota owns its own bootstrap identity
&lt;/h3&gt;

&lt;p&gt;The pressure contract does not ask CI to choose an implementation branch or duplicate installer&lt;br&gt;
commands. It pins the released version through 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;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;bootstrap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ota&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="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;version&lt;/span&gt;
        &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1.6.24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The GitHub workflow uses &lt;code&gt;ota-run/setup&lt;/code&gt; with &lt;code&gt;source: contract&lt;/code&gt;, so the workflow consumes this&lt;br&gt;
identity instead of becoming another source of Ota version truth.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ota owns the tool
&lt;/h3&gt;

&lt;p&gt;The contract does not hide &lt;code&gt;kubectl&lt;/code&gt; installation in a shell preamble:&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;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;kubectl&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;*"&lt;/span&gt;
    &lt;span class="na"&gt;acquisition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apt&lt;/span&gt;
      &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kubectl&lt;/span&gt;
    &lt;span class="na"&gt;platforms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;macos&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;acquisition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;brew&lt;/span&gt;
          &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kubernetes-cli&lt;/span&gt;
      &lt;span class="na"&gt;windows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;acquisition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;winget&lt;/span&gt;
          &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Kubernetes.kubectl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives humans, CI, and agents the same declared tool requirement instead of three separate&lt;br&gt;
installation conventions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Local verification is non-mutating
&lt;/h3&gt;

&lt;p&gt;The safe verification lane uses &lt;code&gt;kubectl annotate --local&lt;/code&gt;. It asks &lt;code&gt;kubectl&lt;/code&gt; to load and emit the&lt;br&gt;
object without contacting a Kubernetes API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;k8s:preview:deployment&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;kubectl&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;annotate&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--local&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;-f&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deployment.yaml&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ota.run/preview=true&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;-o&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The aggregate keeps both manifests in one canonical verification path:&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;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Render the focused raw Kubernetes manifest set without mutating the cluster&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;k8s:preview:deployment&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;k8s:preview:service&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This proves that the installed &lt;code&gt;kubectl&lt;/code&gt; can interpret and render the selected manifests. It does&lt;br&gt;
not prove server-side admission, policy compatibility, resource creation, or application&lt;br&gt;
readiness.&lt;/p&gt;
&lt;h3&gt;
  
  
  Cluster mutation is not agent-safe verification
&lt;/h3&gt;

&lt;p&gt;The apply tasks declare their external effect instead of disguising deployment as another check:&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;k8s:apply:service&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;kubectl&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;apply&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;-f&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;svc.yaml&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;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;kubernetes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those tasks are intentionally excluded from &lt;code&gt;agent.safe_tasks&lt;/code&gt;. The workflow layer also gives&lt;br&gt;
verification and deployment different operational meanings:&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;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;intent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ci_verification&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;span class="na"&gt;deploy&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;deployment&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;k8s:cluster:proof&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ota is not merely storing two commands. It is declaring which path is routine verification and&lt;br&gt;
which path mutates an external system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The proof ladder
&lt;/h2&gt;

&lt;p&gt;The pressure design keeps three distinct proof levels:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Evidence required&lt;/th&gt;
&lt;th&gt;Current &lt;code&gt;v1.6.24&lt;/code&gt; result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Local manifest interpretation&lt;/td&gt;
&lt;td&gt;Real &lt;code&gt;kubectl annotate --local&lt;/code&gt; execution for both manifests&lt;/td&gt;
&lt;td&gt;Proved locally on macOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes API and resource acceptance&lt;/td&gt;
&lt;td&gt;Real &lt;code&gt;kubectl apply&lt;/code&gt; followed by &lt;code&gt;kubectl get&lt;/code&gt; in an ephemeral &lt;code&gt;kind&lt;/code&gt; cluster&lt;/td&gt;
&lt;td&gt;Hosted Ubuntu reproof pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hasura application readiness&lt;/td&gt;
&lt;td&gt;Pod readiness, database connectivity, service reachability, and application behavior&lt;/td&gt;
&lt;td&gt;Not proved&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This distinction is the main engineering result. A created Deployment and Service are stronger&lt;br&gt;
evidence than local YAML handling, but they are still not proof that Hasura became ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Ota 1.6.24 evidence
&lt;/h2&gt;

&lt;p&gt;The upgraded contract was exercised with released Ota &lt;code&gt;v1.6.24&lt;/code&gt;, commit &lt;code&gt;c1ab23a58&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The current local proof covers:&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;
&lt;code&gt;ota run verify --dry-run --json&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota up --workflow verify --dry-run --json&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;real &lt;code&gt;ota run verify --native --agent&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;both real &lt;code&gt;kubectl annotate --local&lt;/code&gt; tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;ota doctor&lt;/code&gt; reported the repository slice ready with no findings. The task and workflow previews&lt;br&gt;
were runnable, and the real safe verification closure completed successfully.&lt;/p&gt;

&lt;p&gt;The pressure workflow is prepared to repeat contract discovery and dry-run coverage on Ubuntu,&lt;br&gt;
macOS, and Windows, with real &lt;code&gt;kind&lt;/code&gt; cluster apply-and-observe proof on Ubuntu. That hosted matrix&lt;br&gt;
must pass against the upgraded contract before this draft is published as cross-platform&lt;br&gt;
&lt;code&gt;v1.6.24&lt;/code&gt; evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Matrix design
&lt;/h3&gt;

&lt;p&gt;The matrix is asymmetric by design. It does not pretend that every operating system owns a&lt;br&gt;
Kubernetes runtime:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lane&lt;/th&gt;
&lt;th&gt;Contract and discovery gates&lt;/th&gt;
&lt;th&gt;Dry-run coverage&lt;/th&gt;
&lt;th&gt;Real execution&lt;/th&gt;
&lt;th&gt;Honest boundary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu&lt;/td&gt;
&lt;td&gt;Validate, Doctor, task inventory, safe-task inventory, workflow inventory, execution topology&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;verify&lt;/code&gt;, cluster proof, and both workflows&lt;/td&gt;
&lt;td&gt;Local manifest verification plus apply-and-observe against an ephemeral &lt;code&gt;kind&lt;/code&gt; cluster&lt;/td&gt;
&lt;td&gt;Kubernetes resource acceptance, not Hasura readiness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS&lt;/td&gt;
&lt;td&gt;Validate, Doctor, task inventory, safe-task inventory, workflow inventory, execution topology&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;verify&lt;/code&gt;, cluster proof, and both workflows&lt;/td&gt;
&lt;td&gt;No hosted cluster execution&lt;/td&gt;
&lt;td&gt;Contract and admission compatibility only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;Validate, Doctor, task inventory, safe-task inventory, workflow inventory, execution topology&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;verify&lt;/code&gt;, cluster proof, and both workflows&lt;/td&gt;
&lt;td&gt;No hosted cluster execution&lt;/td&gt;
&lt;td&gt;Contract and admission compatibility only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Ubuntu lane creates the &lt;code&gt;kind&lt;/code&gt; cluster in GitHub Actions, outside the Ota contract. Ota then&lt;br&gt;
owns the declared &lt;code&gt;kubectl&lt;/code&gt; task and workflow execution inside that provider-owned boundary. This&lt;br&gt;
keeps cluster provisioning truth separate from manifest execution truth.&lt;/p&gt;

&lt;p&gt;The refreshed matrix acceptance bar is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;ota-run/setup&lt;/code&gt; installs the contract-pinned &lt;code&gt;v1.6.24&lt;/code&gt; release.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota --version&lt;/code&gt; confirms the installed release before any contract claim is evaluated.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; passes without a tolerated blocked state.&lt;/li&gt;
&lt;li&gt;The safe &lt;code&gt;verify&lt;/code&gt; closure executes through the real agent boundary.&lt;/li&gt;
&lt;li&gt;Successful JSON, topology, and execution-receipt evidence is retained for every lane.&lt;/li&gt;
&lt;li&gt;Ubuntu proves resource apply and observation without promoting that result to application
readiness.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Explicit boundaries
&lt;/h2&gt;

&lt;p&gt;The pressure result remains narrow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contract-owned and currently proved with &lt;code&gt;v1.6.24&lt;/code&gt;:&lt;/strong&gt; Ota bootstrap identity, &lt;code&gt;kubectl&lt;/code&gt; acquisition shape, task/workflow selection, safe-task separation, local validation and discovery, dry-run admission, and real local manifest execution on macOS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract-owned and awaiting hosted reproof:&lt;/strong&gt; Ubuntu &lt;code&gt;kind&lt;/code&gt; resource apply/observation and the Ubuntu, macOS, and Windows matrix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo-owned and outside this slice:&lt;/strong&gt; editing &lt;code&gt;deployment.yaml&lt;/code&gt; with the real database URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not proved:&lt;/strong&gt; Hasura pod readiness, database connectivity, service reachability, application behavior, production-cluster policy, RBAC, storage, ingress, load balancers, and rollback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not governed by this contract:&lt;/strong&gt; creation and teardown of the CI &lt;code&gt;kind&lt;/code&gt; cluster, which remained GitHub workflow infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not repo-global:&lt;/strong&gt; no result here should be read as proof of the wider Hasura repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Hasura taught Ota
&lt;/h2&gt;

&lt;p&gt;Raw manifests do not need a giant abstraction. They need precise ownership and honest evidence.&lt;/p&gt;

&lt;p&gt;Ota adds value here by keeping four truths together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how the required tool is acquired;&lt;/li&gt;
&lt;li&gt;which command path is safe verification;&lt;/li&gt;
&lt;li&gt;which path mutates Kubernetes;&lt;/li&gt;
&lt;li&gt;what each successful lane actually proved.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important outcome is not that Ota can run &lt;code&gt;kubectl&lt;/code&gt;. Any shell can do that. The outcome is that&lt;br&gt;
humans, CI, and agents receive the same governed execution path without being told that local&lt;br&gt;
rendering, cluster acceptance, and application readiness are interchangeable.&lt;/p&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/pressure-testing-ota-on-hasura-raw-kubernetes-manifests-and-honest-kubectl-proof-4m2h" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-hasura-raw-kubernetes-manifests-and-honest-kubectl-proof-4m2h&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pressuretesting</category>
      <category>hasura</category>
      <category>kubernetes</category>
      <category>kubectl</category>
    </item>
    <item>
      <title>mise Resolves Tools. Ota Governs Repository Acceptance.</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Mon, 27 Jul 2026 12:25:30 +0000</pubDate>
      <link>https://dev.to/otaready/mise-resolves-tools-ota-governs-repository-acceptance-3c39</link>
      <guid>https://dev.to/otaready/mise-resolves-tools-ota-governs-repository-acceptance-3c39</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;orchestrators&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mise&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mise&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;config_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;mise.toml&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;activation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;trust&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;prepare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;install&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;toolchains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;22"&lt;/span&gt;
    &lt;span class="na"&gt;fulfillment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mise&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;run&lt;/span&gt;

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

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

&lt;/div&gt;



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

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

&lt;p&gt;Ota gives that operational truth a machine-readable home in &lt;code&gt;ota.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;prepare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dependency_hydration&lt;/span&gt;
      &lt;span class="na"&gt;medium&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;package_dependencies&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node_package_manager&lt;/span&gt;
        &lt;span class="na"&gt;manager&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;install&lt;/span&gt;
        &lt;span class="na"&gt;frozen_lockfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

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

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

&lt;/div&gt;



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

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

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

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

&lt;p&gt;The runtime workflow declares the positive observation and the negative control independently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-proof&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
    &lt;span class="na"&gt;readiness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;surfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;proof&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;seam_observations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres-marker&lt;/span&gt;
          &lt;span class="na"&gt;dependency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
          &lt;span class="na"&gt;producer_task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;proof:marker-produce&lt;/span&gt;
          &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;proof:marker-observe&lt;/span&gt;
          &lt;span class="na"&gt;marker_env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OTA_PROOF_DEPENDENCY_MARKER&lt;/span&gt;
      &lt;span class="na"&gt;negative_controls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres-unavailable&lt;/span&gt;
          &lt;span class="na"&gt;dependency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
          &lt;span class="na"&gt;obligation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres-marker&lt;/span&gt;
          &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;proof:postgres-unavailable&lt;/span&gt;
          &lt;span class="na"&gt;intervention&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dependency_endpoint_override&lt;/span&gt;
          &lt;span class="na"&gt;expected_failure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dependency_unavailable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

&lt;/div&gt;



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

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

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

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

&lt;/div&gt;



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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

&lt;/div&gt;



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

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

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

&lt;p&gt;Ota contracts can name the repo-owned artifacts that define a replay lane:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;gate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;replay_inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recorded_sql&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;static_file&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data/fixture.jsonl&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;frozen_store&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;static_file&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data/store.db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;runtime-presentation&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;presentation_profile&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replay/presentation-profile.yaml&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;equivalence&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;comparator_profile&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replay/comparator-profile.yaml&lt;/span&gt;
    &lt;span class="na"&gt;witnessed_observations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;query_traces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recorded_queries&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;evidence/query-trace.jsonl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

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

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

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

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

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

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

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

&lt;/div&gt;



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

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

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;In this repo, the packaged native workflow launches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;serve:native&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;launch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;command&lt;/span&gt;
    &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;uv&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;run&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;open-webui&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;serve&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--host&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--port&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

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

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

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

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

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

&lt;p&gt;The Docker workflow uses a native task shape to launch Compose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;compose:up&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;launch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;command&lt;/span&gt;
    &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;compose&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;up&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;The packaged native workflow stays explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;native&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;intent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local_development&lt;/span&gt;
  &lt;span class="na"&gt;prepare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup:env&lt;/span&gt;
  &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;serve:native&lt;/span&gt;
  &lt;span class="na"&gt;readiness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;surfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;native-web&lt;/span&gt;
  &lt;span class="na"&gt;exposes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;surface&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;native-web&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Docker workflow stays separate instead of pretending it is the same runtime family:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;intent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;packaged_runtime&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;compose:up&lt;/span&gt;
  &lt;span class="na"&gt;readiness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;surfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker-web&lt;/span&gt;
  &lt;span class="na"&gt;exposes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;surface&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-web&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

&lt;p&gt;That duplication drifts easily. The stronger Ota shape is to keep the listener canonical and project&lt;br&gt;
known server flags from it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;surfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contributor:web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3005&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;

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

&lt;/div&gt;



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

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

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

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

&lt;/div&gt;



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

&lt;p&gt;Kylrix's full self-hosted stack is not a second contributor runtime. It uses Compose to build and&lt;br&gt;
launch Kylrix, Appwrite, MariaDB, Redis, and Caddy. Ota owns the interpolation env file, Compose&lt;br&gt;
file selection, image build, lifecycle, and readiness surface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;selfhost:up&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;launch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;compose&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;up&lt;/span&gt;
    &lt;span class="na"&gt;detach&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service&lt;/span&gt;
    &lt;span class="na"&gt;surfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;selfhost&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;That looks like this in the contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;aggregate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;setup:env&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;setup:venv&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;setup:deps&lt;/span&gt;

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

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

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

&lt;/div&gt;



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

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

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

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

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

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

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

&lt;p&gt;That is the wrong trust order for a repo that creates its own &lt;code&gt;.venv&lt;/code&gt; as part of setup. If the repo-local interpreter path is declared as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.venv/bin/python&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;The local web service can now declare listener truth once and let Ota project supported bind args for a known adapter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;launch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;command&lt;/span&gt;
  &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.venv/bin/uvicorn&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web.app:app&lt;/span&gt;
  &lt;span class="na"&gt;runtime_projection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;listener&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
    &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;uvicorn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

</description>
      <category>pressuretesting</category>
      <category>python</category>
      <category>uv</category>
      <category>reporeadiness</category>
    </item>
  </channel>
</rss>
