<?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: Adamma</title>
    <description>The latest articles on DEV Community by Adamma (@faithada).</description>
    <link>https://dev.to/faithada</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%2F3914302%2Ff509bdd2-39d1-4401-8ad3-41f8d43d3c0b.png</url>
      <title>DEV Community: Adamma</title>
      <link>https://dev.to/faithada</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/faithada"/>
    <language>en</language>
    <item>
      <title>Software Execution Governance Starts Before Production</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Tue, 16 Jun 2026 21:14:09 +0000</pubDate>
      <link>https://dev.to/otaready/software-execution-governance-starts-before-production-4chn</link>
      <guid>https://dev.to/otaready/software-execution-governance-starts-before-production-4chn</guid>
      <description>&lt;p&gt;Most teams still talk about governance as if it begins at deployment.&lt;/p&gt;

&lt;p&gt;Approvals. Production access. Compliance review. Audit trails.&lt;/p&gt;

&lt;p&gt;All of that matters.&lt;/p&gt;

&lt;p&gt;But by the time software reaches production, many of the most important execution decisions have already happened:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dependencies were installed&lt;/li&gt;
&lt;li&gt;scripts were executed&lt;/li&gt;
&lt;li&gt;services were started&lt;/li&gt;
&lt;li&gt;environments were configured&lt;/li&gt;
&lt;li&gt;secrets were required&lt;/li&gt;
&lt;li&gt;agents were allowed to act&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why I think the usual framing is incomplete.&lt;/p&gt;

&lt;p&gt;Software execution governance starts before production. It starts the moment someone runs a repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gap Most Teams Still Ignore
&lt;/h2&gt;

&lt;p&gt;Most organizations govern production carefully while leaving repository execution loosely managed.&lt;/p&gt;

&lt;p&gt;A contributor clones a repo, reads the README, and runs whatever setup path seems right.&lt;/p&gt;

&lt;p&gt;Maybe it works.&lt;/p&gt;

&lt;p&gt;Maybe it expects undocumented services.&lt;/p&gt;

&lt;p&gt;Maybe it mutates local state.&lt;/p&gt;

&lt;p&gt;Maybe it reaches external systems.&lt;/p&gt;

&lt;p&gt;Maybe it asks an AI agent to infer what is safe.&lt;/p&gt;

&lt;p&gt;Execution is already happening. The governance layer is just missing.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Risk Does Not Start At Deployment
&lt;/h2&gt;

&lt;p&gt;A repository can do a lot before any deployment exists:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;install software&lt;/li&gt;
&lt;li&gt;run scripts&lt;/li&gt;
&lt;li&gt;modify files&lt;/li&gt;
&lt;li&gt;start infrastructure&lt;/li&gt;
&lt;li&gt;request credentials&lt;/li&gt;
&lt;li&gt;bind ports&lt;/li&gt;
&lt;li&gt;touch Docker, databases, or cloud tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that makes repositories “bad.”&lt;/p&gt;

&lt;p&gt;It just means execution has consequences much earlier than most governance models admit.&lt;/p&gt;

&lt;p&gt;The operator can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a developer&lt;/li&gt;
&lt;li&gt;a CI runner&lt;/li&gt;
&lt;li&gt;an automation system&lt;/li&gt;
&lt;li&gt;an AI agent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The operator changes.&lt;/p&gt;

&lt;p&gt;The execution risk does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI Makes This Impossible To Ignore
&lt;/h2&gt;

&lt;p&gt;For years, teams got away with weak repository governance because humans could fill in the missing pieces.&lt;/p&gt;

&lt;p&gt;Someone knew:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which command actually mattered&lt;/li&gt;
&lt;li&gt;which service needed to be running first&lt;/li&gt;
&lt;li&gt;which script was outdated&lt;/li&gt;
&lt;li&gt;which path was safe&lt;/li&gt;
&lt;li&gt;what “done” really meant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI agents do not have access to that hidden context unless the repository declares it.&lt;/p&gt;

&lt;p&gt;That is why AI is exposing a problem that already existed.&lt;/p&gt;

&lt;p&gt;The issue is not that agents are inherently reckless.&lt;/p&gt;

&lt;p&gt;The issue is that many repositories still depend on tribal knowledge at the exact point where execution begins.&lt;/p&gt;

&lt;p&gt;Inference is not governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Real Repo-Shaped Problem
&lt;/h2&gt;

&lt;p&gt;Pressure-testing real repositories makes this obvious fast.&lt;/p&gt;

&lt;p&gt;Take a repo like &lt;code&gt;n8n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It has multiple legitimate execution paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a contributor path through the monorepo&lt;/li&gt;
&lt;li&gt;a quickstart path through &lt;code&gt;npx n8n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;a container path through Docker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three are real.&lt;/p&gt;

&lt;p&gt;But they do not share the same prerequisites, the same setup path, or the same readiness meaning.&lt;/p&gt;

&lt;p&gt;If that truth is only spread across README prose, scripts, CI workflows, and maintainer memory, the repo is already under-governed before production is even relevant.&lt;/p&gt;

&lt;p&gt;That is the problem Ota is trying to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance Means Declaring Intent
&lt;/h2&gt;

&lt;p&gt;Good governance is not bureaucracy.&lt;/p&gt;

&lt;p&gt;It is ambiguity reduction.&lt;/p&gt;

&lt;p&gt;A governed repository should be able to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what this repo requires&lt;/li&gt;
&lt;li&gt;which workflow is the intended front door&lt;/li&gt;
&lt;li&gt;what must happen before work can run&lt;/li&gt;
&lt;li&gt;which services matter&lt;/li&gt;
&lt;li&gt;what “ready” means&lt;/li&gt;
&lt;li&gt;which tasks are safe&lt;/li&gt;
&lt;li&gt;which paths are protected&lt;/li&gt;
&lt;li&gt;what verification is required&lt;/li&gt;
&lt;li&gt;when execution should stop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are execution questions.&lt;/p&gt;

&lt;p&gt;And they show up before deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Ota Makes Explicit
&lt;/h2&gt;

&lt;p&gt;One of the core ideas behind Ota is simple:&lt;/p&gt;

&lt;p&gt;the repository should be able to explain how it operates without requiring a maintainer to translate it every time.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;What it needs&lt;/li&gt;
&lt;li&gt;What can run&lt;/li&gt;
&lt;li&gt;What should run&lt;/li&gt;
&lt;li&gt;What should not run&lt;/li&gt;
&lt;li&gt;What requires approval&lt;/li&gt;
&lt;li&gt;What verification means&lt;/li&gt;
&lt;li&gt;When execution should stop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And more importantly, Ota can make those answers executable through one contract.&lt;/p&gt;

&lt;p&gt;A compact shape looks like this:&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="s"&gt;yaml|OTA Contract&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;project&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-service&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application&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;package_managers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;pnpm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.0"&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;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;cwd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
        &lt;span class="na"&gt;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;requirements&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;toolchains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;node&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;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm&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;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;setup&lt;/span&gt;
    &lt;span class="na"&gt;requirements&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;toolchains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;node&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;deploy&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;npm&lt;/span&gt;
      &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;run&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy&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="s"&gt;setup&lt;/span&gt;
    &lt;span class="na"&gt;requirements&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;toolchains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;node&lt;/span&gt;
&lt;span class="na"&gt;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;contributor&lt;/span&gt;
  &lt;span class="na"&gt;contributor&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;test&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;entrypoint&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;default_task&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;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;setup&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;protected_paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ota.yaml&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env.production&lt;/span&gt;
  &lt;span class="na"&gt;verify_after_changes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not just command exposure.&lt;/p&gt;

&lt;p&gt;That is execution governance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one declared front door&lt;/li&gt;
&lt;li&gt;one declared verification path&lt;/li&gt;
&lt;li&gt;one agent-safe boundary&lt;/li&gt;
&lt;li&gt;one explicit approval boundary for higher-risk execution&lt;/li&gt;
&lt;li&gt;one explicit protected-path surface&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Command Layer Matters Too
&lt;/h2&gt;

&lt;p&gt;Once the contract exists, the repo can expose a more trustworthy execution path for humans and agents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ota validate
ota doctor
ota up
ota run verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those commands answer different questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota validate&lt;/code&gt; checks whether the contract itself is sound&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; explains what is blocked right now&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota up&lt;/code&gt; prepares the repo along the declared path&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota run verify&lt;/code&gt; executes the canonical verification task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a stronger operating model than “read the README, inspect the scripts, and hope you found the real path.”&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is Becoming A Repository Concern
&lt;/h2&gt;

&lt;p&gt;As AI-assisted development becomes normal, more repos will be executed by automation and agents before a human ever asks a maintainer what the right command is.&lt;/p&gt;

&lt;p&gt;That means governance can no longer remain a production-only concept.&lt;/p&gt;

&lt;p&gt;Repositories need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;declared operating rules&lt;/li&gt;
&lt;li&gt;verification boundaries&lt;/li&gt;
&lt;li&gt;machine-readable execution contracts&lt;/li&gt;
&lt;li&gt;one source of execution truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, they need software execution governance at the repository boundary itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The old model says governance begins when software reaches production.&lt;/p&gt;

&lt;p&gt;That is too late.&lt;/p&gt;

&lt;p&gt;Execution begins much earlier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when a repository is cloned&lt;/li&gt;
&lt;li&gt;when setup starts&lt;/li&gt;
&lt;li&gt;when services are launched&lt;/li&gt;
&lt;li&gt;when CI runs&lt;/li&gt;
&lt;li&gt;when an AI agent begins work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where trust begins.&lt;/p&gt;

&lt;p&gt;That is where assumptions become actions.&lt;/p&gt;

&lt;p&gt;And that is where governance belongs.&lt;/p&gt;

&lt;p&gt;Because software execution governance does not start in production.&lt;/p&gt;

&lt;p&gt;It starts the moment execution begins.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Explore the Ota &lt;a href="https://ota.run/docs/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check out the Ota &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;examples&lt;/a&gt; repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally posted @ &lt;a href="https://ota.run/blog/software-execution-governance-starts-before-production" rel="noopener noreferrer"&gt;ota.run&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>programming</category>
    </item>
    <item>
      <title>Ota v1.6.20 Now Available</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Sat, 13 Jun 2026 17:27:48 +0000</pubDate>
      <link>https://dev.to/otaready/ota-v1620-now-available-26f6</link>
      <guid>https://dev.to/otaready/ota-v1620-now-available-26f6</guid>
      <description>&lt;p&gt;&lt;code&gt;v1.6.20&lt;/code&gt; is a contract-governance release.&lt;/p&gt;

&lt;p&gt;As Ota has moved from repo readiness into broader software execution governance, the trust problem has shifted.&lt;/p&gt;

&lt;p&gt;It is no longer enough for Ota to execute a repository successfully once.&lt;/p&gt;

&lt;p&gt;The harder requirement is that every public execution surface stays trustworthy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;published contract schemas&lt;/li&gt;
&lt;li&gt;doctor findings consumed by automation&lt;/li&gt;
&lt;li&gt;workflow-owned environment truth&lt;/li&gt;
&lt;li&gt;service topology and readiness ownership&lt;/li&gt;
&lt;li&gt;dependency preparation and orchestration behavior&lt;/li&gt;
&lt;li&gt;If those surfaces drift, Ota starts to look correct while becoming less dependable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is exactly the kind of failure execution governance is supposed to prevent.&lt;/p&gt;

&lt;p&gt;So the goal for &lt;code&gt;v1.6.20&lt;/code&gt; was direct: make more execution truth explicit, machine-readable, versioned, and release-governed.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;v1.6.20&lt;/code&gt; ships a broad but coherent set of governance improvements. The main story is not “more YAML.” The story is that more of the repo’s actual operating model can now be published, validated, and trusted.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Contract publication became a governed release surface
&lt;/h3&gt;

&lt;p&gt;Repo and workspace contract schemas are now treated as real public APIs.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;published repo and workspace schemas are generated from the Rust-owned source of truth&lt;/li&gt;
&lt;li&gt;release and compatibility checks now fail on schema drift&lt;/li&gt;
&lt;li&gt;shipped examples and canonical contract docs validate against those published schemas&lt;/li&gt;
&lt;li&gt;contract publication is no longer a best-effort artifact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a meaningful step for humans, CI systems, editors, and AI agents. Once contracts are public machine-readable surfaces, they need the same release discipline as any other API.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Doctor output became more stable for machine consumers
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ota doctor --json&lt;/code&gt; now carries stronger governed identity across findings.&lt;/p&gt;

&lt;p&gt;Instead of forcing downstream tooling to infer meaning from rendered summary text, Ota now preserves stable finding identity more consistently across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;doctor findings&lt;/li&gt;
&lt;li&gt;policy-backed findings&lt;/li&gt;
&lt;li&gt;workflow and service findings&lt;/li&gt;
&lt;li&gt;env and provisioning findings&lt;/li&gt;
&lt;li&gt;ota explain --json&lt;/li&gt;
&lt;li&gt;workspace doctor/check surfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means integrations can depend more on structured codes, categories, ownership, and blocker metadata, and less on brittle summary parsing.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Environment ownership became first-class
&lt;/h3&gt;

&lt;p&gt;This release significantly expands what Ota can own around environments.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;v1.6.20&lt;/code&gt; adds or strengthens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;env.profiles&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;workflow-level env profile selection&lt;/li&gt;
&lt;li&gt;workflow-owned rendered dotenv artifacts&lt;/li&gt;
&lt;li&gt;richer &lt;code&gt;ensure_env_file&lt;/code&gt; behavior&lt;/li&gt;
&lt;li&gt;first-class &lt;code&gt;checks[].kind: env&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;allowed host and URL-host assertions&lt;/li&gt;
&lt;li&gt;env-file overlays on task execution paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important shift is architectural: environment truth no longer has to be spread across shell snippets, copy commands, &lt;code&gt;grep&lt;/code&gt;-based checks, and task-local duplication. More of that logic can now live in the contract itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Services and topology got more truthful
&lt;/h3&gt;

&lt;p&gt;Service modeling also moved closer to how real systems actually work.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;v1.6.20&lt;/code&gt; improves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;canonical Compose manager modeling&lt;/li&gt;
&lt;li&gt;structured compose_health readiness&lt;/li&gt;
&lt;li&gt;multi-endpoint service identity&lt;/li&gt;
&lt;li&gt;endpoint-specific context ownership&lt;/li&gt;
&lt;li&gt;endpoint-aware readiness and env bindings&lt;/li&gt;
&lt;li&gt;host-published Compose port detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because real repos rarely have just one flat “service URL.” They have host projections, multiple endpoints, readiness ownership, and task/service relationships that need to be modeled honestly.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Workflow, setup, and dependency preparation got stronger
&lt;/h3&gt;

&lt;p&gt;The workflow and setup path is now much more expressive without falling back to shell glue.&lt;/p&gt;

&lt;p&gt;This release adds or expands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;workflow-native &lt;code&gt;prepare.task&lt;/code&gt; for finite setup work&lt;/li&gt;
&lt;li&gt;first-class dependency hydration for package and image setup&lt;/li&gt;
&lt;li&gt;aggregate tasks as structured entrypoints&lt;/li&gt;
&lt;li&gt;stronger env-file and setup ownership at the workflow level&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives contracts a better way to say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what must happen before the main workflow&lt;/li&gt;
&lt;li&gt;which setup work is finite and structural&lt;/li&gt;
&lt;li&gt;which verification path is canonical&lt;/li&gt;
&lt;li&gt;how shared preparation should be modeled without fake parent tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Ota now owns more of the execution layer itself
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;v1.6.20&lt;/code&gt; also widens execution governance into orchestration and ownership lanes that used to be much looser.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;first-class orchestrator modeling&lt;/li&gt;
&lt;li&gt;Mise as the first supported orchestrator&lt;/li&gt;
&lt;li&gt;stronger toolchain ownership, including Poetry under Python&lt;/li&gt;
&lt;li&gt;better separation between runtime/tool/package-manager owners&lt;/li&gt;
&lt;li&gt;better selected-path execution truth for env artifacts and requirement projection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is one of the more important long-term shifts in the release. Ota is becoming less dependent on opaque shell mediation and more capable of governing the execution layer directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  One concrete example
&lt;/h3&gt;

&lt;p&gt;Before this release, a repo could still end up with execution truth split across several places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contract examples in docs&lt;/li&gt;
&lt;li&gt;generated schemas&lt;/li&gt;
&lt;li&gt;Rust contract types&lt;/li&gt;
&lt;li&gt;doctor JSON&lt;/li&gt;
&lt;li&gt;workflow-owned env behavior
Each individual surface might look fine, but if they drifted from each other, machine consumers would get an unreliable picture of the repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;v1.6.20&lt;/code&gt; closes a lot of that gap.&lt;/p&gt;

&lt;p&gt;For example, a workflow can now own environment profile selection and rendered dotenv artifacts directly, while the published contract schema, validation path, execution reporting, and proof JSON all stay aligned to that same declared model.&lt;/p&gt;

&lt;p&gt;That is the difference between a feature existing and a feature being governable.&lt;/p&gt;

&lt;p&gt;Taken together, these changes do not just add capabilities.&lt;/p&gt;

&lt;p&gt;They make more of Ota’s behavior publishable, enforceable, and trustworthy as execution truth.&lt;/p&gt;

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

&lt;p&gt;If you want to adopt these capabilities directly, use the live docs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get Started: Install Ota and run &lt;code&gt;ota doctor&lt;/code&gt; in your repository.&lt;/li&gt;
&lt;li&gt;Contract Reference: Repo contracts, workspace contracts, services, environments, workflows, orchestration, and toolchains.&lt;/li&gt;
&lt;li&gt;Command Reference: &lt;code&gt;ota doctor&lt;/code&gt;, &lt;code&gt;ota env&lt;/code&gt;, &lt;code&gt;ota run&lt;/code&gt;, &lt;code&gt;ota up&lt;/code&gt;, &lt;code&gt;ota proof&lt;/code&gt;, and related execution commands.&lt;/li&gt;
&lt;li&gt;Environment Modeling: Environment profiles, dotenv rendering, environment checks, and ownership surfaces.&lt;/li&gt;
&lt;li&gt;Service Modeling: Managed services, readiness, endpoint ownership, and topology definitions.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;v1.6.20 is live.&lt;/p&gt;

&lt;p&gt;If you already use Ota, upgrade and verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota &lt;span class="nt"&gt;--version&lt;/span&gt;
ota validate
ota doctor
ota &lt;span class="nb"&gt;env
&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;If you are evaluating Ota for the first time, &lt;code&gt;v1.6.20&lt;/code&gt; is one of the clearest releases yet for understanding where the product is going.&lt;/p&gt;

&lt;p&gt;Ota is not only trying to make repositories runnable.&lt;/p&gt;

&lt;p&gt;It is building governed execution truth for humans, CI systems, automation, and AI agents, where contracts, diagnostics, environments, services, toolchains, and orchestration all become explicit parts of the same operating model.&lt;br&gt;
Command reference: Commands for ota doctor, ota env, ota run, ota up, and ota proof&lt;br&gt;
Workflow modeling: Workflows for canonical front doors, setup, prepare, and readiness&lt;br&gt;
JSON output: JSON output reference for machine-readable execution and diagnosis surfaces&lt;br&gt;
Release&lt;/p&gt;

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

&lt;p&gt;If you already use Ota, upgrade and verify:&lt;/p&gt;

&lt;p&gt;VERIFY&lt;br&gt;
bash&lt;br&gt;
Copy&lt;br&gt;
ota upgrade&lt;br&gt;
ota --version&lt;br&gt;
ota validate&lt;br&gt;
ota doctor&lt;br&gt;
ota env&lt;br&gt;
ota run  --dry-run --json&lt;br&gt;
If you are evaluating Ota for the first time, v1.6.20 is one of the clearest releases yet for understanding where the product is going.&lt;/p&gt;

&lt;p&gt;Ota is not only trying to make repositories runnable.&lt;/p&gt;

&lt;p&gt;It is building governed execution truth for humans, CI systems, automation, and AI agents, where contracts, diagnostics, environments, services, toolchains, and orchestration all become explicit parts of the same operating model.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>softwareengineering</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Why Tribal Knowledge Breaks Repos for AI Agents</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Sat, 13 Jun 2026 14:22:09 +0000</pubDate>
      <link>https://dev.to/otaready/why-tribal-knowledge-breaks-repos-for-ai-agents-5bb3</link>
      <guid>https://dev.to/otaready/why-tribal-knowledge-breaks-repos-for-ai-agents-5bb3</guid>
      <description>&lt;p&gt;Every repo has a little tribal knowledge.&lt;/p&gt;

&lt;p&gt;The command everyone knows not to run.&lt;br&gt;
The service that must be started before tests.&lt;br&gt;
The environment variable missing from &lt;code&gt;.env.example&lt;/code&gt;.&lt;br&gt;
The setup step that only lives in someone’s memory.&lt;br&gt;
The CI behavior nobody explains because "that’s just how this repo works."&lt;/p&gt;

&lt;p&gt;For human teams, tribal knowledge is already expensive.&lt;/p&gt;

&lt;p&gt;For AI-native repos, it is worse.&lt;/p&gt;

&lt;p&gt;It is incompatible with the operating model.&lt;/p&gt;

&lt;p&gt;An AI-native repo is not just a repo where someone occasionally uses an AI coding tool. It is a repo where humans, CI, automation, and AI agents are all expected to reason about the same codebase and take useful action from the same operating truth.&lt;/p&gt;

&lt;p&gt;That model breaks if the repo’s real rules live outside the repo.&lt;/p&gt;

&lt;p&gt;This is one of the clearest reasons Ota exists. Ota is built around software execution governance for humans and AI agents. A repo should not depend on memory, Slack history, or maintainer intuition to explain how execution works. It should declare what it needs, what can run, what is safe, what should be verified, and where agents must stop.&lt;/p&gt;

&lt;p&gt;Tribal knowledge does the opposite.&lt;/p&gt;

&lt;p&gt;It hides the rules.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tribal Knowledge Was Never Harmless
&lt;/h2&gt;

&lt;p&gt;Teams often treat tribal knowledge as normal.&lt;/p&gt;

&lt;p&gt;Someone joins the repo and asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do I run this locally?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A maintainer replies:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Oh, the README is outdated. Use pnpm now.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run the migration first, but not the reset command.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The tests only pass if Redis is already running.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ignore that script. CI does something different.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Humans can survive that kind of repo because they have a social recovery layer. They can ask follow-up questions. They can notice hesitation. They can ask whether something is safe.&lt;/p&gt;

&lt;p&gt;AI agents do not have that layer.&lt;/p&gt;

&lt;p&gt;They inspect files, choose commands, run checks, edit code, and report status.&lt;/p&gt;

&lt;p&gt;If the real rule is not declared, the agent has to infer it.&lt;/p&gt;

&lt;p&gt;And inference is not governance.&lt;/p&gt;
&lt;h2&gt;
  
  
  AI-Native Repos Need Declared Operating Truth
&lt;/h2&gt;

&lt;p&gt;A repo becomes AI-native when agents are expected to do real work inside it.&lt;/p&gt;

&lt;p&gt;That does not mean the agent owns the repo. It means the repo has to be legible to non-human operators.&lt;/p&gt;

&lt;p&gt;A serious repo should be able to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what runtime and tools are required&lt;/li&gt;
&lt;li&gt;what setup path should run first&lt;/li&gt;
&lt;li&gt;which workflows are canonical&lt;/li&gt;
&lt;li&gt;which tasks are declared&lt;/li&gt;
&lt;li&gt;which tasks are safe for agents&lt;/li&gt;
&lt;li&gt;which paths are writable&lt;/li&gt;
&lt;li&gt;which paths are protected&lt;/li&gt;
&lt;li&gt;what counts as verification&lt;/li&gt;
&lt;li&gt;which blockers require approval&lt;/li&gt;
&lt;li&gt;what status automation should consume&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those answers cannot live only in someone’s head.&lt;/p&gt;

&lt;p&gt;They should not be scattered across README prose, package scripts, CI files, shell history, and old issue comments either.&lt;/p&gt;

&lt;p&gt;This is where Ota is useful.&lt;/p&gt;

&lt;p&gt;Ota gives the repo one declared contract for that operating truth.&lt;/p&gt;

&lt;p&gt;Instead of asking humans and agents to rediscover the rules every time, the repo can declare them in &lt;code&gt;ota.yaml&lt;/code&gt; and expose them through a stable command surface.&lt;/p&gt;
&lt;h2&gt;
  
  
  Hidden Setup Turns Readiness Problems Into Debugging
&lt;/h2&gt;

&lt;p&gt;One of the most common failures in AI-assisted development is not bad code.&lt;/p&gt;

&lt;p&gt;It is hidden setup.&lt;/p&gt;

&lt;p&gt;An agent runs a test, sees a failure, and tries to fix the application. But the real problem is that Postgres was not running. Or the wrong Python version was active. Or a required CLI was missing. Or the repo needed a bootstrap step that nobody declared clearly.&lt;/p&gt;

&lt;p&gt;From the agent’s perspective, the failure is real.&lt;/p&gt;

&lt;p&gt;From the repo’s perspective, the failure is misleading.&lt;/p&gt;

&lt;p&gt;The repo was not ready for the task.&lt;/p&gt;

&lt;p&gt;This is why hidden setup knowledge is dangerous. It converts readiness blockers into debugging sessions. Humans waste time. CI becomes noisy. Agents patch the wrong layer.&lt;/p&gt;

&lt;p&gt;Ota’s position is simple: surface the blocker first.&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run the test and interpret the crash.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;This task requires Postgres.&lt;br&gt;
Postgres is not available.&lt;br&gt;
Stop here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a better operating model.&lt;/p&gt;

&lt;p&gt;That is what &lt;code&gt;ota doctor&lt;/code&gt; is for.&lt;/p&gt;
&lt;h2&gt;
  
  
  A Simple Failure Pattern
&lt;/h2&gt;

&lt;p&gt;This failure pattern shows up all the time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the README says &lt;code&gt;pnpm test&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the real test path also needs Redis&lt;/li&gt;
&lt;li&gt;nobody declared that clearly&lt;/li&gt;
&lt;li&gt;the agent runs tests&lt;/li&gt;
&lt;li&gt;the tests fail&lt;/li&gt;
&lt;li&gt;the agent starts changing application code&lt;/li&gt;
&lt;li&gt;the real problem was missing setup, not broken code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not an AI-quality issue.&lt;/p&gt;

&lt;p&gt;That is a repo-truth issue.&lt;/p&gt;

&lt;p&gt;In a governed repo, the sequence should be different:&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;see that &lt;code&gt;test&lt;/code&gt; requires Redis&lt;/li&gt;
&lt;li&gt;stop at the blocker&lt;/li&gt;
&lt;li&gt;prepare the repo correctly&lt;/li&gt;
&lt;li&gt;only then run the declared task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the practical value of replacing tribal knowledge with contract truth.&lt;/p&gt;
&lt;h2&gt;
  
  
  Hidden Safety Rules Create Risky Execution
&lt;/h2&gt;

&lt;p&gt;Tribal knowledge is not only about setup.&lt;/p&gt;

&lt;p&gt;It is also about safety.&lt;/p&gt;

&lt;p&gt;Every mature repo has commands that should not be run casually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deploy
publish
db:reset
terraform apply
seed-production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It may also have files that should not be edited without review:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.env
lockfiles
migrations
generated files
production config
deployment scripts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A human maintainer may know these boundaries instinctively.&lt;/p&gt;

&lt;p&gt;An AI agent needs them declared.&lt;/p&gt;

&lt;p&gt;Telling an agent "be careful" is not enough. The repo should say what careful means.&lt;/p&gt;

&lt;p&gt;Safe tasks should be explicit.&lt;br&gt;
Writable paths should be explicit.&lt;br&gt;
Protected paths should be explicit.&lt;br&gt;
External-state mutation should require approval.&lt;/p&gt;

&lt;p&gt;That is how Ota moves agent safety from advice into execution governance.&lt;/p&gt;
&lt;h2&gt;
  
  
  Hidden Verification Creates False Confidence
&lt;/h2&gt;

&lt;p&gt;A repo can also hide what "done" means.&lt;/p&gt;

&lt;p&gt;The README may say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run tests before opening a PR.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the actual verification path might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lint
typecheck
unit tests
integration tests
build
migration check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the agent only runs the visible test command, it may report success while CI still fails.&lt;/p&gt;

&lt;p&gt;Humans do this too.&lt;/p&gt;

&lt;p&gt;The deeper issue is that the repo has not declared the difference between a quick check and full verification.&lt;/p&gt;

&lt;p&gt;In an AI-native repo, that distinction must be explicit.&lt;/p&gt;

&lt;p&gt;Agents need finite, declared verification paths.&lt;br&gt;
CI needs stable signals.&lt;br&gt;
Humans need to know what evidence was actually produced.&lt;/p&gt;

&lt;p&gt;That is why Ota gives the repo declared tasks, workflows, and verification surfaces instead of leaving "done" to interpretation.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Ota Replaces
&lt;/h2&gt;

&lt;p&gt;Ota replaces tribal knowledge with a contract.&lt;/p&gt;

&lt;p&gt;In an Ota-backed repo, &lt;code&gt;ota.yaml&lt;/code&gt; becomes the place where the repo declares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;runtimes and tools&lt;/li&gt;
&lt;li&gt;setup requirements&lt;/li&gt;
&lt;li&gt;workflows&lt;/li&gt;
&lt;li&gt;declared tasks&lt;/li&gt;
&lt;li&gt;safe tasks&lt;/li&gt;
&lt;li&gt;verification tasks&lt;/li&gt;
&lt;li&gt;writable paths&lt;/li&gt;
&lt;li&gt;protected paths&lt;/li&gt;
&lt;li&gt;agent entrypoints&lt;/li&gt;
&lt;li&gt;execution boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That changes the question from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who knows how this repo works?&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;What has this repo declared about how it works?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the category shift.&lt;/p&gt;

&lt;p&gt;Not better onboarding prose.&lt;/p&gt;

&lt;p&gt;Declared execution truth.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Ota Adds That README Prose And Scripts Cannot
&lt;/h2&gt;

&lt;p&gt;README prose and helper scripts are useful.&lt;/p&gt;

&lt;p&gt;They are not enough on their own.&lt;/p&gt;

&lt;p&gt;They can explain or execute steps. They cannot, by themselves, give the repo a first-class execution contract.&lt;/p&gt;

&lt;p&gt;Ota adds things that tribal knowledge, docs, and scripts do not naturally provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;machine-readable readiness&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; diagnosis before execution starts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota validate&lt;/code&gt; contract validation&lt;/li&gt;
&lt;li&gt;declared workflows instead of implied front doors&lt;/li&gt;
&lt;li&gt;dry-run and preview behavior before mutation&lt;/li&gt;
&lt;li&gt;safe-task boundaries for AI agents&lt;/li&gt;
&lt;li&gt;protected-path boundaries for sensitive files and directories&lt;/li&gt;
&lt;li&gt;one shared truth for humans, CI, and agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between repository guidance and repository governance.&lt;/p&gt;
&lt;h2&gt;
  
  
  What This Looks Like In Practice
&lt;/h2&gt;

&lt;p&gt;A small Ota contract can already replace a surprising amount of tribal knowledge:&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;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;project&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&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;runtimes&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="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;22"&lt;/span&gt;

&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pnpm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10"&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;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm install --frozen-lockfile&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="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="s"&gt;pnpm build&lt;/span&gt;

  &lt;span class="na"&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="s"&gt;build&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm test:ci&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;entrypoint&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;default_task&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;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;setup&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
  &lt;span class="na"&gt;writable_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;src&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;tests&lt;/span&gt;
  &lt;span class="na"&gt;protected_paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env.local&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;infra/production&lt;/span&gt;
  &lt;span class="na"&gt;verify_after_changes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That contract tells humans and agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which runtime matters&lt;/li&gt;
&lt;li&gt;which package manager matters&lt;/li&gt;
&lt;li&gt;what setup means&lt;/li&gt;
&lt;li&gt;what task should run next&lt;/li&gt;
&lt;li&gt;what is safe&lt;/li&gt;
&lt;li&gt;what should not be touched&lt;/li&gt;
&lt;li&gt;how to verify changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is already much stronger than maintainer memory plus a stale README.&lt;/p&gt;

&lt;p&gt;And then the repo gets an actual operating flow:&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 doctor
ota up &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
ota run &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the practical difference between guessing and governed execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Repo Should Be Able To Speak For Itself
&lt;/h2&gt;

&lt;p&gt;A repo that has moved beyond tribal knowledge can speak for itself.&lt;/p&gt;

&lt;p&gt;It can say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This repo needs Node 22 and pnpm 10.
Setup is declared here.
Build depends on setup.
Tests depend on build.
The safe agent tasks are setup, build, and test.
The agent may write to src and tests.
The agent must not edit .env or deployment config.
Full verification means build plus test.
If credentials are missing, stop and report the blocker.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not excessive process.&lt;/p&gt;

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

&lt;p&gt;It gives humans a faster path.&lt;br&gt;
It gives CI a cleaner contract.&lt;br&gt;
It gives agents boundaries.&lt;br&gt;
It gives maintainers evidence.&lt;/p&gt;

&lt;p&gt;Most importantly, it makes the repo less dependent on whoever happens to remember the rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Rule Is The Broken Rule
&lt;/h2&gt;

&lt;p&gt;A README can explain.&lt;br&gt;
An &lt;code&gt;AGENTS.md&lt;/code&gt; file can guide.&lt;br&gt;
CI can enforce.&lt;br&gt;
Maintainers can decide.&lt;/p&gt;

&lt;p&gt;But the repo still needs a declared operating layer that all of them can share.&lt;/p&gt;

&lt;p&gt;Tribal knowledge cannot provide that layer.&lt;/p&gt;

&lt;p&gt;It is not reviewable.&lt;br&gt;
It is not validated.&lt;br&gt;
It is not machine-readable.&lt;br&gt;
It is not stable enough for automation.&lt;br&gt;
It does not give agents a safe boundary.&lt;/p&gt;

&lt;p&gt;Ota does.&lt;/p&gt;

&lt;p&gt;That is why this matters beyond onboarding. It is not just about helping the next developer get started faster. It is about making execution legible enough for AI agents and automation to participate without turning every action into a guessing game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Tribal knowledge does not scale into AI-native development.&lt;/p&gt;

&lt;p&gt;It may work when a small team can ask each other questions in real time. It does not work when humans, CI, automation, and AI agents all need the same repo to explain itself.&lt;/p&gt;

&lt;p&gt;AI-native repos need more than instructions.&lt;/p&gt;

&lt;p&gt;They need declared execution governance.&lt;/p&gt;

&lt;p&gt;They need to say what is required, what is safe, what is verified, what is blocked, and what must stop.&lt;/p&gt;

&lt;p&gt;That is the work Ota is built for.&lt;/p&gt;

&lt;p&gt;Not making repos look documented.&lt;/p&gt;

&lt;p&gt;Making repo execution governable.&lt;/p&gt;

&lt;p&gt;Because in an AI-native repo, the hidden rule is the broken rule.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Explore the Ota &lt;a href="https://ota.run/docs/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check out the Ota &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;examples&lt;/a&gt; repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally posted @ &lt;a href="https://ota.run/blog/why-tribal-knowledge-breaks-repos-for-ai-agents" rel="noopener noreferrer"&gt;ota.run&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Running an Unfamiliar Repo Is a Security Boundary</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Sun, 07 Jun 2026 19:43:28 +0000</pubDate>
      <link>https://dev.to/otaready/running-an-unfamiliar-repo-is-a-security-boundary-595g</link>
      <guid>https://dev.to/otaready/running-an-unfamiliar-repo-is-a-security-boundary-595g</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Running an unfamiliar repo is not neutral.&lt;/p&gt;

&lt;p&gt;That first command can install packages, execute lifecycle scripts, create files, start services, request credentials, open network connections, apply migrations, seed data, or touch external systems.&lt;/p&gt;

&lt;p&gt;That does not mean every repo is dangerous.&lt;/p&gt;

&lt;p&gt;It means the first run is a boundary.&lt;/p&gt;

&lt;p&gt;And my view is simple: boundaries should be inspected before they are crossed.&lt;/p&gt;

&lt;p&gt;This is one of the clearest reasons Ota exists. Ota is not just about making repos easier to run. It is about making repo execution explicit before humans, CI, automation, or AI agents start acting on trust they have not earned yet.&lt;/p&gt;

&lt;p&gt;The old developer habit is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Clone the repo.
Run the setup command.
See what breaks.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That habit is too casual for modern software.&lt;/p&gt;

&lt;p&gt;The better habit is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inspect the repo.
Understand what execution will do.
Preview the declared path.
Then run it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the shift from repo setup as guesswork to repo execution as a governed action.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Run Is Not Just Setup
&lt;/h2&gt;

&lt;p&gt;When people say "just run the repo," they usually flatten a lot of behavior into one harmless-sounding sentence.&lt;/p&gt;

&lt;p&gt;But the first meaningful execution step in a repo can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dependency installation&lt;/li&gt;
&lt;li&gt;package-manager lifecycle scripts&lt;/li&gt;
&lt;li&gt;local file creation or mutation&lt;/li&gt;
&lt;li&gt;long-running service startup&lt;/li&gt;
&lt;li&gt;container creation&lt;/li&gt;
&lt;li&gt;database migrations&lt;/li&gt;
&lt;li&gt;seed data&lt;/li&gt;
&lt;li&gt;secret requirements&lt;/li&gt;
&lt;li&gt;external API calls&lt;/li&gt;
&lt;li&gt;changes to remote systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a maintainer, that may all feel normal.&lt;/p&gt;

&lt;p&gt;For a new contributor, it is not normal.&lt;/p&gt;

&lt;p&gt;For an AI agent, it is worse. The agent may choose the obvious command because it is the strongest visible signal, not because it understands the consequences.&lt;/p&gt;

&lt;p&gt;That is not mainly a prompting problem.&lt;/p&gt;

&lt;p&gt;It is a repo execution problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Repo That Runs Can Still Be Opaque
&lt;/h2&gt;

&lt;p&gt;A repo is not trustworthy just because it eventually starts.&lt;/p&gt;

&lt;p&gt;If the setup path installs dependencies, starts services, applies migrations, and seeds data, then "it worked on my machine" still leaves the important questions unanswered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what exactly ran&lt;/li&gt;
&lt;li&gt;what changed&lt;/li&gt;
&lt;li&gt;what required secrets&lt;/li&gt;
&lt;li&gt;what talked to the network&lt;/li&gt;
&lt;li&gt;what touched external systems&lt;/li&gt;
&lt;li&gt;what was safe for automation&lt;/li&gt;
&lt;li&gt;what should have been reviewed before execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why "can this repo run?" is not enough.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What will this repo do when I run it?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the repo cannot answer that clearly, the first run is still a trust fall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Most Risk Hides Inside Ordinary Commands
&lt;/h2&gt;

&lt;p&gt;The risky part is usually not an obviously scary command.&lt;/p&gt;

&lt;p&gt;It is usually something ordinary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;install
setup
dev
test
seed
migrate
start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those names look harmless. Sometimes they are. Sometimes they hide real side effects.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;setup&lt;/code&gt; task may install packages and generate files.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;dev&lt;/code&gt; task may start multiple services and keep running forever.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;test&lt;/code&gt; task may require a database and mutate fixtures.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;seed&lt;/code&gt; task may write data.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;migrate&lt;/code&gt; task may alter schema.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;start&lt;/code&gt; task may assume credentials are already present.&lt;/p&gt;

&lt;p&gt;The problem is not that these tasks exist.&lt;/p&gt;

&lt;p&gt;The problem is that most repos do a weak job of declaring what they mean before execution.&lt;/p&gt;

&lt;p&gt;My opinion here is direct: if a repo expects humans or agents to run tasks, the repo should declare what those tasks actually do. README hints and command names are not enough.&lt;/p&gt;

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

&lt;p&gt;AI agents compress the distance between reading and acting.&lt;/p&gt;

&lt;p&gt;A human might pause before running a strange command. An agent often will not, unless the repo makes the stopping rules explicit.&lt;/p&gt;

&lt;p&gt;If an agent sees &lt;code&gt;setup&lt;/code&gt;, it needs to know whether that command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;only installs dependencies&lt;/li&gt;
&lt;li&gt;starts services&lt;/li&gt;
&lt;li&gt;requires secrets&lt;/li&gt;
&lt;li&gt;mutates local state&lt;/li&gt;
&lt;li&gt;touches external systems&lt;/li&gt;
&lt;li&gt;is safe for automation at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why "be careful" is not a serious safety model.&lt;/p&gt;

&lt;p&gt;If a task requires credentials, the agent should stop.&lt;/p&gt;

&lt;p&gt;If a task touches external systems, the agent should stop unless approved.&lt;/p&gt;

&lt;p&gt;If a task is outside declared safe tasks, the agent should stop.&lt;/p&gt;

&lt;p&gt;If the requested work touches protected paths, the agent should stop.&lt;/p&gt;

&lt;p&gt;That is how agent safety becomes operational.&lt;/p&gt;

&lt;p&gt;Not by hoping the agent is cautious.&lt;/p&gt;

&lt;p&gt;By making the repo declare where execution should stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  First-Run Inspection Should Be Normal
&lt;/h2&gt;

&lt;p&gt;Before running an unfamiliar repo, the responsible question is not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What command do I try first?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What will this repo do when I run it?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A healthy repo should let you inspect that before mutation starts.&lt;/p&gt;

&lt;p&gt;At minimum, first-run inspection should reveal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required runtimes and tools&lt;/li&gt;
&lt;li&gt;setup and bootstrap tasks&lt;/li&gt;
&lt;li&gt;service dependencies&lt;/li&gt;
&lt;li&gt;environment requirements&lt;/li&gt;
&lt;li&gt;tasks that are safe to run&lt;/li&gt;
&lt;li&gt;tasks that should stop for approval&lt;/li&gt;
&lt;li&gt;protected paths&lt;/li&gt;
&lt;li&gt;external state or network effects&lt;/li&gt;
&lt;li&gt;verification tasks&lt;/li&gt;
&lt;li&gt;blockers that prevent execution safely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that sounds strict, good. It should be strict.&lt;/p&gt;

&lt;p&gt;Repos are executable systems, not just folders of source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is Exactly Where Ota Fits
&lt;/h2&gt;

&lt;p&gt;Ota treats first-run execution as something the repo should declare, preview, and govern.&lt;/p&gt;

&lt;p&gt;That starts with the repo-local &lt;code&gt;ota.yaml&lt;/code&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;what the repo needs&lt;/li&gt;
&lt;li&gt;how it becomes ready&lt;/li&gt;
&lt;li&gt;which tasks exist&lt;/li&gt;
&lt;li&gt;which workflows are the intended front door&lt;/li&gt;
&lt;li&gt;which tasks are safe for agents&lt;/li&gt;
&lt;li&gt;which paths are writable or protected&lt;/li&gt;
&lt;li&gt;which effects require caution&lt;/li&gt;
&lt;li&gt;what counts as ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives humans, CI, automation, and AI agents one inspectable operating path before execution.&lt;/p&gt;

&lt;p&gt;The Ota discipline is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inspect before acting.
Diagnose before mutating.
Preview before setup.
Run declared safe tasks.
Stop at secrets, unsafe mutation, protected paths, or external-state boundaries.
Return stable status.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not process theater.&lt;/p&gt;

&lt;p&gt;That is what a governed first run looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Best Ota Commands For First-Run Inspection
&lt;/h2&gt;

&lt;p&gt;If you want this behavior to be real, not rhetorical, the command surface matters.&lt;/p&gt;

&lt;p&gt;These are the important ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; tells you what is missing or blocked before execution&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota validate&lt;/code&gt; checks whether the contract itself is sound&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota tasks --json&lt;/code&gt; exposes declared work in a machine-readable way&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota up --dry-run&lt;/code&gt; previews the setup path before changing the environment&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota run &amp;lt;task&amp;gt; --dry-run --json&lt;/code&gt; previews execution intent and status for automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most important command in this post is &lt;code&gt;ota up --dry-run&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That command matters because setup should not begin with mutation. It should begin with inspection.&lt;/p&gt;

&lt;h2&gt;
  
  
  README Prose Is Not A Boundary
&lt;/h2&gt;

&lt;p&gt;This is the part I would state bluntly.&lt;/p&gt;

&lt;p&gt;README instructions are helpful, but they are not execution governance.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; is helpful, but it is not execution governance either.&lt;/p&gt;

&lt;p&gt;A warning like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Be careful with database commands.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;is not a boundary.&lt;/p&gt;

&lt;p&gt;A boundary is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;these tasks are safe&lt;/li&gt;
&lt;li&gt;these paths are protected&lt;/li&gt;
&lt;li&gt;these secrets are required&lt;/li&gt;
&lt;li&gt;these external systems require approval&lt;/li&gt;
&lt;li&gt;these effects are denied&lt;/li&gt;
&lt;li&gt;this workflow is the intended front door&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That difference matters because humans forget, READMEs drift, and agents act on the strongest signal they see.&lt;/p&gt;

&lt;p&gt;If the repo never makes the boundary explicit, the first run is still governed by guesswork.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Better Standard
&lt;/h2&gt;

&lt;p&gt;The old standard was convenience:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can I get this repo running?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The better standard is governance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can I inspect what this repo will do before I run it?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the standard Ota is pushing.&lt;/p&gt;

&lt;p&gt;Not just runnable repos.&lt;/p&gt;

&lt;p&gt;Inspectable repos.&lt;/p&gt;

&lt;p&gt;Not just setup docs.&lt;/p&gt;

&lt;p&gt;Declared execution truth.&lt;/p&gt;

&lt;p&gt;Not just telling agents to behave.&lt;/p&gt;

&lt;p&gt;Giving the repo explicit stop signs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Running an unfamiliar repo is a security boundary, whether teams name it that way or not.&lt;/p&gt;

&lt;p&gt;The first run can install, execute, start, connect, mutate, request, or verify. Sometimes that is exactly what you want. Sometimes it is not.&lt;/p&gt;

&lt;p&gt;The difference should not be discovered accidentally by typing the obvious command.&lt;/p&gt;

&lt;p&gt;Ota treats first-run behavior as something to inspect before execution, govern through a repo contract, and verify through declared tasks, workflows, and stable output.&lt;/p&gt;

&lt;p&gt;That is what software execution governance means in practice.&lt;/p&gt;

&lt;p&gt;Not just making repos runnable.&lt;/p&gt;

&lt;p&gt;Making execution understandable before it happens.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Explore the Ota &lt;a href="https://ota.run/docs/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check out the Ota &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;examples&lt;/a&gt; repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally posted @ &lt;a href="https://ota.run/blog/running-an-unfamiliar-repo-is-a-security-boundary" rel="noopener noreferrer"&gt;ota.run&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>AI Agent Safety Need Stop Signs, Not Just Instructions</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Sun, 07 Jun 2026 08:09:00 +0000</pubDate>
      <link>https://dev.to/otaready/ai-agent-safety-need-stop-signs-not-just-instructions-1nb9</link>
      <guid>https://dev.to/otaready/ai-agent-safety-need-stop-signs-not-just-instructions-1nb9</guid>
      <description>&lt;p&gt;AI agents do not only need better instructions.&lt;/p&gt;

&lt;p&gt;They need stop signs.&lt;/p&gt;

&lt;p&gt;That is one of the clearest reasons Ota exists as &lt;strong&gt;software execution governance for humans and AI agents&lt;/strong&gt;. A repo should not merely tell an agent what it can try. It should declare what the agent must not do, when it must stop, and what requires human approval.&lt;/p&gt;

&lt;p&gt;Prompts and &lt;code&gt;AGENTS.md&lt;/code&gt; files are useful. They give agents context: how the project is organized, what style to follow, how to summarize changes, and which areas need caution.&lt;/p&gt;

&lt;p&gt;But advice is not a boundary.&lt;/p&gt;

&lt;p&gt;An instruction says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Be careful with database commands.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A stop sign says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do not run destructive database commands unless explicitly approved.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An instruction says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Avoid editing generated files.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A stop sign says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;These paths are protected. Stop if the requested edit falls outside the writable boundary.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That difference matters because modern agents are no longer passive readers. They inspect repos, choose commands, edit files, run checks, interpret failures, and report completion.&lt;/p&gt;

&lt;p&gt;If the repo gives them only guidance, they still have to infer the boundary.&lt;/p&gt;

&lt;p&gt;Ota’s position is sharper: agent execution should not depend on inference. It should be governed by the repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instructions tell agents what to attempt
&lt;/h2&gt;

&lt;p&gt;Most agent guidance is written as advice.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;follow the existing style&lt;/li&gt;
&lt;li&gt;prefer small changes&lt;/li&gt;
&lt;li&gt;run tests before finishing&lt;/li&gt;
&lt;li&gt;avoid touching generated files&lt;/li&gt;
&lt;li&gt;do not expose secrets&lt;/li&gt;
&lt;li&gt;explain what changed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That helps. It makes agents less generic and more aware of the repo they are working inside.&lt;/p&gt;

&lt;p&gt;But it still leaves the dangerous questions open.&lt;/p&gt;

&lt;p&gt;Which tests should the agent run?&lt;br&gt;
Which commands are allowed?&lt;br&gt;
Which files are generated?&lt;br&gt;
Which services require approval?&lt;br&gt;
Which failures mean “fix the code” and which mean “stop and ask”?&lt;br&gt;
Which paths are out of bounds?&lt;/p&gt;

&lt;p&gt;A capable agent may make reasonable guesses.&lt;/p&gt;

&lt;p&gt;But reasonable guesses are not governance.&lt;/p&gt;

&lt;p&gt;For low-risk editing, guidance may be enough. For repo execution, CI, automation, and agentic development, the repo needs something stronger.&lt;/p&gt;
&lt;h2&gt;
  
  
  Stop signs define when not to continue
&lt;/h2&gt;

&lt;p&gt;A stop sign is not a suggestion.&lt;/p&gt;

&lt;p&gt;It is a boundary.&lt;/p&gt;

&lt;p&gt;In a repo, stopping rules should cover at least five areas.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Secrets and credentials
&lt;/h3&gt;

&lt;p&gt;An agent should not invent secrets, request private values indirectly, or edit sensitive environment files just to make a task pass.&lt;/p&gt;

&lt;p&gt;If a command needs an API key, database password, cloud token, or private credential, the correct behavior is not improvisation.&lt;/p&gt;

&lt;p&gt;The correct behavior is to stop and report the blocker.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. External services
&lt;/h3&gt;

&lt;p&gt;Some tasks depend on systems outside the repo: cloud infrastructure, managed databases, payment providers, queues, object storage, or production-like services.&lt;/p&gt;

&lt;p&gt;If those services are unavailable, the agent should not patch code around the failure.&lt;/p&gt;

&lt;p&gt;It should identify the missing dependency and stop.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Unsafe mutation
&lt;/h3&gt;

&lt;p&gt;Some commands change state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deploy
publish
db:reset
terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are not cousins of &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;lint&lt;/code&gt;, or &lt;code&gt;build&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If a task can mutate external state, delete data, publish packages, or affect infrastructure, the repo should not outsource that decision to the agent’s confidence.&lt;/p&gt;

&lt;p&gt;That boundary should be declared.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Protected paths
&lt;/h3&gt;

&lt;p&gt;Agents need to know where they can work.&lt;/p&gt;

&lt;p&gt;Source files and tests may be open. Generated files, migrations, lockfiles, production config, and environment files may need review or approval.&lt;/p&gt;

&lt;p&gt;This is not about slowing the agent down.&lt;/p&gt;

&lt;p&gt;It is about preventing quiet damage in files that carry operational weight.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Verification limits
&lt;/h3&gt;

&lt;p&gt;Agents also need to know when verification is finite.&lt;/p&gt;

&lt;p&gt;A long-running dev server is not a verification result.&lt;br&gt;
A watch mode is not a handoff signal.&lt;br&gt;
A task that never terminates is not the same as a bounded check.&lt;/p&gt;

&lt;p&gt;Agent-safe tasks need finite verification paths: run, finish, report status.&lt;/p&gt;

&lt;p&gt;Without that, the agent may wait indefinitely, stop too early, or report success without a meaningful result.&lt;/p&gt;
&lt;h2&gt;
  
  
  This is execution governance
&lt;/h2&gt;

&lt;p&gt;This is bigger than prompt quality.&lt;/p&gt;

&lt;p&gt;If an agent runs a risky command, edits a protected file, or treats missing credentials as a code problem, the issue is not only that the agent made a poor choice.&lt;/p&gt;

&lt;p&gt;The repo failed to govern execution.&lt;/p&gt;

&lt;p&gt;Software execution governance means the repo can declare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what it needs&lt;/li&gt;
&lt;li&gt;how it should be prepared&lt;/li&gt;
&lt;li&gt;what can be executed&lt;/li&gt;
&lt;li&gt;what requires approval&lt;/li&gt;
&lt;li&gt;where agents can write&lt;/li&gt;
&lt;li&gt;when verification is complete&lt;/li&gt;
&lt;li&gt;when execution must stop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the frame Ota is built around.&lt;/p&gt;

&lt;p&gt;Not “better setup docs.”&lt;/p&gt;

&lt;p&gt;Not “another task runner.”&lt;/p&gt;

&lt;p&gt;Ota is the contract-first way to make execution boundaries explicit for humans, CI, automation, and AI agents.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Ota makes stop signs explicit
&lt;/h2&gt;

&lt;p&gt;In an Ota-backed repo, stopping rules do not have to live only in prose.&lt;/p&gt;

&lt;p&gt;The contract can declare safe tasks, verification tasks, writable paths, protected paths, setup requirements, and readiness blockers.&lt;/p&gt;

&lt;p&gt;That gives agents a governed operating model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If the task is declared safe, proceed.
If setup is required, prepare from the contract.
If the contract is invalid, stop.
If secrets or credentials are missing, stop.
If the requested edit is outside writable paths, stop.
If the task mutates external state without approval, stop.
If verification is complete, report the result.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is stronger than telling an agent to “be careful.”&lt;/p&gt;

&lt;p&gt;Ota’s agent quickstart follows this same principle: agents should prefer repo-local contracts when they exist, execute declared safe tasks, parse JSON output instead of scraping terminal prose, and stop when blockers involve secrets, credentials, external services, unsafe mutation, or paths outside declared boundaries.&lt;/p&gt;

&lt;p&gt;The command surface supports that model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; checks readiness and surfaces blockers before work begins.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota validate&lt;/code&gt; checks whether the contract itself is usable.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota tasks&lt;/code&gt; shows what work the repo has declared.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota up --dry-run&lt;/code&gt; previews setup before changing the environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota run &amp;lt;task&amp;gt; --json&lt;/code&gt; runs declared work and returns stable status for automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not that every agent action needs ceremony.&lt;/p&gt;

&lt;p&gt;The point is that dangerous ambiguity should be removed before execution happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  AGENTS.md still matters
&lt;/h2&gt;

&lt;p&gt;This does not make &lt;code&gt;AGENTS.md&lt;/code&gt; useless.&lt;/p&gt;

&lt;p&gt;It means &lt;code&gt;AGENTS.md&lt;/code&gt; should do what prose does best: explain context.&lt;/p&gt;

&lt;p&gt;Use it for style, conventions, architectural notes, review expectations, and collaboration preferences.&lt;/p&gt;

&lt;p&gt;Use Ota for the execution boundary.&lt;/p&gt;

&lt;p&gt;A clean split looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AGENTS.md:
How the agent should behave.

ota.yaml:
What the repo allows, requires, verifies, and refuses.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One gives the agent context.&lt;/p&gt;

&lt;p&gt;The other governs the repo.&lt;/p&gt;

&lt;p&gt;Together, they produce a better operator: one that understands the project and knows where the guardrails are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop signs build trust
&lt;/h2&gt;

&lt;p&gt;Teams do not trust agents because agents sound confident.&lt;/p&gt;

&lt;p&gt;They trust agents when the repo constrains what the agent can do, makes the approved path obvious, and produces evidence for what happened.&lt;/p&gt;

&lt;p&gt;A good stop sign does not make agents less useful.&lt;/p&gt;

&lt;p&gt;It makes them dependable.&lt;/p&gt;

&lt;p&gt;It tells the agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Move quickly here.
Slow down here.
Stop here.
Ask here.
Report this.
Do not guess.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the behavior serious teams need as AI agents move from code suggestion into repo execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;AI agents need instructions.&lt;/p&gt;

&lt;p&gt;But instructions alone are not enough.&lt;/p&gt;

&lt;p&gt;A repo that only tells agents what to do still leaves too much room for unsafe interpretation. The next layer is stopping rules: clear boundaries for secrets, external services, unsafe mutation, protected paths, and finite verification.&lt;/p&gt;

&lt;p&gt;That is why Ota’s contract-first model matters.&lt;/p&gt;

&lt;p&gt;It turns agent safety from advice into execution governance.&lt;/p&gt;

&lt;p&gt;The future of AI-assisted development will not be won by repos that merely prompt agents better.&lt;/p&gt;

&lt;p&gt;It will be won by repos that know when agents should stop.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Explore the Ota &lt;a href="https://ota.run/docs/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check out the Ota &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;examples&lt;/a&gt; repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally posted @ &lt;a href="https://ota.run/blog/ai-agent-safety-needs-stop-signs-not-just-instructions" rel="noopener noreferrer"&gt;ota.run&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>automation</category>
      <category>devops</category>
    </item>
    <item>
      <title>Diagnose with Ota, Then Run with Confidence</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Sat, 06 Jun 2026 11:04:19 +0000</pubDate>
      <link>https://dev.to/otaready/diagnose-with-ota-then-run-with-confidence-4lbd</link>
      <guid>https://dev.to/otaready/diagnose-with-ota-then-run-with-confidence-4lbd</guid>
      <description>&lt;p&gt;Most repo blockers are discovered too late.&lt;/p&gt;

&lt;p&gt;A developer clones a repo, follows the README, runs the setup command, and only then finds out that the required runtime is missing. Or Docker is not running. Or the test database needs secrets they do not have. Or the command they ran was never the command CI uses.&lt;/p&gt;

&lt;p&gt;By then, the repo has already wasted their time.&lt;/p&gt;

&lt;p&gt;With AI agents, the cost is higher.&lt;/p&gt;

&lt;p&gt;An agent can inspect files, choose commands, edit code, and run tests. But if the repo does not surface blockers early, the agent may spend its effort on the wrong thing. It may treat a missing service as a code bug. It may retry a command that was never going to work. It may make changes before realizing the repo was not ready to execute safely.&lt;/p&gt;

&lt;p&gt;This is exactly the class of problem Ota is built to solve.&lt;/p&gt;

&lt;p&gt;Ota’s position is straightforward: a repo should not force humans, CI, or agents to discover basic execution blockers halfway through work. The repo should expose them up front, before execution begins, through one explicit contract for execution governance.&lt;/p&gt;

&lt;p&gt;That is why the better habit is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Diagnose first.
Run second.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A blocker is not always a failure
&lt;/h2&gt;

&lt;p&gt;A blocker is not the same as a bug.&lt;/p&gt;

&lt;p&gt;A bug says the software behaved incorrectly.&lt;/p&gt;

&lt;p&gt;A blocker says execution should not proceed yet.&lt;/p&gt;

&lt;p&gt;If Postgres is not running, the app may fail. But the failure does not mean the application logic is wrong. It means the environment is incomplete.&lt;/p&gt;

&lt;p&gt;If an API key is missing, a test may fail. But the fix is not necessarily in the codebase. It may require secrets, access, or user approval.&lt;/p&gt;

&lt;p&gt;If the repo requires Python 3.12 but the machine has Python 3.10, the build may fail before the project itself has even been tested.&lt;/p&gt;

&lt;p&gt;These are execution blockers.&lt;/p&gt;

&lt;p&gt;They should be surfaced before the repo asks humans, CI, or agents to do meaningful work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why late blockers are expensive
&lt;/h2&gt;

&lt;p&gt;Late blockers are expensive because they look like ordinary failures.&lt;/p&gt;

&lt;p&gt;A missing service looks like a broken test.&lt;br&gt;
A missing runtime looks like a dependency issue.&lt;br&gt;
A missing environment variable looks like an application error.&lt;br&gt;
A risky command looks normal until it mutates state.&lt;/p&gt;

&lt;p&gt;For humans, this creates frustration.&lt;/p&gt;

&lt;p&gt;For CI, it creates noisy failures.&lt;/p&gt;

&lt;p&gt;For agents, it creates bad decision paths.&lt;/p&gt;

&lt;p&gt;An agent may see a stack trace and try to patch the code. But if the real blocker is missing Redis, the agent is now solving the wrong problem. It may edit files, rerun tests, and report uncertainty when the correct next step was simply: start the required service or stop and ask for credentials.&lt;/p&gt;

&lt;p&gt;Early diagnosis prevents that wrong turn.&lt;/p&gt;
&lt;h2&gt;
  
  
  What should be diagnosed first?
&lt;/h2&gt;

&lt;p&gt;A repo does not need to diagnose everything before running code.&lt;/p&gt;

&lt;p&gt;It needs to diagnose the conditions that decide whether execution is safe and useful.&lt;/p&gt;

&lt;p&gt;At minimum, that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required runtimes&lt;/li&gt;
&lt;li&gt;required package managers&lt;/li&gt;
&lt;li&gt;required tools&lt;/li&gt;
&lt;li&gt;expected services&lt;/li&gt;
&lt;li&gt;required environment variables&lt;/li&gt;
&lt;li&gt;setup prerequisites&lt;/li&gt;
&lt;li&gt;task availability&lt;/li&gt;
&lt;li&gt;safe tasks for agents&lt;/li&gt;
&lt;li&gt;protected paths&lt;/li&gt;
&lt;li&gt;whether the requested action needs external state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not about adding friction.&lt;/p&gt;

&lt;p&gt;It is about avoiding work that could never produce a trustworthy result.&lt;/p&gt;

&lt;p&gt;If a task needs Docker, check that early. If a test requires Postgres, say that early. If an agent is not allowed to mutate external state, stop before it reaches the risky command.&lt;/p&gt;
&lt;h2&gt;
  
  
  Diagnose first does not mean never run
&lt;/h2&gt;

&lt;p&gt;There is a bad version of this idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Check so much that nothing ever executes.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not the goal.&lt;/p&gt;

&lt;p&gt;The goal is to make the next action obvious.&lt;/p&gt;

&lt;p&gt;If the repo is ready, run the declared task.&lt;/p&gt;

&lt;p&gt;If the repo is blocked, show the blocker.&lt;/p&gt;

&lt;p&gt;If the repo needs approval, stop and ask.&lt;/p&gt;

&lt;p&gt;If the repo requires secrets, do not invent them.&lt;/p&gt;

&lt;p&gt;If the task is outside the safe boundary, do not pretend it is safe.&lt;/p&gt;

&lt;p&gt;Good diagnosis should lead to movement. It should answer one practical question:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What is the next safe action?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What this looks like for AI agents
&lt;/h2&gt;

&lt;p&gt;For AI agents, blocker diagnosis is a guardrail.&lt;/p&gt;

&lt;p&gt;Before acting in a repo, an agent should know whether the repo exposes execution governance, which tasks exist, which tasks are safe, and where execution should stop.&lt;/p&gt;

&lt;p&gt;A safer Ota-backed agent loop looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Run `ota doctor`.
2. Run `ota validate`.
3. Run `ota tasks --safe --use`.
4. Preview setup with `ota up --dry-run` when needed.
5. Run only declared safe tasks through `ota run &amp;lt;task&amp;gt;`.
6. Stop when blockers require secrets, external services, or unsafe mutation.
7. Report the blocker and the next safe action.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not about making agents timid.&lt;/p&gt;

&lt;p&gt;It is about keeping agent execution bounded.&lt;/p&gt;

&lt;p&gt;A good agent should move quickly when the repo is ready and stop clearly when the repo is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ota should surface blockers before execution
&lt;/h2&gt;

&lt;p&gt;This is one of the clearest places where Ota’s framing matters.&lt;/p&gt;

&lt;p&gt;A blocker should not be discovered only after a human, CI job, or agent has already started running commands. The repo should be able to surface basic execution problems before execution begins.&lt;/p&gt;

&lt;p&gt;In an Ota-backed repo, that means the contract can describe what the repo needs, which tasks exist, which tasks are safe, and where execution should stop. Ota’s agent guidance follows the same rule: prefer the repo contract when it exists, execute only declared safe tasks, consume JSON output when automation needs it, and stop when blockers require secrets, credentials, external services, unsafe mutation, or paths outside the declared boundary.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; surfaces execution blockers before work starts.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota validate&lt;/code&gt; checks whether the contract itself is usable.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota tasks --safe --use&lt;/code&gt; shows what work an agent can actually run safely.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota up --dry-run&lt;/code&gt; previews setup before changing the environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota run &amp;lt;task&amp;gt; --json&lt;/code&gt; runs declared work and returns stable status for automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not simply to put commands behind another CLI.&lt;/p&gt;

&lt;p&gt;The point is to avoid guessing whether execution should proceed, whether the task is safe, or whether the result means anything.&lt;/p&gt;

&lt;p&gt;That is the difference between reactive execution and governed execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The human benefit
&lt;/h2&gt;

&lt;p&gt;This is not only for agents.&lt;/p&gt;

&lt;p&gt;A repo that diagnoses blockers early is easier for humans too.&lt;/p&gt;

&lt;p&gt;New contributors know why setup is blocked.&lt;br&gt;
Maintainers get fewer vague “it does not work” reports.&lt;br&gt;
CI can fail earlier with clearer messages.&lt;br&gt;
Automation can stop before mutating state.&lt;br&gt;
Agents can report blockers instead of hallucinating fixes.&lt;/p&gt;

&lt;p&gt;The practical outcome is simple: less time spent debugging the wrong layer.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Why did this command fail?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repo helps answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Was this command safe and useful to run in the first place?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a better question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Running code is not always the first responsible step.&lt;/p&gt;

&lt;p&gt;Sometimes the responsible step is diagnosis.&lt;/p&gt;

&lt;p&gt;A repo should be able to say what it needs, what is missing, what is safe, and what should happen next before execution begins.&lt;/p&gt;

&lt;p&gt;That does not make development slower. It makes execution more intentional.&lt;/p&gt;

&lt;p&gt;The old habit is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run the command and see what breaks.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The better habit is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Diagnose first. Run second.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is how teams move from accidental execution to software execution governance.&lt;/p&gt;

&lt;p&gt;If you want that behavior to be explicit instead of tribal, start with &lt;code&gt;ota doctor&lt;/code&gt; and give the repo one contract that can say what is blocked, what is safe, and what the next action should be before anyone starts guessing.&lt;/p&gt;




&lt;p&gt;Explore the Ota &lt;a href="https://ota.run/docs/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;&lt;br&gt;
Check the Ota &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;examples&lt;/a&gt; repo&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>automation</category>
      <category>cli</category>
    </item>
    <item>
      <title>Why a Runnable Repo Is Not Always a Trustworthy Repo</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Thu, 04 Jun 2026 20:07:59 +0000</pubDate>
      <link>https://dev.to/otaready/why-a-runnable-repo-is-not-always-a-trustworthy-repo-26lo</link>
      <guid>https://dev.to/otaready/why-a-runnable-repo-is-not-always-a-trustworthy-repo-26lo</guid>
      <description>&lt;p&gt;A repo can run and still be hard to trust.&lt;/p&gt;

&lt;p&gt;That sounds strange at first. If the app starts, the build completes, or the tests pass, the repo is working, right?&lt;/p&gt;

&lt;p&gt;Not always.&lt;/p&gt;

&lt;p&gt;A runnable repo proves that something executed under some conditions. A trustworthy repo explains those conditions, makes the path repeatable, and gives humans, CI, automation, and AI agents enough evidence to understand what happened.&lt;/p&gt;

&lt;p&gt;That difference matters more as software teams rely on AI-assisted development.&lt;/p&gt;

&lt;p&gt;For a human, an unclear repo creates friction. For an AI agent, it creates risk. The agent may run the obvious command, get a passing result, and assume the repo is healthy, even though the result only proves a small part of the system.&lt;/p&gt;

&lt;p&gt;The next standard is not just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can this repo run?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can this repo be trusted when it runs?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Runnable is a low bar
&lt;/h2&gt;

&lt;p&gt;A repo is runnable when someone can get it to execute.&lt;/p&gt;

&lt;p&gt;Maybe the app starts locally. Maybe one test command passes. Maybe the build completes on a maintainer’s machine.&lt;/p&gt;

&lt;p&gt;That is useful, but it does not answer enough questions.&lt;/p&gt;

&lt;p&gt;A runnable repo may still leave important things unclear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which runtime and tool versions were used?&lt;/li&gt;
&lt;li&gt;Was setup completed correctly?&lt;/li&gt;
&lt;li&gt;Were required services running?&lt;/li&gt;
&lt;li&gt;Was this a quick check or the full verification path?&lt;/li&gt;
&lt;li&gt;Was the command safe for automation?&lt;/li&gt;
&lt;li&gt;Did the result match what CI expects?&lt;/li&gt;
&lt;li&gt;Can someone else reproduce the same outcome?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those answers are missing, the repo may run, but the result is difficult to interpret.&lt;/p&gt;

&lt;p&gt;That is the gap between execution and trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trustworthy repos make conditions explicit
&lt;/h2&gt;

&lt;p&gt;A trustworthy repo does not only provide commands. It explains the conditions around those commands.&lt;/p&gt;

&lt;p&gt;For example, this is runnable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pytest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this is more trustworthy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Runtime:
Python 3.12

Services:
Postgres 16 must be running

Quick check:
pytest tests/unit

Full verification:
pytest --cov
ruff check .
mypy .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first version tells someone what to run.&lt;/p&gt;

&lt;p&gt;The second tells them what the result means.&lt;/p&gt;

&lt;p&gt;That distinction matters. If an AI agent runs &lt;code&gt;pytest&lt;/code&gt; and sees a pass, it may report success. But if the repo’s real verification path also includes coverage, linting, type checks, and database-backed integration tests, that success is incomplete.&lt;/p&gt;

&lt;p&gt;The command ran.&lt;/p&gt;

&lt;p&gt;The repo was not fully verified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trustworthy repos reduce false confidence
&lt;/h2&gt;

&lt;p&gt;The dangerous thing about an unclear repo is not only failure.&lt;/p&gt;

&lt;p&gt;It is false confidence.&lt;/p&gt;

&lt;p&gt;A failure forces someone to investigate. A misleading pass can be worse because it tells the human, CI job, or agent that things are fine when they are not.&lt;/p&gt;

&lt;p&gt;This happens when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local checks are weaker than CI checks&lt;/li&gt;
&lt;li&gt;README commands are outdated&lt;/li&gt;
&lt;li&gt;service dependencies are implicit&lt;/li&gt;
&lt;li&gt;generated files are skipped&lt;/li&gt;
&lt;li&gt;migrations are not tested&lt;/li&gt;
&lt;li&gt;safe and risky commands are mixed together&lt;/li&gt;
&lt;li&gt;agents treat a small local check as full verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these cases, the repo may produce green output without producing meaningful assurance.&lt;/p&gt;

&lt;p&gt;That is not only a testing problem.&lt;/p&gt;

&lt;p&gt;It is an execution governance problem.&lt;/p&gt;

&lt;p&gt;The repo has not made clear what counts as enough evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trustworthy repos define safe execution
&lt;/h2&gt;

&lt;p&gt;A repo also becomes more trustworthy when it separates safe execution from risky execution.&lt;/p&gt;

&lt;p&gt;Some commands are usually safe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test
lint
typecheck
build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Others may need explicit approval:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deploy
publish
db:reset
terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For humans, the difference may be obvious from experience. For automation and AI agents, it should be declared.&lt;/p&gt;

&lt;p&gt;The same applies to files.&lt;/p&gt;

&lt;p&gt;Source code and tests may be safe to edit. Generated files, production config, lockfiles, migrations, and environment files may need stronger review.&lt;/p&gt;

&lt;p&gt;A trustworthy repo does not rely on an agent guessing those boundaries from filenames.&lt;/p&gt;

&lt;p&gt;It makes safe paths visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trustworthy repos create evidence
&lt;/h2&gt;

&lt;p&gt;A runnable repo says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The command ran.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A trustworthy repo can say more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what command ran&lt;/li&gt;
&lt;li&gt;what setup happened first&lt;/li&gt;
&lt;li&gt;what environment was expected&lt;/li&gt;
&lt;li&gt;what task was selected&lt;/li&gt;
&lt;li&gt;what passed or failed&lt;/li&gt;
&lt;li&gt;what was skipped&lt;/li&gt;
&lt;li&gt;what still needs review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That evidence matters for humans. It matters for CI. It matters even more for agents.&lt;/p&gt;

&lt;p&gt;When an agent reports that work is complete, the team needs to know whether it ran the right task, in the right context, with the right boundaries.&lt;/p&gt;

&lt;p&gt;Without evidence, agent output becomes another thing to manually verify from scratch.&lt;/p&gt;

&lt;p&gt;With evidence, automation becomes easier to trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The contract layer
&lt;/h2&gt;

&lt;p&gt;This is where the earlier posts in this series have been pointing.&lt;/p&gt;

&lt;p&gt;Once a repo needs to be trusted by humans, CI, automation, and AI agents, scattered instructions are not enough. The repo needs a contract layer: a declared place where setup, tasks, safety boundaries, verification, and execution expectations can be reviewed together.&lt;/p&gt;

&lt;p&gt;That is the role Ota’s &lt;code&gt;ota.yaml&lt;/code&gt; is designed to play.&lt;/p&gt;

&lt;p&gt;The important shift is not “use another config file.”&lt;/p&gt;

&lt;p&gt;The shift is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;From:
This repo has commands you can try.

To:
This repo declares how execution should happen, what is safe, and what evidence counts.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In that model, &lt;code&gt;ota doctor&lt;/code&gt; can check readiness before work starts. &lt;code&gt;ota validate&lt;/code&gt; can check whether the contract itself is valid. &lt;code&gt;ota up&lt;/code&gt; can prepare the repo from declared setup. &lt;code&gt;ota run &amp;lt;task&amp;gt;&lt;/code&gt; can execute declared work instead of forcing humans or agents to guess the right command.&lt;/p&gt;

&lt;p&gt;The value is not only that tasks run.&lt;/p&gt;

&lt;p&gt;The value is that execution becomes explicit, bounded, and reviewable.&lt;/p&gt;

&lt;p&gt;That is what moves a repo from runnable toward trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The better standard
&lt;/h2&gt;

&lt;p&gt;The old standard was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can I run this repo?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The better standard is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can I trust what happened when this repo ran?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That requires more than a command.&lt;/p&gt;

&lt;p&gt;It requires clear setup, declared tasks, safe execution boundaries, verification paths, and evidence.&lt;/p&gt;

&lt;p&gt;This is especially important for AI agents because they are increasingly expected to operate inside repos, not just read them.&lt;/p&gt;

&lt;p&gt;They need to know what is safe.&lt;br&gt;
They need to know what counts as verification.&lt;br&gt;
They need to know when to stop.&lt;br&gt;
They need to know what to report.&lt;/p&gt;

&lt;p&gt;A trustworthy repo makes those answers visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A runnable repo is useful.&lt;/p&gt;

&lt;p&gt;But a runnable repo is not always a trustworthy repo.&lt;/p&gt;

&lt;p&gt;It may start, build, or pass a small test while still hiding the conditions that made the result possible. It may produce green output without proving the repo is ready. It may let humans, CI, and agents interpret success differently.&lt;/p&gt;

&lt;p&gt;That is why repo readiness is only the beginning.&lt;/p&gt;

&lt;p&gt;The larger goal is execution governance: making software execution explicit, safe, verifiable, and reusable across humans, CI, automation, and AI agents.&lt;/p&gt;

&lt;p&gt;A repo you can run saves time.&lt;/p&gt;

&lt;p&gt;A repo you can trust changes how safely people and agents can work.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Explore the &lt;a href="https://github.com/ota-run/ota" rel="noopener noreferrer"&gt;Ota getting started guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check the &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;Ota examples repo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally posted: &lt;a href="https://ota.run/blog/runnable-repo-vs-trustworthy-repo" rel="noopener noreferrer"&gt;https://ota.run/blog/runnable-repo-vs-trustworthy-repo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>softwareengineering</category>
      <category>testing</category>
    </item>
    <item>
      <title>AGENTS.md vs Ota: Instructions vs Readiness Contracts</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Wed, 03 Jun 2026 20:13:41 +0000</pubDate>
      <link>https://dev.to/otaready/agentsmd-vs-ota-instructions-vs-readiness-contracts-bkh</link>
      <guid>https://dev.to/otaready/agentsmd-vs-ota-instructions-vs-readiness-contracts-bkh</guid>
      <description>&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; is a useful idea.&lt;/p&gt;

&lt;p&gt;It gives AI agents a place to look for repo-specific instructions: how the project is organized, what conventions to follow, what files to avoid, and what commands may be useful.&lt;/p&gt;

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

&lt;p&gt;The problem starts when teams expect &lt;code&gt;AGENTS.md&lt;/code&gt; to carry the full weight of repo readiness.&lt;/p&gt;

&lt;p&gt;An instruction file can guide an agent. It can explain intent. It can warn against risky changes. But it is still prose.&lt;/p&gt;

&lt;p&gt;It cannot prove the repo is ready.&lt;br&gt;
It cannot validate that setup still works.&lt;br&gt;
It cannot guarantee that a command exists.&lt;br&gt;
It cannot make CI, humans, and agents share the same execution path.&lt;/p&gt;

&lt;p&gt;That is the difference between instructions and readiness contracts.&lt;/p&gt;
&lt;h2&gt;
  
  
  What AGENTS.md is good for
&lt;/h2&gt;

&lt;p&gt;An &lt;code&gt;AGENTS.md&lt;/code&gt; file is best at giving agents human-written context.&lt;/p&gt;

&lt;p&gt;For example, it can explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how the repo is structured&lt;/li&gt;
&lt;li&gt;which coding conventions to follow&lt;/li&gt;
&lt;li&gt;what areas need extra caution&lt;/li&gt;
&lt;li&gt;how to write tests&lt;/li&gt;
&lt;li&gt;what files are generated&lt;/li&gt;
&lt;li&gt;what commands are usually useful&lt;/li&gt;
&lt;li&gt;how to summarize changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This kind of guidance helps agents behave less like generic code generators and more like collaborators inside a specific repo.&lt;/p&gt;

&lt;p&gt;A good &lt;code&gt;AGENTS.md&lt;/code&gt; can reduce noise. It can tell an agent not to edit generated files, not to touch production config, or not to run destructive database commands.&lt;/p&gt;

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

&lt;p&gt;But &lt;code&gt;AGENTS.md&lt;/code&gt; works best as an instruction layer, not as the repo’s execution authority.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where AGENTS.md starts to fall short
&lt;/h2&gt;

&lt;p&gt;The limitation is simple: prose can drift.&lt;/p&gt;

&lt;p&gt;An &lt;code&gt;AGENTS.md&lt;/code&gt; file may say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run the tests before finishing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But which tests?&lt;/p&gt;

&lt;p&gt;Unit tests? Integration tests? Type checks? Lint? Build? The same command used locally, or the stricter command used in CI?&lt;/p&gt;

&lt;p&gt;It may say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do not edit generated files.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But which paths are generated? Are they listed explicitly? Are they enforced anywhere?&lt;/p&gt;

&lt;p&gt;It may say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Start the database before running integration tests.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But how should the database be started? Which version? Which port? How does the agent know it is ready?&lt;/p&gt;

&lt;p&gt;These instructions are useful, but they are not executable by themselves.&lt;/p&gt;

&lt;p&gt;They depend on the agent interpreting prose correctly and on the prose staying current as the repo changes.&lt;/p&gt;

&lt;p&gt;That is risky when the agent is expected to run commands, edit files, and verify work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a readiness contract adds
&lt;/h2&gt;

&lt;p&gt;A readiness contract turns repo expectations into structured, reviewable rules.&lt;/p&gt;

&lt;p&gt;Instead of only saying what an agent should generally do, the repo declares what it needs and how work should run.&lt;/p&gt;

&lt;p&gt;A contract can describe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required runtimes and tools&lt;/li&gt;
&lt;li&gt;setup tasks&lt;/li&gt;
&lt;li&gt;declared commands&lt;/li&gt;
&lt;li&gt;task dependencies&lt;/li&gt;
&lt;li&gt;safe tasks for agents&lt;/li&gt;
&lt;li&gt;protected paths&lt;/li&gt;
&lt;li&gt;verification steps after changes&lt;/li&gt;
&lt;li&gt;expected execution mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That changes the operating model.&lt;/p&gt;

&lt;p&gt;The agent no longer has to infer the repo’s setup path from scattered prose, package scripts, CI files, and README notes. The repo has a declared source for readiness and execution.&lt;/p&gt;

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

&lt;p&gt;Ota’s docs describe a starter &lt;code&gt;ota.yaml&lt;/code&gt; as a contract that names the repo, declares core runtime and tools, defines safe tasks and verification tasks, and gives agents a deterministic entrypoint.&lt;/p&gt;

&lt;p&gt;That is a different category from instruction prose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instructions tell. Contracts govern.
&lt;/h2&gt;

&lt;p&gt;This is the simplest way to understand the difference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AGENTS.md tells the agent how to behave.

ota.yaml tells the repo how execution is governed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those two things can work together.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; can say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prefer small changes.
Explain what you changed.
Do not edit generated files manually.
Run the appropriate verification task before handoff.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An Ota contract can define:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The setup task is safe.
The test task depends on setup.
The build task must run before test.
The agent may run setup, build, and test.
The agent should verify changes with build and test.
These paths are protected.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The instruction file provides context. The readiness contract provides structure.&lt;/p&gt;

&lt;p&gt;One is guidance. The other is an operating boundary.&lt;/p&gt;

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

&lt;p&gt;AI agents are increasingly expected to do more than suggest edits.&lt;/p&gt;

&lt;p&gt;They inspect a repo, choose commands, change files, run tests, interpret failures, and report whether work is complete.&lt;/p&gt;

&lt;p&gt;That means they need more than “please be careful.”&lt;/p&gt;

&lt;p&gt;They need the repo to expose safe, finite, verifiable paths.&lt;/p&gt;

&lt;p&gt;Without that, an agent may run a helpful-looking command that is not the real verification path. It may skip setup. It may edit a protected file. It may treat a missing tool as a code failure. It may report success after passing a small local check while CI would still fail.&lt;/p&gt;

&lt;p&gt;These are not always model failures.&lt;/p&gt;

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

&lt;p&gt;The repo did not make the safe path explicit enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ota fits
&lt;/h2&gt;

&lt;p&gt;Ota is software execution governance for humans and AI agents.&lt;/p&gt;

&lt;p&gt;It helps a repo declare what it needs, how it should be prepared, what can be safely executed, and how work should be verified.&lt;/p&gt;

&lt;p&gt;With Ota, humans, CI, automation, and AI agents can work from the same repo-level contract instead of guessing from READMEs, scripts, CI files, and scattered configuration.&lt;/p&gt;

&lt;p&gt;A typical Ota loop looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; checks whether the repo is ready and points to the blocker.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota validate&lt;/code&gt; checks whether the contract itself is valid.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota up&lt;/code&gt; prepares the repo from the contract.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota run &amp;lt;task&amp;gt;&lt;/code&gt; runs declared work through the contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The value is not just command execution.&lt;/p&gt;

&lt;p&gt;The value is that execution becomes explicit, bounded, and reviewable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The better model: AGENTS.md plus Ota
&lt;/h2&gt;

&lt;p&gt;This should not be framed as &lt;code&gt;AGENTS.md&lt;/code&gt; versus Ota in a winner-takes-all sense.&lt;/p&gt;

&lt;p&gt;The better model is both.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;AGENTS.md&lt;/code&gt; for repo-specific guidance, collaboration style, coding conventions, and human-readable cautions.&lt;/p&gt;

&lt;p&gt;Use Ota for readiness, setup, execution, verification, task boundaries, and agent-safe operations.&lt;/p&gt;

&lt;p&gt;That gives you a cleaner split:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AGENTS.md:
Human-readable instructions for how an agent should behave.

Ota:
Machine-readable execution governance for what the repo allows, requires, and verifies.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When those two layers agree, agents get both context and structure.&lt;/p&gt;

&lt;p&gt;They know how to behave, and they know what the repo is prepared to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; is useful, but it should not be asked to do everything.&lt;/p&gt;

&lt;p&gt;It can explain how an agent should work inside a repo. It can capture conventions, preferences, and warnings.&lt;/p&gt;

&lt;p&gt;But repo execution needs more than instructions.&lt;/p&gt;

&lt;p&gt;It needs a readiness contract that can declare setup, safe tasks, protected paths, verification steps, and execution rules in a form humans, CI, and agents can share.&lt;/p&gt;

&lt;p&gt;That is where Ota fits.&lt;/p&gt;

&lt;p&gt;Instructions help agents understand the repo.&lt;/p&gt;

&lt;p&gt;Readiness contracts help the repo govern execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Continue reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Check out &lt;a href="https://dev.to/otaready/repo-readiness-for-ai-agents-the-complete-guide-3acm"&gt;Repo Readiness for AI Agents: The Complete Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Explore the &lt;a href="https://ota.run/docs/getting-started" rel="noopener noreferrer"&gt;Ota getting started&lt;/a&gt; guide&lt;/li&gt;
&lt;li&gt;Check the &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;Ota examples repo&lt;/a&gt; for practical contract examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally Posted:&lt;a href="https://ota.run/blog/agents-md-vs-ota-yaml-instructions-vs-readiness-contracts" rel="noopener noreferrer"&gt;https://ota.run/blog/agents-md-vs-ota-yaml-instructions-vs-readiness-contracts&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>github</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to Align Local, CI, and Agent Execution</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Sat, 30 May 2026 11:48:22 +0000</pubDate>
      <link>https://dev.to/otaready/how-to-align-local-ci-and-agent-execution-k11</link>
      <guid>https://dev.to/otaready/how-to-align-local-ci-and-agent-execution-k11</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;One of the fastest ways to make a repo unreliable is to let local development, CI, and agent execution drift into three different stories.&lt;/p&gt;

&lt;p&gt;A developer runs one command locally. CI runs a stricter path in a different environment. The agent reads the README, checks package scripts, opens the workflow file, and has to guess which version of the repo is actually true.&lt;/p&gt;

&lt;p&gt;That is where bad automation starts.&lt;/p&gt;

&lt;p&gt;The code may be fine. The failure is often operational. The repo never made its intended execution path clear enough for humans, CI, and agents to follow the same logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drift Starts Quietly
&lt;/h2&gt;

&lt;p&gt;Execution drift usually does not arrive as a big design decision. It grows out of convenience.&lt;/p&gt;

&lt;p&gt;A project starts with something simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Later, CI gets stricter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--frozen-lockfile&lt;/span&gt;
pnpm lint
pnpm typecheck
pnpm &lt;span class="nb"&gt;test&lt;/span&gt;:ci
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the repo grows again. A service moves into Docker. Integration tests need Postgres. A new environment variable shows up. The README stays broad, CI becomes the only place with the full path, and local scripts explain only part of the story.&lt;/p&gt;

&lt;p&gt;Now the repo has multiple sources of operational truth.&lt;/p&gt;

&lt;p&gt;Humans feel that as "it works on my machine." Agents feel it as conflicting signals. They run the most obvious command, get a partial pass, and report success against a repo that would still fail in CI.&lt;/p&gt;

&lt;p&gt;That is not always an agent reasoning failure. A lot of the time, the repo gave incomplete instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alignment Does Not Mean Identical Commands
&lt;/h2&gt;

&lt;p&gt;Alignment does not require local development, CI, and agents to run the exact same command sequence.&lt;/p&gt;

&lt;p&gt;Local workflows can stay fast. CI can stay strict. Agents can have tighter safety boundaries than maintainers.&lt;/p&gt;

&lt;p&gt;What has to stay aligned is the intent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Local:
Run fast checks before and during development.

CI:
Run the full verification path before merge.

Agent:
Run declared safe tasks, report what passed, and stop cleanly at boundaries.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem starts when each path is invented separately instead of declared from the same operating model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What To Align First
&lt;/h2&gt;

&lt;p&gt;The best place to start is with the parts of the repo that create the most confusion and the most false confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Setup
&lt;/h3&gt;

&lt;p&gt;There should be one clear setup path for the repo.&lt;/p&gt;

&lt;p&gt;For a Python service, that might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry &lt;span class="nb"&gt;install
&lt;/span&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; postgres
poetry run alembic upgrade &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a Go service, it might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go mod download
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; redis
go &lt;span class="nb"&gt;test&lt;/span&gt; ./...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The stack is not the point. Clarity is. Setup should not be split across README prose, CI YAML, shell history, and one teammate's memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tasks
&lt;/h3&gt;

&lt;p&gt;Repos should expose common tasks with clear names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setup
test
test:integration
lint
typecheck
build
dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;People and agents both work better when task names explain intent. If someone has to inspect every script to figure out what is quick, complete, safe, or destructive, the repo is already too ambiguous.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Verification
&lt;/h3&gt;

&lt;p&gt;Verification is where drift becomes expensive.&lt;/p&gt;

&lt;p&gt;A repo should separate quick feedback from full verification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Quick check:
pytest tests/unit

Full verification:
pytest --cov
ruff check .
mypy .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without that distinction, contributors stop at the fast check and assume they are done while CI still holds the real standard.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Services
&lt;/h3&gt;

&lt;p&gt;Services should never be implied.&lt;/p&gt;

&lt;p&gt;If a task needs Postgres, Redis, Elasticsearch, a queue, or a local emulator, the repo should say so directly. It should also say whether that service is started with Docker Compose, expected from the host machine, or provided elsewhere.&lt;/p&gt;

&lt;p&gt;This matters because missing services often look like application bugs. An agent can lose time chasing the wrong problem when the real issue is that the repo never declared its dependencies clearly.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Safety Boundaries
&lt;/h3&gt;

&lt;p&gt;Agents need a clean line between what is safe to run and what requires review.&lt;/p&gt;

&lt;p&gt;Safe tasks usually look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test
lint
typecheck
build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Riskier tasks usually look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deploy
publish
db:reset
terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that boundary is not explicit, the agent is left inferring safety from command names. That is not a serious operating model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ota Fits
&lt;/h2&gt;

&lt;p&gt;This is the problem Ota is meant to solve.&lt;/p&gt;

&lt;p&gt;Ota turns repo execution from scattered instructions into a declared contract. Instead of hoping the README, scripts, and CI happen to agree, the repo can describe its readiness model in &lt;code&gt;ota.yaml&lt;/code&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;what the repo needs&lt;/li&gt;
&lt;li&gt;how setup happens&lt;/li&gt;
&lt;li&gt;which tasks exist&lt;/li&gt;
&lt;li&gt;which workflow is expected&lt;/li&gt;
&lt;li&gt;what counts as readiness&lt;/li&gt;
&lt;li&gt;which commands are safe for agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The value is not just that Ota can run commands. The value is that humans, CI, and agents can all operate from the same declared path.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; checks whether the repo is actually ready and points to the blocker&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota validate&lt;/code&gt; checks whether the contract is valid&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota up&lt;/code&gt; prepares the repo from the declared contract&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota run &amp;lt;task&amp;gt;&lt;/code&gt; runs a declared task instead of forcing people or agents to reverse-engineer the right command&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The README can still explain the project. CI can still enforce the standard. Ota gives them a shared execution contract so they stop drifting apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Alignment Check
&lt;/h2&gt;

&lt;p&gt;Before adding more setup prose to a README, it is worth asking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can a new contributor find the correct setup path?
Does CI prove the same core tasks the repo tells people to run?
Is the difference between quick checks and full verification explicit?
Are required services declared clearly?
Are dangerous commands separated from safe ones?
Can an AI agent tell what it is allowed to run?
Is there one place that explains how execution is supposed to work?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the answer is no, the repo does not mainly need more documentation. It needs better alignment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Local development, CI, and AI agents usually fail for the same boring reason: the repo never made its intended execution path explicit enough.&lt;/p&gt;

&lt;p&gt;That gets more expensive as teams depend more on automation and AI-assisted development.&lt;/p&gt;

&lt;p&gt;A ready repo should tell humans what to run, tell CI what to enforce, and tell agents what is safe.&lt;/p&gt;

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

&lt;p&gt;Not identical environments.&lt;/p&gt;

&lt;p&gt;A shared path.&lt;/p&gt;




&lt;h2&gt;
  
  
  Continue reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Check out &lt;a href="https://dev.to/otaready/repo-readiness-for-ai-agents-the-complete-guide-3acm"&gt;Repo Readiness for AI Agents: The Complete Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Explore the &lt;a href="https://ota.run/docs/getting-started" rel="noopener noreferrer"&gt;Ota getting started&lt;/a&gt; guide&lt;/li&gt;
&lt;li&gt;Check the &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;Ota examples repo&lt;/a&gt; for practical contract examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally Posted: &lt;a href="https://ota.run/blog/how-to-align-local-ci-and-agent-execution" rel="noopener noreferrer"&gt;https://ota.run/blog/how-to-align-local-ci-and-agent-execution&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>ci</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Is Ota another Makefile?</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Tue, 26 May 2026 21:55:33 +0000</pubDate>
      <link>https://dev.to/otaready/is-ota-another-makefile-56bh</link>
      <guid>https://dev.to/otaready/is-ota-another-makefile-56bh</guid>
      <description>&lt;p&gt;One question about Ota keeps coming up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Isn't this just a Makefile with extra steps?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a fair question.&lt;/p&gt;

&lt;p&gt;Makefiles are one of the most familiar ways to expose a command surface in a repository. If you see a &lt;code&gt;Makefile&lt;/code&gt;, you expect targets like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;test
&lt;/span&gt;make build
make dev
make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's useful. Makefiles have lasted because they solve a real problem: shared command shortcuts.&lt;/p&gt;

&lt;p&gt;Ota is not anti-Makefile, and it is not trying to remove familiar command ergonomics.&lt;/p&gt;

&lt;p&gt;A Makefile usually answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What command should I run?&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Is this repo actually ready to run, and what must be true for that to stay repeatable?&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Another way to say it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ota includes Makefile-style task execution, then adds first-class readiness around it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Makefiles are great at
&lt;/h2&gt;

&lt;p&gt;Makefiles are excellent for common repo actions.&lt;/p&gt;

&lt;p&gt;Instead of asking contributors to remember command sequences, teams define targets once and reuse them. That reduces command hunting and improves ergonomics.&lt;/p&gt;

&lt;p&gt;What Makefiles usually do &lt;strong&gt;not&lt;/strong&gt; do is model readiness state. They typically don't tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the runtime version is wrong&lt;/li&gt;
&lt;li&gt;a required env var is missing&lt;/li&gt;
&lt;li&gt;Docker is required but not running&lt;/li&gt;
&lt;li&gt;docs, local setup, and CI have drifted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So when &lt;code&gt;make test&lt;/code&gt; fails, people fall back to detective work.&lt;/p&gt;

&lt;p&gt;That's not a Makefile bug. It's just outside the Makefile's job.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem Ota focuses on
&lt;/h2&gt;

&lt;p&gt;Ota is an open-source CLI for repo readiness.&lt;/p&gt;

&lt;p&gt;A repo declares an explicit readiness contract (typically &lt;code&gt;ota.yaml&lt;/code&gt;) describing what must be true for setup and execution to be reliable and diagnosable.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;runtimes&lt;/li&gt;
&lt;li&gt;tools&lt;/li&gt;
&lt;li&gt;setup requirements&lt;/li&gt;
&lt;li&gt;tasks and workflows&lt;/li&gt;
&lt;li&gt;environment expectations&lt;/li&gt;
&lt;li&gt;safe task boundaries&lt;/li&gt;
&lt;li&gt;readiness checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ota does not magically invent a working path. Maintainers still establish that first path. Ota's value is turning that path into explicit, repeatable contract truth.&lt;/p&gt;

&lt;p&gt;Our core line is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make the first working run repeatable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because "it worked once" is not enough for the next contributor, CI run, automation, or agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ota extends Make
&lt;/h2&gt;

&lt;p&gt;A Makefile is primarily a &lt;strong&gt;recipe layer&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Ota is a &lt;strong&gt;recipe plus readiness layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A Make target might say "run tests."&lt;br&gt;&lt;br&gt;
Ota models the operational truth around that task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the repo ready?&lt;/li&gt;
&lt;li&gt;What is missing?&lt;/li&gt;
&lt;li&gt;What is blocking vs warning?&lt;/li&gt;
&lt;li&gt;Which workflow path should run?&lt;/li&gt;
&lt;li&gt;Which runtime/tooling is required?&lt;/li&gt;
&lt;li&gt;What is the next safe step?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Core commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; — diagnose readiness, blockers, warnings, and next actions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota validate&lt;/code&gt; — validate contract quality before relying on it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota up&lt;/code&gt; — prepare repo from declared contract intent&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota run &amp;lt;task&amp;gt;&lt;/code&gt; — execute declared tasks through the same operational path used by humans, CI, and agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the real question is not "Make or Ota?"&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Do you only need command shortcuts, or do you need verifiable readiness?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Concrete example
&lt;/h2&gt;

&lt;p&gt;A common flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it fails, you still need to figure out whether the issue is code, missing setup, wrong runtime, missing services, or config drift.&lt;/p&gt;

&lt;p&gt;With Ota, the flow becomes explicit:&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 up &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
ota run &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives one diagnosable path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; explains readiness blockers and the next action&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota up --dry-run&lt;/code&gt; previews preparation before mutation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota run test&lt;/code&gt; executes the declared test path used by humans, CI, and agents&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This always mattered for humans. It matters even more with AI-assisted development.&lt;/p&gt;

&lt;p&gt;Agents can discover commands, but they still need operational context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what is safe to run&lt;/li&gt;
&lt;li&gt;what prerequisites must hold first&lt;/li&gt;
&lt;li&gt;whether a failure is code-related or readiness-related&lt;/li&gt;
&lt;li&gt;whether the path is native, container, or remote&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Makefile can expose commands.&lt;br&gt;&lt;br&gt;
Ota exposes readiness meaning around those commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should use this now
&lt;/h2&gt;

&lt;p&gt;Use this model now if your team has one or more of these conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;onboarding is slow because setup truth is split across multiple files&lt;/li&gt;
&lt;li&gt;CI/local behavior drifts and root-cause takes too long&lt;/li&gt;
&lt;li&gt;repos have native plus container paths and ownership is ambiguous&lt;/li&gt;
&lt;li&gt;teams rely on AI-assisted changes and need explicit safe execution boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ota can work with Makefiles
&lt;/h2&gt;

&lt;p&gt;Ota does not require replacing Make.&lt;/p&gt;

&lt;p&gt;In many repos, the best outcome is &lt;strong&gt;Make + Ota&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make keeps familiar recipes.&lt;/li&gt;
&lt;li&gt;Ota defines readiness truth around those recipes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: keep &lt;code&gt;make test&lt;/code&gt;, and define an Ota task that calls it plus readiness requirements for that workflow.&lt;/p&gt;

&lt;p&gt;Make owns recipes. Ota owns readiness semantics.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, is Ota another Makefile?
&lt;/h2&gt;

&lt;p&gt;Not exactly.&lt;/p&gt;

&lt;p&gt;Ota can absolutely cover Makefile-style command surfaces.&lt;br&gt;&lt;br&gt;
The difference is that Ota also explains and verifies readiness: whether the repo is ready to run, why it is blocked when it isn't, and how to keep the working path repeatable across humans, CI, automation, and AI agents.&lt;/p&gt;

&lt;p&gt;Make is great for recipes.&lt;br&gt;&lt;br&gt;
Ota gives you recipes plus readiness.&lt;/p&gt;

&lt;p&gt;As repos become more complex and more automated, that readiness layer is harder to ignore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Makefile gives commands. Ota gives command truth.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Get Started with Ota
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install Ota: &lt;a href="https://www.ota.run/docs/install" rel="noopener noreferrer"&gt;https://www.ota.run/docs/install&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ota GitHub: &lt;a href="https://github.com/ota-run/ota" rel="noopener noreferrer"&gt;https://github.com/ota-run/ota&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Contract examples: &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;https://github.com/ota-run/examples&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally Posted: &lt;a href="https://ota.run/blog/is-ota-another-makefile-56bh" rel="noopener noreferrer"&gt;https://ota.run/blog/is-ota-another-makefile-56bh&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why README-Driven Infrastructure Breaks for AI Agents</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Sat, 23 May 2026 13:47:06 +0000</pubDate>
      <link>https://dev.to/otaready/why-readme-driven-infrastructure-breaks-for-ai-agents-4b2o</link>
      <guid>https://dev.to/otaready/why-readme-driven-infrastructure-breaks-for-ai-agents-4b2o</guid>
      <description>&lt;p&gt;A README is supposed to be the front door of a software project.&lt;/p&gt;

&lt;p&gt;It tells people what the repo does, why it exists, how to get started, and where to look next. That role still matters. A good README helps humans understand the project before they touch the code.&lt;/p&gt;

&lt;p&gt;The problem starts when the README becomes more than documentation.&lt;/p&gt;

&lt;p&gt;In many repos, the README quietly becomes the setup system, onboarding guide, task registry, local development manual, and source of truth for how work should happen.&lt;/p&gt;

&lt;p&gt;That is &lt;strong&gt;README-driven infrastructure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It works until the repo changes faster than the prose does.&lt;/p&gt;

&lt;p&gt;The README still says &lt;code&gt;npm test&lt;/code&gt;, but CI now runs &lt;code&gt;pnpm test:ci&lt;/code&gt;. The README says “install Python,” but the app actually needs Python 3.12, Poetry, Docker, and Postgres.&lt;/p&gt;

&lt;p&gt;A README is excellent for explanation. It is weak as the only place where a repo’s working state lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  How README-driven infrastructure works in practice
&lt;/h2&gt;

&lt;p&gt;README-driven infrastructure happens when operational truth lives mainly in README prose.&lt;/p&gt;

&lt;p&gt;The README might be the only place that explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which runtime version the repo needs&lt;/li&gt;
&lt;li&gt;which package manager to use&lt;/li&gt;
&lt;li&gt;how to install dependencies&lt;/li&gt;
&lt;li&gt;which services must be running&lt;/li&gt;
&lt;li&gt;what environment variables are required&lt;/li&gt;
&lt;li&gt;which command runs the real test suite&lt;/li&gt;
&lt;li&gt;which files or commands are unsafe for automation&lt;/li&gt;
&lt;li&gt;what to run after making a change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, this feels fine. A clear README is better than no README.&lt;/p&gt;

&lt;p&gt;But prose drifts.&lt;/p&gt;

&lt;p&gt;A team updates CI but forgets to update the README. The project switches from npm to pnpm. Tests start requiring Postgres or Redis. The real verification path moves into a workflow file. The README still shows the old happy path.&lt;/p&gt;

&lt;p&gt;Humans can sometimes work around this. They inspect CI, search issues, ask a teammate, or message the maintainer who knows the real setup.&lt;/p&gt;

&lt;p&gt;AI agents do not have that social fallback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They need the repo to explain itself.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this breaks faster with AI agents
&lt;/h2&gt;

&lt;p&gt;AI coding agents do more than read code. They choose commands, edit files, run tests, interpret failures, and decide whether a task is complete.&lt;/p&gt;

&lt;p&gt;That means README drift becomes more expensive. If the README says one thing and CI does another, the agent has to infer which one is correct. If setup depends on an undocumented service, the agent may treat an environment failure as a code bug.&lt;/p&gt;

&lt;p&gt;The model is not always the problem. Sometimes the repo is simply ambiguous.&lt;/p&gt;

&lt;p&gt;That is why &lt;a href="https://dev.to/faithada/repo-readiness-for-ai-agents-the-complete-guide-3acm"&gt;repo readiness for AI agents&lt;/a&gt; matters. The first post in this series covers the full framework. This post focuses on one specific failure mode: asking the README to carry too much operational truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where README-only setup usually fails
&lt;/h2&gt;

&lt;p&gt;README-only setup tends to break in a few predictable places.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Runtime and tool versions drift
&lt;/h3&gt;

&lt;p&gt;A README might say:&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="nb"&gt;install &lt;/span&gt;Python
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the repo may actually require Python 3.12, Poetry, Docker, and Postgres.&lt;/p&gt;

&lt;p&gt;For a human, this becomes setup friction. For an agent, it becomes a guessing problem. The agent may choose a reasonable default that does not match the repo’s real environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Commands become outdated
&lt;/h3&gt;

&lt;p&gt;Many repos start with simple commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the project grows.&lt;/p&gt;

&lt;p&gt;CI starts using a different package manager. Tests split into unit and integration paths. The app needs a build step before verification. Some checks only run in containers.&lt;/p&gt;

&lt;p&gt;The README may still show the old command.&lt;/p&gt;

&lt;p&gt;An agent can run the documented command, get a passing result, and still miss the check that would fail in CI. This is the kind of drift a repo-readiness contract in Ota is meant to expose earlier, before humans or agents treat an outdated README command as the real workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Service dependencies stay implicit
&lt;/h3&gt;

&lt;p&gt;Modern repos often depend on Postgres, Redis, queues, object storage, search, or local emulators.&lt;/p&gt;

&lt;p&gt;A README may mention these casually without explaining how to start them, which tasks require them, what ports they use, or how readiness is checked.&lt;/p&gt;

&lt;p&gt;That creates false diagnosis.&lt;/p&gt;

&lt;p&gt;If a backend test fails because Postgres is not running, an agent may treat the error as a code bug instead of an environment problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Safety boundaries are missing
&lt;/h3&gt;

&lt;p&gt;A README often tells people how to run a repo. It rarely tells automation what not to do.&lt;/p&gt;

&lt;p&gt;That matters because some commands are safe:&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="nb"&gt;test
&lt;/span&gt;lint
typecheck
build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And some commands need caution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deploy
publish
db:reset
terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same applies to files. Source and tests may be safe to edit. Migrations, generated files, lockfiles, production config, and environment files may need review.&lt;/p&gt;

&lt;p&gt;If these boundaries are not explicit, agents infer risk from filenames and context. That is not enough for reliable agentic development.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The README cannot validate itself
&lt;/h3&gt;

&lt;p&gt;This is the core weakness.&lt;/p&gt;

&lt;p&gt;A README can say &lt;code&gt;pnpm test&lt;/code&gt;, but it does not prove the command exists.&lt;/p&gt;

&lt;p&gt;It can say &lt;code&gt;copy .env.example&lt;/code&gt;, but it does not prove the required variables are complete.&lt;/p&gt;

&lt;p&gt;It can say “start Postgres before running tests,” but it does not prove Postgres is reachable.&lt;/p&gt;

&lt;p&gt;The README can explain the project. The repo still needs a stronger way to declare, check, and run its working state.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do instead
&lt;/h2&gt;

&lt;p&gt;You do not need to delete your README or rebuild your repo overnight.&lt;/p&gt;

&lt;p&gt;Start by separating explanation from operational truth.&lt;/p&gt;

&lt;p&gt;The README should become a map, not the entire operating manual.&lt;/p&gt;

&lt;p&gt;It should still explain what the project does, who it is for, how to begin, and where contributors should go next. Then it should point readers toward clearer operational sources instead of carrying every setup detail itself.&lt;/p&gt;

&lt;p&gt;Move operational guidance into more structured places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CONTRIBUTING.md&lt;/code&gt; for contributor workflow&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; for AI-agent guidance&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env.example&lt;/code&gt; for environment shape&lt;/li&gt;
&lt;li&gt;a task runner or Makefile for common commands&lt;/li&gt;
&lt;li&gt;CI workflows that match the documented verification path&lt;/li&gt;
&lt;li&gt;a contract file that declares setup, tasks, execution, and safety rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your README currently carries everything, the first step is to move the operational burden into a smaller, more structured section or file. A lightweight manual version might look like this:&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="gu"&gt;## Working with this repo&lt;/span&gt;

Runtime:
&lt;span class="p"&gt;-&lt;/span&gt; Python 3.12
&lt;span class="p"&gt;-&lt;/span&gt; Poetry
&lt;span class="p"&gt;-&lt;/span&gt; Postgres 16

Setup:
&lt;span class="p"&gt;1.&lt;/span&gt; Install dependencies: &lt;span class="sb"&gt;`poetry install`&lt;/span&gt;
&lt;span class="p"&gt;2.&lt;/span&gt; Copy &lt;span class="sb"&gt;`.env.example`&lt;/span&gt; to &lt;span class="sb"&gt;`.env`&lt;/span&gt;
&lt;span class="p"&gt;3.&lt;/span&gt; Start services: &lt;span class="sb"&gt;`docker compose up -d`&lt;/span&gt;

Verification:
&lt;span class="p"&gt;-&lt;/span&gt; Unit tests: &lt;span class="sb"&gt;`poetry run pytest tests/unit`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Full check: &lt;span class="sb"&gt;`poetry run pytest --cov`&lt;/span&gt;

Agent guidance:
&lt;span class="p"&gt;-&lt;/span&gt; Safe to run: tests, lint, typecheck
&lt;span class="p"&gt;-&lt;/span&gt; Do not run: deploy, publish, destructive database commands
&lt;span class="p"&gt;-&lt;/span&gt; Do not edit: &lt;span class="sb"&gt;`.env`&lt;/span&gt;, generated files, production config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is already better than forcing contributors or agents to guess.&lt;/p&gt;

&lt;p&gt;But it is still prose. It can still become stale.&lt;/p&gt;

&lt;p&gt;The next step is to make repo readiness executable, reviewable, and reusable by humans, CI, and AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Ota fits
&lt;/h2&gt;

&lt;p&gt;This is where &lt;a href="https://ota.run/" rel="noopener noreferrer"&gt;Ota&lt;/a&gt; becomes useful.&lt;/p&gt;

&lt;p&gt;Ota does not replace the README. It removes the pressure for the README to behave like an execution system.&lt;/p&gt;

&lt;p&gt;Ota is open repo-readiness infrastructure for humans and AI agents. Its docs describe repo readiness as the state of a repo being runnable and diagnosable, so the next safe step is obvious. It also treats &lt;code&gt;ota.yaml&lt;/code&gt; as the repo-level source of truth for readiness, setup, execution, and safe AI-agent guidance.&lt;/p&gt;

&lt;p&gt;Instead of asking humans, CI, and agents to reconstruct setup from scattered README prose, Ota lets the repo declare its working state in an explicit contract.&lt;/p&gt;

&lt;p&gt;That contract can describe what the repo needs, which tools are expected, which tasks exist, how setup should happen, what is safe for agents to run, and what should be verified after changes.&lt;/p&gt;

&lt;p&gt;The README can still explain the project.&lt;/p&gt;

&lt;p&gt;But the contract carries the operational truth.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ota doctor checks whether the repo is ready and points to the blocker&lt;/li&gt;
&lt;li&gt;ota validate checks whether the contract itself is valid&lt;/li&gt;
&lt;li&gt;ota tasks shows the work the repo has declared&lt;/li&gt;
&lt;li&gt;ota up prepares the repo from that contract&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI agents do not need more scattered hints. They need a reliable path.&lt;/p&gt;

&lt;h2&gt;
  
  
  The better model
&lt;/h2&gt;

&lt;p&gt;The future is not README versus tools.&lt;/p&gt;

&lt;p&gt;It is README plus explicit repo readiness.&lt;/p&gt;

&lt;p&gt;The README remains the human-friendly front door. It explains the project, purpose, architecture, and contribution path.&lt;/p&gt;

&lt;p&gt;Setup, execution, verification, environment requirements, and agent-safe boundaries should live in a form that can be reviewed, validated, and reused.&lt;/p&gt;

&lt;p&gt;That is the shift:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Old model:
Read the README and figure it out.

Better model:
Read the README for context. Trust the repo contract for how work runs.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reduces onboarding friction, narrows local versus CI drift, and helps agents avoid confident guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;READMEs are still important.&lt;/p&gt;

&lt;p&gt;The issue is not that READMEs are bad. The issue is that many teams ask them to carry too much operational weight.&lt;/p&gt;

&lt;p&gt;As AI agents become part of software workflows, repo ambiguity becomes harder to ignore. Agents need clear context: runtimes, services, tasks, safe commands, protected paths, and verification rules.&lt;/p&gt;

&lt;p&gt;The better question is no longer, “Does this repo have documentation?”&lt;/p&gt;

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

&lt;p&gt;Can this repo explain how it works clearly enough for a human, CI system, or AI agent to trust it?&lt;/p&gt;

&lt;p&gt;If the answer is no, the README is not the enemy.&lt;/p&gt;

&lt;p&gt;It is just carrying too much weight.&lt;/p&gt;




&lt;h2&gt;
  
  
  Continue reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Check out &lt;a href="https://dev.to/faithada/repo-readiness-for-ai-agents-the-complete-guide-3acm"&gt;Repo Readiness for AI Agents: The Complete Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Explore the &lt;a href="https://github.com/ota-run/ota" rel="noopener noreferrer"&gt;Ota GitHub guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check the &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;Ota examples repo&lt;/a&gt; for practical contract examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally Posted: &lt;a href="https://ota.run/blog/why-readme-driven-infrastructure-breaks-for-ai-agents-4b2o" rel="noopener noreferrer"&gt;https://ota.run/blog/why-readme-driven-infrastructure-breaks-for-ai-agents-4b2o&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>devops</category>
      <category>programming</category>
    </item>
    <item>
      <title>What Should Happen When a Repo Does Not Run?</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Fri, 22 May 2026 19:22:10 +0000</pubDate>
      <link>https://dev.to/otaready/what-should-happen-when-a-repo-does-not-run-31ai</link>
      <guid>https://dev.to/otaready/what-should-happen-when-a-repo-does-not-run-31ai</guid>
      <description>&lt;p&gt;&lt;strong&gt;Most repos still fail in a strangely manual way.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You run a command.&lt;br&gt;
It breaks.&lt;/p&gt;

&lt;p&gt;Now you have to reverse-engineer the repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read the error&lt;/li&gt;
&lt;li&gt;search the README&lt;/li&gt;
&lt;li&gt;inspectpackage.json, Docker files, and lockfiles&lt;/li&gt;
&lt;li&gt;compare local state with CI&lt;/li&gt;
&lt;li&gt;ask someone who already knows&lt;/li&gt;
&lt;li&gt;try a few fixes and hope one is the real one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is annoying for developers, but it is a bigger problem now that AI agents are being asked to work inside unfamiliar repositories.&lt;/p&gt;

&lt;p&gt;If an AI agent is told to fix a bug, it first needs a reliable answer to some basic operational questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does this repo require to run?&lt;/li&gt;
&lt;li&gt;Which workflow is the intended front door?&lt;/li&gt;
&lt;li&gt;Which missing dependency is actually blocking readiness?&lt;/li&gt;
&lt;li&gt;Which commands are safe to run?&lt;/li&gt;
&lt;li&gt;What should stop progress vs what is only a warning?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In most repos, those answers are spread across docs, scripts, CI config, and tribal knowledge. That means the agent is not operating from repo truth. It is guessing. That is the problem ota doctor is meant to solve.&lt;br&gt;
ota doctor evaluates a repo against its readiness contract, defined in ota.yaml, and reports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether the repo is ready&lt;/li&gt;
&lt;li&gt;what is missing&lt;/li&gt;
&lt;li&gt;what is blocking readiness&lt;/li&gt;
&lt;li&gt;what is only degraded or advisory&lt;/li&gt;
&lt;li&gt;the next safe action to take&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of “command failed, go investigate the repo,” you get a structured readiness diagnosis.&lt;/p&gt;

&lt;p&gt;For maintainers, that means fewer contributors rediscovering the same setup failures from scratch.&lt;/p&gt;

&lt;p&gt;For contributors, it means less time spent diffing docs against reality.&lt;/p&gt;

&lt;p&gt;For AI-assisted development, it gives the agent an operational signal before it starts making changes in a repo it does not yet understand.&lt;/p&gt;

&lt;p&gt;The broader question is simple:&lt;br&gt;
When a repo is not runnable, what should it say, and how explicitly should it say it?&lt;/p&gt;

&lt;p&gt;My view is that “good luck, read the repo” is no longer good enough.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62jxs6obfqghf18i5tgx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62jxs6obfqghf18i5tgx.png" alt="Ota doctor in practice" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you want to pressure-test that idea on a real codebase, try Ota and see what ota doctor surfaces:&lt;br&gt;
&lt;a href="https://github.com/ota-run/ota" rel="noopener noreferrer"&gt;https://github.com/ota-run/ota&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally Posted:&lt;a href="https://ota.run/blog/what-should-happen-when-a-repo-does-not-run-31ai" rel="noopener noreferrer"&gt;https://ota.run/blog/what-should-happen-when-a-repo-does-not-run-31ai&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>cli</category>
      <category>githubactions</category>
    </item>
  </channel>
</rss>
