{
  "schema_version": "wheelie_feature_discovery_catalog/v1",
  "generated_at": "2026-05-18T00:00:00Z",
  "api_contract": {
    "schema": "/schemas/wheelie/feature-discovery.openapi.json",
    "path": "/v1/wheelie/feature-suggestions",
    "static_catalog": "/services/wheelie/feature-discovery.json",
    "personalization_model": "typed_usage_context_v1"
  },
  "privacy_contract": {
    "raw_command_arguments_collected": false,
    "raw_source_paths_collected": false,
    "secret_values_collected": false,
    "client_side_dismissal_storage": true,
    "server_side_personalization_requires_consent": true,
    "allowed_context_fields": [
      "surface",
      "command_family",
      "command_action",
      "active_workflow",
      "used_feature_ids",
      "dismissed_suggestion_ids",
      "recent_exposure_ids",
      "org_policy_tags"
    ]
  },
  "surfaces": [
    {
      "surface": "wheelie_cli_command_end",
      "max_suggestions": 1,
      "min_hours_between_impressions": 24,
      "max_impressions_per_7_days": 3,
      "default_gate": "enabled_for_human_tty_non_json",
      "disable_control": "WHEELIE_FEATURE_HINTS=0 or wheelie feature-discovery disable"
    },
    {
      "surface": "wheelie_dev_reload",
      "max_suggestions": 1,
      "min_hours_between_impressions": 24,
      "max_impressions_per_7_days": 3,
      "default_gate": "enabled_for_browser_local_storage",
      "disable_control": "Dismiss the card or set localStorage.wheelieFeatureDiscoveryDisabled=true"
    }
  ],
  "capabilities": [
    {
      "id": "auth_device_login",
      "title": "Sign in without pasting tokens",
      "support_level": "native",
      "support_state": "live",
      "docs": "/docs/wheelie/quickstart.md#2-sign-in-and-connect-integrations",
      "activation_signals": [{ "kind": "command", "command_family": "auth", "command_action": "login" }],
      "available_actions": [{ "kind": "command", "target": "wheelie auth login" }]
    },
    {
      "id": "model_credential_support",
      "title": "Check model and BYOK support before agent runs",
      "support_level": "requires_adapter_for_live_model_catalog_or_credential_use",
      "support_state": "requires_adapter",
      "docs": "/docs/wheelie/cli.md#launch-command-taxonomy",
      "activation_signals": [{ "kind": "command", "command_family": "models", "command_action": "list" }],
      "available_actions": [{ "kind": "command", "target": "wheelie models list --credential-mode subscription --json" }]
    },
    {
      "id": "harness_projection",
      "title": "Probe harness projection support or bring your own harness",
      "support_level": "requires_adapter_in_clean_public_stable_byo_harness_supported",
      "support_state": "requires_adapter",
      "docs": "/docs/wheelie/quickstart.md#4-start-your-byo-harness-and-ask-it-to-use-wheelie",
      "activation_signals": [{ "kind": "command", "command_family": "harness", "command_action": "install" }],
      "available_actions": [{ "kind": "command", "target": "wheelie harness install pi --dry-run --json" }]
    },
    {
      "id": "context_pack",
      "title": "Fetch a fast startup context pack",
      "support_level": "native_partial_without_auth_or_grants",
      "support_state": "live",
      "docs": "/docs/wheelie/quickstart.md#5-get-fast-startup-context",
      "activation_signals": [{ "kind": "command", "command_family": "context", "command_action": "pack" }],
      "available_actions": [{ "kind": "command", "target": "wheelie context pack --purpose coding --level startup --json" }]
    },
    {
      "id": "work_items",
      "title": "Turn one issue into a reviewable diff",
      "support_level": "native_work_item_existing_checkout_or_public_repo_wedge",
      "support_state": "live",
      "docs": "/docs/wheelie/quickstart.md#one-afternoon-wedge",
      "activation_signals": [{ "kind": "command", "command_family": "work", "command_action": "create" }],
      "available_actions": [{ "kind": "command", "target": "wheelie work create --title \"Update the README greeting\" --json" }]
    },
    {
      "id": "validation_evidence",
      "title": "Run validation and keep evidence records",
      "support_level": "native_when_run_inside_materialized_working_copy_requires_adapter_from_clean_public_install",
      "support_state": "requires_adapter",
      "docs": "/docs/wheelie/quickstart.md#7-validate-submit-watch-and-checkpoint",
      "activation_signals": [{ "kind": "command", "command_family": "validation", "command_action": "run" }],
      "available_actions": [{ "kind": "command", "target": "wheelie validation plan --json" }]
    },
    {
      "id": "checkpoint_handoff",
      "title": "Checkpoint a handoff artifact",
      "support_level": "preview_requires_checkpoint_store_for_live_write",
      "support_state": "hosted_preview",
      "docs": "/docs/wheelie/quickstart.md#7-validate-submit-watch-and-checkpoint",
      "activation_signals": [{ "kind": "command", "command_family": "checkpoint", "command_action": "create" }],
      "available_actions": [{ "kind": "command", "target": "wheelie checkpoint create --message \"ready for handoff\" --work-item <id> --context-file handoff.md --json" }]
    }
  ],
  "suggestions": [
    {
      "id": "try_auth_device_login",
      "capability_id": "auth_device_login",
      "title": "Next: sign in once, no raw tokens in prompts",
      "why_templates": {
        "cli": "You have Wheelie installed; auth unlocks source, work, and validation adapters without pasting provider tokens.",
        "web": "New to Wheelie? Auth is the next safe setup step after install and doctor."
      },
      "action": { "kind": "command", "target": "wheelie auth login" },
      "rank_affinity": [
        { "when": { "command_family": "doctor" }, "score": 90 },
        { "when": { "active_workflow": "first_run" }, "score": 80 }
      ],
      "suppress_if_used_feature_ids": ["auth_device_login"],
      "cooldown_hours": 72
    },
    {
      "id": "try_model_credential_support",
      "capability_id": "model_credential_support",
      "title": "Check model/BYOK support before launching work",
      "why_templates": {
        "cli": "Model credentials are mediated by support state; check BYOK/subscription/managed mode before an agent run assumes model access.",
        "web": "Before launching a run, verify whether your account has BYOK, subscription, managed, or enterprise model support."
      },
      "action": { "kind": "command", "target": "wheelie models list --credential-mode subscription --json" },
      "rank_affinity": [
        { "when": { "command_family": "auth" }, "score": 70 },
        { "when": { "active_workflow": "agent_setup" }, "score": 70 }
      ],
      "suppress_if_used_feature_ids": ["model_credential_support"],
      "cooldown_hours": 72
    },
    {
      "id": "try_harness_projection",
      "capability_id": "harness_projection",
      "title": "Use Wheelie from your coding harness",
      "why_templates": {
        "cli": "Probe harness support first; if clean stable reports requires_adapter, keep using Pi, Claude, or Codex as your BYO harness and ask it to follow Wheelie receipts.",
        "web": "The one-afternoon path works with the coding agent you already run; managed projection install stays adapter-gated until Wheelie returns a live receipt."
      },
      "action": { "kind": "command", "target": "wheelie harness install pi --dry-run --json" },
      "rank_affinity": [
        { "when": { "command_family": "auth" }, "score": 85 },
        { "when": { "active_workflow": "agent_setup" }, "score": 75 }
      ],
      "suppress_if_used_feature_ids": ["harness_projection"],
      "cooldown_hours": 72
    },
    {
      "id": "try_context_pack",
      "capability_id": "context_pack",
      "title": "Give your agent a fast startup context pack",
      "why_templates": {
        "cli": "Context packs are token-bounded and designed for coding-agent startup instead of broad repository scraping.",
        "web": "Context packs are the lowest-friction way to start an agent with useful Wheelie context."
      },
      "action": { "kind": "command", "target": "wheelie context pack --purpose coding --level startup --json" },
      "rank_affinity": [
        { "when": { "command_family": "harness" }, "score": 85 },
        { "when": { "active_workflow": "coding" }, "score": 70 }
      ],
      "suppress_if_used_feature_ids": ["context_pack"],
      "cooldown_hours": 72
    },
    {
      "id": "try_work_items",
      "capability_id": "work_items",
      "title": "Turn one issue into a reviewable diff",
      "why_templates": {
        "cli": "Pick one existing-checkout or public-repo issue, create a work item, and tie the diff, validation evidence, and submit/watch support state to that task.",
        "web": "Work items anchor the one-afternoon path: one issue, one working-copy handoff, one reviewable diff, and focused evidence."
      },
      "action": { "kind": "command", "target": "wheelie work create --title \"Update the README greeting\" --json" },
      "rank_affinity": [
        { "when": { "command_family": "context" }, "score": 85 },
        { "when": { "active_workflow": "coding" }, "score": 65 }
      ],
      "suppress_if_used_feature_ids": ["work_items"],
      "cooldown_hours": 72
    },
    {
      "id": "try_validation_evidence",
      "capability_id": "validation_evidence",
      "title": "Run validation with TAP evidence",
      "why_templates": {
        "cli": "You can turn a working-copy change into a validation plan and evidence record before submit.",
        "web": "Validation evidence is Wheelie's proof trail for agent-authored changes."
      },
      "action": { "kind": "command", "target": "wheelie validation plan --json" },
      "rank_affinity": [
        { "when": { "command_family": "working-copy" }, "score": 90 },
        { "when": { "command_family": "work" }, "score": 75 }
      ],
      "suppress_if_used_feature_ids": ["validation_evidence"],
      "cooldown_hours": 72
    },
    {
      "id": "try_checkpoint_handoff",
      "capability_id": "checkpoint_handoff",
      "title": "Create a checkpoint for handoff",
      "why_templates": {
        "cli": "Checkpoint stores are preview-only, but the contract shows how to preserve context-out when the lane is attached.",
        "web": "Checkpointing is how Wheelie turns a run into a resumable handoff artifact."
      },
      "action": { "kind": "link", "target": "/docs/wheelie/quickstart.md#7-validate-submit-watch-and-checkpoint" },
      "rank_affinity": [
        { "when": { "command_family": "validation" }, "score": 75 },
        { "when": { "active_workflow": "handoff" }, "score": 90 }
      ],
      "suppress_if_used_feature_ids": ["checkpoint_handoff"],
      "cooldown_hours": 168
    }
  ],
  "metrics": [
    "wheelie_feature_suggestion_impression",
    "wheelie_feature_suggestion_click",
    "wheelie_feature_suggestion_dismiss",
    "wheelie_feature_suggestion_disable",
    "wheelie_feature_suggestion_activation"
  ]
}
