<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ota</title>
    <description>The latest articles on DEV Community by Ota (@otaready).</description>
    <link>https://dev.to/otaready</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F13336%2F550b6b86-9e5e-4da6-a747-80a7dd35ead3.png</url>
      <title>DEV Community: Ota</title>
      <link>https://dev.to/otaready</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/otaready"/>
    <language>en</language>
    <item>
      <title>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>The Ota Skill for AI Agents</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Fri, 29 May 2026 18:34:38 +0000</pubDate>
      <link>https://dev.to/otaready/the-ota-skill-for-ai-agents-oil</link>
      <guid>https://dev.to/otaready/the-ota-skill-for-ai-agents-oil</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;We built the Ota skill because too much "AI repo automation" is still fake confidence.&lt;/p&gt;

&lt;p&gt;An agent clones a repo, finds a plausible command, edits the right file, and looks smart right up until it does something expensive and stupid. It runs the wrong test path. It installs tools globally because local setup was unclear. It patches around a missing service as if the repo were healthy.&lt;/p&gt;

&lt;p&gt;That failure is usually blamed on the model. Most of the time it is a repo problem. The repository never made its real operating path explicit enough for the agent to follow without guessing.&lt;/p&gt;

&lt;p&gt;Ota already gives the repo a machine-readable contract through &lt;code&gt;ota.yaml&lt;/code&gt;. The skill exists to teach agents how to behave around that contract: what to trust, what to run, and when to stop instead of improvising.&lt;/p&gt;

&lt;p&gt;It is not a replacement for &lt;code&gt;ota.yaml&lt;/code&gt;. It is not an MCP server. It is not a hidden automation layer.&lt;/p&gt;

&lt;p&gt;It is the missing operating guide for agents working in Ota repos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an Ota skill exists
&lt;/h2&gt;

&lt;p&gt;We kept seeing the same pattern: the agent was fast, but the repo was vague.&lt;/p&gt;

&lt;p&gt;Without a repo-specific operating guide, an agent may see several possible paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run the command from the README&lt;/li&gt;
&lt;li&gt;copy the command from CI&lt;/li&gt;
&lt;li&gt;infer setup from &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;pyproject.toml&lt;/code&gt;, or &lt;code&gt;go.mod&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;run a broad test command because it looks conventional&lt;/li&gt;
&lt;li&gt;install tools globally because a local command failed&lt;/li&gt;
&lt;li&gt;patch around a missing service instead of identifying the readiness gap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of those choices work. Some are dangerous. Some look fine locally and still miss the only verification path that matters.&lt;/p&gt;

&lt;p&gt;Our view is simple: if a repo has &lt;code&gt;ota.yaml&lt;/code&gt;, that file should beat README prose, shell folklore, and whatever command happens to look familiar. Declared tasks, writable paths, setup requirements, and validation commands should be treated as contract facts.&lt;/p&gt;

&lt;p&gt;The skill exists to make that behavior explicit across agents that support skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the skill teaches an agent
&lt;/h2&gt;

&lt;p&gt;The official skill lives in &lt;a href="https://github.com/ota-run/skills" rel="noopener noreferrer"&gt;&lt;code&gt;ota-run/skills&lt;/code&gt;&lt;/a&gt;. It is aimed at the work that actually shows up in live repos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authoring or refining an &lt;code&gt;ota.yaml&lt;/code&gt; contract&lt;/li&gt;
&lt;li&gt;reviewing an existing contract for drift or weak boundaries&lt;/li&gt;
&lt;li&gt;running &lt;code&gt;ota doctor&lt;/code&gt;, &lt;code&gt;ota validate&lt;/code&gt;, &lt;code&gt;ota tasks&lt;/code&gt;, and &lt;code&gt;ota run&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;deciding whether a problem belongs in the repo contract or in Ota itself&lt;/li&gt;
&lt;li&gt;preserving safe execution, writable path, and setup boundaries&lt;/li&gt;
&lt;li&gt;explaining repo readiness issues in terms humans can act on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What matters is not the length of the skill. What matters is the order it forces on the agent.&lt;/p&gt;

&lt;p&gt;In an Ota repo, the agent should start from the contract, not from vibes. It should prefer declared tasks over shell improvisation. It should use JSON output when automation needs stable facts. It should not invent fields, flows, or setup steps the repo never declared.&lt;/p&gt;

&lt;p&gt;That sounds obvious. It is also where a lot of agent work still goes off the rails.&lt;/p&gt;

&lt;h2&gt;
  
  
  The contract still comes first
&lt;/h2&gt;

&lt;p&gt;The skill does not rescue a sloppy repo.&lt;/p&gt;

&lt;p&gt;Readiness still belongs in the repo. The repo needs to state what it requires, how it becomes ready, what commands exist, and how those commands are verified. That is the job of &lt;code&gt;ota.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The skill tells the agent how to behave around that contract.&lt;/p&gt;

&lt;p&gt;For example, if a repo declares a &lt;code&gt;test&lt;/code&gt; task through Ota, the agent should use &lt;code&gt;ota run test&lt;/code&gt; instead of guessing at &lt;code&gt;npm test&lt;/code&gt;, &lt;code&gt;pytest&lt;/code&gt;, or &lt;code&gt;go test ./...&lt;/code&gt;. If the repo exposes &lt;code&gt;ota doctor&lt;/code&gt;, the agent should use it to understand readiness before mutating files. If the repo has writable path boundaries, the agent should treat those boundaries as real, not as suggestions.&lt;/p&gt;

&lt;p&gt;This matters because AI-assisted development usually fails at the edges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setup was incomplete&lt;/li&gt;
&lt;li&gt;a service was missing&lt;/li&gt;
&lt;li&gt;the agent ran the wrong verification command&lt;/li&gt;
&lt;li&gt;a generated file was edited directly&lt;/li&gt;
&lt;li&gt;a one-off shell command bypassed the repo's intended workflow&lt;/li&gt;
&lt;li&gt;a local success did not match CI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it does do is keep the agent anchored to the same contract humans and CI are supposed to trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing the skill
&lt;/h2&gt;

&lt;p&gt;Agents and environments can consume skills differently. The current supported install paths are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add ota-run/skills &lt;span class="nt"&gt;--full-depth&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota skills &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--agent&lt;/span&gt; codex
ota skills &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--agent&lt;/span&gt; claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;ota-run/skills&lt;/code&gt; repository is the source of truth for the skill distribution. &lt;code&gt;ota skills install&lt;/code&gt; gives Ota a first-party install path for supported agent environments, and the &lt;code&gt;skills&lt;/code&gt; CLI path supports workflows that consume skill repositories directly.&lt;/p&gt;

&lt;p&gt;The site also exposes discovery links for agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ota.run/.well-known/agent-skills/index.json" rel="noopener noreferrer"&gt;https://ota.run/.well-known/agent-skills/index.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ota-run/skills" rel="noopener noreferrer"&gt;https://github.com/ota-run/skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skills.sh/ota-run/skills" rel="noopener noreferrer"&gt;https://skills.sh/ota-run/skills&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those URLs are intentionally boring. Discovery should not be the hard part.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the skill is not
&lt;/h2&gt;

&lt;p&gt;The Ota skill is not a live MCP server. Ota publishes MCP discovery metadata today, but it does not currently run a live MCP protocol endpoint. That distinction matters. Discovery metadata can help agents understand the intended integration surface, but it is not the same as a callable server.&lt;/p&gt;

&lt;p&gt;The skill is also not a replacement for repo-specific instructions. A repository can still need an &lt;code&gt;AGENTS.md&lt;/code&gt;, contributor guide, security policy, or team review rules. The Ota skill covers Ota-specific behavior: how to understand and preserve repo readiness contracts.&lt;/p&gt;

&lt;p&gt;Finally, the skill is not a permission slip for broad mutation. If a repo does not declare a safe task, setup path, or writable area, the agent should not silently invent one.&lt;/p&gt;

&lt;h2&gt;
  
  
  A better default for agent work
&lt;/h2&gt;

&lt;p&gt;The best agent workflows are usually the least theatrical. They make fewer bad guesses.&lt;/p&gt;

&lt;p&gt;When an agent enters an Ota repo, the ideal sequence is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the Ota skill so it understands the operating model.&lt;/li&gt;
&lt;li&gt;Inspect &lt;code&gt;ota.yaml&lt;/code&gt; as the repo readiness source of truth.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;ota doctor&lt;/code&gt; or &lt;code&gt;ota validate&lt;/code&gt; to understand the current state.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;ota tasks&lt;/code&gt; to discover supported commands.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;ota run &amp;lt;task&amp;gt;&lt;/code&gt; for declared execution.&lt;/li&gt;
&lt;li&gt;Report readiness failures as contract or environment issues instead of guessing around them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That sequence feels slower only if you compare it to blind guessing in the first minute. After that, it is usually faster because it cuts false starts, side quests, and "works on my machine" fixes that were never real.&lt;/p&gt;

&lt;p&gt;That is the practical value. The agent gets the same operating model every time. It does not need to rediscover Ota in each repo, and it does not need to guess whether &lt;code&gt;ota.yaml&lt;/code&gt; is advisory or authoritative.&lt;/p&gt;

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

&lt;p&gt;Teams do not need more demos. They need agents that can enter a real repository and not immediately lower the trust level.&lt;/p&gt;

&lt;p&gt;That means respecting setup, CI, local services, generated files, ownership boundaries, and verification paths. It means being able to say, "this repo is not ready yet," instead of pretending a broken environment is a code problem. It means treating repo readiness as infrastructure, not as a suggestion buried in prose.&lt;/p&gt;

&lt;p&gt;The Ota skill is one piece of that system, but it is an important one. It gives the agent Ota-specific context before the first command runs. &lt;code&gt;ota.yaml&lt;/code&gt; gives the repo its contract. The CLI gives humans, CI, and agents the same command surface.&lt;/p&gt;

&lt;p&gt;That combination is the point.&lt;/p&gt;

&lt;p&gt;If a team wants agents to be useful in production repos, the answer is not more vibe-based automation. The answer is stricter contracts, narrower boundaries, and tools that teach the agent what those boundaries actually mean.&lt;/p&gt;

&lt;p&gt;That is why we built the Ota skill.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;Originally posted here: &lt;a href="https://ota.run/blog/the-ota-skill-for-ai-agents" rel="noopener noreferrer"&gt;https://ota.run/blog/the-ota-skill-for-ai-agents&lt;/a&gt; &lt;/p&gt;

</description>
      <category>agentsafety</category>
      <category>reporeadiness</category>
      <category>otaskills</category>
      <category>otarun</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>Stop Asking AI Agents to Guess How Your Repo Works</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/otaready/stop-asking-ai-agents-to-guess-how-your-repo-works-2olh</link>
      <guid>https://dev.to/otaready/stop-asking-ai-agents-to-guess-how-your-repo-works-2olh</guid>
      <description>&lt;p&gt;AI coding agents are getting better, but a lot of repos still make them start from guesswork.&lt;/p&gt;

&lt;p&gt;They land in a codebase and have to infer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which command installs dependencies&lt;/li&gt;
&lt;li&gt;which command starts the app&lt;/li&gt;
&lt;li&gt;which services need to be running&lt;/li&gt;
&lt;li&gt;which env vars matter&lt;/li&gt;
&lt;li&gt;which workflow is safe to run&lt;/li&gt;
&lt;li&gt;whether the repo is actually ready&lt;/li&gt;
&lt;li&gt;what “done” should look like after a change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a lot of operational knowledge to hide in scattered README sections, old shell scripts, CI files, tribal memory, and half-working local setup notes.&lt;/p&gt;

&lt;p&gt;And when an agent guesses wrong, the problem is not always the agent.&lt;/p&gt;

&lt;p&gt;Sometimes the repo never gave it a reliable answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Agents Amplify Repo Readiness
&lt;/h2&gt;

&lt;p&gt;A human contributor can pause, read docs, ask questions, remember past setup quirks, and work around drift.&lt;/p&gt;

&lt;p&gt;An AI agent usually does something else: it follows the strongest signal it can find.&lt;/p&gt;

&lt;p&gt;If your README says one thing, your CI says another, your package scripts say a third, and your local setup depends on an undocumented service, the agent has to choose. Sometimes it chooses well. Sometimes it burns time. Sometimes it changes the wrong thing because the repo never made the safe path explicit.&lt;/p&gt;

&lt;p&gt;That is why repo readiness matters.&lt;/p&gt;

&lt;p&gt;Before asking an AI agent to work in a repo, the repo should be able to answer basic questions clearly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does this repo need?&lt;/li&gt;
&lt;li&gt;How does it become ready?&lt;/li&gt;
&lt;li&gt;What tasks are safe to run?&lt;/li&gt;
&lt;li&gt;What checks prove the repo still works?&lt;/li&gt;
&lt;li&gt;What paths should an agent avoid?&lt;/li&gt;
&lt;li&gt;What workflow should be used for this kind of change?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those answers are not explicit, every agent has to rediscover them from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  README Instructions Are Not Enough
&lt;/h2&gt;

&lt;p&gt;READMEs are useful for humans, but they are not enough as the only source of operational truth.&lt;/p&gt;

&lt;p&gt;A README can explain intent, context, and contribution style. But repo readiness needs something more precise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;declared runtimes&lt;/li&gt;
&lt;li&gt;declared tools&lt;/li&gt;
&lt;li&gt;declared services&lt;/li&gt;
&lt;li&gt;declared tasks&lt;/li&gt;
&lt;li&gt;declared workflows&lt;/li&gt;
&lt;li&gt;declared checks&lt;/li&gt;
&lt;li&gt;declared agent boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That information should be machine-readable.&lt;/p&gt;

&lt;p&gt;Not because humans do not matter, but because humans, CI, and agents should not each maintain separate versions of the same setup logic.&lt;/p&gt;

&lt;p&gt;When setup knowledge only exists as prose, it drifts. When it drifts, automation becomes fragile. When automation becomes fragile, agents become less trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Repo Should Tell The Agent What Ready Means
&lt;/h2&gt;

&lt;p&gt;A good agent workflow should not begin with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Look around and figure out how this repo works.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It should begin with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Here is the repo contract. Diagnose readiness first. Use the declared workflow. Run the safe task. Respect protected paths.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the difference between guessing and operating.&lt;/p&gt;

&lt;p&gt;This is the layer I care about with Ota.&lt;/p&gt;

&lt;p&gt;Ota gives a repo one explicit readiness contract: &lt;code&gt;ota.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That contract can declare the repo’s tasks, checks, services, workflows, toolchains, env requirements, and agent-safe boundaries. Then humans, CI, and AI agents can all use the same source of truth.&lt;/p&gt;

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

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

&lt;/div&gt;



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

&lt;p&gt;The point is to stop making documentation carry operational truth alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Agents Need From A Repo
&lt;/h2&gt;

&lt;p&gt;An AI agent does not need magic. It needs clear boundaries.&lt;/p&gt;

&lt;p&gt;A solid repo should be able to say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&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;test&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;lint&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;typecheck&lt;/span&gt;
  &lt;span class="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&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;secrets/**&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;production/**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The agent boundary tells agents which task to start from, which tasks are safe, and which paths are protected. The instruction is simple: run &lt;code&gt;ota doctor&lt;/code&gt; first, then use declared safe tasks instead of guessing from repo scripts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It should also be able to say what ready means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;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;dev&lt;/span&gt;
    &lt;span class="na"&gt;readiness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-ready&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the agent is not guessing from random scripts.&lt;/p&gt;

&lt;p&gt;It has a contract.&lt;/p&gt;

&lt;p&gt;It knows the default workflow. It knows the safe tasks. It knows what not to touch. It knows which checks matter.&lt;/p&gt;

&lt;p&gt;That is a better starting point for any coding agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI Should Prove The Same Truth
&lt;/h2&gt;

&lt;p&gt;Repo readiness should not only help local agents. It should also show up in CI.&lt;/p&gt;

&lt;p&gt;If a repo has an explicit readiness contract, CI can prove that contract across environments:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ota-readiness&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;readiness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ota-run/setup@v1&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;ota doctor&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;ota validate .&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;ota up&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives maintainers something concrete.&lt;/p&gt;

&lt;p&gt;Not “the agent says it worked.”&lt;/p&gt;

&lt;p&gt;A repeatable readiness check.&lt;/p&gt;

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

&lt;p&gt;AI agents are moving from demos into real repos.&lt;/p&gt;

&lt;p&gt;That changes the bar.&lt;/p&gt;

&lt;p&gt;A repo that is “understandable if you already know it” is not enough. A repo that “usually works after reading three docs pages” is not enough. A repo that depends on one maintainer’s memory is not enough.&lt;/p&gt;

&lt;p&gt;If we want agents to make useful changes safely, repos need to become easier to reason about.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;fewer hidden setup steps&lt;/li&gt;
&lt;li&gt;fewer undocumented services&lt;/li&gt;
&lt;li&gt;fewer ambiguous commands&lt;/li&gt;
&lt;li&gt;fewer unsafe default paths&lt;/li&gt;
&lt;li&gt;more explicit readiness&lt;/li&gt;
&lt;li&gt;more machine-readable operational truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The better your repo contract, the better every agent run becomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started With Ota
&lt;/h2&gt;

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

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

&lt;/div&gt;



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

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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota doctor
ota init &lt;span class="nt"&gt;--bootstrap&lt;/span&gt;
ota validate &lt;span class="nb"&gt;.&lt;/span&gt;
ota workflows
ota tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Ota: &lt;a href="https://ota.run/docs/install" rel="noopener noreferrer"&gt;ota.run/docs/install&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ota docs: &lt;a href="https://ota.run/docs" rel="noopener noreferrer"&gt;ota.run/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ota source code: &lt;a href="https://github.com/ota-run/ota" rel="noopener noreferrer"&gt;github.com/ota-run/ota&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Example contracts: &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;github.com/ota-run/examples&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Action: &lt;a href="https://github.com/ota-run/action" rel="noopener noreferrer"&gt;github.com/ota-run/action&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub setup action: &lt;a href="https://github.com/ota-run/setup" rel="noopener noreferrer"&gt;github.com/ota-run/setup&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your repo already has setup scripts, CI workflows, and contributor docs, Ota does not replace them blindly.&lt;/p&gt;

&lt;p&gt;It helps turn the important parts into an explicit contract that humans, CI, and agents can all share.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;AI agents should not have to reverse-engineer your repo every time they enter it.&lt;/p&gt;

&lt;p&gt;Make the repo ready first.&lt;/p&gt;

&lt;p&gt;Then let the agent work.&lt;/p&gt;

&lt;p&gt;--&lt;br&gt;
Originally Posted here: &lt;a href="https://ota.run/blog/stop-asking-ai-agents-to-guess-how-your-repo-works-2olh" rel="noopener noreferrer"&gt;https://ota.run/blog/stop-asking-ai-agents-to-guess-how-your-repo-works-2olh&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>automation</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>Pressure-testing Ota on Supabase: from setup prose to executable repo readiness</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-supabase-from-setup-prose-to-executable-repo-readiness-1ion</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-supabase-from-setup-prose-to-executable-repo-readiness-1ion</guid>
      <description>&lt;p&gt;Supabase already has strong contributor documentation.&lt;/p&gt;

&lt;p&gt;That is not faint praise. The docs are good. But good docs and executable readiness are not the same thing.&lt;/p&gt;

&lt;p&gt;Before Ota, the &lt;code&gt;www/docs&lt;/code&gt; contributor path still depended on a familiar manual loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read the docs&lt;/li&gt;
&lt;li&gt;infer which workflow is the intended front door&lt;/li&gt;
&lt;li&gt;install the right runtime and package manager versions&lt;/li&gt;
&lt;li&gt;guess which commands are safe to run&lt;/li&gt;
&lt;li&gt;decide whether the repo is actually ready, or only partially set up&lt;/li&gt;
&lt;li&gt;if something fails on macOS, Windows, or Linux, figure out whether the problem is the repo, the machine, CI, or your shell&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a normal setup experience in modern repos. It is also exactly where drift starts.&lt;/p&gt;

&lt;p&gt;This post is about what changed when I added Ota to a scoped slice of the Supabase monorepo, how that improved the repo surface itself, and what the deeper pressure test exposed in Ota core.&lt;/p&gt;

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

&lt;p&gt;Most repos still answer “why does this not run?” badly.&lt;/p&gt;

&lt;p&gt;The failure mode usually looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local setup works differently from CI&lt;/li&gt;
&lt;li&gt;one workflow is implied, but not explicitly declared&lt;/li&gt;
&lt;li&gt;README setup and repo reality slowly diverge&lt;/li&gt;
&lt;li&gt;native and container paths are present, but not clearly separated&lt;/li&gt;
&lt;li&gt;readiness is inferred from “it seems to work” instead of declared checks&lt;/li&gt;
&lt;li&gt;contributors and agents have to reverse-engineer what the repo expects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is painful for humans. It is worse for agents.&lt;/p&gt;

&lt;p&gt;If an AI agent is dropped into an unfamiliar repo, the first problem is usually not the code change itself. The first problem is operational ambiguity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what this repo slice needs&lt;/li&gt;
&lt;li&gt;which workflow is the front door&lt;/li&gt;
&lt;li&gt;which tasks are safe&lt;/li&gt;
&lt;li&gt;what “ready” means&lt;/li&gt;
&lt;li&gt;what is actually blocking progress&lt;/li&gt;
&lt;li&gt;what the next safe action should be&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the repo cannot expose that clearly, the agent is forced to guess from README prose, scripts, lockfiles, CI output, and convention.&lt;/p&gt;

&lt;p&gt;That is what Ota is designed to remove.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Ota added to Supabase
&lt;/h2&gt;

&lt;p&gt;The upstream PR is intentionally scoped and intentionally lean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PR: &lt;a href="https://github.com/supabase/supabase/pull/46269" rel="noopener noreferrer"&gt;supabase/supabase#46269&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Contract: &lt;a href="https://github.com/bobaikato/supabase/blob/bobai/supabase-ota-readiness/ota.yaml" rel="noopener noreferrer"&gt;ota.yaml&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The PR adds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an &lt;code&gt;ota.yaml&lt;/code&gt; contract for the &lt;code&gt;www/docs&lt;/code&gt; slice&lt;/li&gt;
&lt;li&gt;a cross-OS contract matrix&lt;/li&gt;
&lt;li&gt;Ota local artifact ignores&lt;/li&gt;
&lt;li&gt;a small optional Ota section in &lt;code&gt;CONTRIBUTING.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives Supabase a machine-readable contract for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the runtime and toolchain it expects&lt;/li&gt;
&lt;li&gt;the workflows contributors should use&lt;/li&gt;
&lt;li&gt;the setup tasks that make those workflows runnable&lt;/li&gt;
&lt;li&gt;the readiness checks that prove the slice is actually up&lt;/li&gt;
&lt;li&gt;the tasks and topology surfaces tooling can inspect directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the shift from setup prose to executable repo readiness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before and after
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before Ota
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;www/docs&lt;/code&gt; path was documented, but it was not encoded as repo truth.&lt;/p&gt;

&lt;p&gt;That left both contributors and agents to reconstruct:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which commands matter&lt;/li&gt;
&lt;li&gt;which runtime/toolchain versions are expected&lt;/li&gt;
&lt;li&gt;whether native and container paths are meant to be equivalent&lt;/li&gt;
&lt;li&gt;what should count as “ready”&lt;/li&gt;
&lt;li&gt;how to distinguish a local issue from a repo contract issue&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  After Ota
&lt;/h3&gt;

&lt;p&gt;That same slice can now answer those questions directly.&lt;/p&gt;

&lt;p&gt;You can ask the repo:&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 &lt;span class="nb"&gt;.&lt;/span&gt;
ota doctor &lt;span class="nt"&gt;--workflow&lt;/span&gt; instant &lt;span class="nt"&gt;--native&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
ota up &lt;span class="nt"&gt;--workflow&lt;/span&gt; instant &lt;span class="nt"&gt;--native&lt;/span&gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
ota tasks &lt;span class="nt"&gt;--workflow&lt;/span&gt; app &lt;span class="nb"&gt;.&lt;/span&gt;
ota execution topology &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the repo can answer from declared contract truth, not inferred setup lore.&lt;/p&gt;

&lt;p&gt;For Supabase, that reduces four kinds of drift:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;README drift&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Setup prose can go stale. A contract is executable and testable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local vs CI drift&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The same declared workflow can be pressure-tested in matrix CI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Human vs agent drift&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Humans and agents can consume the same operational truth surface.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Platform drift&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Windows, macOS, and Linux differences get surfaced earlier instead of being rediscovered ad hoc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why the upstream PR stayed lean
&lt;/h2&gt;

&lt;p&gt;This part was deliberate.&lt;/p&gt;

&lt;p&gt;The public PR models the &lt;code&gt;www/docs&lt;/code&gt; slice. It does &lt;strong&gt;not&lt;/strong&gt; claim full Supabase readiness.&lt;/p&gt;

&lt;p&gt;That is not a limitation of ambition. It is a review strategy.&lt;/p&gt;

&lt;p&gt;A smaller honest contract is easier to review, easier to approve, and easier to trust than a broad fuzzy one. So the public change stays disciplined:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scoped slice&lt;/li&gt;
&lt;li&gt;clear workflow surface&lt;/li&gt;
&lt;li&gt;concrete CI pressure around that surface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that did not mean I only did the minimum.&lt;/p&gt;

&lt;p&gt;In parallel, I ran a deeper pressure test on a separate branch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bobaikato/supabase/tree/bobai/supabase-ota-pressure-full" rel="noopener noreferrer"&gt;Supabase pressure branch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;keep the upstream PR lean for higher approval odds&lt;/li&gt;
&lt;li&gt;do the heavier product hardening outside the PR&lt;/li&gt;
&lt;li&gt;fix real Ota gaps in Ota itself instead of hiding them in repo-local glue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the right way to use a serious repo as a product test surface.&lt;/p&gt;

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

&lt;p&gt;The first PR branch was only the start.&lt;/p&gt;

&lt;p&gt;The full pressure cycle expanded into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;native matrix coverage across Ubuntu, macOS, Windows PowerShell, and Windows Git Bash&lt;/li&gt;
&lt;li&gt;container matrix coverage across supported runner surfaces&lt;/li&gt;
&lt;li&gt;strict E2E parity checks&lt;/li&gt;
&lt;li&gt;bounded verification tasks&lt;/li&gt;
&lt;li&gt;a broader &lt;code&gt;studio&lt;/code&gt; slice on the pressure branch&lt;/li&gt;
&lt;li&gt;repeated reruns to separate repo noise from real Ota defects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Representative runs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lean PR branch matrix: &lt;a href="https://github.com/bobaikato/supabase/actions/runs/26281955993" rel="noopener noreferrer"&gt;run #26281955993&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Full pressure branch green run: &lt;a href="https://github.com/bobaikato/supabase/actions/runs/26300846166" rel="noopener noreferrer"&gt;run #26300846166&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where the value of Ota becomes clearer.&lt;/p&gt;

&lt;p&gt;The point was not just to prove that &lt;code&gt;ota.yaml&lt;/code&gt; could validate.&lt;/p&gt;

&lt;p&gt;The point was to prove that the readiness model, workflow targeting, and platform behavior held up under real pressure.&lt;/p&gt;

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

&lt;p&gt;At a high level, the contract models:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node + pnpm toolchain expectations&lt;/li&gt;
&lt;li&gt;native and container execution surfaces&lt;/li&gt;
&lt;li&gt;workflow-specific setup paths&lt;/li&gt;
&lt;li&gt;HTTP readiness for &lt;code&gt;www&lt;/code&gt; and &lt;code&gt;docs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;safe bounded tasks for validation and verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives the repo a surface that tools can inspect directly instead of inferring from scattered files.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota validate &lt;span class="nb"&gt;.&lt;/span&gt;
ota doctor &lt;span class="nt"&gt;--workflow&lt;/span&gt; instant &lt;span class="nt"&gt;--native&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
ota up &lt;span class="nt"&gt;--workflow&lt;/span&gt; instant &lt;span class="nt"&gt;--native&lt;/span&gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
ota tasks &lt;span class="nt"&gt;--workflow&lt;/span&gt; app &lt;span class="nb"&gt;.&lt;/span&gt;
ota execution topology &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those commands are not wrappers around documentation. They operate from declared repo truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually broke in Ota
&lt;/h2&gt;

&lt;p&gt;Supabase exposed a real Ota bug.&lt;/p&gt;

&lt;p&gt;The problem was selected workflow toolchain scoping.&lt;/p&gt;

&lt;p&gt;In practice, Ota could let unrelated toolchain-owned tools leak into a selected workflow surface just because they were declared elsewhere in the contract.&lt;/p&gt;

&lt;p&gt;That sounds small. It is not.&lt;/p&gt;

&lt;p&gt;If a selected workflow does not require something, Ota should not silently activate or diagnose against it just because the broader repo declares it somewhere else.&lt;/p&gt;

&lt;p&gt;If it does, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;noisy dry-runs&lt;/li&gt;
&lt;li&gt;misleading readiness signals&lt;/li&gt;
&lt;li&gt;false activation pressure&lt;/li&gt;
&lt;li&gt;lower trust in workflow targeting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That bug was not fixed in the Supabase contract.&lt;/p&gt;

&lt;p&gt;It was fixed in Ota core.&lt;/p&gt;

&lt;p&gt;That distinction matters. If the platform is wrong, the correct move is to fix the platform, not teach users to work around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did not count as an Ota bug
&lt;/h2&gt;

&lt;p&gt;The pressure test also surfaced failures that looked suspicious at first but were not Ota defects.&lt;/p&gt;

&lt;p&gt;The clearest example was the Docker-backed Studio path on hosted CI.&lt;/p&gt;

&lt;p&gt;That failure came from runner and stack-specific behavior in the Supabase Docker environment, including hosted &lt;code&gt;ulimit&lt;/code&gt; constraints. That is real repo/runtime behavior, but it is not an Ota orchestration bug.&lt;/p&gt;

&lt;p&gt;So the right response was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;do not misclassify repo or runner behavior as an Ota platform defect&lt;/li&gt;
&lt;li&gt;do not hide runtime limitations just to force more green boxes&lt;/li&gt;
&lt;li&gt;keep the matrix useful for signal, not vanity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trust is not built by making every box green. Trust is built by classifying failures correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What value this adds to Supabase
&lt;/h2&gt;

&lt;p&gt;The value here is not “Supabase now has another YAML file.”&lt;/p&gt;

&lt;p&gt;The value is that a real slice of the repo now has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an explicit operational contract&lt;/li&gt;
&lt;li&gt;declared workflow entry points&lt;/li&gt;
&lt;li&gt;repeatable readiness checks&lt;/li&gt;
&lt;li&gt;machine-readable task and topology surfaces&lt;/li&gt;
&lt;li&gt;cross-platform pressure testing around that declared truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Supabase maintainers, that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;less rediscovery of the same setup blockers&lt;/li&gt;
&lt;li&gt;earlier visibility into platform-specific drift&lt;/li&gt;
&lt;li&gt;a clearer operational model for contributors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For contributors, that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;less guessing&lt;/li&gt;
&lt;li&gt;less README archaeology&lt;/li&gt;
&lt;li&gt;less ambiguity around which path is actually supported&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For agents, that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fewer blind setup guesses&lt;/li&gt;
&lt;li&gt;a clearer answer to “what should I run?”&lt;/li&gt;
&lt;li&gt;a more reliable signal for “is this repo ready, or am I about to make changes in a broken environment?”&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Ota still adds value when a repo already has good docs
&lt;/h2&gt;

&lt;p&gt;A fair question is: if Supabase already has solid docs, what does Ota add?&lt;/p&gt;

&lt;p&gt;Docs and contracts do different jobs.&lt;/p&gt;

&lt;p&gt;Docs explain.&lt;br&gt;&lt;br&gt;
Contracts declare.&lt;/p&gt;

&lt;p&gt;Docs are excellent for onboarding context, caveats, workflow explanation, and human guidance. But docs do not usually answer machine-checkable questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is this workflow ready right now?&lt;/li&gt;
&lt;li&gt;which workflow is the front door?&lt;/li&gt;
&lt;li&gt;which setup path belongs to this slice?&lt;/li&gt;
&lt;li&gt;which checks prove readiness?&lt;/li&gt;
&lt;li&gt;which tasks are safe for agents?&lt;/li&gt;
&lt;li&gt;how does this differ across native and container execution?&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;It does not replace good docs. It gives the repo an executable readiness layer that docs alone cannot provide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters beyond Supabase
&lt;/h2&gt;

&lt;p&gt;The Supabase case study is really about a broader repo question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should happen when a repo does not run?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most repos still answer that question badly.&lt;/p&gt;

&lt;p&gt;They fail, and then they force the contributor to become the diagnosis layer.&lt;/p&gt;

&lt;p&gt;Ota changes that shape.&lt;/p&gt;

&lt;p&gt;A repo can declare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what it needs&lt;/li&gt;
&lt;li&gt;how it becomes runnable&lt;/li&gt;
&lt;li&gt;what ready means&lt;/li&gt;
&lt;li&gt;what is safe to run&lt;/li&gt;
&lt;li&gt;what should block progress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That turns readiness from tribal knowledge into contract truth.&lt;/p&gt;

&lt;p&gt;Supabase is a useful example because it is large enough to expose real pressure, but still scoped enough to model honestly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current state of the PR
&lt;/h2&gt;

&lt;p&gt;The upstream PR is intact:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/supabase/supabase/pull/46269" rel="noopener noreferrer"&gt;supabase/supabase#46269&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From our side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no unresolved actionable review threads&lt;/li&gt;
&lt;li&gt;contract and matrix changes are clean&lt;/li&gt;
&lt;li&gt;remaining red checks are upstream Vercel authorization and deploy noise, not Ota contract failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the Ota side of the work is sound.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on your repo
&lt;/h2&gt;

&lt;p&gt;If your repo already has setup docs, that is a good start.&lt;/p&gt;

&lt;p&gt;The harder question is whether the repo can expose, in a machine-readable and testable way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what it needs&lt;/li&gt;
&lt;li&gt;how it becomes runnable&lt;/li&gt;
&lt;li&gt;what ready means&lt;/li&gt;
&lt;li&gt;what is safe to run&lt;/li&gt;
&lt;li&gt;what should block progress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where Ota adds value.&lt;/p&gt;

&lt;p&gt;If you want to pressure-test that on a real codebase, start here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ota-run/ota" rel="noopener noreferrer"&gt;ota-run/ota&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you want to start from the Supabase example specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/supabase/supabase/pull/46269" rel="noopener noreferrer"&gt;Supabase PR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bobaikato/supabase/blob/bobai/supabase-ota-readiness/ota.yaml" rel="noopener noreferrer"&gt;Supabase &lt;code&gt;ota.yaml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bobaikato/supabase/tree/bobai/supabase-ota-pressure-full" rel="noopener noreferrer"&gt;Supabase pressure branch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: at the time of writing, the upstream Supabase PR is still open. I’ll update this post with the final outcome once maintainers finish review.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;The concrete artifacts from this work are here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/supabase/supabase/pull/46269" rel="noopener noreferrer"&gt;Supabase upstream PR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bobaikato/supabase/blob/bobai/supabase-ota-readiness/ota.yaml" rel="noopener noreferrer"&gt;Supabase &lt;code&gt;ota.yaml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bobaikato/supabase/blob/bobai/supabase-ota-readiness/.github/workflows/test-ota-contract-matrix.yml" rel="noopener noreferrer"&gt;Supabase contract matrix workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bobaikato/supabase/actions/runs/26281955993" rel="noopener noreferrer"&gt;Lean PR branch green run #26281955993&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bobaikato/supabase/actions/runs/26300846166" rel="noopener noreferrer"&gt;Full pressure branch green run #26300846166&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;Originally post on Ota Blog: &lt;a href="https://ota.run/blog/pressure-testing-ota-on-supabase-from-setup-prose-to-executable-repo-readiness-1ion" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-supabase-from-setup-prose-to-executable-repo-readiness-1ion&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ota</category>
      <category>supabase</category>
      <category>rust</category>
      <category>ci</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>
    <item>
      <title>Pressure Testing Ota on n8n: A Closed PR That Still Proved the Point</title>
      <dc:creator>Bobai Kato</dc:creator>
      <pubDate>Tue, 19 May 2026 13:54:52 +0000</pubDate>
      <link>https://dev.to/otaready/pressure-testing-ota-on-n8n-a-closed-pr-that-still-proved-the-point-1jf3</link>
      <guid>https://dev.to/otaready/pressure-testing-ota-on-n8n-a-closed-pr-that-still-proved-the-point-1jf3</guid>
      <description>&lt;p&gt;I ran a real pressure test on one of the most visible OSS automation repos: &lt;code&gt;n8n-io/n8n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PR:&lt;/strong&gt; &lt;a href="https://github.com/n8n-io/n8n/pull/30714" rel="noopener noreferrer"&gt;n8n-io/n8n#30714&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first glance, a closed PR looks like a loss. It wasn’t.&lt;/p&gt;

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

&lt;p&gt;n8n is a high-signal repo for readiness tooling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large monorepo
&lt;/li&gt;
&lt;li&gt;multiple contributor paths
&lt;/li&gt;
&lt;li&gt;cross-platform contributors
&lt;/li&gt;
&lt;li&gt;native + Docker runtime surfaces
&lt;/li&gt;
&lt;li&gt;mature existing docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If Ota only works on simple repos, it’s not infrastructure.&lt;br&gt;&lt;br&gt;
n8n is exactly the kind of repo that exposes whether Ota is real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before vs After (in the test branch)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After (Ota branch)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Readiness definition&lt;/td&gt;
&lt;td&gt;Documented across markdown instructions&lt;/td&gt;
&lt;td&gt;Explicit contract in &lt;code&gt;ota.yaml&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-OS proof&lt;/td&gt;
&lt;td&gt;Implicit, contributor-dependent&lt;/td&gt;
&lt;td&gt;Matrix proof in GitHub Actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflow entrypoints&lt;/td&gt;
&lt;td&gt;Manual command selection&lt;/td&gt;
&lt;td&gt;Named workflows (&lt;code&gt;app&lt;/code&gt;, &lt;code&gt;backend&lt;/code&gt;, &lt;code&gt;instant&lt;/code&gt;, &lt;code&gt;docker&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Machine-checkable status&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Deterministic &lt;code&gt;ota proof&lt;/code&gt; outcomes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent bootstrap metadata&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;agent.bootstrap.ota&lt;/code&gt; declared&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This was additive. It did not replace n8n’s canonical setup flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was added
&lt;/h2&gt;

&lt;p&gt;In my branch I introduced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota.yaml&lt;/code&gt; with workflow-specific readiness paths
&lt;/li&gt;
&lt;li&gt;a smoke matrix workflow for Linux/macOS/Windows + Docker proof
&lt;/li&gt;
&lt;li&gt;pinned Ota version in CI for deterministic behavior
&lt;/li&gt;
&lt;li&gt;optional contributor-facing Ota guidance
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Green proof run example:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/bobaikato/n8n/actions/runs/26092939099" rel="noopener noreferrer"&gt;Run 26092939099&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why maintainers closed it
&lt;/h2&gt;

&lt;p&gt;The maintainers closed the PR (&lt;a href="https://github.com/n8n-io/n8n/pull/30714" rel="noopener noreferrer"&gt;n8n-io/n8n#30714&lt;/a&gt;) for policy reasons, not technical failure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;they don’t currently need an extra readiness layer
&lt;/li&gt;
&lt;li&gt;they keep CI third-party dependencies narrow
&lt;/li&gt;
&lt;li&gt;they don’t want contributor docs to endorse an external tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s a valid maintainer call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual value
&lt;/h2&gt;

&lt;p&gt;Even without merge, this test delivered high-value evidence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ota can model and prove readiness on a complex repo.
&lt;/li&gt;
&lt;li&gt;Cross-platform behavior held under matrix pressure.
&lt;/li&gt;
&lt;li&gt;Adoption boundaries are now clearer: technical fit and governance fit are separate gates.
&lt;/li&gt;
&lt;li&gt;Ota got sharper through real-world constraints, not synthetic demos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So this is &lt;strong&gt;demonstrated value&lt;/strong&gt;, not &lt;strong&gt;adopted value&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final take
&lt;/h2&gt;

&lt;p&gt;A closed PR can still be a product win.&lt;/p&gt;

&lt;p&gt;This n8n test proved Ota’s technical posture under real load, clarified adoption constraints, and generated stronger evidence for the next integration target.&lt;/p&gt;

&lt;p&gt;That’s exactly what pressure testing is for.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get Started with Ota
&lt;/h2&gt;

&lt;p&gt;Ready to pressure-test your own repo? Start here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Ota: &lt;a href="https://ota.run/docs/install" rel="noopener noreferrer"&gt;ota.run/docs/install&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ota docs: &lt;a href="https://ota.run/docs" rel="noopener noreferrer"&gt;ota.run/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ota GitHub: &lt;a href="https://github.com/ota-run/ota" rel="noopener noreferrer"&gt;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;github.com/ota-run/examples&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  First commands (safe for any repo)
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Prove a workflow (replace with one from &lt;code&gt;ota workflows&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota proof &lt;span class="nt"&gt;--workflow&lt;/span&gt; &amp;lt;workflow-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  If your repo has no contract yet
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ota init &lt;span class="nt"&gt;--bootstrap&lt;/span&gt;
ota validate &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the examples repo as a base, then define workflow names that match your repo.&lt;/p&gt;

&lt;p&gt;--&lt;br&gt;
Originally posted here: &lt;a href="https://ota.run/blog/pressure-testing-ota-on-n8n-a-closed-pr-that-still-proved-the-point-1jf3" rel="noopener noreferrer"&gt;https://ota.run/blog/pressure-testing-ota-on-n8n-a-closed-pr-that-still-proved-the-point-1jf3&lt;/a&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>opensource</category>
      <category>testing</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Repo Readiness for AI Agents: The Complete Guide</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Mon, 18 May 2026 21:45:14 +0000</pubDate>
      <link>https://dev.to/otaready/repo-readiness-for-ai-agents-the-complete-guide-3acm</link>
      <guid>https://dev.to/otaready/repo-readiness-for-ai-agents-the-complete-guide-3acm</guid>
      <description>&lt;p&gt;Software repositories were already difficult to onboard into before AI agents entered the workflow.&lt;/p&gt;

&lt;p&gt;A new developer could clone a repo, read the README, install dependencies, run the setup command, and still hit a wall because the real working state of the repo lived somewhere else. Maybe it was in an old Slack thread. Maybe it was in a CI workflow nobody had reviewed in months. Maybe it was in the head of the one engineer who knew that the test database had to be started before the migration script.&lt;/p&gt;

&lt;p&gt;AI agents make this problem more visible.&lt;/p&gt;

&lt;p&gt;An agent can read files quickly. It can inspect package manifests, suggest commands, edit code, run tests, and explain errors. But it still depends on the repo telling the truth. When setup steps, safe commands, task order, and verification paths are unclear, the agent is not truly autonomous; it is guessing.&lt;/p&gt;

&lt;p&gt;That is where repo readiness comes in.&lt;/p&gt;

&lt;p&gt;Repo readiness is the practice of making a repository understandable, runnable, verifiable, and safe for humans, CI systems, and AI agents. It is not just about having a better README. It is about turning the operational truth of a repo into something explicit enough that the next person or automation layer can take the right step without depending on tribal knowledge.&lt;/p&gt;

&lt;p&gt;This guide gives you a practical framework for turning a repo from “works if someone knows the setup” into something humans, CI, and AI agents can trust. It explains what repo readiness means, why it matters for AI agents, and how to improve your repository whether or not you adopt a dedicated tool like &lt;a href="https://ota.run/" rel="noopener noreferrer"&gt;Ota&lt;/a&gt; immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes a Repo Ready?
&lt;/h2&gt;

&lt;p&gt;A repo is ready when it can answer the basic questions someone needs before working with it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What runtime, package manager, and tool versions does this project require?&lt;/li&gt;
&lt;li&gt;How should dependencies be installed?&lt;/li&gt;
&lt;li&gt;What services or environment variables are needed?&lt;/li&gt;
&lt;li&gt;Which commands build, test, lint, start, or validate the project?&lt;/li&gt;
&lt;li&gt;What is safe for an AI agent to run or edit?&lt;/li&gt;
&lt;li&gt;How do we know the repo is actually working after a change?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When these answers are missing, scattered, outdated, or written only for humans, the repo becomes fragile. A human may eventually figure things out through trial and error. An AI agent may not have that same path, especially when it is operating inside a sandbox, CI job, or remote environment.&lt;/p&gt;

&lt;p&gt;For example, in an unready Python API repo, the README may say &lt;code&gt;pytest&lt;/code&gt;, CI may run a longer test command with coverage and integration settings, and some tests may silently require Postgres to be running. In a ready repo, the required package manager, service dependency, setup order, and verification task are declared clearly enough that a human or agent can follow the same path.&lt;/p&gt;

&lt;p&gt;For AI agents, repo readiness is the difference between useful automation and confident guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI agents expose unclear repos
&lt;/h2&gt;

&lt;p&gt;AI coding agents are often discussed as if the hard part is only the intelligence of the model. In practice, many failures happen before the model reaches the interesting work.&lt;/p&gt;

&lt;p&gt;The agent is not always the problem. Often, the repo does not contain enough reliable operational context.&lt;/p&gt;

&lt;p&gt;An agent may choose a reasonable-looking command that is not the repo’s real verification path. It may run unit tests but miss the integration test that catches the actual failure. It may treat an outdated README instruction as authoritative even though CI has moved on. It may try to fix an error as if it were a code problem when the real issue is a missing service, environment variable, or setup step. It may make a correct code change but leave the repo in an unverified state because the repo never made the expected post-change checks explicit.&lt;/p&gt;

&lt;p&gt;A human developer can ask a teammate, “How do we run this locally?” An agent needs that answer to exist in the repository.&lt;/p&gt;

&lt;p&gt;In a Go service, a human can notice that &lt;code&gt;go test ./...&lt;/code&gt; is not the full verification path because CI also runs race checks, generated-code checks, or containerized integration tests. An agent may still make the wrong call if the repo does not define a clear source of truth.&lt;/p&gt;

&lt;p&gt;A human may know not to touch migration files, generated files, or deployment scripts without review. An agent needs explicit boundaries.&lt;/p&gt;

&lt;p&gt;AI agents are powerful, but they are only as safe as the context they are given.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why README-only setup breaks down
&lt;/h2&gt;

&lt;p&gt;Most teams still rely on the README as the main onboarding surface. That makes sense. A good README is helpful. It explains the project, gives contributors a starting point, and tells humans what to expect.&lt;/p&gt;

&lt;p&gt;But README-driven infrastructure is fragile.&lt;/p&gt;

&lt;p&gt;A README is prose. It can describe setup, but it does not necessarily enforce it. It can mention commands, but it may not prove those commands are still valid. It can explain the happy path, but it often misses the edge cases that decide whether the repo is truly runnable.&lt;/p&gt;

&lt;p&gt;Over time, the real working state of a repo spreads across several places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;README files&lt;/li&gt;
&lt;li&gt;package manifests&lt;/li&gt;
&lt;li&gt;runtime version files&lt;/li&gt;
&lt;li&gt;shell scripts&lt;/li&gt;
&lt;li&gt;Makefiles&lt;/li&gt;
&lt;li&gt;Dockerfiles&lt;/li&gt;
&lt;li&gt;CI workflow files&lt;/li&gt;
&lt;li&gt;environment templates&lt;/li&gt;
&lt;li&gt;issue comments&lt;/li&gt;
&lt;li&gt;internal docs&lt;/li&gt;
&lt;li&gt;maintainer memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That creates a gap between what the repo says and how the repo actually works.&lt;/p&gt;

&lt;p&gt;For humans, that gap causes slow onboarding. For CI, it causes drift. For AI agents, it creates unsafe assumptions.&lt;/p&gt;

&lt;p&gt;The goal is not to delete the README. The goal is to stop treating README prose as the only source of operational truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6 pillars of an AI-ready repo
&lt;/h2&gt;

&lt;p&gt;An AI-ready repo is not simply a repo with an &lt;code&gt;AGENTS.md&lt;/code&gt; file or a note that says “AI agents can work here.”&lt;/p&gt;

&lt;p&gt;A repo is ready for AI agents when the important decisions are explicit, reviewable, and machine-readable where possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Runtime and dependency clarity
&lt;/h3&gt;

&lt;p&gt;The repo should state the exact runtimes and tools needed to work with it.&lt;/p&gt;

&lt;p&gt;That includes the language runtime, package manager, required CLIs, database requirements, container engine requirements, and operating system assumptions.&lt;/p&gt;

&lt;p&gt;For a Python project, a vague instruction like “install Python” is not enough. The repo should make it clear whether it expects Python 3.11 or 3.12, pip or Poetry, Docker or a native setup.&lt;/p&gt;

&lt;p&gt;Without this clarity, an agent may choose a default that looks reasonable but does not match the repo’s real environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Deterministic setup
&lt;/h3&gt;

&lt;p&gt;A ready repo should have one clear path from fresh clone to usable state.&lt;/p&gt;

&lt;p&gt;That path should answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What command installs dependencies?&lt;/li&gt;
&lt;li&gt;What command prepares local services?&lt;/li&gt;
&lt;li&gt;Are migrations required?&lt;/li&gt;
&lt;li&gt;Are generated files required before build or test?&lt;/li&gt;
&lt;li&gt;Can setup be previewed before it changes the machine?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setup should not depend on someone remembering the right order manually. If the repo needs dependencies installed before services start, or services running before tests pass, that sequence should be visible.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Declared tasks and verification
&lt;/h3&gt;

&lt;p&gt;AI agents need to know which tasks exist and what each task means.&lt;/p&gt;

&lt;p&gt;Common tasks include setup, build, test, lint, format, typecheck, start, migrate, seed, verify, and CI. The goal is for an agent to know that &lt;code&gt;test&lt;/code&gt; means unit tests, &lt;code&gt;ci&lt;/code&gt; means the full verification path, and &lt;code&gt;setup&lt;/code&gt; must run before either of them when that dependency exists.&lt;/p&gt;

&lt;p&gt;The repo should also clarify task relationships. If tests require a build step, say so. If lint can run independently, say so. If &lt;code&gt;ci&lt;/code&gt; is the safest full verification path, make it obvious.&lt;/p&gt;

&lt;p&gt;Verification is just as important as execution. A useful agent should not stop at editing code. It should know what “done” means after a change.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;after frontend changes, run lint, typecheck, and tests&lt;/li&gt;
&lt;li&gt;after backend changes, run unit and integration tests&lt;/li&gt;
&lt;li&gt;after dependency changes, install, build, and test&lt;/li&gt;
&lt;li&gt;after documentation changes, run docs validation if available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The clearer this is, the less likely an agent is to leave the repo in an unknown state.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Agent-safe boundaries
&lt;/h3&gt;

&lt;p&gt;Not every task is safe for an AI agent to run.&lt;/p&gt;

&lt;p&gt;Some commands delete local data, reset databases, publish packages, deploy code, rotate secrets, rewrite generated files, or modify infrastructure. For a human maintainer, the risk may be obvious from context. For an AI agent, it should be explicit.&lt;/p&gt;

&lt;p&gt;Agent-safe tasks are tasks the repo has marked as acceptable for automated use. These are usually low-risk commands like build, test, lint, typecheck, and sometimes setup.&lt;/p&gt;

&lt;p&gt;The same applies to files. A repo should make it clear where agents can safely edit and where caution is required.&lt;/p&gt;

&lt;p&gt;For example, source files and tests may be editable. Generated files, vendor directories, lockfiles, migrations, and deployment scripts may need stricter review depending on the project.&lt;/p&gt;

&lt;p&gt;The point is not to make agents timid. The point is to make safe work obvious and risky work intentional.&lt;/p&gt;

&lt;p&gt;A simple rule: if you would not want a junior developer running a command or editing a path without asking, do not leave an AI agent to discover that boundary by accident.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Environment and service dependencies
&lt;/h3&gt;

&lt;p&gt;Many repos fail because the environment is unclear.&lt;/p&gt;

&lt;p&gt;A ready repo should explain which environment variables are required, which are optional, where example values live, and which values must never be committed. It should also be clear whether &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.env.local&lt;/code&gt;, or another file is expected.&lt;/p&gt;

&lt;p&gt;AI agents should not be asked to guess secrets, invent credentials, or modify private environment files without instructions.&lt;/p&gt;

&lt;p&gt;The same applies to services. Modern repos often depend on Postgres, Redis, queues, object storage, search services, or local emulators. If these services are required, the repo should explain how they are started, what ports they use, and how readiness is checked.&lt;/p&gt;

&lt;p&gt;When services are implicit, agents may try to fix application code when the real problem is a missing database, stopped container, or unavailable local dependency.&lt;/p&gt;

&lt;p&gt;That is one of the most expensive forms of agent failure: fixing the wrong layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Local, CI, and automation alignment
&lt;/h3&gt;

&lt;p&gt;A repo is not truly ready if it works locally but fails in CI, or works in CI but cannot be reproduced locally.&lt;/p&gt;

&lt;p&gt;AI agents make this more important because they may operate in different environments: a local machine, cloud sandbox, container, CI runner, or remote workspace.&lt;/p&gt;

&lt;p&gt;The repo should make its execution model clear.&lt;/p&gt;

&lt;p&gt;If the preferred mode is native, say so. If the repo expects container execution, define the image and engine. If remote execution is required, make the target assumptions explicit.&lt;/p&gt;

&lt;p&gt;The same repo truth should guide local development, CI validation, and agent execution. Otherwise, every environment starts creating its own version of how the repo works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick repo readiness checklist for AI agents
&lt;/h2&gt;

&lt;p&gt;Use this checklist to evaluate your repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required runtime versions are documented.&lt;/li&gt;
&lt;li&gt;The package manager is explicit.&lt;/li&gt;
&lt;li&gt;Setup works from a fresh clone.&lt;/li&gt;
&lt;li&gt;Required environment variables are listed.&lt;/li&gt;
&lt;li&gt;Local service dependencies are documented.&lt;/li&gt;
&lt;li&gt;Build, test, lint, and format commands are easy to find.&lt;/li&gt;
&lt;li&gt;The recommended full verification command is clear.&lt;/li&gt;
&lt;li&gt;Task order is explicit where order matters.&lt;/li&gt;
&lt;li&gt;Dangerous commands are marked or separated.&lt;/li&gt;
&lt;li&gt;Agent-safe tasks are identified.&lt;/li&gt;
&lt;li&gt;Editable and protected paths are documented.&lt;/li&gt;
&lt;li&gt;CI uses the same task truth as local development.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your repo fails several of these checks, it may still be usable by experienced maintainers. But it is probably not ready for reliable agentic work.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to improve repo readiness without a new tool
&lt;/h2&gt;

&lt;p&gt;You can start improving repo readiness manually.&lt;/p&gt;

&lt;p&gt;Create a simple &lt;code&gt;CONTRIBUTING.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt;, or internal setup guide that captures the repo’s operational truth. Treat it as a minimal starting template, not a permanent substitute for tested automation.&lt;/p&gt;

&lt;p&gt;For example, a Node.js project might document:&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;## Runtime requirements&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Node: 22.x
&lt;span class="p"&gt;-&lt;/span&gt; Package manager: pnpm 10.x
&lt;span class="p"&gt;-&lt;/span&gt; Database: Postgres 16

&lt;span class="gu"&gt;## Setup&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Install dependencies: &lt;span class="sb"&gt;`pnpm 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.local`&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;
&lt;span class="p"&gt;4.&lt;/span&gt; Run migrations: &lt;span class="sb"&gt;`pnpm db:migrate`&lt;/span&gt;

&lt;span class="gu"&gt;## Common tasks&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Build: &lt;span class="sb"&gt;`pnpm build`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Test: &lt;span class="sb"&gt;`pnpm test`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Full verification: &lt;span class="sb"&gt;`pnpm ci`&lt;/span&gt;

&lt;span class="gu"&gt;## Agent guidance&lt;/span&gt;

Agents may run lint, typecheck, test, and build.
Agents should not run deploy, publish, or destructive database reset commands.
After changing code, run the smallest relevant verification task. Before final handoff, run &lt;span class="sb"&gt;`pnpm ci`&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a good start because it gives humans and agents a clearer operating surface.&lt;/p&gt;

&lt;p&gt;But as the repo grows, prose can become stale again. That is why teams eventually benefit from making readiness executable and machine-readable.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/ota-run/ota" rel="noopener noreferrer"&gt;Ota&lt;/a&gt; is built around a simple belief: the repo should declare its own working state.&lt;/p&gt;

&lt;p&gt;Instead of asking every developer, CI job, and AI agent to reconstruct setup from scattered clues, Ota gives the repo an explicit &lt;a href="https://ota.run/docs/reference/contract" rel="noopener noreferrer"&gt;&lt;code&gt;ota.yaml&lt;/code&gt;&lt;/a&gt; contract.&lt;/p&gt;

&lt;p&gt;That contract can describe the project shape, runtime requirements, tools, setup tasks, build and test tasks, execution mode, service expectations, and agent boundaries.&lt;/p&gt;

&lt;p&gt;The value is not that YAML is magical. The value is that the repo has one inspectable place where readiness decisions live.&lt;/p&gt;

&lt;p&gt;Ota also gives teams a practical command flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ota doctor&lt;/code&gt; checks the repo’s current state and points to what is missing or blocked.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota validate&lt;/code&gt; checks that the readiness contract itself is valid before humans, CI, or agents depend on it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota up&lt;/code&gt; prepares the repo from the contract instead of relying on someone to remember setup steps.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ota run &amp;lt;task&amp;gt;&lt;/code&gt; executes declared work through that same contract, so build, test, lint, or other tasks run through the repo’s defined workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simplified Node.js contract shape might look 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="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;example-app&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;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&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;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 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;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;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;ota.yaml&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.evn.local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This basic Ota example gives the repository a stronger operational starting point. It makes the expected runtime, setup flow, common workflows, and safety constraints easier for humans and agents to understand, validate, and execute reliably.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For copy-ready contracts, use the &lt;a href="https://github.com/ota-run/examples" rel="noopener noreferrer"&gt;examples repo&lt;/a&gt; rather than treating this snippet as a complete production config.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With a contract like this, the repo can answer practical questions before work starts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the repo ready?&lt;/li&gt;
&lt;li&gt;What is the first blocker?&lt;/li&gt;
&lt;li&gt;Is the contract valid?&lt;/li&gt;
&lt;li&gt;What setup should happen before tasks run?&lt;/li&gt;
&lt;li&gt;Which task should be executed?&lt;/li&gt;
&lt;li&gt;What can an agent safely do?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially useful when a repo is used by more than one person, one environment, or one automation layer.&lt;/p&gt;

&lt;p&gt;You do not need to adopt Ota to understand the principle. But Ota is one way to turn that principle into an operational workflow.&lt;/p&gt;

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

&lt;p&gt;AI agents do not remove the need for clear repository structure. They increase it.&lt;/p&gt;

&lt;p&gt;When a repo’s setup, tasks, environment, and safety boundaries are scattered across prose and memory, agents are forced to guess. Sometimes they guess correctly. Sometimes they waste time. Sometimes they make unsafe changes.&lt;/p&gt;

&lt;p&gt;Repo readiness solves this by making the working state of the repository explicit.&lt;/p&gt;

&lt;p&gt;You can start manually by improving your README, task definitions, environment docs, and agent guidance. As your repo grows, you can move toward a contract-first approach with tools like Ota, where diagnosis, setup, execution, and agent-safe automation live in one source of truth.&lt;/p&gt;

&lt;p&gt;The future of AI-assisted development will not belong only to teams with the best prompts.&lt;/p&gt;

&lt;p&gt;It will belong to teams whose repos are clear enough for humans, CI, and agents to trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get Started with Ota
&lt;/h2&gt;

&lt;p&gt;Give your repositories one explicit operational contract for setup, readiness, and execution — so you can run projects with less guesswork and more confidence.&lt;/p&gt;

&lt;p&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;br&gt;
Ota docs: &lt;a href="https://www.ota.run/docs" rel="noopener noreferrer"&gt;https://www.ota.run/docs&lt;/a&gt;&lt;br&gt;
Ota GitHub: &lt;a href="https://www.github.com/ota-run/ota" rel="noopener noreferrer"&gt;https://www.github.com/ota-run/ota&lt;/a&gt;&lt;br&gt;
Contract examples: &lt;a href="https://www.github.com/ota-run/examples" rel="noopener noreferrer"&gt;https://www.github.com/ota-run/examples&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally Posted: &lt;a href="https://ota.run/blog/repo-readiness-for-ai-agents-the-complete-guide-3acm" rel="noopener noreferrer"&gt;https://ota.run/blog/repo-readiness-for-ai-agents-the-complete-guide-3acm&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>github</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why Working Repos Still Fail New Contributors</title>
      <dc:creator>Adamma</dc:creator>
      <pubDate>Sat, 16 May 2026 19:37:28 +0000</pubDate>
      <link>https://dev.to/otaready/why-working-repos-still-fail-new-contributors-3hlg</link>
      <guid>https://dev.to/otaready/why-working-repos-still-fail-new-contributors-3hlg</guid>
      <description>&lt;p&gt;Maintaining a software project is not only about keeping the code working.&lt;/p&gt;

&lt;p&gt;It is also about keeping the path to a working repo understandable for everyone else. New contributors need to know what to install, which commands matter, what environment is expected, what services need to be running, and what "ready" actually means in practice.&lt;/p&gt;

&lt;p&gt;That is the part that often breaks down first.&lt;/p&gt;

&lt;p&gt;A repository can work perfectly for the maintainer and still be frustrating for everyone else. The setup path may be spread across the README, package scripts, CI config, environment files, old pull requests, issue comments, and things the core team simply remembers. The repo has a working state, but that state is not fully captured anywhere.&lt;/p&gt;

&lt;p&gt;When that happens, maintainers become the fallback documentation system.&lt;/p&gt;

&lt;h2&gt;
  
  
  A working repo is not the same as a repeatable repo
&lt;/h2&gt;

&lt;p&gt;A contributor clones the project, follows the README, installs dependencies, fixes a couple of local issues, and eventually gets the app running.&lt;/p&gt;

&lt;p&gt;That looks like success, but it often is not durable success.&lt;/p&gt;

&lt;p&gt;If the working path only exists in someone's terminal history, chat thread, or memory, the repo has not really preserved it. The next person may have to rediscover the same missing step, the same environment tweak, or the same "run this first" command all over again.&lt;/p&gt;

&lt;p&gt;Over time, that creates familiar problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;new contributors ask the same setup questions&lt;/li&gt;
&lt;li&gt;local environments drift from CI&lt;/li&gt;
&lt;li&gt;automation breaks because assumptions are still implicit&lt;/li&gt;
&lt;li&gt;maintainers spend time explaining the repo instead of improving it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this usually comes from bad intent. Most projects grow into it gradually. A setup step gets added here, a new requirement appears there, CI evolves separately from local development, and the operational path becomes harder to see as one whole.&lt;/p&gt;

&lt;h2&gt;
  
  
  The maintainer burden is operational, not just technical
&lt;/h2&gt;

&lt;p&gt;A lot of repo pain is not about bad code. It is about hidden operational context.&lt;/p&gt;

&lt;p&gt;Maintainers usually know which runtime version matters, which service is expected to be running, which command is the real entrypoint, and which documented step is now stale. That context makes the repo feel manageable to the people closest to it, but much harder to trust for everyone else.&lt;/p&gt;

&lt;p&gt;This is where "it works on my machine" becomes expensive.&lt;/p&gt;

&lt;p&gt;The cost is not only failed setup. It is repeated onboarding support, uncertainty about whether local and CI are validating the same thing, and a repo that depends too heavily on the people who already understand it.&lt;/p&gt;

&lt;p&gt;That is the problem Ota is meant to reduce.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Ota changes
&lt;/h2&gt;

&lt;p&gt;Ota gives the repo a readiness contract.&lt;/p&gt;

&lt;p&gt;That contract lives in &lt;code&gt;ota.yaml&lt;/code&gt; and describes the operational path more explicitly: what the repo needs, how it becomes ready, what tasks exist, what checks matter, and what assumptions should stop living only in scattered setup knowledge.&lt;/p&gt;

&lt;p&gt;The value is not the YAML by itself. The value is that repo readiness becomes part of the repository surface instead of staying distributed across docs, scripts, CI config, and maintainer memory.&lt;/p&gt;

&lt;p&gt;That changes the conversation.&lt;/p&gt;

&lt;p&gt;If a pull request changes what the repo needs in order to run, that change can be reviewed as part of the contract. If a setup step matters, it can be made explicit. If a task has different requirements than the rest of the repo, that can be modelled instead of left implied.&lt;/p&gt;

&lt;p&gt;Readiness becomes something the project can define, inspect, and verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Less repeated onboarding support
&lt;/h2&gt;

&lt;p&gt;Every active project eventually gets the same questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which runtime version should I use?&lt;/li&gt;
&lt;li&gt;Do I need Docker for this?&lt;/li&gt;
&lt;li&gt;Which command should I run first?&lt;/li&gt;
&lt;li&gt;Is this service supposed to be running?&lt;/li&gt;
&lt;li&gt;Why does this pass in CI but fail locally?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good documentation helps, but documentation alone is often not enough. It can become stale, incomplete, or disconnected from the actual execution path.&lt;/p&gt;

&lt;p&gt;Ota adds an executable layer to that picture.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ota doctor&lt;/code&gt; is designed to explain why a repo is or is not ready and what to do next. &lt;code&gt;ota up&lt;/code&gt; prepares the declared path. &lt;code&gt;ota run&lt;/code&gt; executes known tasks through the same contract.&lt;/p&gt;

&lt;p&gt;For maintainers, that means the repo can answer more of its own setup questions before a human has to step in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better alignment between local work, CI, and automation
&lt;/h2&gt;

&lt;p&gt;One of the most common frustrations in a mature repo is that different parts of the system are validating different realities.&lt;/p&gt;

&lt;p&gt;CI may be green while local setup is painful. A script may work for maintainers but not for contributors. Automation may assume something that was never made explicit in the repo itself.&lt;/p&gt;

&lt;p&gt;Ota helps close that gap by giving those environments a shared readiness contract.&lt;/p&gt;

&lt;p&gt;That creates a cleaner loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the contract defines readiness&lt;/li&gt;
&lt;li&gt;developers use it locally&lt;/li&gt;
&lt;li&gt;CI validates it&lt;/li&gt;
&lt;li&gt;automation consumes structured output&lt;/li&gt;
&lt;li&gt;maintainers review operational changes explicitly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a stronger model than hoping the README, scripts, and CI config continue to tell the same story as the project evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  A clearer signal for tools and agents
&lt;/h2&gt;

&lt;p&gt;Repositories are no longer read only by humans.&lt;/p&gt;

&lt;p&gt;CI systems, automation tooling, remote execution systems, and AI coding agents also need to understand whether a repo is runnable, what it requires, and what failed when things go wrong.&lt;/p&gt;

&lt;p&gt;Most repos do not expose that clearly. Tools have to infer it from documentation, logs, scripts, and failed commands.&lt;/p&gt;

&lt;p&gt;Ota gives them a more reliable surface through the contract, structured output, receipts, and consistent command behavior.&lt;/p&gt;

&lt;p&gt;For maintainers, that matters because the repo becomes less dependent on guesswork. A tool does not have to reverse-engineer as much. An agent does not have to rediscover as much. And the operational path becomes easier to trust because it is more explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real maintainer benefit
&lt;/h2&gt;

&lt;p&gt;Ota does not replace documentation. It does not replace good repo hygiene either.&lt;/p&gt;

&lt;p&gt;What it does is help preserve the first successful working path so it can be repeated, verified, and reviewed.&lt;/p&gt;

&lt;p&gt;For maintainers, that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;less repeated onboarding support&lt;/li&gt;
&lt;li&gt;fewer hidden setup assumptions&lt;/li&gt;
&lt;li&gt;clearer local and CI expectations&lt;/li&gt;
&lt;li&gt;more reviewable operational changes&lt;/li&gt;
&lt;li&gt;better signals for automation and agents&lt;/li&gt;
&lt;li&gt;a repo that can explain what it needs in order to run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maintainers already carry enough context in their heads. Ota helps move more of that context into the repository itself.&lt;/p&gt;

&lt;p&gt;Because once a repo has a working path, that path should not have to be rediscovered by every new contributor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give &lt;a href="https://ota.run/" rel="noopener noreferrer"&gt;Ota&lt;/a&gt; a try, star us on &lt;a href="https://github.com/ota-run/ota" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and join our &lt;a href="https://discord.gg/ECzcUUuq" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; if you’d like support or want to follow along.&lt;/p&gt;

&lt;p&gt;Originally Posted: &lt;a href="https://ota.run/blog/why-working-repos-still-fail-new-contributors-3hlg" rel="noopener noreferrer"&gt;https://ota.run/blog/why-working-repos-still-fail-new-contributors-3hlg&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cli</category>
      <category>opensource</category>
      <category>devops</category>
      <category>github</category>
    </item>
  </channel>
</rss>
