<?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: DotcomJack</title>
    <description>The latest articles on DEV Community by DotcomJack (@dotcomjack).</description>
    <link>https://dev.to/dotcomjack</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%2F4162225%2F291cacde-ea9a-4eff-bf70-5e41f1e2e5b8.png</url>
      <title>DEV Community: DotcomJack</title>
      <link>https://dev.to/dotcomjack</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dotcomjack"/>
    <language>en</language>
    <item>
      <title>How to pin an agent skill to an exact version</title>
      <dc:creator>DotcomJack</dc:creator>
      <pubDate>Thu, 08 Oct 2026 00:01:19 +0000</pubDate>
      <link>https://dev.to/dotcomjack/how-to-pin-an-agent-skill-to-an-exact-version-nfh</link>
      <guid>https://dev.to/dotcomjack/how-to-pin-an-agent-skill-to-an-exact-version-nfh</guid>
      <description>&lt;p&gt;Pin a skill by a fingerprint of its exact contents, not just by where it lives. Install it at an exact version with a tool that checks the files and records that fingerprint in a lockfile you commit. Then check for changes on purpose, and read what changed before you update. With the mdr tool that is &lt;code&gt;mdr add&lt;/code&gt;, &lt;code&gt;mdr outdated&lt;/code&gt; and &lt;code&gt;mdr diff&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It matters because these files change. In the registry's own crawl, of 47,724 agent markdown files watched for at least 14 days, at least 19.9% changed on GitHub within 14 days of being collected (19.4% of SKILL.md files). We also looked at five Anthropic skills (skills chosen because they change often): of 75 byte-exact copies of them found in other repositories, 47 (62.7%) were an older version. An agent that loads a skill by its path reads whatever the file says today. The figures and how we measured them are in &lt;a href="https://markdownregistry.com/reports/state-of-agent-markdown-2026-09" rel="noopener noreferrer"&gt;State of agent markdown, September 2026&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Watched 14+ days&lt;/th&gt;
&lt;th&gt;Changed within 14 days&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SKILL.md&lt;/td&gt;
&lt;td&gt;42,581&lt;/td&gt;
&lt;td&gt;8,272&lt;/td&gt;
&lt;td&gt;19.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AGENTS.md&lt;/td&gt;
&lt;td&gt;2,623&lt;/td&gt;
&lt;td&gt;730&lt;/td&gt;
&lt;td&gt;27.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLAUDE.md&lt;/td&gt;
&lt;td&gt;1,333&lt;/td&gt;
&lt;td&gt;309&lt;/td&gt;
&lt;td&gt;23.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DESIGN.md&lt;/td&gt;
&lt;td&gt;634&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;5.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor rules&lt;/td&gt;
&lt;td&gt;296&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;12.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llms.txt&lt;/td&gt;
&lt;td&gt;257&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;41.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;How often agent markdown changed upstream within 14 days of being indexed, by kind (lower bounds; only files watched for at least 14 days count). Registry crawl, data frozen September 27, 2026; method and downloads in &lt;a href="https://markdownregistry.com/reports/state-of-agent-markdown-2026-09" rel="noopener noreferrer"&gt;the report&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Every command below was run against the live registry on September 27, 2026, and the output is shown as it printed. Install the CLI from &lt;a href="https://markdownregistry.com/cli" rel="noopener noreferrer"&gt;the mdr CLI page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I pin an agent skill to an exact version?
&lt;/h2&gt;

&lt;p&gt;Install it at an exact version, and record a fingerprint of its contents (a content hash), not just its path. With mdr, run mdr add owner/repo/&lt;a href="mailto:skill@version"&gt;skill@version&lt;/a&gt;. It installs that version's files from their source commit on GitHub and checks every file against its published fingerprint before writing anything. It records the version, the SHA-256 of SKILL.md and the source commit in mdr.lock. A skill with more than 200 files is refused, and nothing is written. Public skills the registry has indexed, each with its versions, are listed on &lt;a href="https://markdownregistry.com/kind/skill" rel="noopener noreferrer"&gt;the SKILL.md page&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mdr add anthropics/skills/skill-creator@git:20260225.3d59511 --dir skills/skill-creator
installed anthropics/skills/skill-creator@git:20260225.3d59511  18 files (18 hash-verified)  audit A  to skills/skill-creator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example installs into &lt;code&gt;skills/skill-creator&lt;/code&gt; so every path below is easy to read. Without &lt;code&gt;--dir&lt;/code&gt;, mdr installs where your agent loads skills: &lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;&lt;/code&gt; by default, or the matching directory for &lt;code&gt;--agent codex&lt;/code&gt;, &lt;code&gt;cursor&lt;/code&gt; or &lt;code&gt;opencode&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A version label is the &lt;code&gt;version&lt;/code&gt; (or &lt;code&gt;metadata.version&lt;/code&gt;) in the skill's frontmatter, with a &lt;code&gt;v&lt;/code&gt; added when it starts with a digit, or, when it declares none, the commit date and short hash, as here. A declared version can repeat across commits, so when two versions share a label, pin by content hash instead: &lt;code&gt;mdr add owner/repo/skill@sha256:&amp;lt;prefix&amp;gt;&lt;/code&gt;. &lt;code&gt;mdr info owner/repo/skill&lt;/code&gt; lists the recent versions with their date, commit and audit grade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is there a lockfile for agent skills like package-lock.json?
&lt;/h2&gt;

&lt;p&gt;Yes. mdr writes mdr.lock, a small JSON file in the folder you run it from. It records each skill's version label, SHA-256 fingerprint, source commit and install path. Commit it to your repository. mdr install then downloads exactly those contents again and checks them, so it installs them exactly or fails. GitHub's gh skill works differently: it pins to a tag or commit and records a git tree SHA inside each SKILL.md, not in a separate lockfile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"registry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://markdownregistry.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"entries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"anthropics/skills/skill-creator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"artifact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"art_hl7wjhua3foziup4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"skill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git:20260225.3d59511"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sha256"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ba8bebb2c085444120743af8dc859dd7c2592d6290e93aa5e1c08403109bdce7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3d59511518591fa82e6cfcf0438d68dd5dad3e76"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"skills/skill-creator"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"verified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"installed_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-27T20:33:01.483Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;sha256&lt;/code&gt; is the hash of the skill's SKILL.md at that version, and &lt;code&gt;verified&lt;/code&gt; counts the files whose bytes were checked before anything was written. If any file does not match, nothing is written at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I check whether my installed agent skills are outdated?
&lt;/h2&gt;

&lt;p&gt;Run mdr outdated. It lists every pinned skill whose SKILL.md changed on GitHub, with the new version and its audit grade. It exits with status 2 when one did, or when one was removed from GitHub, so an automated build can fail on it. For a public skill, a change to another file that leaves SKILL.md untouched is not detected. mdr verify --min-grade A fails when the registry can no longer find a pinned version or its grade is below the minimum. To see a file's grade before you pin it, paste its GitHub link into &lt;a href="https://markdownregistry.com/check" rel="noopener noreferrer"&gt;the checker&lt;/a&gt;.&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="nv"&gt;$ &lt;/span&gt;mdr outdated
anthropics/skills/skill-creator  git:20260225.3d59511 to git:20260306.b0cbd3d  audit A  &lt;span class="o"&gt;(&lt;/span&gt;2026-03-06&lt;span class="o"&gt;)&lt;/span&gt;  mdr diff anthropics/skills/skill-creator
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;
2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mdr verify --min-grade A
✓ anthropics/skills/skill-creator  git:20260225.3d59511  audit A (&amp;gt;= A)  sha256:ba8bebb2c085

all 1 pinned entry verified at grade A or better
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How do I see what changed in an agent skill before I update it?
&lt;/h2&gt;

&lt;p&gt;Run mdr diff owner/repo/skill. It shows the lines that changed in the skill's SKILL.md, from the version you pinned to the latest one, when you are behind. Add two version labels to compare any pair. It does not show the skill's other files, such as scripts. To see those, compare the two source commits: mdr.lock records yours, and mdr info owner/repo/skill lists the short commit hash of each recent version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;$ mdr diff anthropics/skills/skill-creator
&lt;span class="p"&gt;anthropics/skills/skill-creator: git:20260225.3d59511 to git:20260306.b0cbd3d  +8 -2
&lt;/span&gt;&lt;span class="gd"&gt;- description: Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, update or optimize an existing skill, ...
&lt;/span&gt;&lt;span class="gi"&gt;+ description: Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, ...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The long description lines are cut short here; the real output prints them whole, followed by the other changed lines of SKILL.md. Between these two versions, two of the skill's Python scripts also changed upstream (&lt;code&gt;improve_description.py&lt;/code&gt; by 51 lines added and 52 removed, &lt;code&gt;run_loop.py&lt;/code&gt; by 4 removed), and &lt;code&gt;mdr diff&lt;/code&gt; does not show them: run &lt;code&gt;git diff 3d59511 b0cbd3d -- skills/skill-creator&lt;/code&gt; in a clone of the skill's repository to see them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I update an installed skill without losing my local edits?
&lt;/h2&gt;

&lt;p&gt;mdr does not merge local edits. mdr update overwrites every file the new version ships, so an edit inside one of them is lost, and it does not delete files, so a file removed upstream stays until you remove it. The safest course is not to edit an installed skill: if you need changes, copy it to a directory you own, under a new name, and maintain that copy. If you have already edited one, move the skill directory aside before updating (remove last time's backup first), run mdr update, then compare the two with git diff --no-index and carry your changes across by hand. mdr install overwrites local edits the same way.&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; skill-creator.mine &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mv &lt;/span&gt;skills/skill-creator skill-creator.mine
&lt;span class="nv"&gt;$ &lt;/span&gt;mdr update anthropics/skills/skill-creator
installed anthropics/skills/skill-creator@git:20260306.b0cbd3d  18 files &lt;span class="o"&gt;(&lt;/span&gt;18 hash-verified&lt;span class="o"&gt;)&lt;/span&gt;  audit A  to skills/skill-creator
&lt;span class="nv"&gt;$ &lt;/span&gt;git diff &lt;span class="nt"&gt;--no-index&lt;/span&gt; &lt;span class="nt"&gt;--stat&lt;/span&gt; skill-creator.mine skills/skill-creator
 .../skill-creator&lt;span class="o"&gt;}&lt;/span&gt;/LICENSE.txt                     |   3 +-
 .../skill-creator&lt;span class="o"&gt;}&lt;/span&gt;/SKILL.md                        |  12 ++-
 .../skill-creator&lt;span class="o"&gt;}&lt;/span&gt;/scripts/improve_description.py  | 103 ++++++++++-----------
 .../skill-creator&lt;span class="o"&gt;}&lt;/span&gt;/scripts/run_loop.py             |   4 -
 4 files changed, 60 insertions&lt;span class="o"&gt;(&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;, 62 deletions&lt;span class="o"&gt;(&lt;/span&gt;-&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We ran this on September 27, 2026 twice in a row (from &lt;code&gt;1ed29a0&lt;/code&gt; to &lt;code&gt;3d59511&lt;/code&gt;, then the update shown here to the latest), with an edit to &lt;code&gt;LICENSE.txt&lt;/code&gt; carried across after the first and a new edit to &lt;code&gt;SKILL.md&lt;/code&gt; before the second: both edits were in &lt;code&gt;skill-creator.mine&lt;/code&gt; afterwards and the new install was clean. If &lt;code&gt;mdr update&lt;/code&gt; fails, move the directory back. Move the directory rather than copy it: a copy nests inside last time's backup on the next update, and it hides files that upstream removed, which a move lets the comparison show. The comparison lists your edits and every upstream change, including the two scripts &lt;code&gt;mdr diff&lt;/code&gt; does not show; drop &lt;code&gt;--stat&lt;/code&gt; to see the lines. A file that appears only in &lt;code&gt;skill-creator.mine&lt;/code&gt; is either one you added or one upstream removed; &lt;code&gt;mdr info&lt;/code&gt; and the source commits tell you which. &lt;code&gt;git diff --no-index&lt;/code&gt; exits with status 1 when the two differ, which here is expected. We also tried carrying edits across automatically with a patch made from git history; it lost the edit in several ordinary histories (a second update, a shared lockfile, a squash merge), so we do not recommend it.&lt;/p&gt;

&lt;h2&gt;
  
  
  mdr, gh skill, or copying the files
&lt;/h2&gt;

&lt;p&gt;GitHub's CLI added &lt;code&gt;gh skill&lt;/code&gt; in April 2026, in public preview, with its own pinning, described in &lt;a href="https://github.blog/changelog/2026-04-16-manage-agent-skills-with-github-cli/" rel="noopener noreferrer"&gt;GitHub's changelog&lt;/a&gt;. Copying a skill's files into your repository is the third option. How they differ:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;mdr&lt;/th&gt;
&lt;th&gt;gh skill&lt;/th&gt;
&lt;th&gt;Copying the files&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pin to an exact version&lt;/td&gt;
&lt;td&gt;Yes: a version label, checked against a SHA-256&lt;/td&gt;
&lt;td&gt;Yes: --pin to a tag or a commit&lt;/td&gt;
&lt;td&gt;Only by never touching the copy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where the pin is recorded&lt;/td&gt;
&lt;td&gt;mdr.lock, one file for the project&lt;/td&gt;
&lt;td&gt;Tracking fields in each SKILL.md&lt;/td&gt;
&lt;td&gt;Nowhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrity&lt;/td&gt;
&lt;td&gt;Every file checked against its published hash before anything is written&lt;/td&gt;
&lt;td&gt;Records the source's git tree SHA and compares it on update&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;See that upstream moved&lt;/td&gt;
&lt;td&gt;mdr outdated, when SKILL.md changes (exit 2 for CI)&lt;/td&gt;
&lt;td&gt;gh skill update (--dry-run to only check), from the whole directory's tree SHA; pinned skills are skipped&lt;/td&gt;
&lt;td&gt;No signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read the change first&lt;/td&gt;
&lt;td&gt;mdr diff of SKILL.md between any two versions&lt;/td&gt;
&lt;td&gt;gh skill preview before installing&lt;/td&gt;
&lt;td&gt;Compare by hand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit grade on each version&lt;/td&gt;
&lt;td&gt;Yes, deterministic checks&lt;/td&gt;
&lt;td&gt;Not described&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agents it installs for&lt;/td&gt;
&lt;td&gt;Claude, Codex, Cursor, opencode&lt;/td&gt;
&lt;td&gt;Many, including Copilot, Claude Code, Cursor, Codex and Gemini CLI&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use whichever fits how your team already works. What matters is that the pin records the exact bytes and that an update is a decision you make after reading the change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2026-04-16-manage-agent-skills-with-github-cli/" rel="noopener noreferrer"&gt;GitHub changelog: manage agent skills with GitHub CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Last checked September 27, 2026. The page: &lt;a href="https://markdownregistry.com/guides/pin-agent-skills" rel="noopener noreferrer"&gt;https://markdownregistry.com/guides/pin-agent-skills&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://markdownregistry.com/guides/pin-agent-skills" rel="noopener noreferrer"&gt;markdownregistry&lt;/a&gt;. The other guides, on AGENTS.md, CLAUDE.md, skill security and where to find skills, are at &lt;a href="https://markdownregistry.com/guides" rel="noopener noreferrer"&gt;markdownregistry.com/guides&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>DESIGN.md files against the official linter: 1,162 checked</title>
      <dc:creator>DotcomJack</dc:creator>
      <pubDate>Wed, 07 Oct 2026 00:03:10 +0000</pubDate>
      <link>https://dev.to/dotcomjack/designmd-files-against-the-official-linter-1162-checked-3lc3</link>
      <guid>https://dev.to/dotcomjack/designmd-files-against-the-official-linter-1162-checked-3lc3</guid>
      <description>&lt;p&gt;Most DESIGN.md files keep their design values in the markdown body, not in tokens a tool can check. Of 1,162 DESIGN.md files in public GitHub repositories, 78.1% have no YAML design tokens, which the format leaves optional, though 747 of those still spell out three or more hex colors in their text. Of the 254 with tokens, 88.6% pass the format's own linter with no errors, and only 8.3% with no warnings either.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Linter result&lt;/th&gt;
&lt;th&gt;Files&lt;/th&gt;
&lt;th&gt;Share of files with tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No errors&lt;/td&gt;
&lt;td&gt;225&lt;/td&gt;
&lt;td&gt;88.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No errors and no warnings&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;8.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Defines a color that no component refers to&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;40.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writes a typography token as one string, not an object&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;31.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A component's text and background fall below 4.5:1 contrast&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;26.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A component uses a sub-token the format does not define&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;18.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Defines colors, but none named primary&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;16.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Has a value that is not a valid dimension (an error)&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;8.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 254 of 1,162 DESIGN.md files in public GitHub repositories that carry design tokens, each read at its latest version in the registry and run through the format's own linter, version 0.4.0, on October 4, 2026. A file can show more than one result. How each was counted is under How we counted.&lt;/p&gt;

&lt;p&gt;Counted from the registry's own crawl of public GitHub and checked with the linter from &lt;a href="https://github.com/google-labs-code/design.md" rel="noopener noreferrer"&gt;the format's repository&lt;/a&gt;, pinned at version 0.4.0, on October 4, 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two kinds of DESIGN.md
&lt;/h2&gt;

&lt;p&gt;The format published by Google Labs, which marks itself alpha, describes a DESIGN.md in two parts: optional YAML front matter holding exact design tokens (colors, typography, rounded corners, spacing and components), and a markdown body explaining them. When the tokens are there, its repository says they are the normative values and the prose gives the context for applying them.&lt;/p&gt;

&lt;p&gt;Most files with the name use only the body. 908 of the 1,162 files (78.1%) hold no YAML at all, as front matter or in a fenced YAML block, which the linter also reads, and its only finding for each is that no YAML content was found. That is allowed, but it moves the values into the markdown body: 747 of those 908 files (82.3%) name three or more hex colors there, in sentences, palette tables or inline code. A model reading the file can use those colors; the linter cannot check them, and the format's export command, which turns tokens into CSS or Tailwind settings, cannot carry them. Many files are also shared templates: the 1,162 files hold only 715 distinct contents, so 447 of them are byte-for-byte copies of another file counted here.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the linter flags in files with tokens
&lt;/h2&gt;

&lt;p&gt;The 254 files with tokens mostly parse: 225 (88.6%) have no errors. Warnings are another matter, and only 21 files have none. The commonest, by file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A color no component refers to&lt;/strong&gt;, in 103 files (40.6%). The rule applies only to files that define components, and skips the standard color families such as primary and surface, so it flags extra colors the components never use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A typography token written as one string&lt;/strong&gt;, such as &lt;code&gt;"Inter 48px bold"&lt;/code&gt;, in 81 files (31.9%). The format's typography type is an object with properties such as &lt;code&gt;fontFamily&lt;/code&gt;, &lt;code&gt;fontSize&lt;/code&gt; and &lt;code&gt;lineHeight&lt;/code&gt;. Version 0.4.0 of the linter reports a string like this one warning per character, so these files can carry dozens of warnings for one mistake; counted by file, it is one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low contrast&lt;/strong&gt;, in 66 files (26.0%): a component whose text color on its background falls below 4.5:1, the WCAG AA minimum the linter checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A component sub-token the format does not define&lt;/strong&gt;, in 47 files (18.5%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No color named primary&lt;/strong&gt;, in 43 files (16.9%). The linter's message says an agent will then generate key colors itself, which leaves less of the palette in the file's hands.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The errors
&lt;/h2&gt;

&lt;p&gt;29 files with tokens (11.4%) have at least one error. The commonest is a dimension the format does not accept, in 22 files: the format's dimensions are a number with a px, em or rem unit, and values such as &lt;code&gt;normal&lt;/code&gt; for a line height or a bare &lt;code&gt;0&lt;/code&gt; fail that test. 9 files have a color the linter cannot read as a CSS color, 4 have a reference to a token that does not exist, and 1 has a font weight that is not a number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lint your own DESIGN.md
&lt;/h2&gt;

&lt;p&gt;The linter runs with npx and prints its findings as JSON, each with a severity and a message. This is the output, cut to those two fields, from a scratch DESIGN.md with two colors, neither named primary, and a typography token whose line height is &lt;code&gt;normal&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npx @google/design.md@0.4.0 lint DESIGN.md | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'"(severity|message)"'&lt;/span&gt;
&lt;span class="go"&gt;      "severity": "error",
      "message": "'normal' is not a valid dimension."
      "severity": "warning",
      "message": "No 'primary' color defined. The agent will auto-generate key colors, reducing your control over the palette.",
      "severity": "info",
      "message": "Design system defines 2 colors, 1 typography scale.",
      "severity": "info",
      "message": "No 'spacing' section defined. Layout spacing will fall back to agent defaults.",
      "severity": "info",
      "message": "No 'rounded' section defined. Corner rounding will fall back to agent defaults.",
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command exits with status 1 when there is an error, which makes it usable as a check in CI. Pin the version, as here: the format is alpha, and its rules can change between releases. Real DESIGN.md files from other projects are on &lt;a href="https://markdownregistry.com/kind/design" rel="noopener noreferrer"&gt;the DESIGN.md page&lt;/a&gt;, and what the file is for is in &lt;a href="https://markdownregistry.com/guides/agents-md-vs-claude-md#design-md" rel="noopener noreferrer"&gt;what DESIGN.md is and how agents use it&lt;/a&gt;. To see whether a DESIGN.md on GitHub is already in the registry and how its audit grades it, paste its link into &lt;a href="https://markdownregistry.com/check" rel="noopener noreferrer"&gt;the checker&lt;/a&gt;. To start a new one from a file that passes every check the registry runs, use &lt;a href="https://mdpantry.com/s/st_xs6ba3gvobplmswl" rel="noopener noreferrer"&gt;the DESIGN.md starter on mdpantry&lt;/a&gt;, which says what to change in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;The registry collects agent markdown from public GitHub repositories and stores every version of each file by the SHA-256 of its content, the same hash &lt;a href="https://markdownregistry.com/guides/pin-agent-skills" rel="noopener noreferrer"&gt;a pinned install checks&lt;/a&gt;. We took every file named DESIGN.md it holds, read each one's latest stored version, checked its bytes against its hash, and ran the format's linter, the &lt;code&gt;@google/design.md&lt;/code&gt; package at version 0.4.0, on a copy of it. A file has no tokens when the linter reports that no YAML content was found, and names hex colors in its text when three or more distinct six- or three-digit hex codes appear anywhere in it. Results are counted by file: a file is counted once for a rule however many findings that rule gives it. Some findings in version 0.4.0 carry no rule name; they are named here by their message, and a typography finding whose property is a number, which is what a token written as a string produces, is counted as a string token. The registry crawls &lt;a href="https://markdownregistry.com/owners" rel="noopener noreferrer"&gt;the public repositories it has found&lt;/a&gt; that hold agent files, not all of GitHub, so read the shares as describing those repositories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google-labs-code/design.md" rel="noopener noreferrer"&gt;google-labs-code/design.md: the DESIGN.md format, its specification and linter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/TR/WCAG22/#contrast-minimum" rel="noopener noreferrer"&gt;WCAG 2.2: contrast (minimum)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Last checked October 4, 2026. The page: &lt;a href="https://markdownregistry.com/blog/design-md-files-against-the-official-linter" rel="noopener noreferrer"&gt;https://markdownregistry.com/blog/design-md-files-against-the-official-linter&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://markdownregistry.com/blog/design-md-files-against-the-official-linter" rel="noopener noreferrer"&gt;markdownregistry&lt;/a&gt;, where the counts are kept current and the data behind them is public in &lt;a href="https://github.com/dotcomjack/state-of-agent-markdown" rel="noopener noreferrer"&gt;dotcomjack/state-of-agent-markdown&lt;/a&gt;, and the monthly counts are in &lt;a href="https://markdownregistry.com/reports" rel="noopener noreferrer"&gt;the registry's reports&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>ai</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>How llms.txt files follow the format: 438 files counted</title>
      <dc:creator>DotcomJack</dc:creator>
      <pubDate>Tue, 06 Oct 2026 00:01:16 +0000</pubDate>
      <link>https://dev.to/dotcomjack/how-llmstxt-files-follow-the-format-438-files-counted-61g</link>
      <guid>https://dev.to/dotcomjack/how-llmstxt-files-follow-the-format-438-files-counted-61g</guid>
      <description>&lt;p&gt;Most llms.txt files get the top of the format right and drift below it. Of 438 files named llms.txt in public GitHub repositories, 96.6% open with an H1 and 85.2% follow it with a summary blockquote. But only 30.6% follow the whole structure the llms.txt proposal sets out: in 52.7% of files, at least one section under an H2 heading holds prose, not the list of links the proposal describes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule from the llms.txt proposal&lt;/th&gt;
&lt;th&gt;Files&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Opens with an H1, the only required section&lt;/td&gt;
&lt;td&gt;423&lt;/td&gt;
&lt;td&gt;96.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Has exactly one H1&lt;/td&gt;
&lt;td&gt;394&lt;/td&gt;
&lt;td&gt;90.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Has a summary blockquote before the first H2&lt;/td&gt;
&lt;td&gt;373&lt;/td&gt;
&lt;td&gt;85.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uses no headings but the H1 and its H2s&lt;/td&gt;
&lt;td&gt;354&lt;/td&gt;
&lt;td&gt;80.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keeps every H2 section a list of links&lt;/td&gt;
&lt;td&gt;143&lt;/td&gt;
&lt;td&gt;32.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follows every structural rule above but the blockquote&lt;/td&gt;
&lt;td&gt;134&lt;/td&gt;
&lt;td&gt;30.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;438 files named llms.txt in 331 public GitHub repositories, each read at its latest version in the registry on October 4, 2026, and checked against the format in the llms.txt proposal, v2. How each rule was checked is under How we counted.&lt;/p&gt;

&lt;p&gt;Counted from the registry's own crawl of public GitHub, read on October 4, 2026, against &lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;the llms.txt proposal&lt;/a&gt; as it read that day.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 438 llms.txt files look like
&lt;/h2&gt;

&lt;p&gt;159 of the files sit at the root of their repository; the rest live in folders such as a documentation site's public directory, where a build publishes them. Almost all of them have structure: 419 (95.7%) divide their content under H2 headings. The median file holds 13 links, and 102 files (23.3%) hold none at all.&lt;/p&gt;

&lt;p&gt;The H1 and the blockquote, the part of the format every guide shows first, are where files agree: 96.6% open with the H1 the proposal requires, and 85.2% carry the one-paragraph summary it describes next. 89 files (20.3%) keep a section named Optional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where files drift from the format
&lt;/h2&gt;

&lt;p&gt;The proposal describes everything after the summary in two parts: sections of any kind except headings, then sections under H2 headers that are each a "file list", a markdown list whose items are a &lt;code&gt;[name](url)&lt;/code&gt; link with optional notes after a colon. Files part ways with it in the second part. Only 143 files (32.6%) keep every H2 section a list of links, 19 of them because they have no H2 sections at all. In 231 (52.7%), at least one H2 section holds paragraphs of prose, which makes the file read like a document with chapters more than a map of links. 84 files (19.2%) also use H3 or deeper headings, or a second H1, which the format does not describe.&lt;/p&gt;

&lt;p&gt;None of this stops an agent reading the file: it is markdown either way, and the proposal expects agents to view or search the file and follow its links. What drifts is the predictability the format promises, that a program can find the links by reading the H2 lists alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the links point
&lt;/h2&gt;

&lt;p&gt;The proposal asks that the links point to content a language model can read easily, and suggests offering a markdown version of each page at the same address with &lt;code&gt;.md&lt;/code&gt; appended, or with its extension replaced by &lt;code&gt;.md&lt;/code&gt;. Of the 56,557 full web addresses in these files, 6,170 (10.9%) point straight at a &lt;code&gt;.md&lt;/code&gt;, &lt;code&gt;.mdx&lt;/code&gt; or &lt;code&gt;.txt&lt;/code&gt; file. That understates how many reach markdown, because v2 also lets a page point to its markdown version with a link relation, which a count of addresses cannot see.&lt;/p&gt;

&lt;p&gt;119 files (27.2%) link mostly by relative path rather than by full address. A relative link is read against wherever the file is fetched from, so it works when the file is served from the site it describes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your own llms.txt
&lt;/h2&gt;

&lt;p&gt;To find H2 sections that are not pure link lists, print the first line in each one that is not a list item opening with a link, skipping indented lines, which continue the item above them. This is the output from a scratch llms.txt with a Docs list (one note wrapped onto a second line, a nested item and an H3), a Pricing section written as prose, and an Optional list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;awk&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;/^&lt;/span&gt;&lt;span class="c1"&gt;#/{s=($0 ~ /^## /)?$0:""; next} s &amp;amp;&amp;amp; NF &amp;amp;&amp;amp; !/^[-*+] \[/ &amp;amp;&amp;amp; !/^[ \t]/{print NR": "s": "$0; s=""}' llms.txt&lt;/span&gt;
&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;## Pricing: Acme charges per request, billed monthly.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each line it prints is a section to turn into a list of links, or to move above the first H2, where the format allows any content but headings. It reads every line as text, so a &lt;code&gt;##&lt;/code&gt; line inside a fenced code block also counts as a heading. Real llms.txt files from other projects are on &lt;a href="https://markdownregistry.com/kind/llmstxt" rel="noopener noreferrer"&gt;the llms.txt page&lt;/a&gt;, most starred first, and how to add one to a site is in &lt;a href="https://markdownregistry.com/guides/agents-md-vs-claude-md#llms-txt" rel="noopener noreferrer"&gt;how to add an llms.txt file&lt;/a&gt;. To start a new one from a file that passes every check the registry runs, use &lt;a href="https://mdpantry.com/s/st_eohpwiaps5fbt4n5" rel="noopener noreferrer"&gt;the llms.txt starter on mdpantry&lt;/a&gt;, which says what to change in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;The registry collects agent markdown from public GitHub repositories and stores every version of each file by the SHA-256 of its content, the same hash &lt;a href="https://markdownregistry.com/guides/pin-agent-skills" rel="noopener noreferrer"&gt;a pinned install checks&lt;/a&gt;. We took every file named exactly llms.txt it holds, leaving out llms-full.txt and other names, read each one's latest stored version, and checked its bytes against its hash; 4 files with no stored version yet were left out. The proposal is written for files served on websites; these are the files as committed to repositories, many of which a build publishes to a site.&lt;/p&gt;

&lt;p&gt;A leading byte-order mark was dropped and headings inside fenced code blocks were ignored. A file opens with an H1 when its first non-blank line is a level-one heading. The blockquote counts when a line beginning with &lt;code&gt;&amp;gt;&lt;/code&gt; appears before the first H2. An H2 section runs to the next heading of any level. An indented line in it is read as part of the list item above it, and skipped when no item comes before it. The section is a list of links when every other non-blank line is a list item made of a &lt;code&gt;[name](url)&lt;/code&gt; link, optionally followed by a colon and notes; it holds prose when a line of text, outside any code block, is not a list item. A code block fails the list test without counting as prose, and a file with no H2 sections counts as keeping every H2 section a list. A file follows the whole structure when it opens with its only H1, uses no other headings but H2s, and keeps every H2 section a list of links; the blockquote is left out of that test because the proposal requires only the H1. A link ends in markdown when its path ends in &lt;code&gt;.md&lt;/code&gt;, &lt;code&gt;.mdx&lt;/code&gt; or &lt;code&gt;.txt&lt;/code&gt;. The registry crawls the public repositories it has found that hold agent files, not all of GitHub, so read the shares as describing those repositories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;The /llms.txt file, v2: the proposal and its format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://llmstxt.org/changes.md" rel="noopener noreferrer"&gt;llms.txt: what changed in v2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Last checked October 4, 2026. The page: &lt;a href="https://markdownregistry.com/blog/how-llms-txt-files-follow-the-format" rel="noopener noreferrer"&gt;https://markdownregistry.com/blog/how-llms-txt-files-follow-the-format&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://markdownregistry.com/blog/how-llms-txt-files-follow-the-format" rel="noopener noreferrer"&gt;markdownregistry&lt;/a&gt;, where the counts are kept current and the data behind them is public in &lt;a href="https://github.com/dotcomjack/state-of-agent-markdown" rel="noopener noreferrer"&gt;dotcomjack/state-of-agent-markdown&lt;/a&gt;, and the monthly counts are in &lt;a href="https://markdownregistry.com/reports" rel="noopener noreferrer"&gt;the registry's reports&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>ai</category>
      <category>webdev</category>
      <category>documentation</category>
    </item>
    <item>
      <title>How projects write Cursor rules: 557 files counted</title>
      <dc:creator>DotcomJack</dc:creator>
      <pubDate>Mon, 05 Oct 2026 00:09:36 +0000</pubDate>
      <link>https://dev.to/dotcomjack/how-projects-write-cursor-rules-557-files-counted-2202</link>
      <guid>https://dev.to/dotcomjack/how-projects-write-cursor-rules-557-files-counted-2202</guid>
      <description>&lt;p&gt;Most projects now write Cursor rules as .mdc files in &lt;code&gt;.cursor/rules&lt;/code&gt;: 510 of the 557 rule files the registry has collected, against 47 legacy &lt;code&gt;.cursorrules&lt;/code&gt; files. Of the .mdc rules, 32.7% load in every chat, 32.2% attach to matching files and 28.8% let the agent decide. And 46 set a narrow file pattern that Cursor ignores, because they also say &lt;code&gt;alwaysApply: true&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule type&lt;/th&gt;
&lt;th&gt;What the frontmatter says&lt;/th&gt;
&lt;th&gt;.mdc files&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Always Apply&lt;/td&gt;
&lt;td&gt;alwaysApply: true&lt;/td&gt;
&lt;td&gt;167&lt;/td&gt;
&lt;td&gt;32.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apply to Specific Files&lt;/td&gt;
&lt;td&gt;globs set, alwaysApply false or missing&lt;/td&gt;
&lt;td&gt;164&lt;/td&gt;
&lt;td&gt;32.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apply Intelligently&lt;/td&gt;
&lt;td&gt;a description, no globs&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;td&gt;28.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No frontmatter at all&lt;/td&gt;
&lt;td&gt;none of the three fields&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;5.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apply Manually&lt;/td&gt;
&lt;td&gt;frontmatter with none of the three set&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;0.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;510 .mdc rule files in 102 public GitHub repositories, each read at its latest version in the registry on October 3, 2026, and sorted by the rule-type table in Cursor's documentation. How each was decided is under How we counted.&lt;/p&gt;

&lt;p&gt;Counted from the registry's own crawl of public GitHub, read on October 3, 2026. How Cursor applies each rule type is from &lt;a href="https://cursor.com/docs/rules" rel="noopener noreferrer"&gt;its rules documentation&lt;/a&gt;, read the same day.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 557 rule files look like
&lt;/h2&gt;

&lt;p&gt;The single &lt;code&gt;.cursorrules&lt;/code&gt; file at a project's root is the older way to give Cursor instructions, and Cursor's rules documentation does not describe it. It is still in 38 of the 127 repositories with Cursor rules here, and 13 of those keep it beside a &lt;code&gt;.cursor/rules&lt;/code&gt; folder. The rest write rules as .mdc files, one rule per file.&lt;/p&gt;

&lt;p&gt;File counts lean on a few busy repositories: the median repository holds 1 .mdc rule, and the largest holds 52, 10.2% of all of them. Counted by repository instead, the pattern is plainer. 76 of the 102 repositories with .mdc rules (74.5%) have at least one rule that loads in every chat, and 49 (48.0%) have no other kind.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Cursor decides when a rule applies
&lt;/h2&gt;

&lt;p&gt;Each .mdc rule has three frontmatter fields, and &lt;a href="https://cursor.com/docs/rules" rel="noopener noreferrer"&gt;Cursor's documentation&lt;/a&gt; gives the result of each combination:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always Apply:&lt;/strong&gt; &lt;code&gt;alwaysApply: true&lt;/code&gt;. The rule is in every chat, and its globs and description are ignored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply to Specific Files:&lt;/strong&gt; &lt;code&gt;alwaysApply: false&lt;/code&gt; with &lt;code&gt;globs&lt;/code&gt; set. The rule attaches when a matching file is in context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply Intelligently:&lt;/strong&gt; &lt;code&gt;alwaysApply: false&lt;/code&gt;, a &lt;code&gt;description&lt;/code&gt;, no globs. The agent reads the description and pulls the rule in when it judges it relevant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply Manually:&lt;/strong&gt; none of the three. The rule is used only when you @-mention it in chat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The documentation adds that rules in &lt;code&gt;.cursor/rules&lt;/code&gt; must use the .mdc extension, and that a plain .md file there is ignored because it has no frontmatter to say how to apply it. 29 of the .mdc files counted here (5.7%) have no frontmatter either, so by that table they apply only when @-mentioned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule that looks scoped but loads everywhere
&lt;/h2&gt;

&lt;p&gt;46 rules, 9.0% of the .mdc files and spread across 11 repositories, set a pattern that names some files, such as &lt;code&gt;apps/web/**&lt;/code&gt;, and also set &lt;code&gt;alwaysApply: true&lt;/code&gt;. Cursor ignores the pattern when the rule always applies, so instructions written for one part of the code reach every chat. If the rule is meant for those files only, set &lt;code&gt;alwaysApply&lt;/code&gt; to false:&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Rules for the web app&lt;/span&gt;
&lt;span class="na"&gt;globs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/web/**&lt;/span&gt;
&lt;span class="na"&gt;alwaysApply&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To find these rules in your own project, list the always rules and print any pattern they set. The pattern skips an empty &lt;code&gt;globs:&lt;/code&gt; line, which Cursor's editor writes and which scopes nothing. This is the output from a scratch folder holding four rules, one of them the case above and one an always rule with an empty &lt;code&gt;globs:&lt;/code&gt;:&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="s1"&gt;'^alwaysApply: true'&lt;/span&gt; .cursor/rules/&lt;span class="k"&gt;*&lt;/span&gt;.mdc | xargs &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-HE&lt;/span&gt; &lt;span class="s1"&gt;'^globs:[[:space:]]*[^[:space:]]'&lt;/span&gt;
.cursor/rules/web.mdc:globs: apps/web/&lt;span class="k"&gt;**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A pattern that matches every file, such as &lt;code&gt;**/*&lt;/code&gt;, loses nothing when it is ignored, so those are not counted here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor rules or AGENTS.md
&lt;/h2&gt;

&lt;p&gt;Cursor's documentation lists AGENTS.md as a simple alternative to &lt;code&gt;.cursor/rules&lt;/code&gt;: agent instructions in plain markdown, and the place to put them if you prefer plain markdown to frontmatter. Most projects here use both. 110 of the 127 repositories with Cursor rules (86.6%) also hold an AGENTS.md somewhere, though the registry finds repositories by their agent files, so a project with both is likelier to be in it. Which to choose for your own repository is in &lt;a href="https://markdownregistry.com/guides/agents-md-vs-claude-md#cursor-vs-agents" rel="noopener noreferrer"&gt;Cursor rules vs AGENTS.md&lt;/a&gt;, and every Cursor rule the registry has collected is on &lt;a href="https://markdownregistry.com/kind/rules" rel="noopener noreferrer"&gt;the Cursor rules page&lt;/a&gt;, most starred first. To start a new one from a file that passes every check the registry runs, use &lt;a href="https://mdpantry.com/s/st_va4hpwfg6jjpipw4" rel="noopener noreferrer"&gt;the Cursor rule starter on mdpantry&lt;/a&gt;, which says what to change in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;The registry collects agent markdown from public GitHub repositories and stores every version of each file by the SHA-256 of its content, the same hash &lt;a href="https://markdownregistry.com/guides/pin-agent-skills" rel="noopener noreferrer"&gt;a pinned install checks&lt;/a&gt;. We took every Cursor rule file it holds, read each one's latest stored version, and checked its bytes against its hash; 1 file with no stored version yet was left out. A file named &lt;code&gt;.cursorrules&lt;/code&gt; counts as legacy, and a file ending in .mdc as a rule file. Each .mdc file's frontmatter, the block between the first two &lt;code&gt;---&lt;/code&gt; lines, was read for &lt;code&gt;alwaysApply&lt;/code&gt;, &lt;code&gt;globs&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt;. A field with nothing after it, as Cursor's editor writes, counts as not set unless the lines under it give a value, a missing &lt;code&gt;alwaysApply&lt;/code&gt; counts as false, and a quoted &lt;code&gt;"true"&lt;/code&gt; counts as true; an inline comment is not part of a value, and an empty frontmatter block reads as Apply Manually. Each file was then sorted by the documentation's table. A pattern of &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;**&lt;/code&gt;, &lt;code&gt;**/*&lt;/code&gt;, &lt;code&gt;*.*&lt;/code&gt; or &lt;code&gt;**/*.*&lt;/code&gt; counts as matching every file. The registry crawls the public repositories it has found that hold agent files, not all of GitHub, so read the shares as describing those repositories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cursor.com/docs/rules" rel="noopener noreferrer"&gt;Cursor docs: Rules (rule types, frontmatter, AGENTS.md)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md: the open format&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Last checked October 3, 2026. The page: &lt;a href="https://markdownregistry.com/blog/how-projects-write-cursor-rules" rel="noopener noreferrer"&gt;https://markdownregistry.com/blog/how-projects-write-cursor-rules&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://markdownregistry.com/blog/how-projects-write-cursor-rules" rel="noopener noreferrer"&gt;markdownregistry&lt;/a&gt;, where the counts are kept current and the data behind them is public in &lt;a href="https://github.com/dotcomjack/state-of-agent-markdown" rel="noopener noreferrer"&gt;dotcomjack/state-of-agent-markdown&lt;/a&gt;, and the monthly counts are in &lt;a href="https://markdownregistry.com/reports" rel="noopener noreferrer"&gt;the registry's reports&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>AGENTS.md and CLAUDE.md in one repo: what 1,203 folders do</title>
      <dc:creator>DotcomJack</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:54:30 +0000</pubDate>
      <link>https://dev.to/dotcomjack/agentsmd-and-claudemd-in-one-repo-what-1203-folders-do-2217</link>
      <guid>https://dev.to/dotcomjack/agentsmd-and-claudemd-in-one-repo-what-1203-folders-do-2217</guid>
      <description>&lt;p&gt;Keep the instructions in AGENTS.md and start CLAUDE.md with an &lt;code&gt;@AGENTS.md&lt;/code&gt; line. That is what Claude Code's docs show, and the most common single setup in the 1,203 folders the registry has collected from public GitHub that hold both files: 28.8% use the import, 23.8% a symlink and 3.2% identical copies. Another 8.8% only mention the other file in words, and 35.4% keep two separate files.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;How the two files relate&lt;/th&gt;
&lt;th&gt;Folders&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CLAUDE.md imports AGENTS.md with an @AGENTS.md line&lt;/td&gt;
&lt;td&gt;347&lt;/td&gt;
&lt;td&gt;28.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One file is a symlink to the other&lt;/td&gt;
&lt;td&gt;286&lt;/td&gt;
&lt;td&gt;23.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The two files are byte for byte identical&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;3.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One file names the other without an @AGENTS.md import&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;8.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two files that share 80% or more of their lines&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;4.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two files that share 30% to 80% of their lines&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;5.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two files that share under 30% of their lines&lt;/td&gt;
&lt;td&gt;315&lt;/td&gt;
&lt;td&gt;26.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;1,203 folders in 869 public GitHub repositories that hold both an AGENTS.md and a CLAUDE.md, each file read at its latest version in the registry on October 3, 2026. How each setup was decided is under How we counted.&lt;/p&gt;

&lt;p&gt;Counted from the registry's own crawl of public GitHub, read on October 3, 2026. What Claude Code does with each setup is from &lt;a href="https://code.claude.com/docs/en/memory" rel="noopener noreferrer"&gt;its documentation&lt;/a&gt;, read the same day.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the 1,203 folders do
&lt;/h2&gt;

&lt;p&gt;The most common setup, in 28.8% of folders, is the one Claude Code's documentation shows: the instructions live in AGENTS.md, and CLAUDE.md starts with an &lt;code&gt;@AGENTS.md&lt;/code&gt; line that pulls them in. 120 of those 347 CLAUDE.md files hold other lines as well, such as instructions for Claude Code only; the other 227 hold the import and nothing else. The two most starred repositories with a folder that uses the import are &lt;a href="https://markdownregistry.com/a/art_biepnasgbypcmatg" rel="noopener noreferrer"&gt;nexu-io/open-design&lt;/a&gt; and &lt;a href="https://markdownregistry.com/a/art_dc53gpqwt7bnmttb" rel="noopener noreferrer"&gt;bytedance/deer-flow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A symlink is next, in 23.8% of folders: one file is a link to the other, so both names open the same text. In 228 of those 286 folders CLAUDE.md points to AGENTS.md; in the rest AGENTS.md points to CLAUDE.md. The two most starred with a CLAUDE.md linked to AGENTS.md are &lt;a href="https://markdownregistry.com/a/art_j6b6o6rdtlhckvb3" rel="noopener noreferrer"&gt;code-yeongyu/oh-my-openagent&lt;/a&gt; and &lt;a href="https://markdownregistry.com/a/art_xwcfbpi5yh6vnqjs" rel="noopener noreferrer"&gt;coreyhaines31/marketingskills&lt;/a&gt;. Only 3.2% keep two byte for byte identical copies, which stay identical only until someone edits one of them.&lt;/p&gt;

&lt;p&gt;Then come the folders that keep two files. 51 hold two files that share most of their lines, the usual sign of a copy that has started to drift. 315, more than a quarter, hold two files that share under 30% of their lines. 807 of the 1,203 folders are the repository root; the rest sit inside packages and subdirectories. By a repository's stars when it was crawled, the import or a symlink is used about equally below 1,000 stars (51.3% of 811 folders in repositories with under 100 stars; 52.8% of 229 folders in repositories with 100 to 999 stars) and somewhat more often at 1,000 or more (58.9% of 163 folders in repositories with 1,000 stars or more).&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude Code reads in each setup
&lt;/h2&gt;

&lt;p&gt;By default, Claude Code reads AGENTS.md only when there is no CLAUDE.md in the working directory or above it, according to &lt;a href="https://code.claude.com/docs/en/memory#when-claude-code-reads-agents-md" rel="noopener noreferrer"&gt;When Claude Code reads AGENTS.md&lt;/a&gt;. In every folder counted here a CLAUDE.md exists, so by default CLAUDE.md is what Claude Code loads, and AGENTS.md reaches it only through that file, unless the Project instructions setting is changed to read both.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;An import.&lt;/strong&gt; The imported file is expanded and loaded at launch with the CLAUDE.md that names it, and the docs say keeping the import never makes Claude read AGENTS.md twice. Claude Code reads AGENTS.md on its own from version 2.1.277, so the docs say a CLAUDE.md that holds nothing but the import can be removed, or kept if some of your sessions cannot load AGENTS.md directly. 227 of the CLAUDE.md files here hold only the import; before removing one, check that no other CLAUDE.md, .claude/CLAUDE.md or CLAUDE.local.md sits in the same folder or any folder above it, since that file would then be read instead of AGENTS.md.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A symlink.&lt;/strong&gt; The docs say to leave it or delete it; either way Claude reads the content once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A mention in words.&lt;/strong&gt; A CLAUDE.md that tells Claude to read AGENTS.md works only if Claude decides to open the file. For that file the docs advise deleting it, with the same version and folder caveats as the import, or replacing the sentence with an &lt;code&gt;@AGENTS.md&lt;/code&gt; import. 106 folders, 8.8%, fall in this group, which also counts an AGENTS.md that names CLAUDE.md, where that advice does not apply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two separate files.&lt;/strong&gt; Claude Code follows CLAUDE.md, and an agent that reads AGENTS.md follows that file. The &lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md site&lt;/a&gt; adds that the AGENTS.md closest to the edited file wins, so a package's own AGENTS.md beats the root one for those agents. In 315 folders the two files share under 30% of their lines.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When a symlink is the wrong choice
&lt;/h2&gt;

&lt;p&gt;On macOS and Linux a symlink works, and Claude reads the instructions once. Claude Code's documentation names two limits on it, in &lt;a href="https://code.claude.com/docs/en/memory#share-one-file-with-other-coding-tools" rel="noopener noreferrer"&gt;Share one file with other coding tools&lt;/a&gt;. Its Edit and Write tools refuse to write through a symlink and send Claude to edit the target instead. And on Windows, creating one needs Administrator rights or Developer Mode, while a clone made without symlink support gets a one-line text file in place of the instructions. Git's own &lt;a href="https://git-scm.com/docs/git-config#Documentation/git-config.txt-coresymlinks" rel="noopener noreferrer"&gt;core.symlinks documentation&lt;/a&gt; says the same: with the setting false, symbolic links are checked out as small plain files that contain the link text.&lt;/p&gt;

&lt;p&gt;So if anyone who clones the repository works on Windows, the docs recommend the import over the symlink. 286 of the folders counted here, 23.8%, depend on a symlink. In the 58 where AGENTS.md is the link, a clone without symlinks gives every agent that reads AGENTS.md a file holding only the link's target path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check which setup your repository uses
&lt;/h2&gt;

&lt;p&gt;Git records a symlink with the mode &lt;code&gt;120000&lt;/code&gt; and a regular file with &lt;code&gt;100644&lt;/code&gt; (&lt;code&gt;100755&lt;/code&gt; when it is executable), so &lt;code&gt;git ls-files -s&lt;/code&gt; shows which you have. &lt;code&gt;grep -n '@'&lt;/code&gt; lists every line of a CLAUDE.md that may hold an import, since an import can sit anywhere in a line; one inside a code span or a code block does not count. This is the output from a scratch repository with a symlinked CLAUDE.md at the root and an importing one in &lt;code&gt;web/&lt;/code&gt;:&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="nv"&gt;$ &lt;/span&gt;git ls-files &lt;span class="nt"&gt;-s&lt;/span&gt; AGENTS.md CLAUDE.md web/CLAUDE.md
100644 c210dd0e847e27d735268681eea5d9f7f922dc99 0   AGENTS.md
120000 47dc3e3d863cfb5727b87d785d09abf9743c0a72 0   CLAUDE.md
100644 6324e0d711ec068444d8cd34b915543eac643443 0   web/CLAUDE.md
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'@'&lt;/span&gt; web/CLAUDE.md
1:@AGENTS.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To confirm what Claude Code loaded, the docs suggest running &lt;code&gt;/context&lt;/code&gt; in your next session and checking that CLAUDE.md appears under Memory files. To see the files other repositories use, every CLAUDE.md the registry has collected is on &lt;a href="https://markdownregistry.com/kind/claude" rel="noopener noreferrer"&gt;the CLAUDE.md page&lt;/a&gt; and every AGENTS.md on &lt;a href="https://markdownregistry.com/kind/agents" rel="noopener noreferrer"&gt;the AGENTS.md page&lt;/a&gt;, most starred first. To start a new one from a file that passes every check the registry runs, use &lt;a href="https://mdpantry.com/s/st_zdlp6lbqoiyo3ecb" rel="noopener noreferrer"&gt;the AGENTS.md starter on mdpantry&lt;/a&gt;, which says what to change in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;The registry collects agent markdown from public GitHub repositories and stores every version of each file by the SHA-256 of its content. We took every folder where one repository holds both an AGENTS.md and a CLAUDE.md in the same directory, read each file's latest stored version, and checked its bytes against its hash. 18 more folders were left out because one of the two files had no stored version yet; every file in the folders counted was read and matched its hash. A CLAUDE.md inside &lt;code&gt;.claude/&lt;/code&gt; counts only against an AGENTS.md in that same folder.&lt;/p&gt;

&lt;p&gt;Each folder was put in the first group it matched, in this order: identical bytes; a symlink, meaning one file's whole content is a path ending in the other file's name, which is how GitHub serves a symlink's contents; an import, meaning an &lt;code&gt;@AGENTS.md&lt;/code&gt; reference in CLAUDE.md (this count does not leave out one written inside a code block); a mention in words, meaning a file under 600 bytes that names the other file, or an AGENTS.md that refers to &lt;code&gt;@CLAUDE.md&lt;/code&gt;; and otherwise two separate files, compared by the share of their distinct non-blank lines that appear in both. Two edge cases fall where these rules put them: a CLAUDE.md that imports a different path such as &lt;code&gt;@docs/AGENTS.md&lt;/code&gt; counts as a mention in words when it is short and is compared as two separate files when it is longer, and a symlink to an AGENTS.md in another folder counts as a symlink. The registry crawls the public repositories it has found that hold agent files, not all of GitHub, so read the shares as describing those repositories. The full method for the registry's data is in &lt;a href="https://markdownregistry.com/reports/state-of-agent-markdown-2026-09" rel="noopener noreferrer"&gt;State of agent markdown, September 2026&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/memory" rel="noopener noreferrer"&gt;Claude Code docs: How Claude remembers your project (AGENTS.md, imports, symlinks)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md: the open format and its FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-config#Documentation/git-config.txt-coresymlinks" rel="noopener noreferrer"&gt;Git documentation: git-config, core.symlinks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Last checked October 3, 2026. The page: &lt;a href="https://markdownregistry.com/blog/agents-md-and-claude-md-in-one-repo" rel="noopener noreferrer"&gt;https://markdownregistry.com/blog/agents-md-and-claude-md-in-one-repo&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://markdownregistry.com/blog/agents-md-and-claude-md-in-one-repo" rel="noopener noreferrer"&gt;markdownregistry&lt;/a&gt;, where the counts are kept current and the data behind them is public in &lt;a href="https://github.com/dotcomjack/state-of-agent-markdown" rel="noopener noreferrer"&gt;dotcomjack/state-of-agent-markdown&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
