Eazler AI Lab AI Engineering Journal
Skip to article
Memory◷ 20 min read

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.

Korean original: 한국어 원문 (2026-09-24)Scope: Claude Code executables 2.1.276–2.1.281 compared; 10 reproduction runsSources checked: 2026-09-24 · official docs, changelog, issue #95690

1. Executive summary

2.1.277–2.1.280
Versions that did not read AGENTS.md with telemetry off. Fixed in 2.1.281 [4] [6]
10/10
All 10 combinations we reproduced matched what the code predicted. We ran the official executables ourselves on macOS (section 5)
15
Features that are still unavailable, or behave differently, when feature-flag fetching is off. Per the official docs [5]
The key conclusion: If you ran Claude Code 2.1.277–2.1.280 with any one of 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 happenedSource
2026-09-18 01:392.1.276 released. The executable already contained the agents-md plugin; the default behavior at this point was to read CLAUDE.md onlyExecutable [6]
2026-09-18 16:222.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:35Plugin source mods/agents-md published in the anthropics/claude-code repository (PR #95409)GitHub [7]
2026-09-20 15:33Issue #95690 filed. Its title ends "A Local Feature Locked Behind a Remote Switch"GitHub [2]
2026-09-22 15:442.1.280 releasednpm [6]
2026-09-23 08:38The original author posts measurements on the issue and writes them up on a blog the same day[1] [2]
2026-09-23 12:15Posted to Hacker News. 448 points and 254 comments as of 2026-09-24HN [8]
2026-09-23 12:56A 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:012.1.281 released. The flag default changes from false to trueExecutable [6]
2026-09-23 19:37Two official doc pages (Memory, Environment variables) revised: "Before v2.1.281, … read CLAUDE.md files only"Docs [4] [5]
2026-09-23 19:39The official GitHub Action bumps the version it installs to 2.1.281GitHub [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.

StepSituationValue returned
1An override from an environment variable or setting existsThat value. In public builds, however, both lookup functions are stubbed to return nothing, so users have no way to override it
2A session with flag fetching offThe flag default (source:"disabled"). The server is not asked
3A value has been received from the serverThat value
4The server responded, but this flag is not in the responseThe flag default
5A value is cached on diskThat value
6Anything elseThe 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]

SessionHow the value is read2.1.277–2.1.2802.1.281 and later
DISABLE_TELEMETRY setAny non-empty value (including 0 and false)Not read (reproduced)Read (reproduced)
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC setSame as aboveNot read (reproduced)Read (reproduced)
DO_NOT_TRACK setOnly 1, true, yes or on. 0 does not countNot read (reproduced)Read (reproduced)
DISABLE_GROWTHBOOK setWhen 1 or trueNot readRead (from reading the code)
Third-party providers (Bedrock, Vertex, Foundry and others)Except when the host platform sets CLAUDE_CODE_PROVIDER_MANAGED_BY_HOSTNot read. The 2.1.277 changelog says "not yet"Read (official docs)
Claude apps gatewaySessions connected through gateway authenticationNot readRead (from reading the code and docs)
First session after installing or upgrading (flag fetching on)When no fetched flag value exists yetMay 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 ""
VersionVariable setModel's answerResult predicted from the code
2.1.280None (control)MARIGOLDRead
2.1.280DISABLE_TELEMETRY=1NONENot read
2.1.280DISABLE_TELEMETRY=0NONENot read
2.1.280CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1NONENot read
2.1.280DO_NOT_TRACK=1NONENot read
2.1.280DO_NOT_TRACK=0MARIGOLDRead
2.1.281DISABLE_TELEMETRY=1MARIGOLDRead
2.1.281CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1MARIGOLDRead
2.1.281DO_NOT_TRACK=1MARIGOLDRead
2.1.280 + one-line CLAUDE.mdDISABLE_TELEMETRY=1MARIGOLDRead (@ 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.

If you run the canary test yourself: At first we named the test directory 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 as claude -p gives 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.md from 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]
In fairness: the feature flag itself is not the mistake. Making new behavior remotely switchable before turning it on is a common and reasonable way to ship. As the HN discussion pointed out, some repositories may have deliberately kept different instructions in CLAUDE.md and AGENTS.md, so changing the default handling of the two files could break someone's setup. 2.1.281 also contains another built-in plugin with the same structure. A plugin that draws mermaid diagrams in the terminal has never been announced in the changelog, and its flag default is still false. An unannounced feature being off in sessions with flag fetching off is nothing strange. The problem was that an announced feature kept its pre-announcement default, and that it skipped the file without saying so. We also note that it was fixed three days after the issue was opened, and that the docs now record the limitation of the earlier versions. [8] [6]

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]

FeatureWith flag fetching off
Starting sessions in auto mode on Pro, Max and Team plansNot available as the default behavior
The VS Code extension reading the starting permission mode from settings filesNot available
/auto-mode-setupNot available
Remote ControlNot available
Messaging sessions on other machinesNot available. Works between sessions on the same machine
claude import and /importNot available
/skill-doctor and its report in the /plugin Stats tabNot available
Syncing the skills and plugins enabled on your claude.ai accountThey do not reach terminal sessions
The advisor toolNot available
Reading and replying to artifact commentsNot 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 feedbackNot available
Marking large pastes as pasted textThe content behind [Pasted text #N] reaches the model unmarked
Excluding MCP tools whose input schema the API would rejectThey 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

  1. Check your version with claude --version, and if it is 2.1.277–2.1.280, upgrade to 2.1.281 or later with claude update. On 2.1.276 or earlier, according to the official docs, the feature that reads AGENTS.md directly does not exist yet
  2. Check separately anywhere the version is pinned, such as CI and containers. anthropics/claude-code-action installs 2.1.281 at @v1; if you pinned an earlier commit or v1.0.232 or below, you have 2.1.280 or earlier
  3. 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
  4. When you turn a telemetry variable back on, do not set it to 0; remove the variable (unset DISABLE_TELEMETRY). Of the three variables, only DO_NOT_TRACK treats 0 as telemetry "on"
  5. 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
  6. 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
  7. If a CLAUDE.md or CLAUDE.local.md exists alongside AGENTS.md, the default setting does not read AGENTS.md. To have both read, change Project instructions to claude-md-and-agents-md or put @AGENTS.md in CLAUDE.md. This setting takes effect only in ~/.claude/settings.json, --settings or managed settings, and is ignored in a project's .claude/settings.json
  8. If you decide to turn telemetry off, make that choice knowing that the 15 features in section 7 are affected along with it
  9. 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_GROWTHBOOK or 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

SourceWhat we checkedScope 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 workaroundPrimary measurement on a personal blog · posted 2026-09-23, checked 2026-09-24
[2] GitHub issue #95690The 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 statusCommunity report · no response from Anthropic · checked 2026-09-24
[3] Claude Code changelog2.1.277's announcement of AGENTS.md support with "not yet on Bedrock, Vertex or Foundry"; no related fix in the 2.1.281 entryVendor, official · checked 2026-09-24
[4] Claude Code docs: Memory — AGENTS.mdConditions 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 workaroundsVendor's official documentation · revision of 2026-09-23 19:37 (UTC) · checked 2026-09-24
[5] Claude Code docs: Environment variablesHow the three variables and DISABLE_GROWTHBOOK interpret values, sessions that skip flag fetching, the 15 unavailable features, the first sessionVendor'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.281Release 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 runsDownloaded, compared and run by us · 2026-09-24. The interpretation of the code is ours
[7] anthropics/claude-code · mods/agents-mdREADME and plugin.json, two commits (2026-09-18, PR #95409 and #95417), zero hits for the flag name across the whole repositoryVendor's published source · checked 2026-09-24
[8] Hacker News discussionPosting 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 thereCommunity discussion · a developer's comment, not an official announcement · checked 2026-09-24
[9] anthropics/claude-code-actionThe commit the v1 tag points to (2026-09-23 19:39 UTC) installs 2.1.281; v1.0.232 installs 2.1.280Vendor'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.

Newsletter

The week’s new reports, every Sunday

One email a week with that week’s reports, skipped when nothing new came out. Nothing but report news.

Used only to announce new reports. Unsubscribe any time. Privacy Policy
Publisher

Eazler AI Lab is the AI engineering journal of Eazler Inc. We read primary sources in full, and say so when something is unverified.

Editorial standards and method →

We also post report summaries on Threads: @eazler.inc.

Building or adopting AI agents? hello@eazler.com