Claude Code silently skipped AGENTS.md when telemetry was disabled — what 2.1.281 fixed and what remains
Up to 2.1.280, Claude Code did not read AGENTS.md when telemetry was off. What 2.1.281 fixed and what still remains.
On this page
AGENTS.md is a project instruction file shared by several coding agents, including OpenAI Codex. You write down things like build commands, coding rules and files not to touch, and the agent reads them when a session starts. Claude Code used to read only its own CLAUDE.md, but with 2.1.277, released on September 18, 2026, its changelog announced that "in a project with no CLAUDE.md, Claude Code reads AGENTS.md instead." But in sessions with telemetry (usage statistics reporting) turned off, the feature was disabled without any warning. This was because the feature's on switch was a feature flag fetched from Anthropic's servers, and the code said to treat the flag as 'off' when it could not be fetched. In 2.1.281, released on September 23, this default changed to 'on'. We downloaded the executables of five versions published on npm and compared them, and reproduced 10 combinations with the official executables, to establish what was fixed and what remains.
1. Executive summary
DISABLE_TELEMETRY, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC or DO_NOT_TRACK turned on, AGENTS.md never reached the model (our reproduction). According to the changelog and the official docs, the same was true of sessions going through Bedrock, Vertex or Foundry. The model did not ignore the instructions; the file never entered the context. Upgrade to 2.1.281 or later. In CI or containers pinned to a version, a one-line CLAUDE.md containing @AGENTS.md works regardless of version, and the official docs recommend it too. Note, though, that 2.1.281 did not remove the feature flag. In sessions that fetch feature flag values from the server, the value the server sends still takes precedence.Bracketed numbers refer to the sources at the end. We checked every quotation and figure against the original on 2026-09-24.
2. What happened
In Claude Code, reading AGENTS.md is handled not by the core but by the built-in plugin agents-md. When a session starts, this plugin looks for AGENTS.md in the working directory and its parent directories and inserts it as project instructions where CLAUDE.md would go. The times below are UTC, as recorded by the npm registry, GitHub and Hacker News.
| Time (UTC) | What happened | Source |
|---|---|---|
| 2026-09-18 01:39 | 2.1.276 released. The executable already contained the agents-md plugin; the default behavior at this point was to read CLAUDE.md only | Executable [6] |
| 2026-09-18 16:22 | 2.1.277 released. Changelog: "in a project with no CLAUDE.md, Claude Code reads AGENTS.md instead … (not yet on Bedrock, Vertex or Foundry)" | Changelog [3] |
| 2026-09-18 17:35 | Plugin source mods/agents-md published in the anthropics/claude-code repository (PR #95409) | GitHub [7] |
| 2026-09-20 15:33 | Issue #95690 filed. Its title ends "A Local Feature Locked Behind a Remote Switch" | GitHub [2] |
| 2026-09-22 15:44 | 2.1.280 released | npm [6] |
| 2026-09-23 08:38 | The original author posts measurements on the issue and writes them up on a blog the same day | [1] [2] |
| 2026-09-23 12:15 | Posted to Hacker News. 448 points and 254 comments as of 2026-09-24 | HN [8] |
| 2026-09-23 12:56 | A developer who appears to be the plugin's commit author comments on HN: "It's already been fixed as part of v2.1.281 releasing today." | HN [8] |
| 2026-09-23 17:01 | 2.1.281 released. The flag default changes from false to true | Executable [6] |
| 2026-09-23 19:37 | Two official doc pages (Memory, Environment variables) revised: "Before v2.1.281, … read CLAUDE.md files only" | Docs [4] [5] |
| 2026-09-23 19:39 | The official GitHub Action bumps the version it installs to 2.1.281 | GitHub [9] |
The first report pinned down the conditions precisely. Issue #95690 wrote that if you disable telemetry traffic, or go through a third-party gateway, Bedrock or Vertex, this switch can never evaluate to true: "No error. No warning. It just doesn't load." The issue called the switch a Statsig gate (a feature switch managed through a service called Statsig), but the flag client in the executable and the official docs name GrowthBook. GrowthBook is a service that serves feature flags from a server. [2] [5]
The original author measured this directly. In an empty directory holding only AGENTS.md, they wrote a canary word into the file (a word that appears nowhere else, so the model can know it only by reading the file) and asked for that word with claude -p. They wrote that the file was not read if either DISABLE_TELEMETRY or CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC was set, that setting the value to 0 made no difference, and that no warning appeared in any case. [1]
About 40 minutes after the HN post, a developer who appears to be the person who committed this plugin to Anthropic's repository left a comment (the HN account and the GitHub account that made the commit list the same personal domain in their profiles): "this is a rollout artifact, we needed a way to turn this off remotely via feature flags if it broke something, and with telemetry off you don't get those. It's already been fixed as part of v2.1.281 releasing today. … this was a fully human error on my part - I should've found a better way to launch with a kill-switch." A kill switch is a switch that remotely turns off a feature that has already shipped, when something goes wrong. [8]
The changelog's 2.1.281 entry does not include this fix. As of 2026-09-24 the issue is still open, with no response from Anthropic. [3] [2]
3. Where it got switched off — the code
To tell before from after, we downloaded the macOS (Apple Silicon) executables for 2.1.276, 2.1.277, 2.1.278, 2.1.280 and 2.1.281 from npm and compared them (2.1.279 was never published). Claude Code ships as an executable with its JavaScript bundled into a single file, so the minified code sits inside it as strings. [6]
How the plugin decides whether it can be used
A built-in plugin decides for itself whether it can be enabled. Here is that part of 2.1.280 and 2.1.281, exactly as minified.
// 2.1.280
var W=!1;var B=()=>Oa("tengu_agents_md_mod",W);
// 2.1.281
var W=!0;var B=()=>na("tengu_agents_md_mod",W);
!1 is shorthand for false and !0 for true. W is the plugin's exported isOnByDefault, and B is isAvailable. Oa and na are the same function under different minified names; it asks for the value of the feature flag tengu_agents_md_mod. A feature flag is a switch that turns a feature inside already shipped code on or off through server configuration. The second argument, W, is the flag default, returned instead when the server value cannot be used.
The order in which the flag value is decided
getFeatureValueWithSource, which this function calls, is identical in both versions. In order, it works like this.
| Step | Situation | Value returned |
|---|---|---|
| 1 | An override from an environment variable or setting exists | That value. In public builds, however, both lookup functions are stubbed to return nothing, so users have no way to override it |
| 2 | A session with flag fetching off | The flag default (source:"disabled"). The server is not asked |
| 3 | A value has been received from the server | That value |
| 4 | The server responded, but this flag is not in the response | The flag default |
| 5 | A value is cached on disk | That value |
| 6 | Anything else | The flag default |
Step 2 has only one exception: turning on a particular undocumented environment variable. And Oa pins the first value it reads in a session for the rest of that session (pinnedFeatureValues). Even if a server value arrives mid-session, that session's decision does not change.
Through 2.1.280, the default at steps 2, 4 and 6 was false. In a session with flag fetching off, the lookup returns false immediately, without asking the server; the plugin becomes 'unavailable', and AGENTS.md is not read. 2.1.281 changed this default to true. If you strip the short identifier names from both versions of the plugin code and compare them statement by statement, the only differences are this line and the list of imported modules. This one value is the only behavior-changing edit to the agents-md plugin code, and no new warning message was added. 2.1.277 and 2.1.278 had one more condition in front of the flag, but in a session with flag fetching off the result is false all the same.
The three environment variables read the same value differently
The logic that turns flag fetching off is also in the code as is. We only added line breaks for readability.
function D(){
if(process.env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC)return"essential-traffic";
if(process.env.DISABLE_TELEMETRY)return"no-telemetry";
if(De(process.env.DO_NOT_TRACK))return"no-telemetry";
return"default"}
function De(e){if(!e)return!1;if(typeof e==="boolean")return e;
let n=String(e).toLowerCase().trim();return["1","true","yes","on"].includes(n)}
The first two variables only check whether they are non-empty. In JavaScript the string "0" is truthy, so DISABLE_TELEMETRY=0 also counts as telemetry turned off. Only DO_NOT_TRACK goes through De(), and that function treats only 1, true, yes and on as true. The official docs say the same: for DISABLE_TELEMETRY, "Setting it to 0 or false still opts out," and for DO_NOT_TRACK, "Claude Code reads this variable as a standard boolean, so 0 leaves telemetry on." [5]
The public source does not contain this feature flag
Anthropic published this plugin's source in mods/agents-md of the anthropics/claude-code repository. Yet a search of the whole repository does not find tengu_agents_md_mod even once. The flag lives in registration code that has not been published, and the source's README says only that "/plugin lists the plugin among the built-ins, where a person can turn it off." Someone who read only the public source had no way to know about the link to telemetry. [7]
4. Which sessions were affected
The affected sessions are those in which, per the official docs, Claude Code "skips that fetch" of feature flags, plus the first session after installation. Cells marked "reproduced" are runs we did ourselves in section 5; the rest are judgments from the code and the docs. [5]
| Session | How the value is read | 2.1.277–2.1.280 | 2.1.281 and later |
|---|---|---|---|
DISABLE_TELEMETRY set | Any non-empty value (including 0 and false) | Not read (reproduced) | Read (reproduced) |
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC set | Same as above | Not read (reproduced) | Read (reproduced) |
DO_NOT_TRACK set | Only 1, true, yes or on. 0 does not count | Not read (reproduced) | Read (reproduced) |
DISABLE_GROWTHBOOK set | When 1 or true | Not read | Read (from reading the code) |
| Third-party providers (Bedrock, Vertex, Foundry and others) | Except when the host platform sets CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST | Not read. The 2.1.277 changelog says "not yet" | Read (official docs) |
| Claude apps gateway | Sessions connected through gateway authentication | Not read | Read (from reading the code and docs) |
| First session after installing or upgrading (flag fetching on) | When no fetched flag value exists yet | May not be read (issue comment) | The first session after upgrading from 2.1.276 or earlier may not read it (official docs) |
CI easily hits both conditions at once. Runners start with a fresh home directory every time, so every run is a first session, and settings that turn off nonessential traffic are common. One issue comment tested 2.1.278 in freshly created home directories and reported that "AGENTS.md is skipped in the very first session after install, and skipped every time when feature-flag fetching is disabled (DISABLE_GROWTHBOOK=1 or nonessential traffic off), which is exactly what CI runners do." [2] The official GitHub Action (anthropics/claude-code-action) installs a pinned Claude Code version. The @v1 tag points to a commit from 2026-09-23 19:39 (UTC), and that commit installs 2.1.281. If you pinned an earlier commit or a release at or below v1.0.232, you get 2.1.280 or earlier. [9]
The original author also tested whether a settings file could get around the problem. They wrote that an env block clearing both variables in the project's .claude/settings.json did not help, and that passing claude --settings '{"env":{"DISABLE_TELEMETRY":"","CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC":""}}' per session made the file load from the second session on. The author's explanation is that the first session only fetches the flag and does not get to use it. We did not reproduce either of these. [1]
5. What our reproduction showed
We repeated the original author's test the same way. On 2026-09-24, on macOS (Apple Silicon), we used the official executables for 2.1.280 and 2.1.281 from npm. In an empty directory we placed an AGENTS.md with the single line The canary word is MARIGOLD. and sent the same question as the original with claude -p. If the model opened and read the file itself, the test would be meaningless, so we turned off every tool with --tools "". The model was Haiku (--model haiku), and we ran each combination once. We left the user-level ~/.claude/CLAUDE.md in place; according to the official docs, that file does not count in the check that decides whether AGENTS.md is read instead. [4]
mkdir probe && cd probe
echo 'The canary word is MARIGOLD.' > AGENTS.md
DISABLE_TELEMETRY=1 claude -p 'What is the canary word from the project instructions? Answer NONE if you have none. Do not read files.' \
--model haiku --tools ""
| Version | Variable set | Model's answer | Result predicted from the code |
|---|---|---|---|
| 2.1.280 | None (control) | MARIGOLD | Read |
| 2.1.280 | DISABLE_TELEMETRY=1 | NONE | Not read |
| 2.1.280 | DISABLE_TELEMETRY=0 | NONE | Not read |
| 2.1.280 | CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 | NONE | Not read |
| 2.1.280 | DO_NOT_TRACK=1 | NONE | Not read |
| 2.1.280 | DO_NOT_TRACK=0 | MARIGOLD | Read |
| 2.1.281 | DISABLE_TELEMETRY=1 | MARIGOLD | Read |
| 2.1.281 | CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 | MARIGOLD | Read |
| 2.1.281 | DO_NOT_TRACK=1 | MARIGOLD | Read |
2.1.280 + one-line CLAUDE.md | DISABLE_TELEMETRY=1 | MARIGOLD | Read (@ imports do not depend on the flag) |
All ten matched what the code predicted. Two results were not in the original. First, DO_NOT_TRACK=1 gave the same result. DO_NOT_TRACK is a convention that many developer tools honor, so many people keep it in their shell configuration. Second, with DO_NOT_TRACK=0 the file was read, but with DISABLE_TELEMETRY=0 it was not. Two variables that look alike interpret 0 in opposite ways.
canary, and 2.1.280 answered canary, which it had seen in the working directory path, instead of NONE. When the instruction file is missing, the model may find a plausible answer nearby instead of saying it has none. Keep hints out of the directory name, and turn off tools so the model cannot open the file. The table above shows the results after we renamed the directory and ran everything again.6. What 2.1.281 changed and what remains
What changed
The flag default changed from false to true. As a result, AGENTS.md is read even in sessions with flag fetching off, that is, sessions with telemetry off and third-party provider sessions. The official docs put it this way: "Before v2.1.281, some sessions, such as those on Amazon Bedrock or with telemetry disabled, read CLAUDE.md files only. On those versions, update Claude Code." [4]
What remains
- The kill switch is still there. In sessions that can fetch flags, step 3 in the table in section 3, the value from the server, comes first. If Anthropic turns this flag off, those sessions stop reading AGENTS.md again. That is exactly the design intent the HN comment described; the only change is the answer given when the server cannot be asked
- Nothing tells you when the file is skipped. No new warning message was added. The official docs give two clues. When AGENTS.md is read, an interactive session shows the line
no CLAUDE.md found; AGENTS.md loaded: …, and in sessions that cannot use this feature, the Project instructions item does not appear in/config. Both are clues on the interactive screen, so a non-interactive run such asclaude -pgives you nowhere to look [4] - The first session right after an upgrade. The docs say: "In some cases, it's your first session after you upgrade from v2.1.276 or earlier. Claude reads
AGENTS.mdfrom your next session on" [4] - The fix is recorded in only one place. The changelog's 2.1.281 entry does not mention the fix, and the issue is still open. Someone who read only the 2.1.277 changelog could not have known about the telemetry condition, and someone who reads only the 2.1.281 changelog cannot learn that it was fixed [3]
7. What else is affected when flag fetching is off
From 2.1.281 on, AGENTS.md is out of this problem, but many features are still unavailable or behave differently in sessions with flag fetching off. The official docs list 15 of them (checked 2026-09-24). For some, only the default behavior changes, or an environment variable provides an exception. [5]
| Feature | With flag fetching off |
|---|---|
| Starting sessions in auto mode on Pro, Max and Team plans | Not available as the default behavior |
| The VS Code extension reading the starting permission mode from settings files | Not available |
/auto-mode-setup | Not available |
| Remote Control | Not available |
| Messaging sessions on other machines | Not available. Works between sessions on the same machine |
claude import and /import | Not available |
/skill-doctor and its report in the /plugin Stats tab | Not available |
| Syncing the skills and plugins enabled on your claude.ai account | They do not reach terminal sessions |
| The advisor tool | Not available |
| Reading and replying to artifact comments | Not available |
| Probing claude.ai connector servers for MCP protocol revision (2026-07-28) | No probe. Except with MCP_PROTOCOL_NEGOTIATION=auto |
| Getting the PowerShell tool by default on Windows (with Git Bash installed) | Shell commands go through Git Bash. Except with CLAUDE_CODE_USE_POWERSHELL_TOOL=1 |
| Claude-drafted feedback | Not available |
| Marking large pastes as pasted text | The content behind [Pasted text #N] reaches the model unmarked |
| Excluding MCP tools whose input schema the API would reject | They are sent anyway, and any request that includes such a tool fails with a 400 error |
Most of these just mean a feature does not show up, but the last two change behavior. The last one in particular means that a schema problem in a single MCP server can turn into failed requests.
In its ZCode report of September 19, this blog wrote that in Claude Code you turn off unnecessary traffic with CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1. That setting is still a valid option. But the right way to choose it is knowing that the price is the list above, and in 2.1.277–2.1.280 that price included AGENTS.md.
8. Checklist
- Check your version with
claude --version, and if it is 2.1.277–2.1.280, upgrade to 2.1.281 or later withclaude update. On 2.1.276 or earlier, according to the official docs, the feature that reads AGENTS.md directly does not exist yet - Check separately anywhere the version is pinned, such as CI and containers.
anthropics/claude-code-actioninstalls 2.1.281 at@v1; if you pinned an earlier commit orv1.0.232or below, you have 2.1.280 or earlier - If you cannot upgrade right away, put a one-line CLAUDE.md next to AGENTS.md:
echo '@AGENTS.md' > CLAUDE.md.@imports work regardless of the feature flag, and the official docs recommend this approach too. Leaving it in place later does not make AGENTS.md load twice - When you turn a telemetry variable back on, do not set it to
0; remove the variable (unset DISABLE_TELEMETRY). Of the three variables, onlyDO_NOT_TRACKtreats0as telemetry "on" - Confirm with a canary word that AGENTS.md actually reaches the model. Use the command from section 5, and keep hints out of the directory name
- In an interactive session, check whether the
no CLAUDE.md found; AGENTS.md loaded:line appears at startup and whether Project instructions is in/config - If a
CLAUDE.mdorCLAUDE.local.mdexists alongside AGENTS.md, the default setting does not read AGENTS.md. To have both read, change Project instructions toclaude-md-and-agents-mdor put@AGENTS.mdin CLAUDE.md. This setting takes effect only in~/.claude/settings.json,--settingsor managed settings, and is ignored in a project's.claude/settings.json - If you decide to turn telemetry off, make that choice knowing that the 15 features in section 7 are affected along with it
- If you build a product with feature flags, make an announced feature's flag default match the announced behavior, and when you skip a local file, say so, even if only in one line
9. What this is not yet
- We reproduced in one environment, once per combination. macOS (Apple Silicon), the Haiku model, 2026-09-24. We did not check Linux, Windows or other models. The model's answer is an indirect indicator of whether the instructions were delivered
- We did not run third-party provider or gateway sessions. Those rows in section 4 are judgments from the code and the official docs
- We did not reproduce the "first session" effect. The evidence for it is the original author, an issue comment and the official docs. Our control run (2.1.280, no variables) read the file from the very first run, which appears to be because the Claude Code we normally use on the same computer had already saved the flag values to disk. This is an inference
- The server decides the flag value. It may differ by account and over time, and what we saw is the value for our account
- The reason the feature was gated behind a flag is explained only by one HN comment. The changelog and the issue give no explanation. We concluded that the commenter is the plugin's commit author because the HN account and the GitHub account list the same personal domain (
code.lol) in their profiles - We did not reproduce
DISABLE_GROWTHBOOKor the original author's settings-file experiments - The interpretation of the code is ours. We read it from a minified executable, so function names differ between versions and several functions share the same name. The parts we used for our conclusions were checked once more against the run results in section 5
- We did not look at anything after 2.1.281. As of 2026-09-24, the latest version on npm is 2.1.281. The structure may change again in later versions
10. Sources
| Source | What we checked | Scope of the evidence |
|---|---|---|
| [1] Claude Code reads AGENTS.md only when telemetry is on (blog.szypowi.cz) | 2.1.280 registration code, the canary test method, results for the two variables and for the value 0, settings-file experiments, the @AGENTS.md workaround | Primary measurement on a personal blog · posted 2026-09-23, checked 2026-09-24 |
| [2] GitHub issue #95690 | The original report (2.1.277), a comment's reproduction on 2.1.280 and another's first-session report on 2.1.278, labels, open status | Community report · no response from Anthropic · checked 2026-09-24 |
| [3] Claude Code changelog | 2.1.277's announcement of AGENTS.md support with "not yet on Bedrock, Vertex or Foundry"; no related fix in the 2.1.281 entry | Vendor, official · checked 2026-09-24 |
| [4] Claude Code docs: Memory — AGENTS.md | Conditions for reading it, the four Project instructions values and where to set them, sessions where it is unavailable, "Before v2.1.281…", the line shown when it is read, the workarounds | Vendor's official documentation · revision of 2026-09-23 19:37 (UTC) · checked 2026-09-24 |
| [5] Claude Code docs: Environment variables | How the three variables and DISABLE_GROWTHBOOK interpret values, sessions that skip flag fetching, the 15 unavailable features, the first session | Vendor's official documentation · revision of 2026-09-23 19:37 (UTC) · checked 2026-09-24 |
[6] npm · @anthropic-ai/claude-code-darwin-arm64 2.1.276, 2.1.277, 2.1.278, 2.1.280, 2.1.281 | Release times, the agents-md registration code, the flag lookup function, the check on the three variables, a comparison of the 2.1.280 and 2.1.281 plugin code, the mermaid plugin's default, 10 reproduction runs | Downloaded, compared and run by us · 2026-09-24. The interpretation of the code is ours |
| [7] anthropics/claude-code · mods/agents-md | README and plugin.json, two commits (2026-09-18, PR #95409 and #95417), zero hits for the flag name across the whole repository | Vendor's published source · checked 2026-09-24 |
| [8] Hacker News discussion | Posting time, points and comment count, the comment by the user who appears to be the plugin's commit author (2026-09-23 12:56 UTC), discussion of why the feature flag was there | Community discussion · a developer's comment, not an official announcement · checked 2026-09-24 |
| [9] anthropics/claude-code-action | The commit the v1 tag points to (2026-09-23 19:39 UTC) installs 2.1.281; v1.0.232 installs 2.1.280 | Vendor's public repository · checked 2026-09-24 |
Editorial standard: we kept apart sentences from the vendor's docs and changelog, code we confirmed in the executables, and results from our own runs. The issue and the HN comments are marked as community reports.