Skip to content

[Phase 2] Switch feature-ideation-reusable.yml model default to the opus family and verify alias resolution #1210

Closed

Description

@don-petry

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

  1. In .github/workflows/feature-ideation-reusable.yml the model input default: is opus (the family), not claude-opus-4-6 (currently L55).
  2. The model input description reads: "Model family (opus recommended - Sonnet produces shallower adversarial passes) or an explicit model id override" (currently L53).
  3. 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 NO ANTHROPIC_MODEL env 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.
  4. 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.
  5. 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.
  6. 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

Dev Notes

  • GROUNDED FACT: the reusable currently passes the model ONLY via --model ${{ inputs.model }} (L274). A grep confirms NO ANTHROPIC_MODEL env var is set on the analyst step "Run Claude Code - BMAD Analyst" (its env: block is ~L252-266). So ci-standards.md gotcha Add multi-agent isolation strategy using git worktrees #2's claim that ANTHROPIC_MODEL: claude-opus-4-6 is 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 opus client-side (expandModelString) before the API call. So --model opus is the mechanism that should resolve to the current Opus. Do NOT introduce an ANTHROPIC_MODEL: opus env 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 resolve opus to 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

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.

Activity

  1. don-petry commented on Oct 3, 2026

    @don-petry
    ContributorAuthor

    Dev-Lead Implementation Plan

    Issue: #1210 — [Phase 2] Switch feature-ideation-reusable.yml model default to the opus family and verify alias resolution

    Scope

    model input default: is already 'opus' on main (AC#1 already met). What's left: change the input description to 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 the model input description to the exact AC#2 string; keep default: 'opus'
    • Alias-resolution check, done offline: claude-code-action v1.0.234 (9171db3e…) installs Claude Code CLI v2.1.282 (base-action/action.yml). Ran that exact CLI binary with --model opus against 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: the model input default is exactly opus; the description matches AC#2; the default is not a pinned claude-* id; the analyst step passes --model ${{ inputs.model }} and sets no ANTHROPIC_MODEL env

    Test Command

    bats test/workflows/feature-ideation/ + actionlint + bash .dev-lead/scripts/dev-lead-lint.sh

  2. don-petry commented on Oct 3, 2026

    @don-petry
    ContributorAuthor

    Dev-Lead: Progress (in progress — not yet durable)

    Provisional. Nothing is pushed yet. The automation posts the real completion record (with PR number + head SHA) after the push. Read the notes below as intent, not delivered results.

    Plan Execution (intended)

    • AC#1: default: 'opus' was already on main. The new test pins it so it can't regress.
    • AC#2: model input description changed to the exact AC wording.
    • AC#3, alias-resolution check (no tokens spent, no workflow dispatch):
      • The analyst step uses anthropics/claude-code-action@9171db3e57d6a3140a37ddc2ba92788584e0ead6 (v1.0.234). Its base-action/action.yml installs Claude Code CLI v2.1.282 (CLAUDE_CODE_VERSION="2.1.282").
      • Downloaded @anthropic-ai/claude-code-linux-x64@2.1.282 and ran claude -p hi --model <family> with ANTHROPIC_BASE_URL pointed at a local capture server. The server logs the request's model and returns 400, so nothing reaches the Anthropic API.
      • Model ids the CLI actually sent:
        • --model opus → claude-opus-5-5 (current Opus)
        • --model sonnet → claude-sonnet-5
        • --model haiku → claude-haiku-4-5-20251001
      • Result: the family resolves client-side to the current Opus where the model is used (--model ${{ inputs.model }}). The analyst step sets no ANTHROPIC_MODEL env. AC#4's resolve step is not needed, so none was added.
      • Caveat: the check used API-key auth against a custom base URL. Production uses CLAUDE_CODE_OAUTH_TOKEN. --model alias 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 what opus resolves to. Note that sonnet already resolves to claude-sonnet-5, not the newest Sonnet, in this CLI.
    • AC#5 (Risk, for the PR): the analyst's real model changes from Opus 4.6 (the old pinned id) to the current Opus (claude-opus-5-5). Per-run cost now follows the new model's pricing. Note that default: 'opus' was already on main, so callers on @main may already be on this model.
    • AC#6: the feature-ideation workflow was not dispatched.

    Local check output (provisional — not the pushed run)

    • New test/workflows/feature-ideation/model-input.bats failed before the description change and passed after it.
    • actionlint and .dev-lead/scripts/dev-lead-lint.sh were clean locally.
    • 5 DRY_RUN bats failures in the full suite also occur on an unmodified tree. They are unrelated to this change.

    Files touched (this workspace, not yet pushed)

    • .github/workflows/feature-ideation-reusable.yml: model input description reworded, plus a short comment saying never to pin a version id in the default
    • test/workflows/feature-ideation/model-input.bats: new regression tests (family default, AC#2 description, --model passthrough, no ANTHROPIC_MODEL env)

    Notes

    Out of scope, left for Story 3: the caller stubs' header comments (.github/workflows/feature-ideation.yml and standards/workflows/feature-ideation.yml, L9) and standards/agent-standards.md L122/128 still mention ANTHROPIC_MODEL / claude-opus-4-6.

  3. don-petry commented on Oct 3, 2026

    @don-petry
    ContributorAuthor

    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.

    Review 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.

  4. don-petry commented on Oct 21, 2026

    @don-petry
    ContributorAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions