DISABLE_TELEMETRY silently disables GrowthBook — which also gates preview features (Agent View) and remote killswitches
Summary
Setting DISABLE_TELEMETRY=1 (or DO_NOT_TRACK) puts Claude Code into a "no-telemetry" traffic mode that disables GrowthBook entirely. GrowthBook isn't only experiment-exposure logging — it's also the delivery mechanism for feature flags, which gate preview features (e.g. Agent View / claude agents / --bg / /bg) and remote killswitches. Net effect: a user who set DISABLE_TELEMETRY for privacy reasons silently gets a degraded product — with nothing logged (even at --debug) and nothing in the DISABLE_TELEMETRY docs to indicate feature-flag delivery is affected.
This isn't "please make me less private" — there's a legitimate privacy dimension (see Root cause). It's that the coupling is invisible and undocumented, and it pulls in things (killswitches) that have nothing to do with telemetry.
Reproduction
- Claude Code ≥ 2.1.139, OAuth subscription, no Bedrock/Vertex, no
disableAgentView, no managed settings. ~/.claude/settings.json→"env": { "DISABLE_TELEMETRY": "1" }(or export the env var).- Run
claude agentsin a normal terminal → prints the static agent-definition registry ("Project agents / Plugin agents / Built-in agents"), not the Agent View dashboard./bgand←-on-empty-prompt-to-background are also unavailable. - Remove
DISABLE_TELEMETRY→ start a fresh session (so flags re-hydrate) →claude agents→ dashboard appears. DISABLE_ERROR_REPORTINGandCLAUDE_CODE_DISABLE_FEEDBACK_SURVEYdo not have this effect — onlyDISABLE_TELEMETRY/DO_NOT_TRACK, because only those flip the traffic mode.
Confirmed: the same version (2.1.139) shows Agent View fine on a second machine that simply doesn't have DISABLE_TELEMETRY set.
Root cause (paths from the 2.1.139 build)
function G3q(){ if(env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC) return "essential-traffic";
if(env.DISABLE_TELEMETRY) return "no-telemetry";
if(env.DO_NOT_TRACK) return "no-telemetry";
return "default" }
function S7(){ return G3q()==="essential-traffic" } // note: "no-telemetry" is NOT this
function ja(){ return !env.DISABLE_GROWTHBOOK && Ja() } // isGrowthBookEnabled — Ja() appears false in "no-telemetry" mode
function f_(flag, default){ ...; if(!ja()) return default; ...; // getFeatureValue_CACHED_MAY_BE_STALE
return cachedGrowthBookFeatures?.[flag] ?? default }
function Xc(){ return !DWH() && (S7() || f_("tengu_slate_meadow", false)) } // isAgentsFleetEnabled
// `claude agents`: await ensureFleetGateHydrated(); if (Xc()) mountFleetView(); else → legacy registry list
With DISABLE_TELEMETRY set: G3q() → "no-telemetry" ⇒ S7() is false, and GrowthBook is disabled (ja() → Ja() resolves false — I didn't capture Ja()'s body, but empirically GrowthBook is off in this mode). So f_("tengu_slate_meadow", false) short-circuits to its false default — it never fetches the live flag, and the flag isn't in the bootstrap cachedGrowthBookFeatures either — ⇒ Xc() is false ⇒ claude agents falls through to the legacy handler.
The privacy dimension that makes this defensible: the GrowthBook client is configured remoteEval: true and ships an attributes payload on each refresh — N68() builds { deviceID, sessionId, platform, accountUUID, organizationUUID, userType, subscriptionType, rateLimitTier, appVersion, email, entrypoint, … } to https://api.anthropic.com/. So flag-value fetching does send an identifying bundle upstream; a "no telemetry" user arguably wants that off. The issue is the lack of transparency and the all-or-nothing-ness, not the existence of a tradeoff.
Impact
- Preview features silently absent. Agent View /
claude agents/--bg//bgis the visible one; presumably any other flag-gated rollout too. - Remote killswitches don't reach you. The flag set includes
*_killswitchentries (tengu_compact_line_prefix_killswitch,tengu_read_dedup_killswitch, …) and things liketengu_react_vulnerability_warning. With GrowthBook off you're frozen on whatever defaults shipped in your binary, and Anthropic can't push "disable the broken thing" / "warn about the bad thing" to you. This part has nothing to do with telemetry and is the strongest case for decoupling. - Zero signal. Nothing is logged (even with
--debug), and theDISABLE_TELEMETRYdocs (monitoring-usage / data-usage pages) describe it purely in terms of Statsig metrics / analytics — not feature-flag delivery. The only way I found this was disassembling the binary.
Why this reads like an un-revisited bundle, not a deliberate tier
There's already a separate DISABLE_GROWTHBOOK env var, and CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC mode deliberately keeps the Agent View fleet gate on (S7() short-circuits Xc() to true). So the granularity exists — it just wasn't applied to DISABLE_TELEMETRY when GrowthBook started gating user-facing features.
For context, Agent View has at least three independent silent-disable paths in 2.1.139: (1) a wrapper/shell-integration injecting flags alongside claude agents (#58169, fixed in 2.1.140); (2) Bedrock/Vertex/Foundry or a custom ANTHROPIC_BASE_URL (#58284); and (3) DISABLE_TELEMETRY / DO_NOT_TRACK → no GrowthBook (this issue). This third one is the only one with neither documentation nor a log line.
Asks
- Document it. On the
DISABLE_TELEMETRY/ monitoring-usage / data-usage pages and the agent-view page: note thatDISABLE_TELEMETRY/DO_NOT_TRACKdisable the GrowthBook feature-flag layer (distinct from the Statsig metrics opt-out the docs currently describe), that feature flags gate preview features and remote killswitches, and thatDISABLE_GROWTHBOOKis the dedicated knob if zero flag-fetch traffic is the goal. - Decouple (preferred). Separate flag-value delivery from experiment-exposure logging.
DISABLE_TELEMETRYshould suppress exposure events but still allow flag values to be fetched — ideally with a minimal/anonymous attribute set andremoteEvaloff, so nothing identifying leaves the machine. KeepDISABLE_GROWTHBOOKas the explicit "no flag traffic, accept frozen defaults" escape hatch. - At minimum, surface it. A one-line
--debugnote when GrowthBook is suppressed, and/or a hint on theclaude agentsfallback:Agent View unavailable — feature flags disabled by DISABLE_TELEMETRY (see DISABLE_GROWTHBOOK).
Related
- #45381 — "Disabling telemetry also disables 1-hour prompt cache TTL" (closed / completed,
bug·has repro). Same pattern:DISABLE_TELEMETRYsilently degrades an unrelated capability that should be independent of telemetry. Precedent that this class of report is in-scope and gets fixed. - #53899 — "DISABLE_NONESSENTIAL_TRAFFIC silently disables security updates — unbundle DISABLE_AUTOUPDATER" (open,
enhancement·area:security). Sibling argument for unbundling a safety-relevant behavior from a convenience flag; the "remote killswitches" impact here is the direct analogue of its "CVE patches" impact. - #19117 — "Telemetry Configuration Ambiguity: Statsig vs OTel". The public docs describe
DISABLE_TELEMETRYas opting out of Statsig telemetry; they don't mention the GrowthBook feature-flag layer at all, which is what 2.1.139 uses and what gates Agent View. - #58169 (wrapper-injected flags, fixed in 2.1.140) and #58284 (3P-provider / custom-base-URL hard-disable) — the other two silent-disable paths for Agent View.
Environment
- Claude Code 2.1.139 (macOS arm64, native install)
- Auth: Claude.ai OAuth subscription; not Bedrock/Vertex/Foundry; no custom
ANTHROPIC_BASE_URL - No
disableAgentView, noCLAUDE_CODE_DISABLE_AGENT_VIEW, no managed settings - Repro is purely toggling
DISABLE_TELEMETRYin~/.claude/settings.json
This issue has 5 comments on GitHub. Read the full discussion on GitHub ↗