* fix(#1516): expose adaptive model_profile in /gsd-new-project AI Models prompt Both onboarding paths (Step 2a auto-mode + Step 5 interactive) enumerated only 4 profiles (Balanced/Quality/Budget/Inherit), omitting 'adaptive' even though the model catalog (model-catalog.json profiles) and docs/CONFIGURATION.md register 5. Mirrors the proven /gsd:settings two-question split (#3784): Q1 routes between Adaptive/Standard-tier/Inherit; Q2 (conditional on Q1=Standard) picks Quality/Balanced/Budget — keeping every AskUserQuestion within the 4-option cap. Both config-new-project example payloads now list adaptive. Regression cases folded into the owning tests/new-project-mvp-prompt.test.cjs (per the lint-regression-test-names ban on new top-level bug-NNNN files): each AI Models prompt makes adaptive reachable, all 5 profiles reachable, 4-option cap honored, both example enums include adaptive, brace balance. Workflow size baseline bumped (new-project.md 62324 -> 66138 bytes; still well under the XL hard cap). * chore(#1516): backfill changeset pr ref to 1654
This commit is contained in:
@@ -230,19 +230,52 @@ AskUserQuestion([
|
||||
{ label: "Yes (Recommended)", description: "Resolve symbol references against live source during plan review — catches hallucinated names before execution" },
|
||||
{ label: "No", description: "Skip symbol grounding — plan review proceeds without source verification" }
|
||||
]
|
||||
},
|
||||
}
|
||||
])
|
||||
|
||||
// Model profile uses a two-question split because AskUserQuestion enforces a hard
|
||||
// 4-option cap and there are 5 valid profiles (quality, balanced, budget, adaptive,
|
||||
// inherit). Q1 routes between adaptive/standard-tier/inherit; Q2 (shown only when
|
||||
// Q1 = "Standard tier…") picks among the three standard profiles. Mirrors the
|
||||
// /gsd:settings split (#3784, #1516).
|
||||
AskUserQuestion([
|
||||
{
|
||||
header: "AI Models",
|
||||
question: "Which AI models for planning agents?",
|
||||
multiSelect: false,
|
||||
options: [
|
||||
{ label: "Balanced (Recommended)", description: "Sonnet for most agents — good quality/cost ratio" },
|
||||
{ label: "Quality", description: "Opus for research/roadmap — higher cost, deeper analysis" },
|
||||
{ label: "Budget", description: "Haiku where possible — fastest, lowest cost" },
|
||||
{ label: "Inherit", description: "Use the current session model for all agents (OpenCode /model)" }
|
||||
{ label: "Adaptive (Recommended)", description: "Role-based cost optimization: heavy roles use the highest-tier model available on the active runtime, light roles use the cheapest. Best balance of quality and cost across all supported runtimes (Claude, Codex, Gemini, OpenRouter, local)." },
|
||||
{ label: "Standard tier…", description: "Choose Quality, Balanced, or Budget — flat tier applied to all agents" },
|
||||
{ label: "Inherit", description: "Use the current session model for all agents (required for non-Claude runtimes: Codex, Gemini CLI, OpenCode /model, OpenRouter, local models)" }
|
||||
]
|
||||
}
|
||||
])
|
||||
|
||||
**Conditional visibility — model_profile (Q2):**
|
||||
Only ask this question when Q1's answer is "Standard tier…".
|
||||
If Q1 = "Adaptive (Recommended)" → write model_profile=adaptive and SKIP Q2.
|
||||
If Q1 = "Inherit" → write model_profile=inherit and SKIP Q2.
|
||||
If user cancels Q2 after picking "Standard tier…" → leave existing model_profile value unchanged.
|
||||
|
||||
AskUserQuestion([
|
||||
{
|
||||
question: "Which standard profile? (Quality / Balanced / Budget)",
|
||||
header: "Model Tier",
|
||||
multiSelect: false,
|
||||
options: [
|
||||
{ label: "Quality", description: "Opus everywhere except verification (highest cost) — Claude only" },
|
||||
{ label: "Balanced", description: "Opus for planning, Sonnet for research/execution/verification — Claude only" },
|
||||
{ label: "Budget", description: "Sonnet for writing, Haiku for research/verification (lowest cost) — Claude only" }
|
||||
]
|
||||
}
|
||||
])
|
||||
|
||||
// Map UI choices → config values:
|
||||
// Q1 "Adaptive (Recommended)" → model_profile = "adaptive"
|
||||
// Q1 "Inherit" → model_profile = "inherit"
|
||||
// Q1 "Standard tier…" + Q2 "Quality" → model_profile = "quality"
|
||||
// Q1 "Standard tier…" + Q2 "Balanced" → model_profile = "balanced"
|
||||
// Q1 "Standard tier…" + Q2 "Budget" → model_profile = "budget"
|
||||
```
|
||||
|
||||
**Round 3 — PR body onboarding:**
|
||||
@@ -273,7 +306,7 @@ Create `.planning/config.json` with all settings (CLI fills in remaining default
|
||||
|
||||
```bash
|
||||
mkdir -p .planning
|
||||
gsd_run query config-new-project '{"mode":"yolo","granularity":"[selected]","parallelization":true|false,"commit_docs":true|false,"model_profile":"quality|balanced|budget|inherit","workflow":{"research":true|false,"plan_check":true|false,"verifier":true|false,"nyquist_validation":true|false,"auto_advance":true},"plan_review":{"source_grounding":true|false},"ship":{"pr_body_sections":[{"heading":"User Stories & Acceptance Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## User Stories || REQUIREMENTS.md ## Acceptance Criteria","fallback":"- Acceptance criteria are covered by the linked requirements and verification evidence."},{"heading":"Risks & Dependencies","enabled":true|false,"source":"PLAN.md ## Risks || PLAN.md ## Dependencies","fallback":"- No known high-risk rollout dependencies."},{"heading":"Success Metrics & Release Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## Definition of Done || VERIFICATION.md ## Release Criteria","fallback":"- Release when automated verification and required manual checks pass."},{"heading":"Stakeholder Review & Approval","enabled":true|false,"template":"- Product owner approval pending for {phase_name}."}]}}'
|
||||
gsd_run query config-new-project '{"mode":"yolo","granularity":"[selected]","parallelization":true|false,"commit_docs":true|false,"model_profile":"quality|balanced|budget|adaptive|inherit","workflow":{"research":true|false,"plan_check":true|false,"verifier":true|false,"nyquist_validation":true|false,"auto_advance":true},"plan_review":{"source_grounding":true|false},"ship":{"pr_body_sections":[{"heading":"User Stories & Acceptance Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## User Stories || REQUIREMENTS.md ## Acceptance Criteria","fallback":"- Acceptance criteria are covered by the linked requirements and verification evidence."},{"heading":"Risks & Dependencies","enabled":true|false,"source":"PLAN.md ## Risks || PLAN.md ## Dependencies","fallback":"- No known high-risk rollout dependencies."},{"heading":"Success Metrics & Release Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## Definition of Done || VERIFICATION.md ## Release Criteria","fallback":"- Release when automated verification and required manual checks pass."},{"heading":"Stakeholder Review & Approval","enabled":true|false,"template":"- Product owner approval pending for {phase_name}."}]}}'
|
||||
```
|
||||
|
||||
**If commit_docs = No:** Add `.planning/` to `.gitignore`.
|
||||
@@ -745,19 +778,52 @@ questions: [
|
||||
{ label: "Yes (Recommended)", description: "Confirm deliverables match phase goals" },
|
||||
{ label: "No", description: "Trust execution, skip verification" }
|
||||
]
|
||||
},
|
||||
}
|
||||
]
|
||||
|
||||
// Model profile uses a two-question split because AskUserQuestion enforces a hard
|
||||
// 4-option cap and there are 5 valid profiles (quality, balanced, budget, adaptive,
|
||||
// inherit). Q1 routes between adaptive/standard-tier/inherit; Q2 (shown only when
|
||||
// Q1 = "Standard tier…") picks among the three standard profiles. Mirrors the
|
||||
// /gsd:settings split (#3784, #1516).
|
||||
questions: [
|
||||
{
|
||||
header: "AI Models",
|
||||
question: "Which AI models for planning agents?",
|
||||
multiSelect: false,
|
||||
options: [
|
||||
{ label: "Balanced (Recommended)", description: "Sonnet for most agents — good quality/cost ratio" },
|
||||
{ label: "Quality", description: "Opus for research/roadmap — higher cost, deeper analysis" },
|
||||
{ label: "Budget", description: "Haiku where possible — fastest, lowest cost" },
|
||||
{ label: "Inherit", description: "Use the current session model for all agents (OpenCode /model)" }
|
||||
{ label: "Adaptive (Recommended)", description: "Role-based cost optimization: heavy roles use the highest-tier model available on the active runtime, light roles use the cheapest. Best balance of quality and cost across all supported runtimes (Claude, Codex, Gemini, OpenRouter, local)." },
|
||||
{ label: "Standard tier…", description: "Choose Quality, Balanced, or Budget — flat tier applied to all agents" },
|
||||
{ label: "Inherit", description: "Use the current session model for all agents (required for non-Claude runtimes: Codex, Gemini CLI, OpenCode /model, OpenRouter, local models)" }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
**Conditional visibility — model_profile (Q2):**
|
||||
Only ask this question when Q1's answer is "Standard tier…".
|
||||
If Q1 = "Adaptive (Recommended)" → write model_profile=adaptive and SKIP Q2.
|
||||
If Q1 = "Inherit" → write model_profile=inherit and SKIP Q2.
|
||||
If user cancels Q2 after picking "Standard tier…" → leave existing model_profile value unchanged.
|
||||
|
||||
questions: [
|
||||
{
|
||||
question: "Which standard profile? (Quality / Balanced / Budget)",
|
||||
header: "Model Tier",
|
||||
multiSelect: false,
|
||||
options: [
|
||||
{ label: "Quality", description: "Opus everywhere except verification (highest cost) — Claude only" },
|
||||
{ label: "Balanced", description: "Opus for planning, Sonnet for research/execution/verification — Claude only" },
|
||||
{ label: "Budget", description: "Sonnet for writing, Haiku for research/verification (lowest cost) — Claude only" }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
// Map UI choices → config values:
|
||||
// Q1 "Adaptive (Recommended)" → model_profile = "adaptive"
|
||||
// Q1 "Inherit" → model_profile = "inherit"
|
||||
// Q1 "Standard tier…" + Q2 "Quality" → model_profile = "quality"
|
||||
// Q1 "Standard tier…" + Q2 "Balanced" → model_profile = "balanced"
|
||||
// Q1 "Standard tier…" + Q2 "Budget" → model_profile = "budget"
|
||||
```
|
||||
|
||||
**PR body onboarding:** Ask which optional PRD-style sections `/gsd:ship` should append to generated PR bodies. Use the same `ship.pr_body_sections` mapping as Step 2a: selected sections get `enabled: true`, seeded-but-unselected sections get `enabled: false`, and selecting none writes an empty list. Prefer lean/agile PRD sections that make user value, acceptance criteria, Definition of Done, and stakeholder traceability explicit.
|
||||
@@ -773,7 +839,7 @@ Create `.planning/config.json` with all settings (CLI fills in remaining default
|
||||
|
||||
```bash
|
||||
mkdir -p .planning
|
||||
gsd_run query config-new-project '{"mode":"[yolo|interactive]","granularity":"[selected]","parallelization":true|false,"commit_docs":true|false,"model_profile":"quality|balanced|budget|inherit","workflow":{"research":true|false,"plan_check":true|false,"verifier":true|false,"nyquist_validation":[false if granularity=coarse, true otherwise]},"plan_review":{"source_grounding":true|false},"ship":{"pr_body_sections":[{"heading":"User Stories & Acceptance Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## User Stories || REQUIREMENTS.md ## Acceptance Criteria","fallback":"- Acceptance criteria are covered by the linked requirements and verification evidence."},{"heading":"Risks & Dependencies","enabled":true|false,"source":"PLAN.md ## Risks || PLAN.md ## Dependencies","fallback":"- No known high-risk rollout dependencies."},{"heading":"Success Metrics & Release Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## Definition of Done || VERIFICATION.md ## Release Criteria","fallback":"- Release when automated verification and required manual checks pass."},{"heading":"Stakeholder Review & Approval","enabled":true|false,"template":"- Product owner approval pending for {phase_name}."}]}}'
|
||||
gsd_run query config-new-project '{"mode":"[yolo|interactive]","granularity":"[selected]","parallelization":true|false,"commit_docs":true|false,"model_profile":"quality|balanced|budget|adaptive|inherit","workflow":{"research":true|false,"plan_check":true|false,"verifier":true|false,"nyquist_validation":[false if granularity=coarse, true otherwise]},"plan_review":{"source_grounding":true|false},"ship":{"pr_body_sections":[{"heading":"User Stories & Acceptance Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## User Stories || REQUIREMENTS.md ## Acceptance Criteria","fallback":"- Acceptance criteria are covered by the linked requirements and verification evidence."},{"heading":"Risks & Dependencies","enabled":true|false,"source":"PLAN.md ## Risks || PLAN.md ## Dependencies","fallback":"- No known high-risk rollout dependencies."},{"heading":"Success Metrics & Release Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## Definition of Done || VERIFICATION.md ## Release Criteria","fallback":"- Release when automated verification and required manual checks pass."},{"heading":"Stakeholder Review & Approval","enabled":true|false,"template":"- Product owner approval pending for {phase_name}."}]}}'
|
||||
```
|
||||
|
||||
**Note:** Run `/gsd:settings` anytime to update model profile, workflow agents, branching strategy, and other preferences.
|
||||
|
||||
Reference in New Issue
Block a user