<?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: Isaac Johnson</title>
    <description>The latest articles on DEV Community by Isaac Johnson (@zackabrah).</description>
    <link>https://dev.to/zackabrah</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4029602%2F3ab616fd-9ece-404d-959e-fba4ad895099.jpg</url>
      <title>DEV Community: Isaac Johnson</title>
      <link>https://dev.to/zackabrah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zackabrah"/>
    <language>en</language>
    <item>
      <title>I audited the AGENTS.md files of 8 popular open-source repos. Here's what coding agents are actually reading.</title>
      <dc:creator>Isaac Johnson</dc:creator>
      <pubDate>Wed, 15 Jul 2026 05:17:39 +0000</pubDate>
      <link>https://dev.to/zackabrah/i-audited-the-agentsmd-files-of-8-popular-open-source-repos-heres-what-coding-agents-are-1ch3</link>
      <guid>https://dev.to/zackabrah/i-audited-the-agentsmd-files-of-8-popular-open-source-repos-heres-what-coding-agents-are-1ch3</guid>
      <description>&lt;p&gt;Over 60,000 open-source repositories now carry an AGENTS.md file — the "README for agents" that Codex, Claude Code, Cursor, Copilot, and some thirty other tools read before touching your code. Large monorepos nest them: the main OpenAI repository reportedly has 88.&lt;/p&gt;

&lt;p&gt;Here's the thing: almost nobody looks at what those files collectively tell an agent. Instructions accumulate from the repository root down to the file being edited. They're written by different people, in different years, for different tools. They duplicate. They contradict. They link to docs that were deleted three refactors ago. And every byte of them is paid for in context&lt;br&gt;
tokens, on every request.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/zackabrah/scopeglass" rel="noopener noreferrer"&gt;Scopeglass&lt;/a&gt; to make that chain visible, and then pointed it at 8 well-known repositories. All analysis was local and read-only — the tool makes no network calls and never executes repository content.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgfb7ydihcaiy64irro0k.gif" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgfb7ydihcaiy64irro0k.gif" alt="Scopeglass inspecting an AGENTS.md chain in the terminal" width="800" height="1032"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repository&lt;/th&gt;
&lt;th&gt;Files&lt;/th&gt;
&lt;th&gt;Depth&lt;/th&gt;
&lt;th&gt;Max tokens&lt;/th&gt;
&lt;th&gt;Median&lt;/th&gt;
&lt;th&gt;Broken&lt;/th&gt;
&lt;th&gt;Dups&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;openai/codex&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;7,695&lt;/td&gt;
&lt;td&gt;7,601&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apache/airflow&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;18,585&lt;/td&gt;
&lt;td&gt;12,806&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;temporalio/sdk-java&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1,055&lt;/td&gt;
&lt;td&gt;987&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PlutoLang/Pluto*&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vercel/next.js&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;9,402&lt;/td&gt;
&lt;td&gt;8,531&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sst/opencode&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;11,144&lt;/td&gt;
&lt;td&gt;4,164&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;block/goose&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5,303&lt;/td&gt;
&lt;td&gt;1,836&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;crewAIInc/crewAI&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;18,503&lt;/td&gt;
&lt;td&gt;10,990&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Columns: nested AGENTS.md files found; deepest root-to-target chain; max and median chain token estimate; broken/unsafe references; duplicated instructions. An eighth metric — possible conflicts — was zero for every repo; see finding 4.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*Pluto was on the AGENTS.md showcase list but has since removed its AGENTS.md entirely — instruction files rot at the repo level too.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Method: for every directory containing an AGENTS.md, Scopeglass resolved the full root-to-target chain and reported byte-exact size, a transparent token estimate (&lt;code&gt;ceil(UTF-8 bytes / 3)&lt;/code&gt; — deliberately not a model tokenizer), and deterministic diagnostics. Diagnostics are deduplicated across chains. Numbers collected 2026-07-15 at each repo's default branch head; script below.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What stood out
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. A single bad reference at the root poisons every chain.&lt;/strong&gt; Broken references were rarer than I expected — but where they exist, they inherit. Airflow's root AGENTS.md points agents at &lt;code&gt;.claude/skills/magpie-setup/&lt;/code&gt;, which is a symbolic link — and because it's in the root file, all 14 of airflow's AGENTS.md chains inherit that reference. Deeper down, &lt;code&gt;task-sdk/src/airflow/sdk/_shared/AGENTS.md&lt;/code&gt; directs agents to&lt;br&gt;
&lt;code&gt;../../../../shared&lt;/code&gt; — a path that no longer exists. Instructions politely pointing agents into a wall, on every request that touches those packages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Instructions repeat — the champion does it 930 lines apart.&lt;/strong&gt; Nested&lt;br&gt;
files inherit their ancestors, so a rule written at three levels isn't&lt;br&gt;
emphasis, it's triple-billed context. The standout is crewAI's CLI template&lt;br&gt;
AGENTS.md — a file shipped to every new crewAI project — which states&lt;br&gt;
"Python &amp;gt;=3.10, &amp;lt;3.14" at line 48 and again, verbatim, at line 980. Nobody&lt;br&gt;
reads line 980 of their own instruction file; the agent reads it every time.&lt;br&gt;
The 17 flagged duplicates in crewAI's &lt;code&gt;declarative_flow&lt;/code&gt; template chain are&lt;br&gt;
mostly repeated structural boilerplate — noise a human skims past but an&lt;br&gt;
agent parses and pays for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The token bill is real.&lt;/strong&gt; The largest chain measured was ~18,600 tokens&lt;br&gt;
(airflow's deepest package; crewAI's template chain is within 100 tokens of&lt;br&gt;
it) before the agent reads a single line of source. Airflow's &lt;em&gt;median&lt;/em&gt; chain&lt;br&gt;
is ~12,800 tokens. If your agent bills per token, that's the standing cover&lt;br&gt;
charge on every request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. An honest null: zero conflicts.&lt;/strong&gt; Scopeglass's conflict heuristic is&lt;br&gt;
deliberately narrow — same normalized rule core, opposite leading polarity —&lt;br&gt;
and across all 8 repos it fired zero times. Popular repos with maintained&lt;br&gt;
AGENTS.md files apparently don't argue with themselves in ways that pattern&lt;br&gt;
catches. Fine by me: a diagnostic that stays quiet on healthy input is the&lt;br&gt;
point.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this needs to be boring infrastructure
&lt;/h2&gt;

&lt;p&gt;None of this is an indictment of the repos — it's what happens to any&lt;br&gt;
config-by-prose system without a linter. We solved this for code style,&lt;br&gt;
imports, and dead links years ago; instruction files are just the newest&lt;br&gt;
place documentation rots invisibly, with the twist that the reader (an&lt;br&gt;
agent) never complains.&lt;/p&gt;

&lt;p&gt;That's the case for making it a CI concern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scopeglass check &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--fail-on&lt;/span&gt; error &lt;span class="nt"&gt;--max-tokens&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit 1 on broken references or a blown context budget, versioned JSON if you&lt;br&gt;
want to track it over time. Local-only, deterministic, MIT.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; scopeglass
node analyze-agents-md.mjs owner/repo another/repo …
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The survey script (shallow-clones each repo, runs Scopeglass on every&lt;br&gt;
AGENTS.md directory, dedupes diagnostics, emits this post's table plus a JSON&lt;br&gt;
evidence file) is &lt;a href="https://gist.github.com/zackabrah/23ea27929c653273109860112efcee1a" rel="noopener noreferrer"&gt;in a gist&lt;/a&gt;. If you run it on your own&lt;br&gt;
monorepo and find something amusing, I'd love to hear about it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Scopeglass reports expected scope: the canonical ancestor-chain semantics&lt;br&gt;
the format documents. It doesn't claim to know how a specific vendor&lt;br&gt;
assembles prompts, and its conflict heuristic is deliberately narrow — both&lt;br&gt;
limitations are documented in the repo.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
