TL;DR
In a fourteen-month window from January 2025 to March 2026, every major vendor of agentic coding tools — GitHub, Anthropic, OpenAI, Google — shipped the same interface: a markdown file at a specific path that tells their AI agent how to behave in your repo. GitHub Copilot's .github/copilot-instructions.md landed January 21, 2025. Anthropic's Claude Code with CLAUDE.md shipped February 24, 2025. The agents.md spec repo was created August 19, 2025 and now claims over 60,000 open-source projects. Anthropic's Skills (SKILL.md) followed October 16, 2025. Four vendors, one file format, one year. Markdown is now the source code for AI-assisted engineering. The LLM is the compiler. Treating your .md files like documentation is the most expensive mistake on your team.
The weird realization
Open any repository that's been touched by a serious AI-assisted workflow in the last twelve months and do a quick audit of what's changed at the root level. You'll find familiar things — package.json, tsconfig.json, .gitignore. And then you'll find something that didn't exist eighteen months ago: a small constellation of markdown files with very specific names.
CLAUDE.md. AGENTS.md. GEMINI.md. .github/copilot-instructions.md. A .claude/ directory with skills/ and rules/ subfolders full of more markdown. A docs/plans/ folder with step-by-step implementation plans. A specs/ folder. .cursor/rules/ with Cursor's MDC files. Every single one of these is markdown.
Here is the thing nobody is saying clearly enough: these files are executable. Not in the Unix chmod +x sense. In the much more interesting sense that an LLM reads them, binds their contents into its working context, and then takes actions in the world based on what they say. Anthropic states the mechanism outright in the Claude Code memory docs: "CLAUDE.md files are markdown files that give Claude persistent instructions for a project, your personal workflow, or your entire organization" — and, critically, "CLAUDE.md content is delivered as a user message after the system prompt." Read that last sentence twice. The markdown is not documentation being displayed to a reader. It is a message sent to the model, every turn, as if a teammate had typed it into the chat box themselves.
We have, without really announcing it to ourselves, invented a new programming language. It looks like prose. It compiles to tool calls and diffs. And it's the most important source code in your repository that nobody is reviewing carefully.
The old role of markdown
To see how dramatically this inverts markdown's traditional role, it helps to remember what the format was designed for. John Gruber launched Markdown on Daring Fireball in March 2004, with version 1.0.1 packaged December 17, 2004. His stated goal was explicit: "Markdown is a text-to-HTML conversion tool for web writers" and "the overriding design goal for Markdown's formatting syntax is to make it as readable as possible." In the same document he went further: "A Markdown-formatted document should be publishable as-is, as plain text, without looking like it's been marked up with tags or formatting instructions." Gruber's inspiration? "The single biggest source of inspiration for Markdown's syntax is the format of plain text email."
That was the brief. Markdown was designed for humans typing prose that would end up rendered as HTML on the web. CommonMark — the spec that standardized Markdown — has been actively versioned since October 2014 (v0.5), with the current version 0.31.2 released January 28, 2024. Twenty years of mature infrastructure for writing text that humans can read and machines can parse.
For those twenty years, .md files in a codebase did one of two things:
-
Describe the code to humans —
README.md,CONTRIBUTING.md,CHANGELOG.md. These were artifacts humans read when they wanted to understand or contribute to a project. They had no causal effect on the software itself. You could delete every.mdfile in a repo and the binary would build identically. -
Generate static content — blog posts, docs sites, Jekyll, Hugo, Docusaurus. Here markdown was an input to a build step that produced HTML. Still inert as far as the running software was concerned.
In both cases, markdown was downstream of the code. The code was the truth; the markdown was commentary, either for humans or for static site generators. If the two disagreed, the code won and the docs were flagged as stale.
That hierarchy has flipped. When you're pair-programming with an agent, the markdown isn't describing what the code does — it's telling the agent what the code should do next. The causal arrow now points from .md → code, not code → .md. A line in your CLAUDE.md that says "all API responses must be typed with zod schemas" doesn't document a convention. It produces that convention on every file the agent touches going forward.
The fourteen-month convergence
What makes this moment specific is how quickly the entire tool ecosystem landed on the same interface. Here is the timeline, with receipts:
| Date | Vendor | File | Source |
|---|---|---|---|
| 2025-01-21 | GitHub | .github/copilot-instructions.md |
GitHub Changelog |
| 2025-02-24 | Anthropic | CLAUDE.md (Claude Code) |
Anthropic News |
| 2025-08-19 | Agentic AI Foundation | AGENTS.md spec repo |
github.com/agentsmd/agents.md |
| 2025-10-16 | Anthropic | SKILL.md (Claude Skills) |
Skills announcement |
GitHub's custom instructions docs are explicit about the format: "Add natural language instructions to the file, in Markdown format." Anthropic's Skills post defines skills as "folders that include instructions, scripts, and resources that Claude can load when needed" — with each skill requiring a SKILL.md file. Google's Gemini CLI uses GEMINI.md, loaded hierarchically from ~/.gemini/GEMINI.md and workspace ancestors. Aider's conventions docs put it in maintainer voice: "The easiest way to do that with aider is to simply create a small markdown file and include it in the chat."
And the cross-vendor agents.md standard pulls them all together. The agents.md home page describes its file as "a README for agents: a dedicated, predictable place to provide the context and instructions to help AI coding agents work on your project," and lists 22 tools that support it, including OpenAI Codex, Google Jules, Aider, goose, Zed, Warp, VS Code, Devin, JetBrains Junie, Cursor, Gemini CLI, GitHub Copilot, and Windsurf. Anthropic explicitly ceded the filename war in its own docs: "Claude Code reads CLAUDE.md, not AGENTS.md. If your repository already uses AGENTS.md for other coding agents, create a CLAUDE.md that imports it."
Four vendors. Twenty-two tools. Over 60,000 open-source projects. One file format. One year.
What makes something a "programming language"
If you stare hard at what programming languages have in common, you can tease out maybe six properties they all share. I want to walk through each of them and show that markdown-for-agents has quietly acquired every one.
1. A runtime that executes the source
Every programming language needs something that takes source text and does something with it. CPython reads .py. node reads .js. rustc compiles .rs. In agent-assisted engineering, the LLM is the runtime. It reads .md, produces a chain of tool calls, and modifies the world. This isn't a metaphor — Anthropic's own docs describe a literal compilation step: CLAUDE.md files are "loaded into the context window at the start of every session, consuming tokens alongside your conversation" and their contents are "delivered as a user message after the system prompt." The .md on disk becomes a token sequence prepended to the model's input. That is a compiler.
2. Scoping rules
Real languages have scope. Globals, module-level, function-local, block-local. Markdown-for-agents has acquired the same stratification, and the Claude Code docs spell it out in a table with four explicit tiers:
- Managed policy:
/Library/Application Support/ClaudeCode/CLAUDE.md(macOS), for organization-wide instructions deployed by IT/DevOps and unblockable by individual users. - Project:
./CLAUDE.mdor./.claude/CLAUDE.md, team-shared via version control. - User:
~/.claude/CLAUDE.md, personal preferences across all projects. - Local:
./CLAUDE.local.md, per-project gitignored preferences.
The docs describe the merge semantics precisely: "All discovered files are concatenated into context rather than overriding each other." Inner scopes don't shadow outer ones — they compose. This is exactly how .editorconfig, .gitignore, and lexical environments in real programming languages work, re-derived from first principles because it's the only pattern that makes sense once you have multiple overlapping sources of instructions.
3. Composition
Programming languages let you build big things out of small things. You have imports, includes, modules. Markdown-for-agents has this too — explicitly. CLAUDE.md supports an @path/to/import syntax that loads other markdown files into context, with "a maximum depth of five hops" of recursive imports. The docs show an example:
See @README for project overview and @package.json for available npm commands for this project.
# Additional Instructions
- git workflow @docs/git-instructions.md
This is the first time in the history of prose that the footnotes execute. Skills reference other skills. Rules reference rules. Plans reference specs. Your CLAUDE.md says "see docs/architecture.md" and the agent actually pulls that file into context — which means the reference wasn't decorative, it was a transitive dependency.
4. Versioning and reproducibility
Your .md files are checked into git. That means they have a commit history, can be bisected, can be rolled back, can be diffed. A junior engineer can open a PR that modifies CLAUDE.md and the senior reviewer can see the exact behavioral change proposed and say "no, we had this rule for a reason, here's the incident from last quarter." This is code review for prompts, and the fact that it happens in the exact same GitHub UI as code review for code is not a coincidence — it's because they're the same kind of artifact now.
The infrastructure itself is mature. CommonMark 0.31.2 is the current version of a spec that has been actively versioned since v0.5 in 2014 — twenty years since Gruber shipped Markdown 1.0.1 in December 2004. There is no language lawyer ambiguity about how a ## Heading parses. You cannot say that about a prompt in a text box.
5. Tooling
Every real programming language grows an ecosystem of tools around it: linters, formatters, test runners, debuggers, package managers. Markdown-for-agents is in the early phase of this, but the shape is already visible.
Cursor's rules system formalized a variant called MDC (.mdc), stored in .cursor/rules/ directories, with four rule types (Always, Auto Attached, Agent Requested, Manual). Anthropic's Skills require each skill folder to contain a SKILL.md with YAML frontmatter declaring name and description — a full package-manifest convention expressed in markdown. Claude Code rules support YAML frontmatter with a paths field for glob-based conditional loading:
---
paths:
- "src/api/**/*.ts"
---
Rules only load when Claude opens matching files. That is lexical scoping plus lazy loading — language-level features bolted onto prose. Five years from now, "running the prompt tests" will be as normal in CI as running the unit tests. The pieces are being built right now.
6. A community of practitioners who take the craft seriously
The final ingredient is cultural: a group of people who treat the language as a thing worth mastering. The 22 tools listed on agents.md — spanning JetBrains, Google, OpenAI, GitHub, Anthropic, and every major independent coding agent — are a cultural artifact. So is the fact that the agentsmd/agents.md spec repo accumulated nearly 20,000 GitHub stars in its first seven months. So is the talk among the best AI-assisted engineers I know, who don't swap clever prompts anymore — they swap file architectures. How to structure CLAUDE.md so the agent finds the right rule without drowning in irrelevant ones. When to split instructions into a skill versus keeping them inline. How to write a spec that a model can execute without wandering. These are craft questions, and they look exactly like the craft questions good engineers have always asked about code.
The file that runs on every keystroke
Here's a concrete mental model that makes the shift viscerally clear. When you're coding with a traditional IDE, your source files sit on disk, and nothing happens to them until you hit compile. When you're coding with an AI agent, Anthropic's docs tell you exactly what happens: CLAUDE.md is "loaded into the context window at the start of every session." Every new conversation. Every time you open a new terminal. Every time you hit enter, that file's contents are already in the model's context, shaping the decision.
This changes the risk calculus of what you put in that file enormously. A bug in your utils.ts affects the function it's in. A bug in your CLAUDE.md affects every future decision the agent makes in your repo until you notice and fix it. If you've ever told an agent "always use the existing helper function for X" and then found it reinventing that helper an hour later, you have experienced a runtime bug in your markdown. The line you wrote didn't parse the way you thought it did. The instruction was too ambiguous, or it was buried where the model's attention didn't land, or it conflicted with an earlier line.
The Anthropic docs are unusually honest about this failure mode. They note in the troubleshooting section: "CLAUDE.md content is delivered as a user message after the system prompt, not as part of the system prompt itself. Claude reads it and tries to follow it, but there's no guarantee of strict compliance, especially for vague or conflicting instructions." Translation: this is not a hard language. It is a probabilistic runtime with soft guarantees. Debugging is its own discipline — not like debugging code, because there's no stack trace, but not like nothing either. You read the conversation log, identify where the agent went wrong, trace back to the ambiguous or missing rule, and edit the markdown. That is a debugging loop.
Why this happened to markdown specifically
There's a fair question lurking here: why .md? Why not YAML, or JSON, or a bespoke DSL someone invented for prompting? Several teams have tried structured formats for agent instructions — Cursor's MDC being the most successful, though it's still fundamentally markdown with a YAML header. Markdown keeps winning, and I think the reasons are worth naming because they say something about what AI-assisted engineering actually needs.
The first is a twenty-year-old design choice that aged into exactly the right shape. In 2004, John Gruber wrote on Daring Fireball: "The overriding design goal for Markdown's formatting syntax is to make it as readable as possible" and "the single biggest source of inspiration for Markdown's syntax is the format of plain text email." In 2025, Anthropic's Claude Code docs describe the format requirement for effective CLAUDE.md files this way: "Claude scans structure the same way readers do: organized sections are easier to follow than dense paragraphs." Two quotes, twenty-one years apart, making the same claim: a format optimized for human scannability is also optimal as model input. Gruber's design goal turned out to be a specification for LLM-friendly prose before LLMs existed.
The second reason is training exposure. Markdown is everywhere LLMs were trained. It's in The Stack — BigCode's 3.1 TB, 30-language code pretraining corpus, expanded in later versions to 5.28 billion unique files across 358 file types. It's in The Pile, EleutherAI's 825 GiB foundation corpus. It's in the Octoverse 2024 report's 5.2 billion annual contributions across 518 million GitHub projects — and especially in the 137,000 public generative AI projects that grew 98% year-over-year in 2024. No vendor has published a breakdown of exactly what fraction of pretraining data is markdown, but every major code corpus includes .md as a first-class file type, and the models have deep, unforced priors about how headings, lists, code fences, and emphasis work.
The third reason is that markdown is legible to humans at no extra cost. The same file that instructs the agent can be read by your teammate during code review, by the security auditor during a compliance pass, by you at 2 AM when you're wondering why the agent keeps making the same mistake. There is no compile step between the source and the human-readable form. They are the same artifact. This eliminates an entire class of drift bugs that would appear if the machine-readable and human-readable versions were separate files.
The fourth is graceful degradation. If the agent doesn't perfectly understand one section, it still picks up the rest. A JSON config with a missing comma is a hard failure. A markdown file with a confusingly worded paragraph is a soft one — the agent does its best with the parts it did understand. For a probabilistic runtime, soft failure modes are the right ones.
The fifth is that markdown is extensible without a spec committee. Anthropic's rules format adds a YAML paths field. Cursor's MDC adds its own rule-type metadata. The Agents.md spec layers a README-like convention on top. None of these required a version bump to CommonMark. They just picked a frontmatter key and shipped. This is almost the opposite of how programming languages usually evolve, and it's exactly what you want during a period of rapid experimentation.
Implications for how you work
If you accept the framing — that .md files are now the most strategic source code in a repo — several practical things follow.
Your prompt files deserve real engineering investment. That means code review, version control discipline, style guides, refactoring when they grow unwieldy, and yes, tests. If your team has a standard for TypeScript and no standard for CLAUDE.md, you have a gap that will bite you. Anthropic's docs even suggest a size budget: "target under 200 lines per CLAUDE.md file. Longer files consume more context and reduce adherence." Budgets. For prose.
Documentation is no longer downstream of code. The old model was: write the code, then document it. The new model is: write the specification in markdown, have the agent produce code from it, then the markdown is the documentation because it was the source of truth all along. This sounds like a small shift but it reorders the economics of technical writing. The person who writes the clearest markdown ships the most code.
"Prompt engineering" is just software engineering. The early framing of prompt engineering as a separate discipline treated it like a quirky art form. That was fair when prompts were ad-hoc strings in a notebook. It isn't fair anymore, because the prompts now live in versioned files with scopes, dependencies, and review processes — which is to say, they live in a codebase, and editing them is software engineering. The sooner teams stop treating .md authoring as a hobby and start treating it as the skilled craft it is, the faster they'll compound.
The quality of your project's markdown is a proxy for the quality of everything an AI agent produces in it. If your CLAUDE.md is vague, your agent-generated code will be vague. If your skills are sharp and your plans are precise, the output compounds. Teams that figure this out are outshipping teams that don't, and the gap is widening.
What this means for documentation tools
I'll close with the thing that is obviously on our minds at PikaDocs, because it's why we're writing this in the first place. If markdown is the programming language of AI-assisted engineering, then generating good markdown for a codebase is not a documentation task — it's a compiler input task. The docs you generate for your framework, your library, your API, your internal tools are not going to be read primarily by humans scrolling a docs site. They're going to be read by agents, pulled into context windows, and used to produce code.
That changes what "good documentation" means. It needs to be structured so the relevant piece can be found quickly by something scanning for keywords. It needs to be precise about things agents get wrong by default. It needs to be honest about edge cases rather than optimistically vague. It needs to compose — a doc for library X should be readable alongside a doc for library Y without contradicting it. These are the properties of a good standard library reference, not a good marketing brochure, and they're what we're trying to make easy to produce.
The teams that treat their markdown as source code will ship faster than the teams that treat it as an afterthought. That has always been true about documentation in some fuzzy way. It has become concretely, measurably, commit-by-commit true now that the documentation is what runs.
Sources
All primary sources referenced above, accessed 2026-04-04:
- Anthropic Claude Code memory documentation — code.claude.com/docs/en/memory
- Anthropic Skills announcement (October 16, 2025) — claude.com/blog/skills
- Anthropic Claude 3.7 Sonnet / Claude Code launch (February 24, 2025) — anthropic.com/news/claude-3-7-sonnet
- GitHub Copilot custom instructions announcement (January 21, 2025) — github.blog changelog
- GitHub Copilot custom instructions docs — docs.github.com
- AGENTS.md specification — agents.md · github.com/agentsmd/agents.md
- Google Gemini CLI GEMINI.md docs — github.com/google-gemini/gemini-cli
- Aider conventions documentation — aider.chat/docs/usage/conventions.html
- Daring Fireball Markdown project page (John Gruber, 2004) — daringfireball.net/projects/markdown
- CommonMark specification — spec.commonmark.org
- The Stack (BigCode pretraining corpus, arXiv 2211.15533) — arxiv.org/abs/2211.15533
- The Pile (EleutherAI foundation corpus, arXiv 2101.00027) — arxiv.org/abs/2101.00027
- GitHub Octoverse 2024 — github.blog/octoverse-2024
PikaDocs generates high-quality, agent-ready documentation for any codebase or library. If you're tired of your AI coding assistant hallucinating APIs because its training data is stale, we built this for you.
Pika