claude-code - 💡(How to fix) Fix DISABLE_TELEMETRY silently disables GrowthBook — which also gates preview features (Agent View) and remote killswitches

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

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.

Error Message

  • Remote killswitches don't reach you. The flag set includes *_killswitch entries (tengu_compact_line_prefix_killswitch, tengu_read_dedup_killswitch, …) and things like tengu_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.

Root Cause

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.

Fix Action

Fix / Workaround

  • #45381 — "Disabling telemetry also disables 1-hour prompt cache TTL" (closed / completed, bug · has repro). Same pattern: DISABLE_TELEMETRY silently 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_TELEMETRY as 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.

Code Example

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
RAW_BUFFERClick to expand / collapse

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

  1. Claude Code ≥ 2.1.139, OAuth subscription, no Bedrock/Vertex, no disableAgentView, no managed settings.
  2. ~/.claude/settings.json"env": { "DISABLE_TELEMETRY": "1" } (or export the env var).
  3. Run claude agents in a normal terminal → prints the static agent-definition registry ("Project agents / Plugin agents / Built-in agents"), not the Agent View dashboard. /bg and -on-empty-prompt-to-background are also unavailable.
  4. Remove DISABLE_TELEMETRY → start a fresh session (so flags re-hydrate) → claude agents → dashboard appears.
  5. DISABLE_ERROR_REPORTING and CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY do not have this effect — only DISABLE_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 / /bg is the visible one; presumably any other flag-gated rollout too.
  • Remote killswitches don't reach you. The flag set includes *_killswitch entries (tengu_compact_line_prefix_killswitch, tengu_read_dedup_killswitch, …) and things like tengu_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 the DISABLE_TELEMETRY docs (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

  1. Document it. On the DISABLE_TELEMETRY / monitoring-usage / data-usage pages and the agent-view page: note that DISABLE_TELEMETRY / DO_NOT_TRACK disable 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 that DISABLE_GROWTHBOOK is the dedicated knob if zero flag-fetch traffic is the goal.
  2. Decouple (preferred). Separate flag-value delivery from experiment-exposure logging. DISABLE_TELEMETRY should suppress exposure events but still allow flag values to be fetched — ideally with a minimal/anonymous attribute set and remoteEval off, so nothing identifying leaves the machine. Keep DISABLE_GROWTHBOOK as the explicit "no flag traffic, accept frozen defaults" escape hatch.
  3. At minimum, surface it. A one-line --debug note when GrowthBook is suppressed, and/or a hint on the claude agents fallback: 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_TELEMETRY silently 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_TELEMETRY as 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, no CLAUDE_CODE_DISABLE_AGENT_VIEW, no managed settings
  • Repro is purely toggling DISABLE_TELEMETRY in ~/.claude/settings.json

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING