Conversation
After plan approval, `/spec` now ends the planning turn and waits so you
can switch models for implementation. Two ways to resume:
Path A — switch in place
`/model sonnet[1m]` then any prompt (e.g. `continue`). Same session,
planning context carries over. Claude Code asks to confirm the model
switch — the existing context is re-sent to Sonnet on the next turn.
Path B — clean start
`/clear`, then `/spec docs/plans/<plan>.md`. Fresh session, no context
carry. The dispatcher sees the approved plan and routes straight into
implementation.
A new UserPromptSubmit hook (`spec_handoff_resume`) detects the handoff
sentinel and dispatches the next prompt directly to `spec-implement`, so
no `/spec` re-invocation is needed on Path A.
`spec-mode-guard` now hard-blocks `/spec` on non-Opus models for the
planning leg — planning is where reasoning quality dominates outcome.
Resuming an existing plan (`/spec docs/plans/<plan>.md`) is allowed on
any model.
The Model Switching toggle in Console Settings → Automation controls
whether the workflow pauses or runs continuously. Turn it off to stay on
one model end-to-end (also the right setting for headless / CI).
Stop guard now leaves the handoff sentinel intact across the Stop event
so the prompt hook can consume it; `session_clear` cleans up the sentinel
when the user runs `/clear`.
Pilot no longer manages a per-skill / per-agent model routing table. Claude Code's `/model` is the single switch for every workflow. The Settings page's Models and Security sections, the Cost Optimization copy that named specific models, and the per-skill `model:` frontmatter on Pilot-shipped skills are all gone. Config migration v12 strips the dead keys from ~/.pilot/config.json on first launch (`model`, `skills`, `agents`, `extendedContext`, `extendedContextOverrides`) and writes a pre-migration snapshot to ~/.pilot/config.json.bak.v11 once per machine. The new `specWorkflow.modelSwitch` toggle is seeded to true. Credential / secret scanner hooks deleted along with the Console's Security tab and the security-credentials rule. The legacy mksglu/context-mode MCP plugin (auto-installed by older Pilot versions) is auto-uninstalled on upgrade, together with its orphan SessionStart hook in ~/.claude/settings.json. Installer dependency output now distinguishes installed / updated / removed / unchanged. Re-runs no longer show a noisy "✓ X installed" for every tool that was already there — only steps that actually did something report. A one-time launcher notice infrastructure (`launcher/notice.py`) announces the rework on first launch after upgrade. The announcement is sentinel-gated and won't repeat. Permission Modes moved from Getting Started to Features in the docs sidebar; the standalone Security page is gone. Model Routing was rewritten to a single-page walkthrough with the two resume paths laid out explicitly. The marketing site's WhatsInside pillars were rebalanced — "Hooks, Quality & Security" became "Hooks & Quality" (security tile dropped), Cost Optimization no longer hardcodes model names, and card lengths were tightened so the grid reads consistently. BREAKING CHANGE: Pilot no longer manages model selection. Users with `model`, `skills`, `agents`, `extendedContext`, or `extendedContextOverrides` keys in ~/.pilot/config.json will see those keys stripped on first launch. The pre-migration JSON is preserved at ~/.pilot/config.json.bak.v11. Pick your model with Claude Code's `/model` instead. `/spec` requires Opus for the planning leg (spec-mode-guard hard-blocks Sonnet). BREAKING CHANGE: The credential scanner and secret scanner hooks have been removed, along with the `security-credentials` rule, the Console's Security settings tab, and the `docs/features/security.md` page. Use Claude Code's built-in safeguards and project-level conventions for secret handling. BREAKING CHANGE: The legacy mksglu/context-mode Claude plugin (auto-installed by older Pilot versions) is auto-uninstalled on first launch after upgrade. Its orphan SessionStart hook in ~/.claude/settings.json is also removed.
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (6)
WalkthroughThis PR shifts Pilot Shell from a security-scanner/context-mode focus to a model-switching-first workflow: adds config v12 migration (prunes legacy model keys, seeds modelSwitch), removes deprecated claude artifacts, refactors installer/plugin install outcomes and cleanup, updates install/uninstall scripts, and refreshes docs/site content including Reset & Refresh guidance. ChangesConfig Migration & Data Schema
Deprecated Artifact Cleanup
Installation & Messaging Infrastructure
Documentation & Marketing Content
Tests
Estimated code review effort: Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Claude finished @maxritter's task in 2m 55s —— View job Code Review: v9.0.0 — Model switching for
|
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
installer/tests/unit/steps/test_config_migration.py (1)
147-167:⚠️ Potential issue | 🟠 Major | ⚡ Quick winTest intent and assertions are mismatched for “subscription-aware” fresh install.
This test’s docstring describes a Max-plan regression on default model routing, but the assertions only verify file creation and
_configVersion. It doesn’t assert any subscription-dependent outcome, so it won’t catch the regression it describes.Please either (a) assert a concrete max-specific postcondition, or (b) rename/re-scope the test to reflect what it actually validates.
As per coding guidelines, “Review test code briefly. Focus on coverage and proper mocking.”
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/docusaurus/docs/features/console.md`:
- Line 106: Update the Settings tab description to remove the stale "Security"
section reference: modify the sentence that currently reads "a single scrollable
page with three stacked sections: **Spec Workflow**, **Console**, **Security**"
to reflect the current UI (e.g., "a single scrollable page with two stacked
sections: **Spec Workflow** and **Console**"), and ensure the following
sentences about toggle preferences saving to `~/.pilot/config.json` and the
**Console → Worker Port** saving to `~/.pilot/memory/settings.json` remain
accurate and unchanged; update any nearby wording that mentions restarting Pilot
if necessary so the flow no longer references a Security tab.
In `@docs/docusaurus/docs/getting-started/installation.md`:
- Around line 80-83: The bash snippet contains an invalid token "> /logout"
which is interpreted as shell redirection; update the code block to remove the
leading ">" so it reads simply "/logout" (or move the "/logout" instruction out
of the bash fenced block into a plain text step). Modify the block that
currently contains "> /logout" to either show "/logout" alone inside the fenced
bash snippet or present the logout instruction as a regular list item so
copy-paste runs correctly.
In `@docs/site/src/components/ConsoleSection.tsx`:
- Around line 64-65: The Settings copy in ConsoleSection.tsx still mentions
"credential scanner" even though that feature and the Console Security tab were
removed; update the descriptive strings (the desc prop and, if present, the alt
text) in the ConsoleSection component to remove the phrase "credential scanner"
and any related wording so the UI text reflects the current feature set (keep
the rest of the description about spec workflow toggles, reviewer configuration,
and model note intact).
In `@installer/steps/dependencies.py`:
- Around line 811-870: The subprocess invocations in
_legacy_context_mode_uninstall_plugin and
_legacy_context_mode_remove_marketplace use the wrong subcommand "plugin"
(singular) causing commands to fail; update each subprocess.run call in those
functions to use "plugins" (plural) for the CLI subcommand (replace ["claude",
"plugin", ...] with ["claude", "plugins", ...] in the
list/marketplace/uninstall/remove calls so the calls in
_legacy_context_mode_uninstall_plugin and
_legacy_context_mode_remove_marketplace match the working usage elsewhere).
In `@installer/tests/unit/steps/test_config_migration.py`:
- Around line 1110-1111: The test docstrings and assertions for
migrate_model_config full-chain tests are inconsistent about what the .bak.v11
backup should contain (pre-v12 vs original input); pick one contract (recommend:
.bak.v11 captures the state after v9/v10 but before v12 pruning) and make
tests/docstrings consistent: update the docstring that currently says ".bak.v11
captures pre-v12 state" to match the chosen contract if needed, and change
assertions that expect original-input values (e.g., expecting "opus" or "[1m]")
to instead assert the post-v9/post-v10 form that should appear in the .bak.v11
backup; apply the same alignment to other affected tests referenced (around the
blocks near lines 1139-1144, 1266-1267, 1290-1295) and ensure references to
.bak.v11, migrate_model_config, and the specific test functions reflect the
chosen snapshot contract.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: b456be5d-ff74-4311-bdef-bf49f709902a
⛔ Files ignored due to path filters (102)
console/src/services/worker/http/routes/ExtensionRoutes.tsis excluded by!console/**console/src/services/worker/http/routes/SettingsRoutes.tsis excluded by!console/**console/src/services/worker/http/routes/ToolSavingsRoutes.tsis excluded by!console/**console/src/ui/viewer/App.tsxis excluded by!console/**console/src/ui/viewer/components/ActivationModal.tsxis excluded by!console/**console/src/ui/viewer/components/LicenseGate.tsxis excluded by!console/**console/src/ui/viewer/hooks/useLegacySettingsRedirect.tsis excluded by!console/**console/src/ui/viewer/hooks/useSettings.tsis excluded by!console/**console/src/ui/viewer/hooks/useToolSavings.tsis excluded by!console/**console/src/ui/viewer/views/Settings/ModelSelect.tsxis excluded by!console/**console/src/ui/viewer/views/Settings/index.tsxis excluded by!console/**console/src/ui/viewer/views/Settings/sections/ConsoleSection.tsxis excluded by!console/**console/src/ui/viewer/views/Settings/sections/ModelsSection.tsxis excluded by!console/**console/src/ui/viewer/views/Settings/sections/SecuritySection.tsxis excluded by!console/**console/src/ui/viewer/views/Settings/sections/SpecWorkflowSection.tsxis excluded by!console/**console/src/ui/viewer/views/Settings/sections/_shared.tsxis excluded by!console/**console/src/ui/viewer/views/Usage/ModelRoutingInfo.tsxis excluded by!console/**console/src/ui/viewer/views/Usage/index.tsxis excluded by!console/**console/tests/hooks/useSettings-save-error.test.tsxis excluded by!console/**console/tests/hooks/useSettings.test.tsis excluded by!console/**console/tests/settings-routes.test.tsis excluded by!console/**console/tests/ui/legacy-settings-redirect.test.tsxis excluded by!console/**console/tests/ui/model-routing-info.test.tsis excluded by!console/**console/tests/ui/usage-view.test.tsis excluded by!console/**console/tests/worker/extension-routes.test.tsis excluded by!console/**launcher/banner.pyis excluded by!launcher/**launcher/build.pyis excluded by!launcher/**launcher/cli.pyis excluded by!launcher/**launcher/model_config.pyis excluded by!launcher/**launcher/notice.pyis excluded by!launcher/**launcher/settings_injector.pyis excluded by!launcher/**launcher/statusline/formatter.pyis excluded by!launcher/**launcher/tests/unit/statusline/test_formatter.pyis excluded by!launcher/**launcher/tests/unit/test_ansi_safety.pyis excluded by!launcher/**launcher/tests/unit/test_customize.pyis excluded by!launcher/**launcher/tests/unit/test_model_config.pyis excluded by!launcher/**launcher/tests/unit/test_notice.pyis excluded by!launcher/**launcher/tests/unit/test_settings_injector.pyis excluded by!launcher/**launcher/wrapper.pyis excluded by!launcher/**pilot/claude.jsonis excluded by!pilot/**pilot/hooks/_checkers/tdd.pyis excluded by!pilot/**pilot/hooks/_lib/allow_tags.pyis excluded by!pilot/**pilot/hooks/_lib/secret_scanner.pyis excluded by!pilot/**pilot/hooks/_lib/util.pyis excluded by!pilot/**pilot/hooks/context_monitor.pyis excluded by!pilot/**pilot/hooks/credential_scanner.pyis excluded by!pilot/**pilot/hooks/hooks.jsonis excluded by!pilot/**pilot/hooks/session_clear.pyis excluded by!pilot/**pilot/hooks/spec_handoff_resume.pyis excluded by!pilot/**pilot/hooks/spec_mode_guard.pyis excluded by!pilot/**pilot/hooks/spec_stop_guard.pyis excluded by!pilot/**pilot/hooks/tests/test__util.pyis excluded by!pilot/**pilot/hooks/tests/test_allow_tags.pyis excluded by!pilot/**pilot/hooks/tests/test_context_monitor.pyis excluded by!pilot/**pilot/hooks/tests/test_credential_scanner.pyis excluded by!pilot/**pilot/hooks/tests/test_secret_scanner.pyis excluded by!pilot/**pilot/hooks/tests/test_spec_handoff_resume.pyis excluded by!pilot/**pilot/hooks/tests/test_spec_mode_guard.pyis excluded by!pilot/**pilot/hooks/tests/test_spec_stop_guard.pyis excluded by!pilot/**pilot/hooks/tests/test_tdd_enforcer.pyis excluded by!pilot/**pilot/hooks/tests/test_tool_redirect.pyis excluded by!pilot/**pilot/hooks/tool_redirect.pyis excluded by!pilot/**pilot/rules/browser-automation.mdis excluded by!pilot/**pilot/rules/context-mode.mdis excluded by!pilot/**pilot/rules/development-practices.mdis excluded by!pilot/**pilot/rules/security-credentials.mdis excluded by!pilot/**pilot/scripts/mcp-server.cjsis excluded by!pilot/**pilot/scripts/worker-service.cjsis excluded by!pilot/**pilot/settings.jsonis excluded by!pilot/**pilot/skills/benchmark/orchestrator.mdis excluded by!pilot/**pilot/skills/benchmark/scripts/isolation.pyis excluded by!pilot/**pilot/skills/benchmark/scripts/runner.pyis excluded by!pilot/**pilot/skills/benchmark/scripts/utils.pyis excluded by!pilot/**pilot/skills/benchmark/steps/04-execute.mdis excluded by!pilot/**pilot/skills/benchmark/tests/test_aggregate_benchmark.pyis excluded by!pilot/**pilot/skills/benchmark/tests/test_isolation.pyis excluded by!pilot/**pilot/skills/benchmark/tests/test_runner.pyis excluded by!pilot/**pilot/skills/benchmark/tests/test_utils.pyis excluded by!pilot/**pilot/skills/create-skill/orchestrator.mdis excluded by!pilot/**pilot/skills/fix/orchestrator.mdis excluded by!pilot/**pilot/skills/fix/steps/06-finalise.mdis excluded by!pilot/**pilot/skills/prd/orchestrator.mdis excluded by!pilot/**pilot/skills/setup-rules/orchestrator.mdis excluded by!pilot/**pilot/skills/spec-bugfix-plan/orchestrator.mdis excluded by!pilot/**pilot/skills/spec-bugfix-plan/steps/00-setup-and-red-flags.mdis excluded by!pilot/**pilot/skills/spec-bugfix-plan/steps/06-approval.mdis excluded by!pilot/**pilot/skills/spec-bugfix-verify/orchestrator.mdis excluded by!pilot/**pilot/skills/spec-implement/orchestrator.mdis excluded by!pilot/**pilot/skills/spec-plan/orchestrator.mdis excluded by!pilot/**pilot/skills/spec-plan/steps/00-setup-and-questions.mdis excluded by!pilot/**pilot/skills/spec-plan/steps/10-plan-verification.mdis excluded by!pilot/**pilot/skills/spec-plan/steps/12-approval.mdis excluded by!pilot/**pilot/skills/spec-verify/orchestrator.mdis excluded by!pilot/**pilot/skills/spec-verify/steps/01-launch-review.mdis excluded by!pilot/**pilot/skills/spec-verify/steps/03-collect-results.mdis excluded by!pilot/**pilot/skills/spec-verify/steps/07-e2e-and-final-regression.mdis excluded by!pilot/**pilot/skills/spec/orchestrator.mdis excluded by!pilot/**pilot/ui/ExtensionsView.jsis excluded by!pilot/**pilot/ui/index4.jsis excluded by!pilot/**pilot/ui/index5.jsis excluded by!pilot/**pilot/ui/viewer-bundle.jsis excluded by!pilot/**pilot/ui/viewer.cssis excluded by!pilot/**
📒 Files selected for processing (27)
README.mddocs/docusaurus/docs/features/console.mddocs/docusaurus/docs/features/context-optimization.mddocs/docusaurus/docs/features/hooks.mddocs/docusaurus/docs/features/mcp-servers.mddocs/docusaurus/docs/features/model-routing.mddocs/docusaurus/docs/features/open-source-tools.mddocs/docusaurus/docs/features/permission-modes.mddocs/docusaurus/docs/features/rules.mddocs/docusaurus/docs/features/security.mddocs/docusaurus/docs/getting-started/installation.mddocs/docusaurus/sidebars.tsdocs/site/src/components/ConsoleSection.tsxdocs/site/src/components/DeepDiveSection.tsxdocs/site/src/components/FAQSection.tsxdocs/site/src/components/WhatsInside.tsxinstall.shinstaller/steps/claude_files.pyinstaller/steps/config_migration.pyinstaller/steps/dependencies.pyinstaller/tests/unit/steps/test_claude_files.pyinstaller/tests/unit/steps/test_config_migration.pyinstaller/tests/unit/steps/test_dependencies.pyinstaller/tests/unit/steps/test_prerequisites.pyinstaller/tests/unit/test_drift_check.pyinstaller/tests/unit/test_install_sh.pyuninstall.sh
💤 Files with no reviewable changes (1)
- docs/docusaurus/docs/features/security.md
| """Full migrate_model_config from v8 runs v9 (sonnet for pro) then v12 (prune model keys). | ||
| The v9 effect is captured in the .bak.v11 backup; the on-disk config has the keys pruned.""" |
There was a problem hiding this comment.
Backup-state expectations are internally inconsistent across full-chain tests.
These tests/documentation say the .bak.v11 captures pre-v12 state, but assertions expect pre-v9/pre-v10 values (e.g., expecting opus/[1m] forms). This ambiguity can lock in the wrong migration contract.
Please align docstrings/comments and assertions to one contract (pre-v12 snapshot vs original input snapshot) consistently.
Also applies to: 1139-1144, 1266-1267, 1290-1295
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@installer/tests/unit/steps/test_config_migration.py` around lines 1110 -
1111, The test docstrings and assertions for migrate_model_config full-chain
tests are inconsistent about what the .bak.v11 backup should contain (pre-v12 vs
original input); pick one contract (recommend: .bak.v11 captures the state after
v9/v10 but before v12 pruning) and make tests/docstrings consistent: update the
docstring that currently says ".bak.v11 captures pre-v12 state" to match the
chosen contract if needed, and change assertions that expect original-input
values (e.g., expecting "opus" or "[1m]") to instead assert the post-v9/post-v10
form that should appear in the .bak.v11 backup; apply the same alignment to
other affected tests referenced (around the blocks near lines 1139-1144,
1266-1267, 1290-1295) and ensure references to .bak.v11, migrate_model_config,
and the specific test functions reflect the chosen snapshot contract.
- `docs/features/console.md`: Settings tab now correctly describes two stacked sections (Spec Workflow and Console) — the removed Security section was still mentioned. - `docs/getting-started/installation.md` + `README.md`: drop the leading `>` before `/logout` inside the Reset & Refresh bash fence. The `>` was meant as a Claude Code prompt marker but inside a fenced bash block it parses as shell redirection, so copy-paste would silently truncate the file to empty. - `docs/site/src/components/ConsoleSection.tsx`: remove "credential scanner" and "security toggles" copy from the Settings card; both features have been removed. - `installer/steps/dependencies.py`: standardize `claude plugin` to `claude plugins` in the legacy-context-mode cleanup family. `claude --help` shows `claude plugin|plugins` as accepted aliases — both forms behave identically in CLI v2.1.148 — but the inconsistency with the install/update path (which already uses the plural form) made the legacy cleanup look broken at a glance. Tests updated to match.
|
Claude finished @maxritter's task in 2m 21s —— View job Incremental Code Review — push
|
There was a problem hiding this comment.
1 issue found across 129 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="pilot/claude.json">
<violation number="1" location="pilot/claude.json:4">
P2: `autoConnectIde` and `autoInstallIdeExtension` are Claude Code `settings.json` settings, not `~/.claude.json` preferences. Placing them in `pilot/claude.json` (which merges into `~/.claude.json`) means Claude Code may not read them or may log unrecognized-key warnings.
Move these to a `settings.json` customization source that targets `~/.claude/settings.json`.</violation>
</file>
Note: This PR contains a large number of files. cubic only reviews up to 100 files per PR, so some files may not have been reviewed. cubic prioritizes the most important files to review.
On a pro plan you can use ultrareview for larger PRs.
Fix all with cubic | Re-trigger cubic
| { | ||
| "showExpandedTodos": true, | ||
| "autoUpdates": true, | ||
| "autoConnectIde": true, |
There was a problem hiding this comment.
P2: autoConnectIde and autoInstallIdeExtension are Claude Code settings.json settings, not ~/.claude.json preferences. Placing them in pilot/claude.json (which merges into ~/.claude.json) means Claude Code may not read them or may log unrecognized-key warnings.
Move these to a settings.json customization source that targets ~/.claude/settings.json.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At pilot/claude.json, line 4:
<comment>`autoConnectIde` and `autoInstallIdeExtension` are Claude Code `settings.json` settings, not `~/.claude.json` preferences. Placing them in `pilot/claude.json` (which merges into `~/.claude.json`) means Claude Code may not read them or may log unrecognized-key warnings.
Move these to a `settings.json` customization source that targets `~/.claude/settings.json`.</comment>
<file context>
@@ -1,6 +1,8 @@
{
"showExpandedTodos": true,
"autoUpdates": true,
+ "autoConnectIde": true,
+ "autoInstallIdeExtension": true,
"lspRecommendationDisabled": true,
</file context>

Release: v9.0.0 — Model switching for
/spec+ legacy-systems cleanupThis is a major-version release. Headline change:
/specnow pauses after plan approval so you can pick a different model for implementation. Supporting that headline is a broad cleanup — the old per-skill model routing table, the credential scanner, and the legacy context-mode plugin are all gone.Two commits, intentionally split for changelog clarity:
feat:— the new pause-and-resume behaviour (additive)feat!:— the breaking-change cleanup that the new behaviour enables1.
feat: pause /spec after planning for a model switchAfter plan approval,
/specends the planning turn and waits so you can switch models for implementation. Two ways to resume:/model sonnet[1m]then any prompt (e.g.continue). Same session, planning context carries over. Claude Code asks to confirm the model switch — the existing context is re-sent to Sonnet on the next turn./clear, then/spec docs/plans/<plan>.md. Fresh session, no context carry. The dispatcher sees the approved plan and routes straight into implementation.A new UserPromptSubmit hook (
spec_handoff_resume) detects the handoff sentinel and dispatches the next prompt directly tospec-implement, so no/specre-invocation is needed on Path A.spec-mode-guardnow hard-blocks/specon non-Opus models for the planning leg — planning is where reasoning quality dominates outcome. Resuming an existing plan (/spec docs/plans/<plan>.md) is allowed on any model.The Model Switching toggle in Console Settings → Automation controls whether the workflow pauses or runs continuously. Turn it off to stay on one model end-to-end (also the right setting for headless / CI).
Stop guard now leaves the handoff sentinel intact across the Stop event so the prompt hook can consume it;
session_clearcleans up the sentinel when the user runs/clear.2.
feat!: collapse model selection to /model and prune legacy systemsPilot no longer manages a per-skill / per-agent model routing table. Claude Code's
/modelis the single switch for every workflow. The Settings page's Models and Security sections, the Cost Optimization copy that named specific models, and the per-skillmodel:frontmatter on Pilot-shipped skills are all gone.Config migration v12 strips the dead keys from
~/.pilot/config.jsonon first launch (model,skills,agents,extendedContext,extendedContextOverrides) and writes a pre-migration snapshot to~/.pilot/config.json.bak.v11once per machine. The newspecWorkflow.modelSwitchtoggle is seeded totrue.Credential / secret scanner hooks deleted along with the Console's Security tab and the
security-credentialsrule. The legacymksglu/context-modeMCP plugin (auto-installed by older Pilot versions) is auto-uninstalled on upgrade, together with its orphan SessionStart hook in~/.claude/settings.json.Installer dependency output now distinguishes installed / updated / removed / unchanged. Re-runs no longer show a noisy
✓ X installedfor every tool that was already there — only steps that actually did something report.A one-time launcher notice infrastructure (
launcher/notice.py) announces the rework on first launch after upgrade. The announcement is sentinel-gated and won't repeat.Doc reorg: Permission Modes moved from Getting Started → Features. The standalone Security page is gone. Model Routing was rewritten to a single-page walkthrough with the two resume paths laid out explicitly. The marketing site's
WhatsInsidepillars were rebalanced — "Hooks, Quality & Security" became "Hooks & Quality" (security tile dropped), Cost Optimization no longer hardcodes model names, and card lengths were tightened so the grid reads consistently.Breaking changes for users
model,skills,agents,extendedContext, orextendedContextOverrideskeys in~/.pilot/config.jsonwill see those keys stripped on first launch. The pre-migration JSON is preserved at~/.pilot/config.json.bak.v11. Pick your model with Claude Code's/modelinstead./specrequires Opus for the planning leg (spec-mode-guard hard-blocks Sonnet).security-credentialsrule, the Console's Security settings tab, anddocs/features/security.md. Use Claude Code's built-in safeguards and project-level conventions for secret handling.mksglu/context-modeClaude plugin (auto-installed by older Pilot versions) is auto-uninstalled on first launch after upgrade. Its orphan SessionStart hook in~/.claude/settings.jsonis also removed.Migration notes
No user action required for the model / config migration — it runs automatically on first launch and the safety snapshot at
~/.pilot/config.json.bak.v11means hand-picked model IDs are recoverable.If you relied on the credential scanner: it's gone with no in-product replacement. Local pre-commit hooks (e.g.
git-secrets,trufflehog,gitleaks) are the recommended path.Verification
bun run typecheck).npm run buildregenerates bundled artifacts, staged in commit 2).ruff checkandbasedpyrightclean across modified Python files.Summary by CodeRabbit
New Features
Documentation
Chores