v1 → v2 Migration
Guild v2 is a full clean slate: flat command surface, one --rigor knob, cost-aware model tiering, and a new lifecycle structure with dedicated phase verbs. This guide documents every removed/renamed command, the config and flag changes, and the new v2 surfaces you’ll encounter upgrading from v1.
Start here if you’re upgrading. For the complete settings.json key reference, see
the Configuration Reference.
TL;DR — the 60-second version
/guild:guild-x→/guild:x— the:plugin namespace stays (Claude Code requires it); v2 drops the redundantguild-command prefix. The main entry command is/guild:guild [brief].- Flag soup →
--rigor=quick|standard|deep— one knob replaces five tuning flags plus 5 global flags and a universal--dry-run. - New phase subcommands:
init ideate plan build qa ops. The Operations verb isops. /guild:guild-teamis removed — team-compose is folded into/guild:plan./guild:guild-diagnose→/guild:fix— verb rename.- Initiatives are new and opt-in — one-off runs remain first-class.
- No shims that execute. Every removed name prints a redirect and exits non-zero. Redirect stubs live one minor version (v2.0.x) and are deleted at v2.1.0.
1. Command-by-command mapping
The mapping table
| v1 command | v2 replacement | Fate |
|---|---|---|
/guild:guild [brief] [--loops --loop-cap --auto-approve --codex-review --codex-cap] | /guild:guild [brief] + phase subcommands init/ideate/plan/build/qa/ops; flags → --rigor + 5 globals | Renamed / restructured |
/guild:guild-team [propose|show|edit] [--allow-larger] | Removed. propose→ /guild:plan; show→ /guild:status; edit→ [edit] response at plan/team gate; --allow-larger→ --team-size=N on /guild:plan | REMOVED |
/guild:guild-wiki [ingest|query|lint] | /guild:wiki <ingest|query|lint> | Renamed (prefix drop) |
/guild:guild-evolve [skill] [--auto] | /guild:evolve [skill] [--auto] | Renamed (prefix drop) |
/guild:guild-rollback <skill> [n] | /guild:rollback <skill> [n] | Renamed (prefix drop) |
/guild:guild-stats | /guild:stats | Renamed (prefix drop) |
/guild:guild-audit | /guild:audit | Renamed (prefix drop) |
/guild:guild-diagnose [run-id|text] [--codex-review] | /guild:fix [run-id|"symptom"] [--review=cross] | Renamed + flag-migrated |
Designed-but-unshipped in v1, now placed in v2:
| Designed command | v2 placement |
|---|---|
/guild:guild-init | /guild:init (phase subcommand) |
/guild:guild-initiative new|status|resume|update|close | /guild:initiative <…> (opt-in) |
| Quality entrypoint | /guild:qa |
| Operations entrypoint | /guild:ops |
Exact redirect messages
Each removed/renamed name prints one of the following, then exits non-zero and runs nothing.
Generic rename (prefix drop) — applies to wiki, evolve, rollback, stats, audit. Example for /guild:guild-wiki:
/guild:guild-wiki was renamed in Guild v2.
v2 equivalent: /guild:wiki <ingest|query|lint>
Guild v2 keeps the : namespace; it drops the redundant `guild` prefix — every command is /guild:<verb>.
Full mapping: MIGRATION.md (repo root or plugin docs/).
/guild:guild-team (removed outright):
/guild:guild-team was removed in Guild v2 (no direct replacement).
Team composition is now a step inside planning:
• propose → run /guild:plan (team is composed, then approved at the plan gate)
• show → /guild:status (shows the active team)
• edit → answer [edit] at the plan/team approval gate
• --allow-larger → /guild:plan --team-size=N (prints the cap-6 warning)
Full mapping: MIGRATION.md §2.
/guild:guild-diagnose (verb renamed):
/guild:guild-diagnose was renamed in Guild v2.
v2 equivalent: /guild:fix [run-id | "symptom"] [--review=cross]
(`--codex-review` is now `--review=cross`.)
Full mapping: MIGRATION.md §2.
/guild:guild [brief] is renamed/restructured, not removed — it still works. The
two visible changes on first run: a surfaced phase-detection prompt, and the deleted
tuning flags (--loops, --loop-cap, --codex-cap).
2. Config migration (.guild/settings.json)
v2 config surface: .guild/settings.json (JSON) replaces .guild/config.yml (YAML).
It is the single config file and holds every option. Scaffold it with
/guild:config init; inspect the resolved config with /guild:config show.
A back-compat shim in read-guild-config.ts still reads an existing
.guild/config.yml, maps the v1 keys, and warns once per run:
warn: .guild/config.yml uses v1 keys (codex_review, auto_approve=spec-and-plan).
Mapped to v2 (review=cross, auto_approve=[spec,plan]). Update the file to
silence this — see MIGRATION.md §3.
The shim is mapping-and-warn only — it does not rewrite the file. Once settings.json
exists it is authoritative and config.yml is ignored.
Key mapping
v1 config.yml key | v2 settings.json key | Notes |
|---|---|---|
loops: | loops: (null = derive from rigor) | Prefer rigor:; loops: is now a power-user override. |
loop_cap: | loop_cap: | Config-only; no CLI equivalent. |
codex_cap: | codex_cap: | Config-only; no CLI equivalent. |
codex_review: true|false | review: local | cross | off | true→cross, false→local |
auto_approve: none|spec-and-plan|implementation|all | auto_approve: [] csv | none→[], spec-and-plan→[spec,plan], implementation→[build], all→[all] |
| (new) | rigor: standard | New profile knob; the primary control. |
| (new) | host: auto | New host-adapter selection. |
| (new) | initiative_default: null | New; still opt-in. |
defaults.agent_team: true|false | agent_mode: team|agent|subagent|auto (top-level) | true→team, false→subagent, absent→auto. defaults.agent_team is a warn-once deprecated alias; removed at v2.1.0. |
| (new) | defaults.auto_learn: false | When true, /guild:init runs the full learn-* pipeline at bootstrap. |
Worked example
v1 .guild/config.yml:
loops: all
loop_cap: 16
codex_review: true
codex_cap: 5
auto_approve: spec-and-plan
v2 .guild/settings.json equivalent:
{
"rigor": "deep",
"auto_approve": ["spec", "plan"],
"host": "auto",
"initiative_default": null,
"loops": null,
"loop_cap": 16,
"codex_cap": 5
}
rigor: "deep" already implies loops=all, loop_cap=16, and review=cross — set
it in one knob instead of three. Omit review: when using rigor: deep; the profile
expansion already implies cross.
New optional defaults: block (nothing to migrate)
v2 adds an optional top-level defaults: block for project-wide behavior defaults:
adversarial, team size/always-include, review workflow, skill policy, soft-gate
auto-approve, wiki share-mode, reporting verbosity, auto_learn. See the
Configuration Reference for the full key set.
- Absent
defaults:⇒ byte-identical to today. Purely additive; zero-config behavior is unchanged. project.yamlis now identity-only (name, slug, label taxonomy).wiki.share_modemoved fromproject.yamlintodefaults.wiki.share_modeinsettings.json. Move it if you set it there previously.- Unknown keys are rejected —
defaults.wiki.autopromote: trueis rejected always;defaults.adversarial: offis rejected for Guild self-build.
3. Flag migration cheat-sheet
| v1 flag | v2 equivalent |
|---|---|
--loops=<…> | Gone — use --rigor=quick|standard|deep or settings.json loops: |
--loop-cap=N | Gone — config-only (loop_cap:) |
--codex-cap=N | Gone — config-only (codex_cap:) |
--codex-review | --review=cross |
--auto-approve=spec-and-plan | --auto-approve=spec,plan |
--auto-approve=implementation | --auto-approve=build |
--auto-approve=all | --auto-approve=all (unchanged) |
--restart (first word of $ARGUMENTS) | /guild:resume --restart |
--allow-larger (on /guild:guild-team) | /guild:plan --team-size=N |
--deep-scan (on /guild:init) | --learn (same learn-* pipeline; --deep-scan is one trigger name going forward) |
“Give me the old always-loop behavior” → --rigor=deep per invocation, or set
rigor: "deep" in settings.json. Note: --rigor=deep also auto-implies
--review=cross; the expanded profile is printed before the first gate.
4. Deprecation timeline
| Version | Behavior |
|---|---|
| v2.0.x | Removed/renamed names print a redirect stub (exit non-zero, runs nothing). |
| v2.1.0 | Redirect stubs deleted. An unknown subcommand prints usage help only. |
The one-version sunset caps the support tail. Documenting stub removal here so v2.1.0 is not itself a surprise.
5. Additive v2.x additions (no breaking change)
models: config block + --model-tier flag (cost-aware tiering)
Both are purely additive — zero-config repos are unchanged.
| Surface | What changed | Migration action |
|---|---|---|
settings.json | New optional top-level closed-key models: block (master toggle, tier→model map, auto-score weights/thresholds, advisor rounds, escalation markers, recall settings, structured-output flag, cache TTL hints, importance gate). | None required. Absent block = zero-config stable. Scaffold with /guild:config init. |
| CLI | New flag --model-tier=cheap|mid|powerful pins the tier for a run. | None required. Use when you want to override the auto-scored tier for a single run. |
Precedence (normative): --model-tier CLI flag > per-lane plan override (model_tier:) > settings.json models: block > built-in default.
Full key reference: Configuration Reference models.*.
6. New in v2 (not a migration, but you’ll want these)
-
Phase entrypoints + surfaced smart detection — start at any phase; bare
/guild:guildproposes a phase and asks before proceeding. Never silent. -
Flat-token command surface (D1/D2) — beyond the prefix-drop, commands are flat
/guild:<verb>and sub-verbs are positional arguments, never separate files. Guild skills are model-invoked, never user-typed. -
Full skill internalization (D4) — Guild’s skills are clean-room re-authored and Guild-native, with no runtime dependency on external plugins. Methodology skills (
tdd,systematic-debug,worktrees,finish-branch) promoted fromfallbackto first-class. -
Initiatives (opt-in durable work) —
/guild:initiative …. One-off runs remain first-class. -
Cross-host review (
--review=cross) + host adapter (--host) — the Claude↔Codex reciprocal review broker. -
/guild:learn(NEW) + cheap-by-default/guild:init(D3) —/guild:initstays cheap. The full understand-everything pipeline is/guild:learn <map|graph|onboard|diff|explain>. Init runs it only underdefaults.auto_learn: trueor--learn. -
--rigorprofile — one three-valued knob (quick|standard|deep) replaces five tuning flags. -
Quality + Operations are full v2 skills —
/guild:qaexecutes E2E/smoke/a11y/perf/integration checks auto-selected from the CodebaseMap./guild:opsexecutes release/monitoring/incident/rollback/maintenance runbooks. Command verbs, artifact paths, and gate markers are unchanged from their v1 reserved state; only the behavior behind them is promoted from deferred to shipped. -
--auto-approveasymmetry —--auto-approvecollapses soft gates only. Token set:[spec,plan,build,all]. Noqaoropstoken. A QualityBLOCK→release overrideis never a soft gate — stays human-gated even under--auto-approve=all. Same asymmetry in Operations: release, destructive, incident, or rollback actions always prompt. -
.guild/ownership boundary +/guild:auditboundary check — every Guild-owned file lives under the consuming repo’s.guild/. The plugin install directory is static read-only base state./guild:auditgains a boundary-check section that flags violations. -
Optional
.guild/index.sqliteread-through cache — lazy-built, gitignored, fully deletable (rm .guild/index.sqliteis always safe). Disable withindex: "off"insettings.json.
7. Self-build / CI caller find-and-replace
For internal scripts and CI that invoked v1 commands:
| Find (v1) | Replace (v2) |
|---|---|
/guild:guild-audit | /guild:audit |
/guild:guild-stats | /guild:stats |
/guild:guild-wiki | /guild:wiki |
/guild:guild-evolve | /guild:evolve |
/guild:guild-rollback | /guild:rollback |
/guild:guild-diagnose | /guild:fix |
/guild:guild-team propose | /guild:plan |
/guild:guild-team show | /guild:status |
--codex-review | --review=cross |
--auto-approve=spec-and-plan | --auto-approve=spec,plan |
--allow-larger | --team-size=N (on /guild:plan) |
CI ergonomics: name phases explicitly (/guild:build --auto-approve=…) rather than
rely on bare /guild:guild phase detection — detection is interactive by design.
A bare /guild:guild reaching a gate in a non-interactive context hard-fails with a
clear message rather than implicitly granting autonomy.
FAQ
Why no behavioral shims? v2 is a full clean slate. A print-only redirect stub is documentation, not a behavioral shim: it runs nothing and advances nothing. The one-version sunset caps the support tail.
Where did /guild:guild-team go? Team composition is now a step inside
/guild:plan with its own approval gate. Inspect the active team via /guild:status;
edit it via the [edit] response at the plan/team gate; raise the cap with
/guild:plan --team-size=N.
How do I get the old always-loop behavior? Use --rigor=deep per invocation, or
set rigor: "deep" in settings.json. deep = loops=all + cap=16 +
--review=cross (auto-implied, profile printed before the first gate).
Did /guild:guild-diagnose just disappear? No — it was renamed to /guild:fix.
The diagnose skill is retained internally; the command verb changed because a user
wants the thing fixed, not merely diagnosed.
Is /guild:guild itself breaking? The verb still works. Two visible changes:
a surfaced phase-detection prompt on bare /guild:guild, and the removal of
--loops/--loop-cap/--codex-cap from the CLI (now --rigor + config).
Related
- Configuration Reference — complete
settings.jsonkey reference with the full key mapping table. - Command Reference — the v2 command surface in detail.
- Get Started with Guild — upgrading from v1 or installing fresh.