Interactive onboarding. Everything deterministic — detection, the per-phase model recommendation, the policy write, and verification — runs in the Go binary (evolve setup detect|recommend|apply). The only judgment left HERE, in your session (zero extra API cost), is teaching the pipeline and relaying the user's one preset choice. You no longer hand-author pins; evolve setup apply writes them. Presets are defined in a public config file (go/internal/setup/presets.json, overridable per-repo via .evolve/setup-presets.json) — never hardcoded. See docs/architecture/setup-onboarding.md.
Invoked as /evo:setup (the evo plugin namespace); /evo:setup is the same skill.
-
Detect. Run evolve setup detect --json and parse it. The digest has clis[] (per family: binary_present, auth_mode, subscription_type, capability_tier, verdict, and tier_models) and phases[] (per role: current_cli/current_tier, source, default_cli/default_tier, envelope, allowed_clis, pin_violation). A malformed .evolve/policy.json shows as a top-level policy_error.
-
Present the detection as a compact table — one row per CLI family with binary/auth/tier/verdict. (macOS Keychain OAuth is detected — a Keychain-authed claude shows SUBSCRIPTION_OAUTH, not blocked.)
-
Explain the pipeline concisely (this is the teaching goal). Read the canonical sources first — do NOT invent: README.md "Pipeline Design", docs/concepts/overview.md, docs/architecture/phase-architecture.md, docs/architecture/dynamic-phase-routing.md. Cover, in ~6–10 lines: the cycle (Scout → Build → Audit → Ship → Learn), what each phase produces, and why it is trustworthy (deterministic EGPS verdicts, SHA-chained ledger, adversarial Builder≠Auditor). Personalize: reference the user's actual detected CLIs.
-
Recommend. Run evolve setup recommend --json. It returns available_families, cross_family_ok, and presets[] — each preset a full per-phase assignments[] (role, cli, tier, model, differs_from_default, warning) plus a description; default names the recommended one. The binary already applied every rule (envelope clamp, allowed_clis, availability, cross-family split) — you do NOT re-derive any of this. A degraded preset has an unsatisfiable phase (e.g. no authed CLI); surface it but don't pick it.
-
Present the THREE presets as ONE comparison and let the user choose with a single AskUserQuestion (options: the preset names; pre-select default). Summarize each in a line or two from its description + a couple of notable assignments (e.g. "builder→codex, auditor→claude; cheaper phases on fast"). This is the whole "which model for which phase" decision — one pick, not twelve. (Advanced: a user can edit the preset definitions in .evolve/setup-presets.json; mention it only if asked.)
-
Apply. Run evolve setup apply --preset <choice>. The binary deterministically writes the chosen preset's per-phase pins into .evolve/policy.json (lossless merge — preserves floor/cli_health/foreign pins; emits a pin ONLY where it differs from the profile default; stores the abstract tier). It refuses (non-zero exit) a degraded preset or a malformed existing policy rather than write something illegal. Use --dry-run first if the user wants to preview the merged policy.
-
Verify. Re-run evolve setup detect and confirm each pinned phase shows source: "policy-pin" with an EMPTY pin_violation and no top-level policy_error. (The same clamp hard-fails an out-of-bounds pin at dispatch, so this is the pre-flight catch.)
-
Mark complete. Run evolve setup complete to stamp the first-run marker (so the loop stops nudging). Confirm setup is done and that re-running /evo:setup anytime is safe.