<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bobai Kato</title>
    <description>The latest articles on DEV Community by Bobai Kato (@bobaikato).</description>
    <link>https://dev.to/bobaikato</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F661554%2F4a338586-db17-473a-9765-46cf00fc51bd.jpg</url>
      <title>DEV Community: Bobai Kato</title>
      <link>https://dev.to/bobaikato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bobaikato"/>
    <language>en</language>
    <item>
      <title>Pressure-testing Ota on Flagr: native and container Go verification with honest boundaries</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Fri, 14 Aug 2026 23:06:06 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-flagr-native-and-container-go-verification-with-honest-boundaries-4gi0</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-flagr-native-and-container-go-verification-with-honest-boundaries-4gi0</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/openflagr/flagr" rel="noopener noreferrer"&gt;Flagr&lt;/a&gt; is a useful test of whether Ota can keep a real service repository legible. It has a portable Go verification path, a local SQLite-backed API, a six-instance Docker Compose integration topology, four database services, and a locally tagged integration image. Those are different execution truths. One green test command should not flatten them into one readiness or deployment claim.&lt;/p&gt;

&lt;p&gt;The pressure contract pins released Ota &lt;code&gt;v1.6.25&lt;/code&gt;, separates deterministic verification from runtime and integration work, and gives the Compose topology a runner-owned lifecycle proof.&lt;br&gt;
It also removes Windows from the selected verification surface rather than carrying an audit-only lane that could be mistaken for execution support.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this repo mattered
&lt;/h2&gt;

&lt;p&gt;Flagr combines several patterns that show up in mature service repositories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a finite Go verification lane;&lt;/li&gt;
&lt;li&gt;a long-running local service with a declared HTTP surface;&lt;/li&gt;
&lt;li&gt;an integration topology that needs an image build, Compose startup, readiness, test execution, and teardown; and&lt;/li&gt;
&lt;li&gt;CI that needs to distinguish a safe verification lane from deliberately external-state-mutating integration work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pressure question was not merely whether &lt;code&gt;go test&lt;/code&gt; could pass. It was whether the contract could own hydration, execution mode, runtime readiness, image construction, service dependencies, failure cleanup, and agent refusal without hiding the important transitions in CI shell.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the contract models
&lt;/h2&gt;

&lt;p&gt;The deterministic lane uses typed Go module hydration in native and container contexts. Linux and macOS own the native verification path; Linux also owns the container path through &lt;code&gt;golang:1.26-bookworm&lt;/code&gt;. The selected Go closure is intentionally unavailable on Windows.&lt;/p&gt;

&lt;p&gt;The integration image is not a raw &lt;code&gt;docker build&lt;/code&gt; string:&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;integration:image&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;Build the locally tagged image consumed by the six-node Compose integration topology&lt;/span&gt;
  &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&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;build_container_image&lt;/span&gt;
    &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integration_tests/Dockerfile-Integration-Test&lt;/span&gt;
    &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flagr_integration_tests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow split stays explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;verify&lt;/code&gt; is deterministic Go package verification;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;local&lt;/code&gt; owns the SQLite-backed API runtime;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;integration&lt;/code&gt; owns the image, Compose topology, readiness, integration suite, benchmark, and
explicit teardown;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;integration:lifecycle&lt;/code&gt; gives Ota ownership of service start, assertion, teardown, and archive
evidence;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;integration:lifecycle:failure-control&lt;/code&gt; intentionally fails the real assertion and verifies that
teardown still completes; and&lt;/li&gt;
&lt;li&gt;agent refusal canaries exercise the real boundary around the unsafe image task and integration
workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lifecycle model includes the Flagr services and their MySQL and PostgreSQL dependencies. Each managed service declares &lt;code&gt;manager_inactive&lt;/code&gt; as its teardown assertion. Readiness failure is not accepted as proof that a service stopped; the Compose manager must report the terminal state.&lt;/p&gt;

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

&lt;p&gt;Flagr exposes several real Ota boundaries without needing repository-specific workarounds.&lt;/p&gt;

&lt;p&gt;Aggregate verification needed to remain visible as executable closure support in task discovery.&lt;br&gt;
Doctor also had to stop probing repo-owned commands before their producer task had created them.&lt;br&gt;
Those are ordering and discovery problems in the runner, not defects in a Go repository.&lt;/p&gt;

&lt;p&gt;The CI pressure exposed another distinction: a finite workflow cannot stop after a readiness-oriented &lt;code&gt;ota up&lt;/code&gt;. Ota's provider-neutral CI projection distinguishes a finite task closure from a service-runtime path. The finite lane executes its selected task; runtime proof owns&lt;br&gt;
its own execution path.&lt;/p&gt;

&lt;p&gt;That is why the image build matters. Ota owns the action, Dockerfile, context, local tag, and evidence surface. Flagr still owns what the image means and how its integration system behaves.&lt;/p&gt;

&lt;p&gt;The lifecycle lane closes the remaining shell-shaped gap. Starting Compose, probing six Flagr endpoints, running an assertion, and calling &lt;code&gt;down&lt;/code&gt; in a final CI step showed that readiness was proved but transaction-owned cleanup was not. Ota's managed lifecycle surface now acquires cleanup authority before start, runs the declared assertion, finalizes each managed service, and archives the bounded result. The failure control matters because successful cleanup alone would not prove that the same finalization path survives an assertion failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Matrix design
&lt;/h2&gt;

&lt;p&gt;The released matrix is deliberately split by evidence type:&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;Platform and mode&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Managed &lt;code&gt;verify&lt;/code&gt; projection&lt;/td&gt;
&lt;td&gt;Linux native&lt;/td&gt;
&lt;td&gt;Contract validation, Doctor, safe discovery, dry-run admission, real verification, receipt archive, and two refusal canaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed &lt;code&gt;verify&lt;/code&gt; projection&lt;/td&gt;
&lt;td&gt;macOS native&lt;/td&gt;
&lt;td&gt;The same finite verification and refusal boundary on the second supported host OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed &lt;code&gt;verify&lt;/code&gt; projection&lt;/td&gt;
&lt;td&gt;Linux container&lt;/td&gt;
&lt;td&gt;The same selected verification closure inside the contract-owned Go image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native runtime proof&lt;/td&gt;
&lt;td&gt;Ubuntu and macOS&lt;/td&gt;
&lt;td&gt;Bounded execution of the SQLite-backed local API and its declared health surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container runtime and integration&lt;/td&gt;
&lt;td&gt;Ubuntu&lt;/td&gt;
&lt;td&gt;Container runtime proof plus the six-instance Compose suite, benchmark, receipt, and explicit teardown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed lifecycle pressure&lt;/td&gt;
&lt;td&gt;Ubuntu&lt;/td&gt;
&lt;td&gt;Successful lifecycle archive plus an assertion-failure control that must still finalize every transaction-owned service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contract-to-CI drift&lt;/td&gt;
&lt;td&gt;Ubuntu&lt;/td&gt;
&lt;td&gt;The first-party Action checks that CI consumes contract-owned bootstrap and verification truth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The contract and generated workflows bind bootstrap to released &lt;code&gt;v1.6.25&lt;/code&gt;. All three supported managed projections are generated from the final contract, and their human-owned caller bindings are checked against the same projection identities before hosted execution.&lt;/p&gt;

&lt;p&gt;The complete hosted governance matrix is green in&lt;br&gt;
&lt;a href="https://github.com/bobaikato/flagr/actions/runs/31834610141" rel="noopener noreferrer"&gt;run 31834610141&lt;/a&gt; at commit &lt;code&gt;58f5263a&lt;/code&gt;. It executed Linux and macOS native verification, Linux container verification, both refusal canaries in every generated lane, native runtime proof on Ubuntu and macOS, container runtime proof, the Compose integration suite and benchmark, explicit teardown, and the contract-to-CI drift gate.&lt;/p&gt;

&lt;p&gt;The managed lifecycle lane is independently green in&lt;br&gt;
&lt;a href="https://github.com/bobaikato/flagr/actions/runs/31834610099" rel="noopener noreferrer"&gt;run 31834610099&lt;/a&gt;. The successful transaction acquired ownership for and finalized ten services, passed the real integration assertion, and observed every declared teardown state. Its separate failure control sent the same assertion to an unreachable endpoint, recorded the expected non-zero outcome, and still completed finalization for all ten services.&lt;/p&gt;

&lt;p&gt;That lifecycle result is deliberately &lt;code&gt;passed_with_unproven_boundaries&lt;/code&gt;, not a bare pass. The four&lt;br&gt;
database services do not declare readiness or another manager-backed start-state observer, so &lt;code&gt;service_started_state_not_proved&lt;/code&gt; remains attached to each database obligation. Application output and broader repository completion also remain explicitly unproved.&lt;/p&gt;

&lt;p&gt;The distinction between the lanes is part of the result. A refusal canary is not a successful integration run; it proves that the real runner still rejects that path in agent mode. Runtime readiness is not lifecycle finalization. Lifecycle finalization is not application correctness or production deployment evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doctor stayed honest
&lt;/h2&gt;

&lt;p&gt;The released contract validates with no errors, but Doctor intentionally retains two classes of warning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the agent-safe verification closure performs declared Go dependency hydration over the network;
and&lt;/li&gt;
&lt;li&gt;the lifecycle closure mutates Docker, MySQL, and PostgreSQL external state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those warnings are not noise to remove. They tell an operator that repository write boundaries do not govern registries, the Docker engine, or database state. The managed verification lanes remain&lt;br&gt;
agent-admitted because the network effect is typed as dependency hydration. The integration and lifecycle lanes remain outside agent-safe admission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uncovered material behavior
&lt;/h2&gt;

&lt;p&gt;The pressure result is bounded as follows:&lt;/p&gt;

&lt;h3&gt;
  
  
  Contract-owned and exercised
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;typed Go module hydration for the selected native and container verification modes;&lt;/li&gt;
&lt;li&gt;deterministic Go package verification on Linux, macOS, and Linux container execution;&lt;/li&gt;
&lt;li&gt;SQLite-backed local API runtime and HTTP readiness;&lt;/li&gt;
&lt;li&gt;the locally tagged integration-image build;&lt;/li&gt;
&lt;li&gt;the selected six-instance Compose integration suite and benchmark;&lt;/li&gt;
&lt;li&gt;successful and assertion-failure lifecycle finalization; and&lt;/li&gt;
&lt;li&gt;agent refusal canaries plus contract-to-CI drift detection.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Explicitly outside this proof
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;the UI build, browser E2E lane, actionlint job, dependency-freshness policy, and broader upstream benchmark surface remain repo-owned CI behavior outside this selected Ota pressure contract;&lt;/li&gt;
&lt;li&gt;GitHub triggers, permissions, credentials, runner policy, and artifact retention remain provider-owned;&lt;/li&gt;
&lt;li&gt;release publication to GHCR, multi-architecture release images, and production deployment remain outside Ota's selected execution scope; and&lt;/li&gt;
&lt;li&gt;external production services, production data, and deployment credentials were neither selected nor proved.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ota platform gaps
&lt;/h3&gt;

&lt;p&gt;This pressure lane exercises shipped Ota surfaces without adding a repo-local workaround. Any hosted failure must be classified before editing: contract defect, upstream Flagr behavior, provider failure, or a new Ota platform gap. A green matrix does not erase the explicit boundaries above.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this did not prove
&lt;/h2&gt;

&lt;p&gt;The matrix does not prove Windows execution. The contract prevents that over-read by excluding the selected verification tasks from Windows rather than publishing a non-executing audit lane.&lt;/p&gt;

&lt;p&gt;The selected integration topology is real local proof, but it is not evidence that every deployment environment has the same topology or that production operations are governed by this contract. The lifecycle archive proves only the selected Compose transaction and its declared teardown assertions. It does not prove Flagr's application outputs, repository-wide correctness, or external&lt;br&gt;
provider policy. It also does not promote the four database services to observed started state; their command execution and terminal manager state are evidenced, while their start-state obligations remain bounded as &lt;code&gt;not_proved&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosted result
&lt;/h2&gt;

&lt;p&gt;The hosted governance and lifecycle matrices are green on the same pressure commit and install Ota from the contract's released &lt;code&gt;v1.6.25&lt;/code&gt; source. Local validation also passed Doctor, discovery,&lt;br&gt;
native and container dry-run admission, real native and container verification, refusal canaries, managed projection checks, and workflow linting. The hosted runs, not that local result, are the&lt;br&gt;
publication evidence.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Upstream project: &lt;a href="https://github.com/openflagr/flagr" rel="noopener noreferrer"&gt;openflagr/flagr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pressure contract: &lt;a href="https://github.com/bobaikato/flagr/blob/58f5263a402b771418d8d91c6a0105bbd75c9247/ota.yaml" rel="noopener noreferrer"&gt;&lt;code&gt;ota.yaml&lt;/code&gt; at &lt;code&gt;58f5263a&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Governance matrix: &lt;a href="https://github.com/bobaikato/flagr/actions/runs/31834610141" rel="noopener noreferrer"&gt;run 31834610141&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lifecycle matrix: &lt;a href="https://github.com/bobaikato/flagr/actions/runs/31834610099" rel="noopener noreferrer"&gt;run 31834610099&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-flagr-native-container-go-5m3c" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-flagr-native-container-go-5m3c&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pressuretesting</category>
      <category>flagr</category>
      <category>go</category>
      <category>containers</category>
    </item>
    <item>
      <title>Test What Your AI Agents Must Not Do</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Wed, 12 Aug 2026 14:19:58 +0000</pubDate>
      <link>https://dev.to/otaready/test-what-your-ai-agents-must-not-do-3e1a</link>
      <guid>https://dev.to/otaready/test-what-your-ai-agents-must-not-do-3e1a</guid>
      <description>&lt;h2&gt;
  
  
  A Guardrail Without A Negative Test Is Still An Assumption
&lt;/h2&gt;

&lt;p&gt;Most AI agent governance starts with the positive path.&lt;/p&gt;

&lt;p&gt;A repository tells an agent which task it may run. The agent invokes that task. The test suite&lt;br&gt;
passes. CI goes green.&lt;/p&gt;

&lt;p&gt;That proves one useful thing: the allowed path still works.&lt;/p&gt;

&lt;p&gt;It does not prove that the forbidden path is still forbidden.&lt;/p&gt;

&lt;p&gt;A stale allowlist, an incomplete dependency closure, a runner regression, or a hand-maintained CI&lt;br&gt;
condition can quietly widen what an agent is able to execute. Every positive check may remain green&lt;br&gt;
while the safety boundary has stopped doing its job.&lt;/p&gt;

&lt;p&gt;This is why agent guardrails need negative tests.&lt;/p&gt;

&lt;p&gt;Ota calls those tests &lt;strong&gt;refusal canaries&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They are available in Ota &lt;code&gt;v1.6.25&lt;/code&gt;, and they reflect a deliberate product position:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Agent safety should be executable contract truth, not a promise that the model will remember to&lt;br&gt;
behave.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ota uses the same &lt;code&gt;ota.yaml&lt;/code&gt; contract to define the safe task surface, evaluate the complete&lt;br&gt;
selected closure, refuse unsafe execution, emit machine-readable evidence, and project the canary&lt;br&gt;
into CI. There is no separate shell rule for the negative test to drift away from.&lt;/p&gt;

&lt;p&gt;That is the difference between documenting a guardrail and operating one.&lt;/p&gt;
&lt;h2&gt;
  
  
  What A Refusal Canary Tests
&lt;/h2&gt;

&lt;p&gt;A refusal canary names a task or workflow that must remain outside the repository's agent-safe&lt;br&gt;
execution boundary.&lt;/p&gt;

&lt;p&gt;For example, a repository may allow agents to run verification while reserving publishing for a&lt;br&gt;
human-controlled 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;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="s"&gt;verify&lt;/span&gt;
  &lt;span class="na"&gt;refusal_canaries&lt;/span&gt;&lt;span class="pi"&gt;:&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;publish&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;workflow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;release&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;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;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;publish&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;publish&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;false&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;release&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;release&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;publish&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The positive check proves that the allowed lane remains callable:&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 verify &lt;span class="nt"&gt;--agent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The refusal canary tests the opposite 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 run publish &lt;span class="nt"&gt;--agent&lt;/span&gt; &lt;span class="nt"&gt;--expect-refusal&lt;/span&gt;
ota up &lt;span class="nt"&gt;--workflow&lt;/span&gt; release &lt;span class="nt"&gt;--agent&lt;/span&gt; &lt;span class="nt"&gt;--expect-refusal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands do not run the unsafe task and then inspect its exit code. Ota exercises the same&lt;br&gt;
agent admission boundary used by ordinary execution and requires refusal before the selected task,&lt;br&gt;
its dependencies, or the workflow closure starts.&lt;/p&gt;

&lt;p&gt;That distinction matters. The canary tests the execution boundary, not the behavior of a dangerous&lt;br&gt;
command after it has already begun.&lt;/p&gt;
&lt;h2&gt;
  
  
  Expected Refusal Becomes A Passing Test
&lt;/h2&gt;

&lt;p&gt;An ordinary agent refusal is a blocked execution result. That is the correct behavior for a direct&lt;br&gt;
attempt to run an unsafe task, but it is inconvenient as a CI assertion because the shell sees a&lt;br&gt;
non-zero exit.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--expect-refusal&lt;/code&gt; gives that result explicit negative-control semantics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;refused_as_expected&lt;/code&gt; means the declared agent-safety boundary refused the selected target before
execution and the canary passes;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;refusal_not_observed&lt;/code&gt; means the target was admitted, so the canary fails; and&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wrong_refusal_boundary&lt;/code&gt; means execution was blocked for another reason, so the canary still
fails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The third state prevents an important false positive.&lt;/p&gt;

&lt;p&gt;Suppose &lt;code&gt;publish&lt;/code&gt; accidentally becomes agent-safe, but an unrelated organization policy still&lt;br&gt;
denies the command. A weak negative test would see "something failed" and call the guardrail&lt;br&gt;
healthy. Ota does not. The canary passes only when the safety boundary it was created to test is&lt;br&gt;
the boundary that refused the lane.&lt;/p&gt;

&lt;p&gt;For machine consumers, the same result is available as structured JSON:&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;--agent&lt;/span&gt; &lt;span class="nt"&gt;--expect-refusal&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output carries the canary target, the runner-authored refusal record, whether execution&lt;br&gt;
started, and the associated blocked receipt when refusal was observed. The agent does not&lt;br&gt;
self-report that it behaved safely.&lt;/p&gt;

&lt;p&gt;This is where Ota is intentionally more opinionated than a task runner. A task runner answers,&lt;br&gt;
"Can I invoke this command?" Ota also asks, "Should this actor be admitted to this complete&lt;br&gt;
execution closure, and what evidence should exist when the answer is no?"&lt;/p&gt;
&lt;h2&gt;
  
  
  Why This Must Run Through The Real Runner
&lt;/h2&gt;

&lt;p&gt;It is easy to imitate a refusal canary with shell logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$AGENT_MODE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That only proves the shell condition still exists.&lt;/p&gt;

&lt;p&gt;It does not prove that Ota's selected task closure, safety declaration, dependency expansion, and&lt;br&gt;
execution admission agree. It can also drift independently from local execution, turning CI into a&lt;br&gt;
second policy system.&lt;/p&gt;

&lt;p&gt;A useful refusal canary has to pass through the same chokepoint as the real action. Otherwise the&lt;br&gt;
test and the boundary can fail independently while both appear green.&lt;/p&gt;

&lt;p&gt;Ota therefore derives the refusal from current contract truth at execution time. Authors declare&lt;br&gt;
which task or workflow is the canary; they do not author the reason that should make it pass.&lt;/p&gt;
&lt;h2&gt;
  
  
  Put Refusal Canaries In CI
&lt;/h2&gt;

&lt;p&gt;Local refusal gives agents and developers fast feedback. CI turns the same boundary into a&lt;br&gt;
repository-level control.&lt;/p&gt;

&lt;p&gt;A mature governance lane should test both directions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;At least one meaningful safe verification path is admitted and completes.&lt;/li&gt;
&lt;li&gt;Each material unsafe path selected as a canary is refused by the agent boundary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ota's provider-neutral CI projection includes each declared refusal canary. The GitHub adapter&lt;br&gt;
emits each one as its own provider check with a stable merge-check identity. That lets a repository&lt;br&gt;
make the negative control merge-required instead of hiding several boundaries inside one opaque&lt;br&gt;
script step.&lt;/p&gt;

&lt;p&gt;This is stronger than one broad "agent safety" job. If the publish canary fails while verification&lt;br&gt;
still passes, the provider shows exactly which execution boundary widened.&lt;/p&gt;

&lt;p&gt;Branch protection remains provider-owned. Ota can generate and identify the GitHub check, but the&lt;br&gt;
repository's GitHub policy must make it required if the organization wants a non-optional merge&lt;br&gt;
gate. Future provider adapters must preserve the same ownership boundary rather than pretending&lt;br&gt;
Ota controls provider policy.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Refusal Canaries Prove
&lt;/h2&gt;

&lt;p&gt;A passing refusal canary proves a narrow and valuable claim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;At this contract snapshot and runner boundary, the selected task or workflow was refused for the&lt;br&gt;
expected agent-safety reason before execution started.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;that every dangerous repository action has been declared;&lt;/li&gt;
&lt;li&gt;that the maintainer classified every task correctly;&lt;/li&gt;
&lt;li&gt;that raw shell execution outside Ota is impossible;&lt;/li&gt;
&lt;li&gt;that CI branch protection requires the canary check;&lt;/li&gt;
&lt;li&gt;that runtime filesystem, network, credential, or provider controls were enforced; or&lt;/li&gt;
&lt;li&gt;that the repository is globally safe for autonomous operation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are different obligations.&lt;/p&gt;

&lt;p&gt;Contract-claim assurance can evaluate whether observable repository evidence supports a declared&lt;br&gt;
safety claim. Sandbox and capability providers can enforce runtime controls. CI policy can make&lt;br&gt;
checks mandatory. Refusal canaries test whether one declared runner boundary still refuses what it&lt;br&gt;
is supposed to refuse.&lt;/p&gt;

&lt;p&gt;Keeping those claims separate is what makes the result trustworthy.&lt;/p&gt;
&lt;h2&gt;
  
  
  Turn Incidents Into Permanent Negative Tests
&lt;/h2&gt;

&lt;p&gt;A refusal canary protects a boundary the repository has already identified. It cannot protect an&lt;br&gt;
omitted path merely because that path reaches a similar outcome.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;publish&lt;/code&gt; is refused, Ota has proved that the selected &lt;code&gt;publish&lt;/code&gt; closure was refused. It has not&lt;br&gt;
proved that another task, migration, helper script, or raw shell command cannot reach the same&lt;br&gt;
external effect. Presenting task-level refusal as effect-level protection would turn a precise&lt;br&gt;
negative test into a broader claim the evidence does not support.&lt;/p&gt;

&lt;p&gt;The practical operating model is a ratchet: when an incident or review exposes another material&lt;br&gt;
execution path, add that real task or workflow as a permanent canary. The incident should improve&lt;br&gt;
the executable governance suite, not remain only in a retrospective document.&lt;/p&gt;

&lt;p&gt;Ota's current refusal canaries are task- and workflow-bound. Effect-level assurance across&lt;br&gt;
equivalent execution paths is a separate, planned governance boundary; it is not something this&lt;br&gt;
feature claims to provide today. Until that boundary is implemented and pressure-tested, canary&lt;br&gt;
coverage should remain explicit about which declared lanes it exercises and which equivalent paths&lt;br&gt;
remain unproved.&lt;/p&gt;
&lt;h2&gt;
  
  
  Choosing Useful Canaries
&lt;/h2&gt;

&lt;p&gt;Do not turn every non-agent-safe helper into a canary. Choose actions whose accidental admission&lt;br&gt;
would materially weaken the repository's governance story.&lt;/p&gt;

&lt;p&gt;Good candidates include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;package publishing and release workflows;&lt;/li&gt;
&lt;li&gt;production deployment;&lt;/li&gt;
&lt;li&gt;destructive database operations;&lt;/li&gt;
&lt;li&gt;credentialed external mutations;&lt;/li&gt;
&lt;li&gt;infrastructure apply or teardown tasks; and&lt;/li&gt;
&lt;li&gt;expensive or metered execution that should require a different authority path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The canary should name the real contract task or workflow. Do not create a fake unsafe command&lt;br&gt;
whose only purpose is to be refused; that proves the fixture, not the material repository boundary.&lt;/p&gt;

&lt;p&gt;Also keep the positive lane. A system that refuses everything is not safely governed execution. It&lt;br&gt;
is unavailable software. The useful result is selective admission: routine work remains easy, and&lt;br&gt;
materially different work remains outside the agent-safe closure.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try It In Your Repository
&lt;/h2&gt;

&lt;p&gt;The fastest way to understand refusal canaries is to make one fail deliberately on a temporary&lt;br&gt;
branch.&lt;/p&gt;

&lt;p&gt;First, &lt;a href="https://ota.run/docs/install" rel="noopener noreferrer"&gt;install Ota&lt;/a&gt;, then inspect the repository before changing its&lt;br&gt;
contract:&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 tasks &lt;span class="nt"&gt;--safe&lt;/span&gt; &lt;span class="nt"&gt;--use&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add one real unsafe task or workflow to &lt;code&gt;agent.refusal_canaries&lt;/code&gt;. Choose publishing, deployment,&lt;br&gt;
infrastructure mutation, or another material lane that already exists in the repository. Then&lt;br&gt;
validate both directions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota validate
ota run verify &lt;span class="nt"&gt;--agent&lt;/span&gt;
ota run publish &lt;span class="nt"&gt;--agent&lt;/span&gt; &lt;span class="nt"&gt;--expect-refusal&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now temporarily make &lt;code&gt;publish&lt;/code&gt; agent-safe. The positive verification lane can remain green, but the&lt;br&gt;
refusal canary changes to &lt;code&gt;refusal_not_observed&lt;/code&gt; and exits non-zero. That is the failure shape the&lt;br&gt;
feature exists to expose: the repository still works, but its agent execution boundary has widened.&lt;/p&gt;

&lt;p&gt;When the local contract is correct, inspect the provider-neutral CI projection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota ci projection &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--mode&lt;/span&gt; native &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target-os&lt;/span&gt; linux &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For GitHub Actions, Ota can render the governed reusable workflow from that projection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota ci github render &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--mode&lt;/span&gt; native &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target-os&lt;/span&gt; linux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository keeps ownership of triggers, permissions, secrets, runners, environments, and&lt;br&gt;
branch protection. Ota owns the contract-derived execution and refusal checks. That boundary lets&lt;br&gt;
teams adopt Ota without replacing their CI provider or creating another hand-maintained workflow&lt;br&gt;
language.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Larger Point
&lt;/h2&gt;

&lt;p&gt;AI governance cannot stop at telling agents what they may do.&lt;/p&gt;

&lt;p&gt;It also needs tests for what they must not be allowed to execute.&lt;/p&gt;

&lt;p&gt;Positive tests prove that an allowed path still works. Refusal canaries prove that a selected&lt;br&gt;
forbidden path still stops at the runner boundary. Together they turn an agent allowlist from&lt;br&gt;
static metadata into executable governance.&lt;/p&gt;

&lt;p&gt;That is the standard Ota is building toward: boundaries that are declared once, exercised through&lt;br&gt;
the real chokepoint, and retained as evidence rather than trusted as prose.&lt;/p&gt;

&lt;p&gt;If your repository already tells agents what they may run, the next useful question is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which one unsafe action would you want CI to prove they still cannot run?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Go Deeper
&lt;/h2&gt;

&lt;ul&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/contract-to-ci-governance" rel="noopener noreferrer"&gt;Contract-to-CI Governance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/blog/why-agent-safety-needs-enforced-boundaries-not-just-declared-ones-4m7q" rel="noopener noreferrer"&gt;Why Agent Safety Needs Enforced Boundaries, Not Just Declared Ones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/blog/one-contract-multiple-enforcement-points-for-safe-ai-agent-execution" rel="noopener noreferrer"&gt;One Contract, Multiple Enforcement Points for Safe AI Agent Execution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/test-what-your-ai-agents-must-not-do" rel="noopener noreferrer"&gt;https://ota.run/blog/test-what-your-ai-agents-must-not-do&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>agentsafety</category>
      <category>negativetesting</category>
      <category>executiongovernance</category>
    </item>
    <item>
      <title>Pressure-testing Ota on nopCommerce: managed .NET verification across native and container CI</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Tue, 11 Aug 2026 11:34:53 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-nopcommerce-managed-net-verification-across-native-and-container-ci-icp</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-nopcommerce-managed-net-verification-across-native-and-container-ci-icp</guid>
      <description>&lt;h2&gt;
  
  
  The question
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/nopSolutions/nopCommerce" rel="noopener noreferrer"&gt;nopCommerce&lt;/a&gt; is a useful test of where Ota should&lt;br&gt;
stop owning CI. Its .NET repository has substantial provider-owned workflow and deployment policy;&lt;br&gt;
Ota should not turn that into a second CI language. The pressure question was narrower: can Ota own&lt;br&gt;
a restore-and-build verification lane while GitHub retains triggers, runners, permissions,&lt;br&gt;
environments, and release policy?&lt;/p&gt;

&lt;p&gt;The setup task expresses restore as typed dependency hydration, then the workflow runs a finite&lt;br&gt;
aggregate verification task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;prepare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dependency_hydration&lt;/span&gt;
    &lt;span class="na"&gt;medium&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;package_dependencies&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet_restore&lt;/span&gt;
      &lt;span class="na"&gt;cwd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;src/Tests/Nop.Tests&lt;/span&gt;

&lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;aggregate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;build&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;verify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The pressure result
&lt;/h2&gt;

&lt;p&gt;The contract declares native and container execution for the same workflow. Ota projects each into&lt;br&gt;
an Ota-owned reusable workflow, binds it to a target OS and projection identity, and asks the&lt;br&gt;
human-owned GitHub caller to supply that identity. The caller is an adapter, not a second authority.&lt;/p&gt;

&lt;p&gt;Moving the contract from the old implementation branch to released &lt;code&gt;v1.6.25&lt;/code&gt; changed both&lt;br&gt;
projection identities. The old caller refused immediately. That was the useful failure: it made&lt;br&gt;
stale governance YAML visible before any verification task ran. We regenerated the native and&lt;br&gt;
container projections with the released Ota binary, updated the caller bindings, and re-ran them.&lt;/p&gt;

&lt;p&gt;The result is two linked release-backed proofs at commit&lt;br&gt;
&lt;a href="https://github.com/bobaikato/nopCommerce/commit/409bcc073d39ace391e989f1434c223774ccff1d" rel="noopener noreferrer"&gt;&lt;code&gt;409bcc073d&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
the &lt;a href="https://github.com/bobaikato/nopCommerce/actions/runs/31434829320" rel="noopener noreferrer"&gt;contract matrix&lt;/a&gt; installed&lt;br&gt;
Ota &lt;code&gt;v1.6.25&lt;/code&gt;, executed restore and build on native and container Linux, and dry-ran the selected&lt;br&gt;
surface on macOS and Windows. The &lt;a href="https://github.com/bobaikato/nopCommerce/actions/runs/31434829472" rel="noopener noreferrer"&gt;managed governance run&lt;/a&gt;&lt;br&gt;
verified both regenerated identities before executing the finite task and archiving its receipt.&lt;/p&gt;

&lt;p&gt;This is the ownership split Ota needs: the contract owns restore, verification, admission, mode,&lt;br&gt;
and projection identity; GitHub retains its provider policy. Neither side has to duplicate the&lt;br&gt;
other's truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the refusal matters
&lt;/h2&gt;

&lt;p&gt;Bootstrap truth is execution truth. Changing an Ota source from an implementation branch to a&lt;br&gt;
release changes the engine that interprets the contract, so it must change the projected lane's&lt;br&gt;
identity too. Treating that as a cosmetic edit would let a caller keep asserting governance that it&lt;br&gt;
was no longer able to reproduce.&lt;/p&gt;

&lt;p&gt;The initial refusal made the mismatch actionable: no task ran, the expected identity was reported,&lt;br&gt;
and &lt;code&gt;ota ci github sync&lt;/code&gt; could regenerate the Ota-owned files from the same release that CI would&lt;br&gt;
install. That is a better failure mode than a hand-maintained workflow silently drifting until a&lt;br&gt;
toolchain or execution change reveals it later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the split is practical
&lt;/h2&gt;

&lt;p&gt;This is not an argument that all GitHub workflow YAML should disappear. nopCommerce still needs&lt;br&gt;
provider-owned decisions that are specific to the repository: when to run, which runner to use,&lt;br&gt;
what credentials are available, and how releases are protected. Those are not contract defaults.&lt;/p&gt;

&lt;p&gt;What Ota can own without overreaching is the governed lane inside that caller: the selected&lt;br&gt;
workflow, its toolchain fulfillment, native or container mode, agent admission, and the stable&lt;br&gt;
check identity branch protection can require. That leaves a small human-owned adapter instead of&lt;br&gt;
two independently authored execution plans.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boundary
&lt;/h2&gt;

&lt;p&gt;This is a restore-and-build baseline, not full nopCommerce proof. The modeled &lt;code&gt;test&lt;/code&gt; task was&lt;br&gt;
admitted and dry-run but not executed. Database-backed behavior, frontend workflows, runtime&lt;br&gt;
readiness, Windows execution, and deployment remain outside the claim. The container image uses a&lt;br&gt;
tag rather than a digest, so the container result is run-specific execution evidence, not immutable&lt;br&gt;
image provenance.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Upstream project: &lt;a href="https://github.com/nopSolutions/nopCommerce" rel="noopener noreferrer"&gt;nopSolutions/nopCommerce&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pressure contract: &lt;a href="https://github.com/bobaikato/nopCommerce/blob/409bcc073d39ace391e989f1434c223774ccff1d/ota.yaml" rel="noopener noreferrer"&gt;commit &lt;code&gt;409bcc073d&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Green contract matrix: &lt;a href="https://github.com/bobaikato/nopCommerce/actions/runs/31434829320" rel="noopener noreferrer"&gt;run 31434829320&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Green managed governance: &lt;a href="https://github.com/bobaikato/nopCommerce/actions/runs/31434829472" rel="noopener noreferrer"&gt;run 31434829472&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-nopcommerce-dotnet-projection-5m4d" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-nopcommerce-dotnet-projection-5m4d&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pressuretesting</category>
      <category>nopcommerce</category>
      <category>dotnet</category>
      <category>containers</category>
    </item>
    <item>
      <title>Pressure-testing Ota on Azure SDK for .NET: typed NuGet hydration across ephemeral containers</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Mon, 10 Aug 2026 14:29:16 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-azure-sdk-for-net-typed-nuget-hydration-across-ephemeral-containers-nog</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-azure-sdk-for-net-typed-nuget-hydration-across-ephemeral-containers-nog</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Azure SDK for .NET is a large multi-service repository. Its contributor, test, API-compatibility,&lt;br&gt;
code-generation, live-resource, and release paths are not one runnable surface.&lt;/p&gt;

&lt;p&gt;The Ota contract therefore owns one useful contributor slice and names it plainly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;restore the dependencies for &lt;code&gt;sdk/core/Azure.Core&lt;/code&gt; through the repository's &lt;code&gt;NuGet.Config&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;build that library with &lt;code&gt;--no-restore&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;execute the same sequence in native mode and in a fresh .NET SDK container.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is enough to pressure a real boundary without pretending that a green build means the Azure&lt;br&gt;
SDK repository, its services, or its releases are ready.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Contract
&lt;/h2&gt;

&lt;p&gt;The repository owns package-source policy. Ota owns the typed restore operation that consumes 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;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;dotnet_restore&lt;/span&gt;
        &lt;span class="na"&gt;cwd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sdk/core/Azure.Core/src&lt;/span&gt;
        &lt;span class="na"&gt;config_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;../../../../NuGet.Config&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The later build is deliberately no-restore:&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;build&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;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet&lt;/span&gt;
      &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;--no-restore&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;--framework&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;net10.0&lt;/span&gt;&lt;span class="pi"&gt;]&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;sdk/core/Azure.Core/src&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the boundary testable. If restore state does not reach the build, &lt;code&gt;--no-restore&lt;/code&gt; fails&lt;br&gt;
instead of silently going back to the network.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ephemeral Container Cache Ownership
&lt;/h2&gt;

&lt;p&gt;The selected container context is ephemeral, so restore and build do not share a long-lived&lt;br&gt;
container. The contract declares the NuGet cache as Ota-managed attachment state:&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;contexts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;dotnet: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;ephemeral&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;mcr.microsoft.com/dotnet/sdk:10.0.103&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="s"&gt;.nuget/packages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ota derives &lt;code&gt;NUGET_PACKAGES&lt;/code&gt; for the selected context and carries that cache across the restore and&lt;br&gt;
later no-restore build containers. The repo does not need to duplicate a host cache path or a&lt;br&gt;
Docker volume name in a helper script.&lt;/p&gt;

&lt;p&gt;Azure SDK exposed two Ota corrections while this was pressure-tested:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;command tasks must mount the contract root, then apply &lt;code&gt;command.cwd&lt;/code&gt; inside it, because restore
writes shared intermediates under the repository &lt;code&gt;artifacts/&lt;/code&gt; tree;&lt;/li&gt;
&lt;li&gt;typed &lt;code&gt;dotnet_restore&lt;/code&gt; must carry the resolved NuGet package cache into later ephemeral tasks,
not merely report that restore exited successfully.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are runner ownership fixes. They are not Azure-specific workflow glue.&lt;/p&gt;
&lt;h2&gt;
  
  
  .NET Version Truth
&lt;/h2&gt;

&lt;p&gt;The contract follows &lt;code&gt;global.json&lt;/code&gt;, which requests &lt;code&gt;10.0.103&lt;/code&gt; with &lt;code&gt;rollForward: feature&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;toolchains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dotnet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;=10.0.103,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;10.1.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That admits valid servicing releases in the same feature band. An exact patch equality would turn&lt;br&gt;
the repository's declared roll-forward policy into a false readiness failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Released Matrix
&lt;/h2&gt;

&lt;p&gt;The requalification matrix installs Ota from the contract as released &lt;code&gt;v1.6.25&lt;/code&gt;, verifies the&lt;br&gt;
binary version before any Ota command runs, and pins all GitHub Actions by immutable revision.&lt;/p&gt;

&lt;p&gt;The released &lt;a href="https://github.com/bobaikato/azure-sdk-for-net/actions/runs/31392647606" rel="noopener noreferrer"&gt;four-lane matrix&lt;/a&gt;&lt;br&gt;
is green. Every lane recorded &lt;code&gt;ota v1.6.25 (source, commit a3e9f98f3)&lt;/code&gt; before running Ota.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;validate&lt;/code&gt;, Doctor, task/workflow discovery, and safe/unsafe task-surface discovery;&lt;/li&gt;
&lt;li&gt;task and workflow dry-runs on Ubuntu, macOS, Windows, and Ubuntu container mode;&lt;/li&gt;
&lt;li&gt;real restore, no-restore build, and declared workflow execution in each advertised mode;&lt;/li&gt;
&lt;li&gt;retained version, diagnosis, contract snapshot, and archived workflow receipt artifacts on every result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The receipts agree on one contract snapshot:&lt;br&gt;
&lt;code&gt;sha256:f7a96703141dc4e6cbb9626e0f893f4692d781db48113ac639c18770d972134b&lt;/code&gt;.&lt;br&gt;
The Ubuntu container receipt records &lt;code&gt;dotnet:container&lt;/code&gt; with ephemeral lifecycle; the other three&lt;br&gt;
receipts record the native context. A historical matrix that installed an implementation branch is&lt;br&gt;
not evidence for this release claim.&lt;/p&gt;

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

&lt;p&gt;This is selected-lane evidence only. It does not prove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every Azure SDK client library, test suite, API-compatibility check, generator, or release build;&lt;/li&gt;
&lt;li&gt;Azure credentials, live-resource tests, external package-feed availability, or service behavior;&lt;/li&gt;
&lt;li&gt;application correctness, package publication, or repository-wide readiness;&lt;/li&gt;
&lt;li&gt;container execution on macOS or Windows, where those lanes exercise native contract execution;&lt;/li&gt;
&lt;li&gt;hermetic replay or a contract-pinned expected identity for the SDK image tag.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last point is an intentional limitation to keep visible: this contract records the configured&lt;br&gt;
SDK image tag, not an immutable image digest. A mutable tag is not a maintainer-declared immutable&lt;br&gt;
input, so this is not a claim of a pinned container base.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;The useful result is not that Ota can invoke &lt;code&gt;dotnet restore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It is that the contract declares dependency intent once, while the runner owns the workspace and&lt;br&gt;
cache continuity needed to make a later no-restore build meaningful across fresh containers. The&lt;br&gt;
result remains narrow, inspectable, and honest about the much larger Azure SDK surface it does not&lt;br&gt;
govern.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Upstream repository: &lt;a href="https://github.com/Azure/azure-sdk-for-net" rel="noopener noreferrer"&gt;Azure/azure-sdk-for-net&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pressure contract: &lt;a href="https://github.com/bobaikato/azure-sdk-for-net/blob/bobai/azure-sdk-for-net-ota-pressure/ota.yaml" rel="noopener noreferrer"&gt;Azure SDK &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/azure-sdk-for-net/blob/bobai/azure-sdk-for-net-ota-pressure/.github/workflows/ota-contract-matrix.yml" rel="noopener noreferrer"&gt;Azure SDK Ota contract matrix&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Released Ota evidence: &lt;a href="https://github.com/bobaikato/azure-sdk-for-net/actions/runs/31392647606" rel="noopener noreferrer"&gt;green Azure SDK matrix run&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally Posted: &lt;a href="https://ota.run/blog/pressure-testing-ota-on-azure-sdk-for-net-3v9q" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-azure-sdk-for-net-3v9q&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pressuretesting</category>
      <category>azuresdk</category>
      <category>dotnet</category>
      <category>nuget</category>
    </item>
    <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>Ota v1.6.25 Now Available: Governed CI, Trusted Replay, and Lifecycle Proof</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Wed, 29 Jul 2026 19:40:13 +0000</pubDate>
      <link>https://dev.to/bobaikato/ota-v1625-now-available-governed-ci-trusted-replay-and-lifecycle-proof-3hd6</link>
      <guid>https://dev.to/bobaikato/ota-v1625-now-available-governed-ci-trusted-replay-and-lifecycle-proof-3hd6</guid>
      <description>&lt;h2&gt;
  
  
  Idea
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;v1.6.25&lt;/code&gt; is an execution-authority release.&lt;/p&gt;

&lt;p&gt;Ota already gave repositories one contract for setup, readiness, tasks, workflows, and agent&lt;br&gt;
boundaries. The next problem was harder: how should a consumer decide whether the resulting green&lt;br&gt;
run deserves trust?&lt;/p&gt;

&lt;p&gt;A contract can be internally valid while making a claim that available evidence does not support.&lt;br&gt;
A CI workflow can be green while executing a different closure from the one the contract governs.&lt;br&gt;
A generated baseline can be present while nobody can prove who recorded it, which version was&lt;br&gt;
reviewed, or whether replay was allowed to rewrite it. A service can become ready while teardown&lt;br&gt;
remains unobserved.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;v1.6.25&lt;/code&gt; addresses those gaps by making authority more explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI lanes are deterministic projections of contract truth, not another hand-maintained execution source.&lt;/li&gt;
&lt;li&gt;prerequisite freshness is derived from runner-witnessed provenance, not a maintainer-authored &lt;code&gt;cold: true&lt;/code&gt; label.&lt;/li&gt;
&lt;li&gt;replay consumes an explicitly promoted baseline identity, never whichever recording happens to be newest.&lt;/li&gt;
&lt;li&gt;lifecycle proof owns startup, readiness, assertion, and finalization as one bounded transaction.&lt;/li&gt;
&lt;li&gt;safety and proof claims remain qualified when the available evidence is incomplete.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is not “more green.” It is a stronger account of what made the run green, which&lt;br&gt;
authority admitted it, and where the proof stops.&lt;/p&gt;
&lt;h2&gt;
  
  
  Feature
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. CI can now be projected from the contract
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;v1.6.25&lt;/code&gt; introduces a provider-neutral CI projection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota ci projection &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--mode&lt;/span&gt; container &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target-os&lt;/span&gt; linux &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The projection binds the selected workflow, effective execution mode, target operating system,&lt;br&gt;
bootstrap truth, toolchain ownership, governance decision, proof requirements, and stable merge&lt;br&gt;
check identities.&lt;/p&gt;

&lt;p&gt;GitHub Actions is the first adapter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota ci github render &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="nt"&gt;--mode&lt;/span&gt; container &lt;span class="nt"&gt;--target-os&lt;/span&gt; linux
ota ci github check &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="nt"&gt;--mode&lt;/span&gt; container &lt;span class="nt"&gt;--target-os&lt;/span&gt; linux
ota ci github &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="nt"&gt;--mode&lt;/span&gt; container &lt;span class="nt"&gt;--target-os&lt;/span&gt; linux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All three commands use the same canonical renderer. &lt;code&gt;check&lt;/code&gt; detects drift. &lt;code&gt;sync&lt;/code&gt; writes only the&lt;br&gt;
Ota-owned reusable workflow and refuses unowned or unsafe paths.&lt;/p&gt;

&lt;p&gt;The ownership boundary is deliberate. Ota owns the governed verification lane. The provider-owned&lt;br&gt;
caller keeps triggers, permissions, environments, scheduling, deployment, and platform policy.&lt;br&gt;
This avoids replacing two manually maintained sources of execution truth with fragile&lt;br&gt;
bidirectional synchronization.&lt;/p&gt;

&lt;p&gt;Generated lanes also preserve execution semantics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;finite verification runs the selected task closure, not readiness-only &lt;code&gt;ota up&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;runtime-proof lanes execute through one authoritative proof wrapper instead of running twice&lt;/li&gt;
&lt;li&gt;native toolchains are projected from contract truth&lt;/li&gt;
&lt;li&gt;container-owned toolchains stay inside the declared image&lt;/li&gt;
&lt;li&gt;impossible mode or target-OS combinations are refused before rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The provider-neutral model is the product surface. GitHub is an adapter, not the architecture.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Agent refusal can be tested at the real chokepoint
&lt;/h3&gt;

&lt;p&gt;Safety metadata is useful only if the runner still enforces it.&lt;/p&gt;

&lt;p&gt;Repositories can now declare refusal canaries for tasks and workflows that must remain unavailable&lt;br&gt;
to agents:&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;refusal_canaries&lt;/span&gt;&lt;span class="pi"&gt;:&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;publish&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;workflow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The canary uses the ordinary runner admission path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota run &lt;span class="nt"&gt;--agent&lt;/span&gt; &lt;span class="nt"&gt;--expect-refusal&lt;/span&gt; publish
ota up &lt;span class="nt"&gt;--agent&lt;/span&gt; &lt;span class="nt"&gt;--expect-refusal&lt;/span&gt; &lt;span class="nt"&gt;--workflow&lt;/span&gt; release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It succeeds only when Ota observes the expected safety-boundary refusal before work starts. An&lt;br&gt;
admitted target fails the canary. A refusal at the wrong governance boundary does not silently&lt;br&gt;
stand in for the safety control being tested.&lt;/p&gt;

&lt;p&gt;Managed CI projects each canary as its own provider check with a stable merge-check identity. That&lt;br&gt;
turns “this lane is unsafe for agents” from static metadata into a negative control on the actual&lt;br&gt;
runner chokepoint.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Doctor separates declaration, evidence, and policy
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ota doctor --json&lt;/code&gt; now carries contract-claim assurance without pretending that Ota can infer&lt;br&gt;
missing intent.&lt;/p&gt;

&lt;p&gt;For agent-safety and proof-breadth claims, the output keeps four truths separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what the maintainer declared&lt;/li&gt;
&lt;li&gt;what closure the runner derives and enforces&lt;/li&gt;
&lt;li&gt;whether observable evidence is &lt;code&gt;supported&lt;/code&gt;, &lt;code&gt;contradicted&lt;/code&gt;, or &lt;code&gt;unknown&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;what policy decides to do with that assurance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;unknown&lt;/code&gt; is important. A structurally valid contract is not independently proven merely because&lt;br&gt;
nothing contradicted it.&lt;/p&gt;

&lt;p&gt;Archived runtime proof can support a bounded proof claim only when its contract snapshot, source&lt;br&gt;
identity, selected scope, execution mode, and replay posture match the current lane. Stale,&lt;br&gt;
scope-mismatched, or absent evidence stays &lt;code&gt;unknown&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is also why execution success and proof breadth remain separate. &lt;code&gt;ok: true&lt;/code&gt; means the selected&lt;br&gt;
execution/readiness operation succeeded. Consumers must read &lt;code&gt;proof_verdict&lt;/code&gt; and &lt;code&gt;not_proved[]&lt;/code&gt;&lt;br&gt;
before deciding what the artifact established.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Freshness is now runner-authored provenance
&lt;/h3&gt;

&lt;p&gt;“It worked in a fresh environment” is a useful claim, but only when the runner can show which&lt;br&gt;
prerequisites were absent, created, reused, and later asserted.&lt;/p&gt;

&lt;p&gt;Runtime proof now carries an execution-boundary evidence graph for supported prerequisite classes.&lt;br&gt;
The graph binds precondition observations, producer events, assertion observations, identities,&lt;br&gt;
scope, and ordering to the current execution.&lt;/p&gt;

&lt;p&gt;Ota derives two independent results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;target_freshness&lt;/code&gt;, such as &lt;code&gt;cold_start_verified&lt;/code&gt;, &lt;code&gt;persistent_state_reused&lt;/code&gt;, or &lt;code&gt;unknown&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;derivation_posture&lt;/code&gt;, such as &lt;code&gt;fully_derived&lt;/code&gt;, &lt;code&gt;cache_assisted&lt;/code&gt;, &lt;code&gt;inherited_immutable&lt;/code&gt;, or &lt;code&gt;unknown&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That separation matters. A clean &lt;code&gt;node_modules&lt;/code&gt; target rebuilt with a reused download cache can be&lt;br&gt;
cold for runtime state while still being cache-assisted. A pre-existing virtual environment with&lt;br&gt;
a matching identity is verified reused, not cold.&lt;/p&gt;

&lt;p&gt;The first carriers are intentionally narrow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;native virtual environments&lt;/li&gt;
&lt;li&gt;native frozen pnpm hydration&lt;/li&gt;
&lt;li&gt;compatible finite ephemeral-container dependency closures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ota does not generalize those observations into whole-machine freshness. Uninstrumented services,&lt;br&gt;
databases, volumes, provider-managed state, and unsupported package-manager layouts remain&lt;br&gt;
&lt;code&gt;unknown&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Generated baselines have an explicit authority chain
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;v1.6.25&lt;/code&gt; adds first-class record, promote, and replay authority for generated baselines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota baseline record &lt;span class="nt"&gt;--artifact&lt;/span&gt; answer-key
ota baseline promote &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--artifact&lt;/span&gt; answer-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--attestation&lt;/span&gt; .ota/recordings/answer-key.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The authority chain is explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;producer run
  -&amp;gt; recorded attestation
  -&amp;gt; explicit promotion
  -&amp;gt; immutable selected authority
  -&amp;gt; bounded replay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recording binds the producer receipt, semantic contract identity, source state, execution-boundary&lt;br&gt;
graph, and complete canonical output manifest. Promotion selects one named attestation&lt;br&gt;
atomically. Replay consumes only the promoted identity; it never selects “latest” and never&lt;br&gt;
rewrites authority.&lt;/p&gt;

&lt;p&gt;Strict &lt;code&gt;read_only&lt;/code&gt; replay uses a runner-owned snapshot outside the writable worktree and projects&lt;br&gt;
it across the full ephemeral-container consumer closure. Native and other non-strict lanes can use&lt;br&gt;
&lt;code&gt;verify_unchanged&lt;/code&gt;, which detects mutation after execution without falsely claiming that writes&lt;br&gt;
were structurally prevented.&lt;/p&gt;

&lt;p&gt;Portable manifests name &lt;code&gt;scm_review&lt;/code&gt; as an external trust root. Ota verifies the selected manifest&lt;br&gt;
and content identities, but it does not claim to have verified repository review, reviewer&lt;br&gt;
identity, or signer provenance. That delivery-system authority remains outside Ota.&lt;/p&gt;

&lt;p&gt;Replay-input pins are stronger too. Authors can optionally declare an immutable expected identity:&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;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;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="na"&gt;expected_identity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:4d8c...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ota computes the observed identity before execution and refuses missing or mismatched pins before&lt;br&gt;
setup, hydration, service ownership, or task startup. Expected and observed identities remain in&lt;br&gt;
machine-readable refusal evidence.&lt;/p&gt;
&lt;h3&gt;
  
  
  6. Lifecycle proof owns finalization, not just readiness
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ota proof lifecycle&lt;/code&gt; adds a bounded transaction for manager-owned service closures:&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 lifecycle &lt;span class="nt"&gt;--workflow&lt;/span&gt; integration &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;The transaction orders:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;prerequisite execution&lt;/li&gt;
&lt;li&gt;initial-state observation&lt;/li&gt;
&lt;li&gt;cleanup-lease acquisition&lt;/li&gt;
&lt;li&gt;service startup&lt;/li&gt;
&lt;li&gt;readiness&lt;/li&gt;
&lt;li&gt;an optional finite assertion&lt;/li&gt;
&lt;li&gt;reverse-order teardown&lt;/li&gt;
&lt;li&gt;terminal finalization observation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ota leases only services it can prove were inactive before startup. It does not claim ownership of&lt;br&gt;
pre-existing services. Cleanup runs after acquired ownership on success, failure, or interruption,&lt;br&gt;
and isolated container boundaries are complete only after the engine confirms that the exact&lt;br&gt;
session is absent.&lt;/p&gt;

&lt;p&gt;Lifecycle archives bind the semantic contract snapshot, source identity, selected workflow and&lt;br&gt;
service closure, execution scope, target OS, boundary identity, transaction records, and qualified&lt;br&gt;
verdict. Archive verification re-derives service selection and teardown authority from the&lt;br&gt;
snapshot instead of trusting archive-authored labels.&lt;/p&gt;

&lt;p&gt;The boundary remains narrow: lifecycle proof can establish the selected startup/readiness/assertion&lt;br&gt;
and finalization transaction. It does not prove broader application output, repository completion,&lt;br&gt;
deployment safety, or provider policy.&lt;/p&gt;
&lt;h3&gt;
  
  
  7. Typed execution keeps replacing shell ownership
&lt;/h3&gt;

&lt;p&gt;The release also closes several practical gaps uncovered while pressure-testing the larger trust&lt;br&gt;
model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;command.interaction: auto | forbidden | required&lt;/code&gt; makes human TTY ownership explicit while keeping agent and non-TTY execution noninteractive&lt;/li&gt;
&lt;li&gt;native Corepack activation prevents ambient Yarn or pnpm shims from bypassing declared versions&lt;/li&gt;
&lt;li&gt;GitHub projection supports contract-owned Python/uv, Node/Corepack, Ruby, Go, and .NET toolchains&lt;/li&gt;
&lt;li&gt;typed local-project Python hydration preserves editable posture, extras, groups, source, manifest, and lock identities&lt;/li&gt;
&lt;li&gt;selected Ruby container lanes can fulfill the declared Bundler version before hydration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;effects.network_kind: service_readiness&lt;/code&gt; distinguishes finite local probes from live integration tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These changes are not independent conveniences. They remove shell and ambient-state ambiguity from&lt;br&gt;
the execution paths that now produce stronger proof.&lt;/p&gt;
&lt;h3&gt;
  
  
  Boundaries
&lt;/h3&gt;

&lt;p&gt;The most important &lt;code&gt;v1.6.25&lt;/code&gt; behavior is what it refuses to imply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a successful command does not prove the wider repository&lt;/li&gt;
&lt;li&gt;a supported contract claim does not prove the absence of hidden risk&lt;/li&gt;
&lt;li&gt;a cold verified target does not prove whole-machine or provider-state freshness&lt;/li&gt;
&lt;li&gt;a recovered seam marker does not prove that the dependency shaped broader application output&lt;/li&gt;
&lt;li&gt;a lifecycle pass does not prove deployment or production health&lt;/li&gt;
&lt;li&gt;a promoted baseline relies on the declared external review authority&lt;/li&gt;
&lt;li&gt;a provider adapter does not transfer triggers, permissions, secrets, environments, or deployment policy into Ota&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not disclaimers around the product. They are part of the product contract.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pressure
&lt;/h3&gt;

&lt;p&gt;The release was shaped by real repositories with different failure boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kylrix and Outline pressured managed native/container CI projection and Corepack ownership.&lt;/li&gt;
&lt;li&gt;OrchardCore and nopCommerce pressured typed .NET projection without transferring deployment policy into Ota.&lt;/li&gt;
&lt;li&gt;Lead Quorum and Dograh pressured native Python fulfillment and local-project hydration.&lt;/li&gt;
&lt;li&gt;EventCatalog pressured portable generated-baseline authority and detached replay consumers.&lt;/li&gt;
&lt;li&gt;Bedrock pressured the separation between declared replay inputs and witnessed model behavior.&lt;/li&gt;
&lt;li&gt;Caddy and Open WebUI pressured lifecycle ownership across isolated and Compose-backed managers.&lt;/li&gt;
&lt;li&gt;Athena API pressured bounded dependency proof and typed Ruby/Bundler execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The useful outcome was not that every repository became globally governed. Each pressure pass&lt;br&gt;
either moved material behavior into the contract, carried a machine-readable &lt;code&gt;not_proved&lt;/code&gt;&lt;br&gt;
boundary, kept provider-owned behavior outside Ota, or exposed a named platform gap.&lt;/p&gt;
&lt;h2&gt;
  
  
  Docs
&lt;/h2&gt;

&lt;p&gt;Use the live references for exact authoring and machine-consumer semantics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/install" rel="noopener noreferrer"&gt;Install Ota&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ota.run/docs/reference/command" rel="noopener noreferrer"&gt;Command Reference&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/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/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/json-output" rel="noopener noreferrer"&gt;JSON Output Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Release
&lt;/h2&gt;

&lt;p&gt;Install or upgrade to the released version, then inspect the contract-owned surface before running&lt;br&gt;
it:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;For the new proof and CI surfaces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota ci projection &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="nt"&gt;--mode&lt;/span&gt; native &lt;span class="nt"&gt;--target-os&lt;/span&gt; linux &lt;span class="nt"&gt;--json&lt;/span&gt;
ota proof runtime &lt;span class="nt"&gt;--workflow&lt;/span&gt; verify &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--archive&lt;/span&gt;
ota proof lifecycle &lt;span class="nt"&gt;--workflow&lt;/span&gt; integration &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;The canonical release and complete patch-level changelog are available at&lt;br&gt;
&lt;a href="https://ota.run/releases/v1.6.25" rel="noopener noreferrer"&gt;ota.run/releases/v1.6.25&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;v1.6.25&lt;/code&gt; moves Ota from declared execution governance toward evidence-bound execution authority:&lt;br&gt;
not only what should run, but which closure ran, what state it relied on, who selected the replay&lt;br&gt;
truth, which cleanup Ota owned, and what the resulting green artifact still did not prove.&lt;/p&gt;




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

</description>
      <category>release</category>
      <category>cigovernance</category>
      <category>replay</category>
      <category>lifecycleproof</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>
  </channel>
</rss>
