Files
ClaudeDo/docs/superpowers/plans/2026-06-09-per-task-model-override-plan.md

2.5 KiB
Raw Blame History

Plan: Per-task model override via MCP + cheapest-model prompt guidance

Spec: docs/superpowers/specs/2026-06-09-per-task-model-override-design.md

TDD, one focused commit per task. Build with -c Release per project; run ClaudeDo.Worker.Tests (and Data.Tests if touched).

Task 1 — ModelRegistry: cost ordering + alias validation

  • Add ByCostAscending = ["haiku","sonnet","opus"].
  • Add string? NormalizeAlias(string? model): trim; null/blank → null; case-insensitive match against Aliases → canonical lowercase; else throw ArgumentException($"Unknown model '{model}'. Allowed: {join(Aliases)}.").
  • Tests (Data.Tests): "sonnet"/"OPUS"/" haiku " → normalized; ""/null/" " → null; "gpt4" → throws.

Task 2 — CreateChildAsync accepts model

  • TaskRepository.CreateChildAsync: add string? model = null (before the trailing CancellationToken ct = default); set child.Model = ModelRegistry.NormalizeAlias(model).
  • Update the two existing callers to compile (named pass-through added in Tasks 34; keep default null here).

Task 3 — Planning + improvement MCP tools forward model

  • PlanningMcpService.CreateChildTask: add string? model param after commitType; pass to CreateChildAsync. Extend [Description] to document the model arg (haiku/sonnet/opus; cheapest capable).
  • TaskRunMcpService.SuggestImprovement: add string? model param after description; pass to CreateChildAsync. Extend [Description].
  • Tests: each tool persists the model; invalid value throws.

Task 4 — External AddTask forwards model

  • ExternalMcpService.AddTask: add string? model = null param (before the trailing CancellationToken); entity.Model = ModelRegistry.NormalizeAlias(model). Extend [Description].
  • Test: AddTask persists model; invalid value rejected.

Task 5 — Prompt guidance

  • PromptFiles.PlanningSystemDefault: add a short paragraph — assign each subtask the cheapest model that does it well, with ordering haiku < sonnet < opus and the heuristic; pass it as CreateChildTask(model=...).
  • PromptFiles.SystemDefault Out-of-scope section: when filing via SuggestImprovement, pass the cheapest capable model.
  • PromptFiles.ImprovementChildDefault: one-line minimality reminder.
  • No test (static prompt text); verify build only.

Task 6 — Verify

  • Build App + Worker -c Release; run Worker.Tests + Data.Tests.
  • Update ClaudeDo.Worker/CLAUDE.md (ConfigMcpTools/creation-tool notes) and ClaudeDo.Data/CLAUDE.md (ModelRegistry) if needed.