Shopify's CEO Just Threatened to Ban Claude Code — Over a Markdown File
胡新宇
发布于 2026-08-26
Tobi Lütke is considering banning Claude Code inside Shopify — not for model quality, but because of a filename. This is the next AI tooling war.
Shopify's CEO Just Threatened to Ban Claude Code — Over a Markdown File
Tobi Lütke, the CEO of Shopify, posted on X last week that he's considering banning Claude Code inside Shopify — not because of model quality, not because of price, but because Claude Code insists on reading a file named CLAUDE.md instead of AGENTS.md. The thread went viral. The Claude Code team replied. And the whole thing is a preview of how AI vendor fights are going to be fought in the next two years.
This is not a story about benchmarks. It's a story about a file in your repo root.
Two files, one job
If you've shipped an AI coding tool in the last year, you know what an agent instructions file looks like. It's a Markdown document at the repo root that tells the agent how to behave: which test command to run, which code style to follow, what skills are available, which MCP servers to call. It's the operating manual for the AI.
OpenAI Codex reads AGENTS.md. Cursor reads AGENTS.md. Amp reads AGENTS.md. The de-facto industry standard is AGENTS.md.
Claude Code reads CLAUDE.md. Plus .claude/skills/.
Both files do the same thing. Neither reads the other.
This is not an accident. In a thread reply, Anthropic's Thariq explained why Claude Code went its own way: Claude models have specific preferences for how skills, system prompts, and instruction files are organized, and the team tunes Claude Code's system prompt around that. Generic support would, in their view, degrade model quality. The team has spent the last year publishing context-engineering material arguing exactly this point — that prompt composition matters more than file naming, and that treating "instructions" as a single shared document flattens model-specific behavior into mush.
#AI编程#Anthropic#Claude#OpenAI#Codex
Shopify's CEO Just Threatened to Ban Claude Code — Over a Markdown File
AGENTS.md
The community didn't buy it. AGENTS.md was already a vendor-neutral artifact, designed precisely to avoid this kind of fragmentation. Claude Code became the holdout.
There's a quieter version of the same fight already happening inside Cloudflare's just-released Agent Tracing. Same vendor, two frameworks: Think and wrapAISDK() don't store message or tool payload by default. Flue does, and needs content: false to stop. Same feature, opposite defaults depending on which harness you picked. The pattern is consistent: the configuration surface is where vendors plant their bet, and where lock-in hides in plain sight.
The workarounds that don't scale
The standard Stack Overflow answer for this problem is ln -s AGENTS.md CLAUDE.md. For a 10-file personal project, it works. For a Shopify-scale monorepo with thousands of developers and hundreds of subdirectories, it doesn't.
Three workarounds circulate in the community, and none of them survive a real production monorepo:
ln -s AGENTS.md CLAUDE.md — fine until one directory forgets to maintain both files in sync. Symlinks don't follow you across a git checkout that doesn't preserve them. CI runners on Windows break them outright.
Embed @AGENTS.md inside CLAUDE.md — works for a Claude Code user in isolation. The moment a teammate opens the same repo with Codex, they read a different file and get different rules. Two PRs, two agents, two opinions on whether the linter should run.
CI scripts that regenerate both files — works until they break, and they always break. Anyone who has maintained a pre-commit hook that syncs .editorconfig knows this shape of pain: the script that was supposed to remove the complexity tax becomes the new thing you have to maintain.
Tobi spelled out the actual concern in his second reply. Configuration files like CLAUDE.md and AGENTS.md are recursively applied down the directory tree. In a monorepo, every subdirectory is a place where the two files can drift apart. The moment one directory is missing one of them, two developers in the same codebase get different AI behavior. Tobi called this "a complexity tax that shouldn't fall on developers" (X post 2092259436538495186).
This is the same shape of problem as .gitignore drift across submodules — except here the consequences aren't a missed build, they're a teammate's AI silently breaking the test suite.
Worth pausing on what "different AI behavior" actually looks like in practice. It isn't that one developer gets a worse coding agent. It's that the same pull request, opened in the same repo, run through the same CI, gets reviewed by two agents that have read different ground truth. One follows the team's lint rules. The other doesn't. One runs the database migration before tests. The other doesn't. The PR is "merged" by both bots and breaks production for whichever side lost the coin flip. The bug isn't in the code. It's in the configuration surface, and no static analysis will catch it.
What Anthropic actually said
Thariq's reply was careful. He acknowledged the maintenance burden, pointed at Anthropic's existing context-engineering work (Claude 5 generation reportedly removed ~80% of the Claude Code system prompt), and signaled that a config-flexibility feature is in progress. Exact timeline: not stated.
The subtext is more interesting than the words. Anthropic heard the public pressure and is moving. They haven't shipped. A CEO with a public platform is doing what GitHub issues couldn't.
This is how vendor behavior changes in 2026: not through RFCs, but through executives naming names on X.
The deeper story behind Thariq's response is the context-engineering thesis Anthropic has been pushing publicly for months. Claude Code's architecture assumes a Claude-shaped context: specific instructions in specific places, with a system prompt tuned for Claude's behavior. In that world, an AGENTS.md written for a generic agent — broad, vendor-neutral, agnostic of model quirks — looks like a degraded prompt. Anthropic's argument is essentially that the file matters less than the prompt composition that consumes it. Whether you find that convincing or convenient, the market has now spoken, and the market prefers fewer files.
Why this is the new battleground
The 3-month agent-harness cycle is now obvious: every vendor ships their own runtime (Codex harness, Claude Code harness, Cloudflare Agents harness, Gemini's harness). The model is the commodity. The harness is the moat. And the configuration surface is the only thing two vendors can lock down unilaterally.
This is a pattern, and it has played out before. Package managers split into package.json, Pipfile, Cargo.toml. Linters split into .eslintrc, .pylintrc, rustfmt.toml. Editor configs split into .editorconfig, .prettierrc, biome.json. CI systems split into .github/workflows, .gitlab-ci.yml, Jenkinsfile. Each time, an industry picks one or two winners a decade later, and the others go to maintenance mode. The winners are the ones that chose their file name carefully and let the community reach for it.
The AI agent space is running the same playbook, on a faster loop. AGENTS.md was supposed to be the converging artifact. It became one half of a two-file standard instead.
The irony is sharp. AGENTS.md was an OpenAI-led initiative specifically to prevent vendor lock-in. The fact that it became "AGENTS.md (everywhere) vs CLAUDE.md (Anthropic)" is the lock-in reopening, one filename at a time.
There's also a more cynical reading. Anthropic's context-engineering thesis is correct on the merits — different models do behave differently under different prompt shapes. But it is also a thesis that conveniently justifies a non-standard config file. The first company to ship genuine AGENTS.md support for Claude Code will be the first to admit that the convenience argument was the real reason. Until then, the technical argument is doing double duty.
The same dynamic played out a decade ago with code formatters. Prettier bet that one canonical formatter, with one config file, would beat every per-language formatter with bespoke configs. They were right. The community consolidated on prettierrc and biome.json, and the customization tax on the user dropped to near-zero. AI coding tools are about to run the same race, and they haven't realized it yet.
There's one more layer to this that nobody in the thread addressed. If config-file names become the new battleground, then the vendors who control the defaults in those files will quietly shape the entire ecosystem. Codex, Cursor, and Amp have already shipped with sensible defaults in AGENTS.md. Anthropic is the only major vendor that built its own surface and called it a feature. That choice will compound. Every Claude Code user who has ever customized CLAUDE.md is a user who would have to start over if they switched tools — and that switching cost is exactly the kind of moat that justifies building a non-standard file in the first place.
What this means for you
If you're in a small project: stop reading this article, run ln -s AGENTS.md CLAUDE.md, ship code, move on.
If you're in a monorepo: pick one canonical config file as the source of truth, and generate the others at CI time. Or — and this is the more durable fix — push your AI tool vendor to support the standard. The Tobi-Lütke-on-X playbook works. Vendor roadmaps follow public pressure.
If you're choosing an AI coding tool for a team: ask "what config file does it read?" before you ask "what's the MML score?". A 2-point benchmark improvement means nothing if it ships a config file that breaks your monorepo.
If you're an AI tool vendor: ship config-file interoperability, or expect a CEO to call you out. The next fight is already brewing — .claude/skills/ vs .agents/skills/ is the same trap with a different file extension.
In the agent era, the file in your repo root is more important than the model behind it.
What happens next
Tobi's threat worked. It forced a feature onto Anthropic's roadmap. That is the new mechanism for change in AI tooling. The next vendor to ship a non-standard config file will face the same public pressure.
The era of AI tools being measured by benchmarks is closing. The era of being measured by how well they fit into your repo has begun. The file name is the new benchmark.