From 6a62e3ff76ba9ba446b8e20cf2bb139ee76a9387 Mon Sep 17 00:00:00 2001 From: Nourrisse Florian <3023852+Flo5k5@users.noreply.github.com> Date: Tue, 21 Apr 2026 12:34:51 +0200 Subject: [PATCH] feat: enable 15 additional feature flags in open build (#667) * feat: enable 16 additional feature flags in open build Activate features whose source is fully available in the mirror and that have no Anthropic-internal infrastructure dependencies: UI/UX: MESSAGE_ACTIONS, HISTORY_PICKER, QUICK_SEARCH, HOOK_PROMPTS Reasoning: ULTRATHINK, TOKEN_BUDGET, SHOT_STATS Agents: FORK_SUBAGENT, VERIFICATION_AGENT, MCP_SKILLS Memory: EXTRACT_MEMORIES, AWAY_SUMMARY Optimization: CACHED_MICROCOMPACT, PROMPT_CACHE_BREAK_DETECTION Safety: TRANSCRIPT_CLASSIFIER Debug: DUMP_SYSTEM_PROMPT Also reorganize featureFlags into documented sections (disabled/upstream/new) with inline comments explaining each flag's purpose. * feat: add centralized GrowthBook defaults map for open build Add _openBuildDefaults in the GrowthBook stub (no-telemetry-plugin.ts) with all 66 runtime feature keys, organized by category with inline comments describing each flag's purpose. Override tengu_sedge_lantern (AWAY_SUMMARY) and tengu_hive_evidence (VERIFICATION_AGENT) to true so these features work out of the box without requiring manual ~/.claude/feature-flags.json setup. Priority: feature-flags.json > _openBuildDefaults > upstream default * feat: replace refusal language with positive security guidance Remove refusal instructions from CYBER_RISK_INSTRUCTION since they are redundant for Anthropic models (applied server-side) and useless for uncensored models in multi-provider setups. Keep positive guidance for security testing contexts and add red teaming support. * Revert "feat: replace refusal language with positive security guidance" This reverts commit 0463676a8f23265e779d72cfb86dc2c3ba5dcb34. * fix: add EXTRACT_MEMORIES runtime gate overrides to open-build defaults EXTRACT_MEMORIES was enabled at build-time but its runtime GrowthBook gates (tengu_passport_quail, tengu_coral_fern) still defaulted to false, preventing the feature from activating. Add both keys to _openBuildDefaults so memory extraction works out of the box. Also adds test coverage for _openBuildDefaults precedence behavior. * docs: update GrowthBook runtime keys catalog to 88 keys Expand the reference catalog in no-telemetry-plugin.ts from ~62 to 88 unique keys, covering all tengu_* call sites found in src/. Adds 27 previously undocumented keys including VSCode gates, dynamic configs (auto-mode, cron, bridge), security gates, and KAIROS cron keys. Adds "not exhaustive" disclaimer as suggested by Copilot reviewer. Reorganizes categories with section dividers for readability. --- scripts/build.ts | 64 +++++--- scripts/no-telemetry-growthbook-stub.test.ts | 17 +++ scripts/no-telemetry-plugin.ts | 146 +++++++++++++++++++ 3 files changed, 203 insertions(+), 24 deletions(-) diff --git a/scripts/build.ts b/scripts/build.ts index 13004430..02dab0ae 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -19,30 +19,46 @@ const version = pkg.version // Most Anthropic-internal features stay off; open-build features can be // selectively enabled here when their full source exists in the mirror. const featureFlags: Record = { - VOICE_MODE: false, - PROACTIVE: false, - KAIROS: false, - BRIDGE_MODE: false, - DAEMON: false, - AGENT_TRIGGERS: false, - MONITOR_TOOL: true, - ABLATION_BASELINE: false, - DUMP_SYSTEM_PROMPT: false, - CACHED_MICROCOMPACT: false, - COORDINATOR_MODE: true, - BUILTIN_EXPLORE_PLAN_AGENTS: true, - CONTEXT_COLLAPSE: false, - COMMIT_ATTRIBUTION: false, - TEAMMEM: true, - UDS_INBOX: false, - BG_SESSIONS: false, - AWAY_SUMMARY: false, - TRANSCRIPT_CLASSIFIER: false, - WEB_BROWSER_TOOL: false, - MESSAGE_ACTIONS: true, - BUDDY: true, - CHICAGO_MCP: false, - COWORKER_TYPE_TELEMETRY: false, + // ── Disabled: require Anthropic infrastructure or missing source ───── + VOICE_MODE: false, // Push-to-talk STT via claude.ai OAuth endpoint + PROACTIVE: false, // Autonomous agent mode (missing proactive/ module) + KAIROS: false, // Persistent assistant/session mode (cloud backend) + BRIDGE_MODE: false, // Remote desktop bridge via CCR infrastructure + DAEMON: false, // Background daemon process (stubbed in open build) + AGENT_TRIGGERS: false, // Scheduled remote agent triggers + ABLATION_BASELINE: false, // A/B testing harness for eval experiments + CONTEXT_COLLAPSE: false, // Context collapsing optimization (stubbed) + COMMIT_ATTRIBUTION: false, // Co-Authored-By metadata in git commits + UDS_INBOX: false, // Unix Domain Socket inter-session messaging + BG_SESSIONS: false, // Background sessions via tmux (stubbed) + WEB_BROWSER_TOOL: false, // Built-in browser automation (source not mirrored) + CHICAGO_MCP: false, // Computer-use MCP (native Swift modules stubbed) + COWORKER_TYPE_TELEMETRY: false, // Telemetry for agent/coworker type classification + + // ── Enabled: upstream defaults ────────────────────────────────────── + COORDINATOR_MODE: true, // Multi-agent coordinator with worker delegation + BUILTIN_EXPLORE_PLAN_AGENTS: true, // Built-in Explore/Plan specialized subagents + BUDDY: true, // Buddy mode for paired programming + MONITOR_TOOL: true, // MCP server monitoring/streaming tool + TEAMMEM: true, // Team memory management + MESSAGE_ACTIONS: true, // Message action buttons in the UI + + // ── Enabled: new activations ──────────────────────────────────────── + DUMP_SYSTEM_PROMPT: true, // --dump-system-prompt CLI flag for debugging + CACHED_MICROCOMPACT: true, // Cache-aware tool result truncation optimization + AWAY_SUMMARY: true, // "While you were away" recap after 5min blur + TRANSCRIPT_CLASSIFIER: true, // Auto-approval classifier for safe tool uses + ULTRATHINK: true, // Deep thinking mode — type "ultrathink" to boost reasoning + TOKEN_BUDGET: true, // Token budget tracking with usage warnings + HISTORY_PICKER: true, // Enhanced interactive prompt history picker + QUICK_SEARCH: true, // Ctrl+G quick search across prompts + SHOT_STATS: true, // Shot distribution stats in session summary + EXTRACT_MEMORIES: true, // Auto-extract durable memories from conversations + FORK_SUBAGENT: true, // Implicit context-forking when omitting subagent_type + VERIFICATION_AGENT: true, // Built-in read-only agent for test/verification + MCP_SKILLS: true, // Discover skills dynamically from MCP server resources + PROMPT_CACHE_BREAK_DETECTION: true, // Detect & log unexpected prompt cache invalidations + HOOK_PROMPTS: true, // Allow tools to request interactive user prompts } // ── Pre-process: replace feature() calls with boolean literals ────── diff --git a/scripts/no-telemetry-growthbook-stub.test.ts b/scripts/no-telemetry-growthbook-stub.test.ts index da0d33e1..a92c9ed8 100644 --- a/scripts/no-telemetry-growthbook-stub.test.ts +++ b/scripts/no-telemetry-growthbook-stub.test.ts @@ -50,6 +50,23 @@ describe('growthbook stub — local feature flag overrides', () => { expect(stub.getAllGrowthBookFeatures()).toEqual({}) }) + // ── Open-build defaults (_openBuildDefaults) ──────────────────── + + test('returns open-build default when flags file is absent', () => { + // tengu_passport_quail is in _openBuildDefaults as true; without a + // flags file the stub should return the open-build override, not + // the call-site defaultValue. + expect(stub.getFeatureValue_CACHED_MAY_BE_STALE('tengu_passport_quail', false)).toBe(true) + expect(stub.getFeatureValue_CACHED_MAY_BE_STALE('tengu_coral_fern', false)).toBe(true) + }) + + test('flags file overrides open-build defaults', () => { + // User-provided feature-flags.json takes priority over _openBuildDefaults. + writeFileSync(flagsFile, JSON.stringify({ tengu_passport_quail: false })) + + expect(stub.getFeatureValue_CACHED_MAY_BE_STALE('tengu_passport_quail', true)).toBe(false) + }) + // ── Valid JSON object ──────────────────────────────────────────── test('loads and returns values from a valid JSON file', () => { diff --git a/scripts/no-telemetry-plugin.ts b/scripts/no-telemetry-plugin.ts index 97fb54a3..27f2ddd8 100644 --- a/scripts/no-telemetry-plugin.ts +++ b/scripts/no-telemetry-plugin.ts @@ -40,6 +40,151 @@ import _os from 'node:os'; let _flags = undefined; +// ── Open-build GrowthBook overrides ─────────────────────────────────── +// Override upstream defaultValue for runtime gates tied to build-time +// features. Only keys that DIFFER from upstream belong here — the +// catalog below is pure documentation and does NOT affect resolution. +// +// Priority: ~/.claude/feature-flags.json > _openBuildDefaults > defaultValue +// +// To override at runtime, create ~/.claude/feature-flags.json: +// { "tengu_some_flag": true } +const _openBuildDefaults = { + 'tengu_sedge_lantern': true, // AWAY_SUMMARY — "while you were away" recap (upstream: false) + 'tengu_hive_evidence': true, // VERIFICATION_AGENT — read-only test/verification agent (upstream: false) + 'tengu_passport_quail': true, // EXTRACT_MEMORIES — enable memory extraction (upstream: false) + 'tengu_coral_fern': true, // EXTRACT_MEMORIES — enable memory search in past context (upstream: false) +}; + +/* ── Known runtime feature keys (reference only) ─────────────────────── + * This catalog does NOT participate in flag resolution. It documents + * the known GrowthBook keys and their upstream default values, scraped + * from src/ call sites. It is NOT exhaustive — new keys may be added + * upstream between catalog updates. + * + * Some keys have different defaults at different call sites — this is + * intentional upstream (the server unifies the value at runtime). + * + * To activate any of these, add them to ~/.claude/feature-flags.json + * or to _openBuildDefaults above. + * + * ── Reasoning & thinking ────────────────────────────────────────────── + * tengu_turtle_carbon = true ULTRATHINK deep thinking runtime gate + * tengu_thinkback = gate /thinkback replay command + * + * ── Agents & orchestration ──────────────────────────────────────────── + * tengu_amber_flint = true Agent swarms coordination + * tengu_amber_stoat = true Built-in agent availability (Explore, Plan, etc.) + * tengu_agent_list_attach = true Attach file context to agent list + * tengu_auto_background_agents = false Auto-spawn background agents + * tengu_slim_subagent_claudemd = true Lighter ClaudeMD for subagents + * tengu_hive_evidence = false Verification agent / evidence tracking (4 call sites) + * tengu_ultraplan_model = model cfg ULTRAPLAN model selection (dynamic config) + * + * ── Memory & context ────────────────────────────────────────────────── + * tengu_passport_quail = false EXTRACT_MEMORIES main gate (isExtractModeActive) + * tengu_coral_fern = false EXTRACT_MEMORIES search in past context + * tengu_slate_thimble = false Memory dir paths (non-interactive sessions) + * tengu_herring_clock = true/false Team memory paths (varies by call site) + * tengu_bramble_lintel = null Extract memories throttle (null → every turn) + * tengu_sedge_lantern = false AWAY_SUMMARY "while you were away" recap + * tengu_session_memory = false Session memory service + * tengu_sm_config = {} Session memory config (dynamic) + * tengu_sm_compact_config = {} Session memory compaction config (dynamic) + * tengu_cobalt_raccoon = false Reactive compaction (suppress auto-compact) + * tengu_pebble_leaf_prune = false Session storage pruning + * + * ── Kairos & cron ───────────────────────────────────────────────────── + * tengu_kairos_brief = false Brief layout mode (KAIROS) + * tengu_kairos_brief_config = {} Brief config (dynamic) + * tengu_kairos_cron = true Cron scheduler enable + * tengu_kairos_cron_durable = true Durable (disk-persistent) cron tasks + * tengu_kairos_cron_config = {} Cron jitter config (dynamic) + * + * ── Bridge & remote (require Anthropic infra) ───────────────────────── + * tengu_ccr_bridge = false CCR bridge connection + * tengu_ccr_bridge_multi_session = gate Multi-session spawn mode + * tengu_ccr_mirror = false CCR session mirroring + * tengu_ccr_bundle_seed_enabled = gate Git bundle seeding for CCR + * tengu_ccr_bundle_max_bytes = null Bundle size limit (null → default) + * tengu_bridge_repl_v2 = false Environment-less REPL bridge v2 + * tengu_bridge_repl_v2_cse_shim_enabled = true CSE→Session tag retag shim + * tengu_bridge_min_version = {min:'0'} Min CLI version for bridge (dynamic) + * tengu_bridge_initial_history_cap = 200 Initial history cap for bridge + * tengu_bridge_system_init = false Bridge system initialization + * tengu_cobalt_harbor = false Auto-connect CCR at startup + * tengu_cobalt_lantern = false Remote setup preconditions + * tengu_remote_backend = false Remote TUI backend + * tengu_surreal_dali = false Remote agent tasks / triggers + * + * ── Prompt & API ────────────────────────────────────────────────────── + * tengu_attribution_header = true Attribution header in API requests + * tengu_basalt_3kr = true MCP instructions delta + * tengu_slate_prism = true/false Message formatting (varies by call site) + * tengu_amber_prism = false Message content formatting + * tengu_amber_json_tools = false JSON format for tool schemas + * tengu_fgts = false API feature gates + * tengu_otk_slot_v1 = false One-time key slots for API auth + * tengu_cicada_nap_ms = 0 Background GrowthBook refresh throttle (ms) + * tengu_miraculo_the_bard = false Service initialization gate + * tengu_immediate_model_command = false Immediate /model command execution + * tengu_chomp_inflection = false Prompt suggestions after responses + * tengu_tool_pear = gate API betas for tool use + * tengu-off-switch = {act:false} Service kill switch (dynamic; uses dash) + * + * ── Permissions & security ──────────────────────────────────────────── + * tengu_birch_trellis = true Bash auto-mode permissions config + * tengu_auto_mode_config = {} Auto-mode configuration (dynamic, many call sites) + * tengu_iron_gate_closed = true Permission iron gate (with refresh) + * tengu_destructive_command_warning = false Warning for destructive bash commands + * tengu_disable_bypass_permissions_mode = security Security killswitch (always false in open build) + * + * ── UI & UX ─────────────────────────────────────────────────────────── + * tengu_willow_mode = 'off' REPL rendering mode + * tengu_terminal_panel = false Terminal panel keybinding + * tengu_terminal_sidebar = false Terminal sidebar in REPL/config + * tengu_marble_sandcastle = false Fast mode gate + * tengu_jade_anvil_4 = false Rate limit options UI ordering + * tengu_collage_kaleidoscope = true Native clipboard image paste (macOS) + * tengu_lapis_finch = false Plugin/hint recommendation + * tengu_lodestone_enabled = false Deep links claude-cli:// protocol + * tengu_copper_panda = false Skill improvement suggestions + * tengu_desktop_upsell = {} Desktop app upsell config (dynamic) + * tengu-top-of-feed-tip = {} Emergency tip of feed (dynamic; uses dash) + * + * ── File operations ─────────────────────────────────────────────────── + * tengu_quartz_lantern = false File read/write dedup optimization + * tengu_moth_copse = false Attachments handling (variant A) + * tengu_marble_fox = false Attachments handling (variant B) + * tengu_scratch = gate Scratchpad filesystem access / coordinator + * + * ── MCP & plugins ───────────────────────────────────────────────────── + * tengu_harbor = false MCP channel allowlist verification + * tengu_harbor_permissions = false MCP channel permissions enforcement + * tengu_copper_bridge = false Chrome MCP bridge + * tengu_chrome_auto_enable = false Auto-enable Chrome MCP on startup + * tengu_glacier_2xr = false Enhanced tool search / ToolSearchTool + * tengu_malort_pedway = {} Computer-use (Chicago) config (dynamic) + * + * ── VSCode / IDE ────────────────────────────────────────────────────── + * tengu_quiet_fern = false VSCode browser support + * tengu_vscode_cc_auth = false VSCode in-band OAuth via claude_authenticate + * tengu_vscode_review_upsell = gate VSCode review upsell + * tengu_vscode_onboarding = gate VSCode onboarding experience + * + * ── Voice ───────────────────────────────────────────────────────────── + * tengu_amber_quartz_disabled = false VOICE_MODE kill-switch (false = voice allowed) + * + * ── Auto-updater (stubbed in open build) ────────────────────────────── + * tengu_version_config = {min:'0'} Min version enforcement (dynamic) + * tengu_max_version_config = {} Max version / deprecation config (dynamic) + * + * ── Telemetry & tracing ─────────────────────────────────────────────── + * tengu_trace_lantern = false Beta session tracing + * tengu_chair_sermon = gate Analytics / message formatting gate + * tengu_strap_foyer = false Settings sync to cloud + */ + function _loadFlags() { if (_flags !== undefined) return; try { @@ -55,6 +200,7 @@ function _loadFlags() { function _getFlagValue(key, defaultValue) { _loadFlags(); if (_flags != null && Object.hasOwn(_flags, key)) return _flags[key]; + if (Object.hasOwn(_openBuildDefaults, key)) return _openBuildDefaults[key]; return defaultValue; }