{
  "version": 1,
  "flags": [
    {
      "id": "in-chat-onboarding-tour",
      "scope": "client",
      "key": "in-chat-onboarding-tour",
      "label": "In-Chat Onboarding Tour",
      "description": "Multivariate experiment for the eyes-led in-chat onboarding tour. control = straight to chat after research onboarding (current behavior); tour = the extended tour auto-plays on first workspace entry. Desktop-only: phone-width viewports and the native shell get neither the tour nor its telemetry (not even the exposure event), so the funnel measures desktop sessions exclusively. Targeted via LaunchDarkly (70% tour / 30% control).",
      "defaultEnabled": "control",
      "values": ["control", "tour"]
    },
    {
      "id": "user-hosted-enabled",
      "scope": "client",
      "key": "user-hosted-enabled",
      "label": "User Hosted Enabled",
      "description": "Enable user-hosted onboarding flow",
      "defaultEnabled": false
    },
    {
      "id": "proactive-tips",
      "scope": "client",
      "key": "proactive-tips",
      "label": "Proactive Tips",
      "description": "Gates the dismissible proactive tip card in the web sidebar. String-valued so future A/B arms can be added as new values.",
      "defaultEnabled": "off",
      "values": ["off", "on"]
    },
    {
      "id": "experiment-activation-flow-2026-06-03",
      "scope": "both",
      "key": "experiment-activation-flow-2026-06-03",
      "label": "Activation Flow Experiment 2026-06-03",
      "description": "Multivariate activation-flow experiment. control = standard flow; variant-a = activation rail; personal-page = new sign-up-page variant (front-end only). Targeted via LaunchDarkly.",
      "defaultEnabled": "control",
      "values": ["control", "variant-a", "personal-page"]
    },
    {
      "id": "local-docker-enabled",
      "scope": "client",
      "key": "local-docker-enabled",
      "label": "Local Docker Mode",
      "description": "When enabled, the Local hosting option uses Docker under the hood for sandboxed execution, hiding the separate Docker card",
      "defaultEnabled": false
    },
    {
      "id": "a2a-channel",
      "scope": "assistant",
      "key": "a2a-channel",
      "label": "A2A Channel",
      "description": "Enable the A2A (Agent-to-Agent) channel for inter-assistant communication via the open A2A protocol",
      "defaultEnabled": false
    },
    {
      "id": "settings-developer-nav",
      "scope": "assistant",
      "key": "settings-developer-nav",
      "label": "Settings Developer Nav",
      "description": "Control Developer nav visibility in macOS settings",
      "defaultEnabled": false
    },
    {
      "id": "developer-menu-items",
      "scope": "client",
      "key": "developer-menu-items",
      "label": "Developer Menu Items",
      "description": "Show Component Gallery and Replay Onboarding in the menu bar",
      "defaultEnabled": false
    },
    {
      "id": "settings-embedding-provider",
      "scope": "assistant",
      "key": "settings-embedding-provider",
      "label": "Embedding Provider Settings",
      "description": "Show the Embedding service card in Models & Services settings",
      "defaultEnabled": false
    },
    {
      "id": "multi-platform-assistant",
      "scope": "client",
      "key": "multi-platform-assistant",
      "label": "Multi-Platform Assistant Switcher",
      "description": "Enable the menu-bar assistant switcher for managing multiple platform-hosted assistants (new/switch/retire)",
      "defaultEnabled": false
    },
    {
      "id": "quick-input",
      "scope": "client",
      "key": "quick-input",
      "label": "Quick Input",
      "description": "Enable the Quick Input popover on right-click of the menu bar icon",
      "defaultEnabled": false
    },
    {
      "id": "expand-completed-steps",
      "scope": "client",
      "key": "expand-completed-steps",
      "label": "Expand Completed Steps",
      "description": "Auto-expand completed tool call step groups instead of showing them collapsed",
      "defaultEnabled": false
    },
    {
      "id": "backward-releases",
      "scope": "assistant",
      "key": "backward-releases",
      "label": "Backward Releases",
      "description": "Show older versions in the version picker, allowing rollback to previous releases",
      "defaultEnabled": false
    },
    {
      "id": "fast-mode",
      "scope": "assistant",
      "key": "fast-mode",
      "label": "Fast Mode",
      "description": "Enable Anthropic fast mode for Opus models (4.6, 4.7, 4.8), delivering up to 2.5x higher output tokens per second at premium pricing",
      "defaultEnabled": false
    },
    {
      "id": "teleport",
      "scope": "client",
      "key": "teleport",
      "label": "Teleport",
      "description": "Enable teleport UI in General settings for moving assistants between hosting environments",
      "defaultEnabled": false
    },
    {
      "id": "apple-container",
      "scope": "client",
      "key": "apple-container",
      "label": "Apple Container",
      "description": "Enable assistant sandboxing via Apple Containers on macOS 26+, providing a lightweight native sandbox without third-party dependencies",
      "defaultEnabled": false
    },
    {
      "id": "fork-from-message",
      "scope": "client",
      "key": "fork-from-message",
      "label": "Internal Thread Actions (legacy key)",
      "description": "Legacy key for `internal-thread-actions`. The client grants the internal thread affordances when either key is enabled, so the platform may serve the gate under either name. Declared here so the flag mapper keeps the value instead of dropping it as undeclared.",
      "defaultEnabled": false
    },
    {
      "id": "internal-thread-actions",
      "scope": "client",
      "key": "internal-thread-actions",
      "label": "Internal Thread Actions",
      "description": "Show the internal thread affordances: 'Fork from here' on messages, 'Fork Conversation', 'Analyze Conversation', and 'Copy conversation ID' in the thread menu, plus the LLM inspector surfaces. The flag is the sole gate: any session that enables it gets the affordances, including local sessions with no platform identity.",
      "defaultEnabled": false
    },
    {
      "id": "home-tab",
      "scope": "client",
      "key": "home-tab",
      "label": "Home Tab",
      "description": "Replace the knowledge graph top-level tab with a new Home page showing relationship progression, facts, and capability tiers",
      "defaultEnabled": false
    },
    {
      "id": "scroll-debug-overlay",
      "scope": "client",
      "key": "scroll-debug-overlay",
      "label": "Scroll Debug Overlay",
      "description": "Show a live HUD in the top-right of the conversation with scroll geometry, velocity, update rate, and anchor-preserver activity. Developer diagnostic for investigating scroll jank.",
      "defaultEnabled": false
    },
    {
      "id": "compaction-playground",
      "scope": "assistant",
      "key": "compaction-playground",
      "label": "Compaction Playground",
      "description": "Expose the developer-only Compaction Playground tab in macOS Settings and enable the /playground/* HTTP endpoints for exercising compaction conditions. Dev-only; default off.",
      "defaultEnabled": false
    },
    {
      "id": "app-control",
      "scope": "assistant",
      "key": "app-control",
      "label": "App Control",
      "description": "Enable the app-control skill (per-app screenshot + raw input bypassing AX tree)",
      "defaultEnabled": false
    },
    {
      "id": "velvet-theme",
      "scope": "client",
      "key": "velvet-theme",
      "label": "Velvet Theme",
      "description": "Show the Velvet theme option in the macOS appearance settings. Velvet is a dark-mode variant with red/pink accent colors.",
      "defaultEnabled": false
    },
    {
      "id": "chat-pull-to-refresh-enabled",
      "scope": "client",
      "key": "chat-pull-to-refresh-enabled",
      "label": "Chat Pull to Refresh",
      "description": "Enable pull-to-refresh gesture in the chat view.",
      "defaultEnabled": false
    },
    {
      "id": "centralized-assistant-status",
      "scope": "client",
      "key": "centralized-assistant-status",
      "label": "Centralized Assistant Status",
      "description": "Enable client polling of the centralized assistant operational status endpoint.",
      "defaultEnabled": false
    },
    {
      "id": "preview-channel",
      "scope": "client",
      "key": "preview-channel",
      "label": "Preview Channel",
      "description": "Enable user-facing Preview release channel controls in assistant settings.",
      "defaultEnabled": false
    },
    {
      "id": "rollback-enabled",
      "scope": "assistant",
      "key": "rollback-enabled",
      "label": "Rollback Enabled",
      "description": "Show older versions in the version picker, allowing rollback to previous releases.",
      "defaultEnabled": false
    },
    {
      "id": "self-hosted-assistant",
      "scope": "client",
      "key": "self-hosted-assistant",
      "label": "Self-Hosted Assistant",
      "description": "Enable self-hosted assistant configuration.",
      "defaultEnabled": false
    },
    {
      "id": "paired-devices-ui",
      "scope": "client",
      "key": "paired-devices-ui",
      "label": "Paired Devices UI",
      "description": "Show the paired-devices list and revoke controls inside the pair-a-device settings card. Visibility only; `vellum devices` on the host stays available.",
      "defaultEnabled": false
    },
    {
      "id": "settings-sleep-policy",
      "scope": "assistant",
      "key": "settings-sleep-policy",
      "label": "Settings Sleep Policy",
      "description": "Enable sleep policy settings.",
      "defaultEnabled": false
    },
    {
      "id": "velvet",
      "scope": "client",
      "key": "velvet",
      "label": "Velvet",
      "description": "Enable the Velvet design theme.",
      "defaultEnabled": false
    },
    {
      "id": "memory-router-playground",
      "scope": "client",
      "key": "memory-router-playground",
      "label": "Memory Router Playground",
      "description": "Expose the developer-only Memory Router Playground tab in macOS Settings and the /assistant/memory-router-playground web page for dry-running v4 router config overrides against the live page index. Dev-only; default off.",
      "defaultEnabled": false
    },
    {
      "id": "self-intro-greeting",
      "scope": "both",
      "key": "self-intro-greeting",
      "label": "Self-intro first message",
      "description": "On the first conversation, send a natural self-introduction (e.g. \"Hi Vela, I'm alex. Nice to meet you.\") on the user's behalf and route it through real LLM inference, instead of serving the canned first greeting. Names come from the onboarding context; falls back to the canned greeting when no name is known. Exposed to clients so pre-hatch onboarding can compute the source-of-truth initial message, and to the assistant so older clients can still be gated server-side. See assistant/src/daemon/first-greeting.ts (buildSelfIntroMessage).",
      "defaultEnabled": false
    },
    {
      "id": "channel-trust-floors",
      "scope": "assistant",
      "key": "channel-trust-floors",
      "label": "Channel Trust Floors",
      "description": "Expose the Channel Trust Floors settings card (per-channel inbound admission policy) on the Privacy settings page. When off, the card is hidden and channels fall back to their default admission floors. On by default; disable to hide the card.",
      "defaultEnabled": true
    },
    {
      "id": "mcp-add-server",
      "scope": "assistant",
      "key": "mcp-add-server",
      "label": "MCP Add Server",
      "description": "Show the Add Server action on the MCP settings page. The MCP page itself remains visible; this flag gates only creating new Model Context Protocol server connections.",
      "defaultEnabled": false
    },
    {
      "id": "os-beta",
      "scope": "assistant",
      "key": "os-beta",
      "label": "OS Beta",
      "description": "Enable the OS Beta model profile (MiniMax M3 / Together) in the assistant's model profile selection.",
      "defaultEnabled": false
    },
    {
      "id": "new-thread-suggestions",
      "scope": "client",
      "key": "new-thread-suggestions",
      "label": "New-thread suggestions library",
      "description": "Replace the empty-state conversation-starter chips with the scrollable, categorized suggestions library and detail drawer (currently mocked data).",
      "defaultEnabled": false
    },
    {
      "id": "account-mfa",
      "scope": "client",
      "key": "account-mfa",
      "label": "Account MFA",
      "description": "Surface the Security settings page where users enroll and manage TOTP two-factor authentication for their Vellum (WorkOS) account. Applies to email/password sign-in only.",
      "defaultEnabled": false
    },
    {
      "id": "chat-credential-reveal",
      "scope": "assistant",
      "key": "chat-credential-reveal",
      "label": "Chat Credential Reveal",
      "description": "Persist chat secret redactions as sentinel markers instead of the legacy HTML marker, enriched with the vault identity when the value byte-matches a credential revealed this turn. Also gates the `credentials reveal --for-chat` channel and the live-stream swap that replaces an echoed reveal plaintext with its sentinel before emission. Redaction itself is NOT gated: a route-proven reveal plaintext stays out of persisted rows in both modes. Client chip rendering is gated on daemon version, not on this flag.",
      "defaultEnabled": false
    },
    {
      "id": "marketing-pricing-takeover",
      "scope": "client",
      "key": "marketing-pricing-takeover",
      "label": "Marketing Pricing Takeover",
      "description": "Gates the marketing pricing takeover page (www.vellum.ai/pricing) and the `/assistant/checkout?package=<slug>` deep link its package CTAs target. One flag covers both halves of the funnel so they can never be enabled independently and strand a CTA. When off, the checkout deep link redirects to the in-app plans takeover.",
      "defaultEnabled": false
    },
    {
      "id": "assistant-reply-push",
      "scope": "assistant",
      "key": "assistant-reply-push",
      "label": "Assistant Reply Push",
      "description": "Gates the `chat.assistant_reply` push notification the assistant sends at the end of a user-initiated turn whose reply the user has not seen. On by default; turn it off to silence the push without disabling the rest of the notification pipeline.",
      "defaultEnabled": true
    },
    {
      "id": "desktop-presence-suppression",
      "scope": "assistant",
      "key": "desktop-presence-suppression",
      "label": "Desktop Presence Suppression",
      "description": "Gates whether a `chat.assistant_reply` push is suppressed while a Mac desktop client reports itself attended. On by default; turn it off to restore unconditional reply pushes.",
      "defaultEnabled": true
    },
    {
      "id": "web-presence-suppression",
      "scope": "assistant",
      "key": "web-presence-suppression",
      "label": "Web Presence Suppression",
      "description": "Gates whether a `chat.assistant_reply` push is suppressed while a browser tab reports itself visible on that conversation. On by default; turn it off to restore unconditional reply pushes for web-visible conversations.",
      "defaultEnabled": true
    },
    {
      "id": "plugin-schedules",
      "scope": "assistant",
      "key": "plugin-schedules",
      "label": "Plugin Schedules",
      "description": "Plugins declare recurring schedules as files that register and run automatically",
      "defaultEnabled": true
    },
    {
      "id": "experiment-balanced-model-2026-08-06",
      "scope": "assistant",
      "key": "experiment-balanced-model-2026-08-06",
      "label": "Experiment: Balanced Profile Model",
      "description": "Multivariate experiment on the model the managed Balanced inference profile resolves to. control = the shipped pin (accounts/fireworks/models/glm-5p2); terra = gpt-5.6-terra; glm-5p2 = accounts/fireworks/models/glm-5p2. Only the managed (vellum) implementation moves: ChatGPT-subscription and BYOK installs run the provider the user chose and are outside the experiment. Rollout and targeting are managed in the LaunchDarkly dashboard; any value that is not an arm name resolves to control.",
      "defaultEnabled": "control",
      "values": ["control", "terra", "glm-5p2"]
    },
    {
      "id": "obscure-credits",
      "scope": "client",
      "key": "obscure-credits",
      "label": "Obscure Credits",
      "description": "Replaces the dollar amounts on the billing Plan section with a usage-relative view: the current-plan tile trades its price footer for a Usage Balance bar (managed spend this billing cycle against the package's included credits) and the credits spec chip reads \"<Package> usage, reset monthly\" instead of naming a dollar bundle. Spec chips wrap horizontally to fit the shorter labels. Off leaves the Plan section exactly as it ships today.",
      "defaultEnabled": false
    }
  ]
}
