Repository navigation
[Phase 2] Switch feature-ideation-reusable.yml model default to the opus family and verify alias resolution #1210
Copy link
Copy link
Closed
Labels
Description
Story
As a workflow maintainer,
I want change the reusable feature-ideation workflow's model input default from the pinned claude-opus-4-6 to the family opus, reword its description, and verify claude-code-action / the Claude Code CLI resolve the family to the current Opus at the point of use,
so that the BMAD Analyst auto-tracks the current Opus and future model upgrades no longer require editing a pinned version id.
Acceptance Criteria
- In .github/workflows/feature-ideation-reusable.yml the
modelinputdefault:isopus(the family), notclaude-opus-4-6(currently L55). - The
modelinputdescriptionreads: "Model family (opusrecommended - Sonnet produces shallower adversarial passes) or an explicit model id override" (currently L53). - It is verified that the family alias resolves to the current Opus where the workflow uses the model - today that is
--model ${{ inputs.model }}at L274, and the analyst step sets NOANTHROPIC_MODELenv var. The resolved model id is captured from a minimal/dry-run resolution check (NOT a full ideation run, which spends tokens - see AC#6) and recorded in the PR. - If the family alias does NOT resolve to the current Opus at the point of use, the family is resolved to a concrete id in a small step before the analyst job, and a version id is still never written into the input default.
- The PR's Risk section notes that this changes the analyst's actual model from Opus 4.6 to the current Opus, and that per-run cost changes with the new model's pricing.
- The feature-ideation workflow is NOT dispatched from the PR (it spends tokens); verification uses a minimal/dry-run check or inspection of the CLI's client-side resolution, not a full ideation run.
Tasks / Subtasks
- Change the
modelinputdefaultfromclaude-opus-4-6toopusand reword thedescriptionper AC. (AC: Addressing PR comments #1, Add multi-agent isolation strategy using git worktrees #2) - Verify family-alias resolution at the point of use (
--model ${{ inputs.model }}, L274) and capture the resolved model id; record it in the PR. (AC: Add coding standards & principles section to AGENTS.md #3) - If the alias does not resolve to the current Opus, add a small resolve-family-to-id step before the job - never a version in the default. (AC: Add workflow, environment, and orchestration guidance #4)
- Write the PR Risk section (model change Opus 4.6 -> current Opus, cost implication) and confirm no live ideation dispatch occurred. (AC: Add stacked PR strategy and Epic-level workflow guidance #5, feat: add Structured Logging and CQRS standards #6)
Dev Notes
- GROUNDED FACT: the reusable currently passes the model ONLY via
--model ${{ inputs.model }}(L274). A grep confirms NOANTHROPIC_MODELenv var is set on the analyst step "Run Claude Code - BMAD Analyst" (itsenv:block is ~L252-266). So ci-standards.md gotcha Add multi-agent isolation strategy using git worktrees #2's claim thatANTHROPIC_MODEL: claude-opus-4-6is a step env var is already stale relative to the workflow - see the advisory open question; Story 3 reconciles the docs. - The raw Anthropic API does NOT accept bare family names; the Claude Code CLI resolves
--model opusclient-side (expandModelString) before the API call. So--model opusis the mechanism that should resolve to the current Opus. Do NOT introduce anANTHROPIC_MODEL: opusenv var expecting the API to resolve it - if such an env var is ever added it must be verified to pass through the CLI's resolver, not the raw API (enhancement comment risk Add workflow, environment, and orchestration guidance #4). - claude-code-action is pinned (v1.0.234, SHA at the analyst step's
uses:~L266). The family->id alias table ships compiled per action release, so record which action version resolved which model id; a lagging action bump can resolveopusto an older Opus (enhancement comment risk Add coding standards & principles section to AGENTS.md #3). - This file IS the source-of-truth reusable workflow - NOT a thin caller stub - so editing the input default here is the correct place (the AGENTS.md thin-caller-stub freeze does not apply to it).
- Testing standard: actionlint runs on .github/workflows/*.yml in ci.yml's Lint job; keep the change actionlint-clean. Do not trigger the schedule/dispatch from the PR.
- Depends on Story 1 so the description/behaviour references the now-canonical standard.
Project Structure Notes
Single-line default + description change plus (conditionally) one small resolve step in an existing reusable workflow. No new files.
References
- https://github.com/petry-projects/.github/blob/main/.github/workflows/feature-ideation-reusable.yml
- https://github.com/petry-projects/.github/blob/main/standards/ci-standards.md
- discussion Standard Proposal: name a model family, never pin a model version #1199
Likely target surface
petry-projects/.github: .github/workflows/feature-ideation-reusable.yml (model input L52-55; --model at L274; analyst step env ~L252-266)
Story prepared by the BMAD Scrum Master (Bob) for epic #1208. Status: ready-for-dev.
Reactions are currently unavailable
Activity
don-petry commentedon Oct 3, 2026
Dev-Lead Implementation Plan
Issue: #1210 — [Phase 2] Switch feature-ideation-reusable.yml model default to the opus family and verify alias resolution
Scope
modelinputdefault:is already'opus'onmain(AC#1 already met). What's left: change the inputdescriptionto the AC#2 wording, add a regression test that pins both, and record the alias-resolution check (AC#3). No live ideation dispatch.Implementation Checklist
.github/workflows/feature-ideation-reusable.yml: set themodelinputdescriptionto the exact AC#2 string; keepdefault: 'opus'9171db3e…) installs Claude Code CLI v2.1.282 (base-action/action.yml). Ran that exact CLI binary with--model opusagainst a local capture server (returns 400, so nothing goes to the real API and no tokens are spent). Model sent on the wire:claude-opus-5-5(current Opus). AC#4's resolve step is not needed.Tests to Write
test/workflows/feature-ideation/model-input.bats: themodelinput default is exactlyopus; the description matches AC#2; the default is not a pinnedclaude-*id; the analyst step passes--model ${{ inputs.model }}and sets noANTHROPIC_MODELenvTest Command
bats test/workflows/feature-ideation/+actionlint+bash .dev-lead/scripts/dev-lead-lint.shdon-petry commentedon Oct 3, 2026
Dev-Lead: Progress (in progress — not yet durable)
Plan Execution (intended)
default: 'opus'was already onmain. The new test pins it so it can't regress.modelinputdescriptionchanged to the exact AC wording.anthropics/claude-code-action@9171db3e57d6a3140a37ddc2ba92788584e0ead6(v1.0.234). Itsbase-action/action.ymlinstalls Claude Code CLI v2.1.282 (CLAUDE_CODE_VERSION="2.1.282").@anthropic-ai/claude-code-linux-x64@2.1.282and ranclaude -p hi --model <family>withANTHROPIC_BASE_URLpointed at a local capture server. The server logs the request'smodeland returns 400, so nothing reaches the Anthropic API.--model opus→claude-opus-5-5(current Opus)--model sonnet→claude-sonnet-5--model haiku→claude-haiku-4-5-20251001--model ${{ inputs.model }}). The analyst step sets noANTHROPIC_MODELenv. AC#4's resolve step is not needed, so none was added.CLAUDE_CODE_OAUTH_TOKEN.--modelalias expansion is client-side and shouldn't depend on auth mode, but that path wasn't exercised. The alias table is compiled into each CLI release, so a later action bump that pins an older CLI could change whatopusresolves to. Note thatsonnetalready resolves toclaude-sonnet-5, not the newest Sonnet, in this CLI.claude-opus-5-5). Per-run cost now follows the new model's pricing. Note thatdefault: 'opus'was already onmain, so callers on@mainmay already be on this model.Local check output (provisional — not the pushed run)
test/workflows/feature-ideation/model-input.batsfailed before the description change and passed after it..dev-lead/scripts/dev-lead-lint.shwere clean locally.Files touched (this workspace, not yet pushed)
.github/workflows/feature-ideation-reusable.yml:modelinput description reworded, plus a short comment saying never to pin a version id in the defaulttest/workflows/feature-ideation/model-input.bats: new regression tests (family default, AC#2 description,--modelpassthrough, noANTHROPIC_MODELenv)Notes
Out of scope, left for Story 3: the caller stubs' header comments (
.github/workflows/feature-ideation.ymlandstandards/workflows/feature-ideation.yml, L9) andstandards/agent-standards.mdL122/128 still mentionANTHROPIC_MODEL/claude-opus-4-6.don-petry commentedon Oct 3, 2026
Dev-Lead: Implementation Complete — PR #1245
The implementation for issue #1210 is durable: commits are pushed and a pull request is open. This record is backed by verifiable artifacts you can confirm in one click.
6a045cd9539cfe0b04ddca68595fd9def4fb45c5main: 2 file(s), +43/-4 linesReview happens on the PR. Acceptance criteria and test results are evidenced by the PR's diff and CI checks — not asserted here. If a later stage fails, this claim is retracted in place.
fix(reviews): align model input description with #1210 AC2 exact wording
fix(reviews): add final period to model input description per #1210 AC2
don-petry commentedon Oct 21, 2026
Closing after the 2026-10-21 backlog triage.
Why: Done on main: model default is family 'opus'. PR #1245 now redundant.
Evidence: commit ec3b3de (#1216); reusable L65-67
Reopen if this still reproduces on main.