Bundled GrowthBook clientKey intermittently returns 400 "Invalid API Key" → all feature flags fail → channels & Remote Control unavailable
Summary
Claude Code resolves feature flags from GrowthBook using a hardcoded clientKey sdk-zAZezfDKGoZuXXKe (apiHost https://cdn.growthbook.io, same key in 2.1.149 / 2.1.157 / 2.1.158). That key intermittently returns HTTP 400 {"status":400,"error":"Invalid API Key"}. When it does, zero flags load and claude doctor reports "the feature-flag service was unreachable" — so channels (--channels …) and Remote Control silently become unavailable, and a session can't receive pushed/inbound messages.
Environment
- Claude Code 2.1.149 / 2.1.157 / 2.1.158 (verified identical clientKey in all three via
strings) - Linux (x64) and macOS (arm64)
- First-party claude.ai subscription auth (Team),
apiProvider: firstParty
Repro (machine-independent, no auth required)
$ curl https://cdn.growthbook.io/api/features/sdk-zAZezfDKGoZuXXKe
{"status":400,"error":"Invalid API Key"} # observed 12/12 consecutive
It flaps: minutes before the above, a claude process fetched 278 flags successfully off the same key (claude doctor showed growthBookFeaturesLoaded=278, growthBookLastFetched=5s ago). So the key oscillates valid↔invalid at the CDN — consistent with a key rotation / project-config change that left deployed CLIs pointing at a key the CDN now rejects intermittently.
claude doctor on a failing session
Remote Control
✗ tengu_ccr_bridge gate (no server response this session)
Remote Control eligibility could not be determined — the feature-flag service was unreachable.
isGrowthBookEnabled=true
hasFreshGrowthBookFeatures=false
growthBookFeaturesLoaded=0
growthBookLastFetched=never
vs a working session on the same version/key: growthBookFeaturesLoaded=278.
Banner on the failing session:
--channels ignored (plugin:fakechat@claude-plugins-official)
Channels are not currently available
Impact
- The CDN response is global per clientKey, so while the key is in its invalid state it affects all Claude Code instances simultaneously (we saw a fleet-wide break → partial recovery).
- Channels/Remote Control fail closed and silently — no error surfaced to the user; a pushed message is just dropped. A session that happened to cache flags during a valid window keeps working (coasting on stale cache), which makes it look misleadingly like a per-machine/per-version issue.
Ask
- Restore/rotate the GrowthBook clientKey so
cdn.growthbook.ioaccepts it (and/or ship a build with a valid key). - Consider not hard-failing channels/Remote Control closed on a transient flag-fetch error — degrade more gracefully, and surface the fetch failure clearly (the
claude doctor"unreachable" text is good; the channels banner just says "not currently available", which sent us down a long wrong path).
🤖 Generated with Claude Code
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗