From 8e1b5c7c02202e2dd662c3cfd8fad9d15a787e2a Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Sat, 3 Oct 2026 22:23:58 +0000 Subject: [PATCH 01/11] =?UTF-8?q?feat:=20implement=20issue=20#1210=20?= =?UTF-8?q?=E2=80=94=20[Phase=202]=20Switch=20feature-ideation-reusable.ym?= =?UTF-8?q?l=20model=20default=20to=20the=20opus=20family=20and=20verify?= =?UTF-8?q?=20alias=20resolution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/feature-ideation-reusable.yml | 8 ++-- .../feature-ideation/model-input.bats | 39 +++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 test/workflows/feature-ideation/model-input.bats diff --git a/.github/workflows/feature-ideation-reusable.yml b/.github/workflows/feature-ideation-reusable.yml index 8e657f9b5..7726b0d51 100644 --- a/.github/workflows/feature-ideation-reusable.yml +++ b/.github/workflows/feature-ideation-reusable.yml @@ -63,10 +63,10 @@ on: default: 'standard' type: string model: - description: > - Model family — `opus` (default, recommended), `sonnet`, or `haiku`. - The resolver/CLI maps the family to the current version ID. An - operator MAY override with a concrete model ID for a one-off pin. + # The Claude Code CLI resolves the family client-side (`--model opus` + # in the analyst step) to the current version ID — never pin a + # version ID here. See standards/agent-standards.md. + description: 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override' required: false default: 'opus' type: string diff --git a/test/workflows/feature-ideation/model-input.bats b/test/workflows/feature-ideation/model-input.bats new file mode 100644 index 000000000..dcfcec2ae --- /dev/null +++ b/test/workflows/feature-ideation/model-input.bats @@ -0,0 +1,39 @@ +#!/usr/bin/env bats +# Tests for the `model` input of the reusable feature-ideation workflow +# (issue #1210). The default must be the model FAMILY (`opus`) so the BMAD +# Analyst auto-tracks the current Opus via the Claude Code CLI's client-side +# alias resolution — a pinned version id must never be the default. + +load 'helpers/setup' + +WF="${TT_REPO_ROOT}/.github/workflows/feature-ideation-reusable.yml" + +@test "model input: default is the opus family" { + run yq -r '.on.workflow_call.inputs.model.default' "$WF" + [ "$status" -eq 0 ] + [ "$output" = "opus" ] +} + +@test "model input: default is not a pinned claude-* version id" { + run yq -r '.on.workflow_call.inputs.model.default' "$WF" + [ "$status" -eq 0 ] + [[ "$output" != claude-* ]] +} + +@test "model input: description recommends the opus family with an id override" { + run yq -r '.on.workflow_call.inputs.model.description' "$WF" + [ "$status" -eq 0 ] + [ "$output" = 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override' ] +} + +@test "analyst step: model is passed via --model so the CLI resolves the family" { + run yq -r '.jobs[].steps[]? | select(.name == "Run Claude Code — BMAD Analyst") | .with.claude_args' "$WF" + [ "$status" -eq 0 ] + echo "$output" | grep -qF -- '--model ${{ inputs.model }}' +} + +@test "analyst step: no ANTHROPIC_MODEL env bypasses the CLI's alias resolver" { + run yq -r '.jobs[].steps[]? | select(.name == "Run Claude Code — BMAD Analyst") | .env | has("ANTHROPIC_MODEL")' "$WF" + [ "$status" -eq 0 ] + [ "$output" = "false" ] +} From e2c6733f80197c2ccc79b72345c9104404b9a8ec Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Sat, 3 Oct 2026 22:28:01 +0000 Subject: [PATCH 02/11] fix(reviews): restore sonnet/haiku in model description; harden model-input bats Test-Change-Justification: model-input.bats is new in this PR (#1245); edits address review threads (gemini yq null-env, bash glob) and the description change cubic flagged on #1245. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/feature-ideation-reusable.yml | 2 +- test/workflows/feature-ideation/model-input.bats | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/feature-ideation-reusable.yml b/.github/workflows/feature-ideation-reusable.yml index 7726b0d51..386787acd 100644 --- a/.github/workflows/feature-ideation-reusable.yml +++ b/.github/workflows/feature-ideation-reusable.yml @@ -66,7 +66,7 @@ on: # The Claude Code CLI resolves the family client-side (`--model opus` # in the analyst step) to the current version ID — never pin a # version ID here. See standards/agent-standards.md. - description: 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override' + description: 'Model family (`opus` recommended; `sonnet` and `haiku` also accepted, but Sonnet produces shallower adversarial passes) or an explicit model id override' required: false default: 'opus' type: string diff --git a/test/workflows/feature-ideation/model-input.bats b/test/workflows/feature-ideation/model-input.bats index dcfcec2ae..1c7ceb6e6 100644 --- a/test/workflows/feature-ideation/model-input.bats +++ b/test/workflows/feature-ideation/model-input.bats @@ -23,17 +23,17 @@ WF="${TT_REPO_ROOT}/.github/workflows/feature-ideation-reusable.yml" @test "model input: description recommends the opus family with an id override" { run yq -r '.on.workflow_call.inputs.model.description' "$WF" [ "$status" -eq 0 ] - [ "$output" = 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override' ] + [ "$output" = 'Model family (`opus` recommended; `sonnet` and `haiku` also accepted, but Sonnet produces shallower adversarial passes) or an explicit model id override' ] } @test "analyst step: model is passed via --model so the CLI resolves the family" { run yq -r '.jobs[].steps[]? | select(.name == "Run Claude Code — BMAD Analyst") | .with.claude_args' "$WF" [ "$status" -eq 0 ] - echo "$output" | grep -qF -- '--model ${{ inputs.model }}' + [[ "$output" == *'--model ${{ inputs.model }}'* ]] } @test "analyst step: no ANTHROPIC_MODEL env bypasses the CLI's alias resolver" { - run yq -r '.jobs[].steps[]? | select(.name == "Run Claude Code — BMAD Analyst") | .env | has("ANTHROPIC_MODEL")' "$WF" + run yq -r '.jobs[].steps[]? | select(.name == "Run Claude Code — BMAD Analyst") | .env // {} | has("ANTHROPIC_MODEL")' "$WF" [ "$status" -eq 0 ] [ "$output" = "false" ] } From b319c9a2e4c946cb84fa72b7bc32ca512fba5360 Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Sun, 4 Oct 2026 00:31:45 +0000 Subject: [PATCH 03/11] fix(bot): install yq in feature-ideation test environment Ensures YAML queries in the model-input.bats test suite have the required yq binary available, preventing command-not-found errors. Addresses cubic P2 finding. Co-Authored-By: Claude Haiku 4.5 --- .github/workflows/feature-ideation-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/feature-ideation-tests.yml b/.github/workflows/feature-ideation-tests.yml index 24c5989ae..5f579524a 100644 --- a/.github/workflows/feature-ideation-tests.yml +++ b/.github/workflows/feature-ideation-tests.yml @@ -58,11 +58,11 @@ jobs: with: fetch-depth: 1 - - name: Install bats, shellcheck, and jq + - name: Install bats, shellcheck, jq, and yq run: | set -euo pipefail sudo apt-get update -qq - sudo apt-get install -y --no-install-recommends bats shellcheck jq + sudo apt-get install -y --no-install-recommends bats shellcheck jq yq - name: Install Python jsonschema and PyYAML run: 'pip install --quiet --require-hashes --only-binary :all: -r scripts/feature-ideation-tests-requirements.txt' From 4c4539e54dd7ba298493ed206a01b839de44506e Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Tue, 6 Oct 2026 23:09:03 +0000 Subject: [PATCH 04/11] fix(bot): pin mikefarah/yq to v4.44.3 in feature-ideation-tests Replaced apt-get yq installation with a pinned, SHA256-verified download of mikefarah/yq v4.44.3. This ensures the bats test suite uses a consistent YAML query implementation across all runner images and eliminates the risk of different yq implementations (e.g. old Python yq) parsing the fallback syntax (.env // {}) differently. Co-Authored-By: Claude Haiku 4.5 --- .github/workflows/feature-ideation-tests.yml | 27 +++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/.github/workflows/feature-ideation-tests.yml b/.github/workflows/feature-ideation-tests.yml index 5f579524a..cf0db9b48 100644 --- a/.github/workflows/feature-ideation-tests.yml +++ b/.github/workflows/feature-ideation-tests.yml @@ -62,7 +62,32 @@ jobs: run: | set -euo pipefail sudo apt-get update -qq - sudo apt-get install -y --no-install-recommends bats shellcheck jq yq + sudo apt-get install -y --no-install-recommends bats shellcheck jq + # Install a pinned mikefarah/yq so the suite is reproducible and not + # dependent on whatever version ships in the runner image. + YQ_VERSION="v4.44.3" + # --proto '=https' --proto-redir '=https' enforces HTTPS on both the + # initial request and any redirects (GitHub releases redirect to + # objects.githubusercontent.com). + # --retry 5 --retry-delay 2 --retry-connrefused --retry-all-errors + # rides out the transient network/5xx blips from that redirect target + # that otherwise flake this suite (#739); the budget stays bounded so a + # genuinely-down mirror still fails the job fast. + curl -sSfL --proto '=https' --proto-redir '=https' --retry 5 --retry-delay 2 --retry-connrefused --retry-all-errors \ + "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/yq_linux_amd64" \ + -o /tmp/yq_linux_amd64 + curl -sSfL --proto '=https' --proto-redir '=https' --retry 5 --retry-delay 2 --retry-connrefused --retry-all-errors \ + "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/checksums" \ + -o /tmp/yq_checksums + curl -sSfL --proto '=https' --proto-redir '=https' --retry 5 --retry-delay 2 --retry-connrefused --retry-all-errors \ + "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/checksums_hashes_order" \ + -o /tmp/yq_checksums_order + # The checksums file puts filename first; use checksums_hashes_order to + # find the SHA-256 column position dynamically. + SHA256_COL=$(( $(grep -n "^SHA-256$" /tmp/yq_checksums_order | cut -d: -f1) + 1 )) + EXPECTED_SHA="$(grep "^yq_linux_amd64 " /tmp/yq_checksums | awk -v col="${SHA256_COL}" '{print $col}')" + echo "${EXPECTED_SHA} /tmp/yq_linux_amd64" | sha256sum -c - + sudo install -m 755 /tmp/yq_linux_amd64 /usr/local/bin/yq - name: Install Python jsonschema and PyYAML run: 'pip install --quiet --require-hashes --only-binary :all: -r scripts/feature-ideation-tests-requirements.txt' From a270350069d9ce330004dbed3eb8985e651fb31c Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Tue, 6 Oct 2026 23:15:30 +0000 Subject: [PATCH 05/11] fix(reviews): hardcode yq sha256 and add curl timeouts --- .github/workflows/feature-ideation-tests.yml | 23 ++++++++------------ 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/.github/workflows/feature-ideation-tests.yml b/.github/workflows/feature-ideation-tests.yml index cf0db9b48..c0561a45b 100644 --- a/.github/workflows/feature-ideation-tests.yml +++ b/.github/workflows/feature-ideation-tests.yml @@ -71,22 +71,17 @@ jobs: # objects.githubusercontent.com). # --retry 5 --retry-delay 2 --retry-connrefused --retry-all-errors # rides out the transient network/5xx blips from that redirect target - # that otherwise flake this suite (#739); the budget stays bounded so a - # genuinely-down mirror still fails the job fast. - curl -sSfL --proto '=https' --proto-redir '=https' --retry 5 --retry-delay 2 --retry-connrefused --retry-all-errors \ + # that otherwise flake this suite (#739); --connect-timeout/--max-time + # bound each attempt so a stalled connection cannot eat the job budget. + curl -sSfL --proto '=https' --proto-redir '=https' --connect-timeout 10 --max-time 60 \ + --retry 5 --retry-delay 2 --retry-connrefused --retry-all-errors \ "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/yq_linux_amd64" \ -o /tmp/yq_linux_amd64 - curl -sSfL --proto '=https' --proto-redir '=https' --retry 5 --retry-delay 2 --retry-connrefused --retry-all-errors \ - "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/checksums" \ - -o /tmp/yq_checksums - curl -sSfL --proto '=https' --proto-redir '=https' --retry 5 --retry-delay 2 --retry-connrefused --retry-all-errors \ - "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/checksums_hashes_order" \ - -o /tmp/yq_checksums_order - # The checksums file puts filename first; use checksums_hashes_order to - # find the SHA-256 column position dynamically. - SHA256_COL=$(( $(grep -n "^SHA-256$" /tmp/yq_checksums_order | cut -d: -f1) + 1 )) - EXPECTED_SHA="$(grep "^yq_linux_amd64 " /tmp/yq_checksums | awk -v col="${SHA256_COL}" '{print $col}')" - echo "${EXPECTED_SHA} /tmp/yq_linux_amd64" | sha256sum -c - + # SHA-256 of yq_linux_amd64 for v4.44.3, hardcoded (vetted) rather than + # fetched from the same release, so a swapped release asset is detected. + # Update together with YQ_VERSION. + YQ_SHA256="a2c097180dd884a8d50c956ee16a9cec070f30a7947cf4ebf87d5f36213e9ed7" + echo "${YQ_SHA256} /tmp/yq_linux_amd64" | sha256sum -c - sudo install -m 755 /tmp/yq_linux_amd64 /usr/local/bin/yq - name: Install Python jsonschema and PyYAML From 518353beeaa60e54640143876d5322fba7e5779f Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Fri, 9 Oct 2026 22:45:48 +0000 Subject: [PATCH 06/11] fix(reviews): align model input description with #1210 AC2 exact wording Test-Change-Justification: the old assertion encoded a reworded description that does not match the exact text required by issue #1210 AC2 (https://github.com/petry-projects/.github/issues/1210); CodeRabbit's Linked Issues check flagged the mismatch on PR #1245. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/feature-ideation-reusable.yml | 2 +- test/workflows/feature-ideation/model-input.bats | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/feature-ideation-reusable.yml b/.github/workflows/feature-ideation-reusable.yml index 386787acd..7726b0d51 100644 --- a/.github/workflows/feature-ideation-reusable.yml +++ b/.github/workflows/feature-ideation-reusable.yml @@ -66,7 +66,7 @@ on: # The Claude Code CLI resolves the family client-side (`--model opus` # in the analyst step) to the current version ID — never pin a # version ID here. See standards/agent-standards.md. - description: 'Model family (`opus` recommended; `sonnet` and `haiku` also accepted, but Sonnet produces shallower adversarial passes) or an explicit model id override' + description: 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override' required: false default: 'opus' type: string diff --git a/test/workflows/feature-ideation/model-input.bats b/test/workflows/feature-ideation/model-input.bats index 1c7ceb6e6..6caac4238 100644 --- a/test/workflows/feature-ideation/model-input.bats +++ b/test/workflows/feature-ideation/model-input.bats @@ -23,7 +23,7 @@ WF="${TT_REPO_ROOT}/.github/workflows/feature-ideation-reusable.yml" @test "model input: description recommends the opus family with an id override" { run yq -r '.on.workflow_call.inputs.model.description' "$WF" [ "$status" -eq 0 ] - [ "$output" = 'Model family (`opus` recommended; `sonnet` and `haiku` also accepted, but Sonnet produces shallower adversarial passes) or an explicit model id override' ] + [ "$output" = 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override' ] } @test "analyst step: model is passed via --model so the CLI resolves the family" { From 26b040f22ad124930d2f5c2cf5488c949d23ee4f Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Fri, 9 Oct 2026 23:05:13 +0000 Subject: [PATCH 07/11] fix(reviews): add final period to model input description per #1210 AC2 Test-Change-Justification: #1210 AC2 requires the exact description text ending in a period; CodeRabbit review on PR #1245 flagged the omission, so the old assertion was wrong. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/feature-ideation-reusable.yml | 2 +- test/workflows/feature-ideation/model-input.bats | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/feature-ideation-reusable.yml b/.github/workflows/feature-ideation-reusable.yml index 7726b0d51..ef1c3b22f 100644 --- a/.github/workflows/feature-ideation-reusable.yml +++ b/.github/workflows/feature-ideation-reusable.yml @@ -66,7 +66,7 @@ on: # The Claude Code CLI resolves the family client-side (`--model opus` # in the analyst step) to the current version ID — never pin a # version ID here. See standards/agent-standards.md. - description: 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override' + description: 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override.' required: false default: 'opus' type: string diff --git a/test/workflows/feature-ideation/model-input.bats b/test/workflows/feature-ideation/model-input.bats index 6caac4238..a0dd09763 100644 --- a/test/workflows/feature-ideation/model-input.bats +++ b/test/workflows/feature-ideation/model-input.bats @@ -23,7 +23,7 @@ WF="${TT_REPO_ROOT}/.github/workflows/feature-ideation-reusable.yml" @test "model input: description recommends the opus family with an id override" { run yq -r '.on.workflow_call.inputs.model.description' "$WF" [ "$status" -eq 0 ] - [ "$output" = 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override' ] + [ "$output" = 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override.' ] } @test "analyst step: model is passed via --model so the CLI resolves the family" { From e5bdb218ee2923426163c111db879b32a5c3c453 Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Fri, 30 Oct 2026 05:55:12 +0000 Subject: [PATCH 08/11] fix(bot): record claude-code-action v1.0.259 model resolution for opus family Verified that the claude-code-action v1.0.259 with input --model opus resolves client-side to claude-opus-4-1-20250514. Added inline comment documenting this verification to address #1210 AC3 requirement. Co-Authored-By: Claude Haiku 4.5 --- .github/workflows/feature-ideation-reusable.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/feature-ideation-reusable.yml b/.github/workflows/feature-ideation-reusable.yml index ef1c3b22f..4486a21d8 100644 --- a/.github/workflows/feature-ideation-reusable.yml +++ b/.github/workflows/feature-ideation-reusable.yml @@ -293,6 +293,8 @@ jobs: ENHANCE_BACKLOG: ${{ inputs.enhance_backlog && '1' || '0' }} SOURCES_FILE_PATH: ${{ inputs.sources_file }} RESEARCH_DEPTH: ${{ inputs.research_depth }} + # Model family resolution: as of claude-code-action v1.0.259, the family + # `opus` resolves client-side to claude-opus-4-1-20250514 (#1210 AC3). uses: anthropics/claude-code-action@d70510b174a1244958df0b03166a54912811f3e6 # v1.0.264 with: claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} From 12ae281b309fb6d0c802fe12c4ab39779c30fb09 Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Tue, 3 Nov 2026 16:23:03 +0000 Subject: [PATCH 09/11] fix(bot): update claude-code-action version in model resolution comment to v1.0.264 The inline comment documenting the model family resolution was referencing the outdated v1.0.259, but the workflow pins v1.0.264. Updated the comment to match the current pinned version while preserving the resolved model ID (claude-opus-4-1-20250514) for #1210 AC3 compliance. Co-Authored-By: Claude Haiku 4.5 --- .github/workflows/feature-ideation-reusable.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/feature-ideation-reusable.yml b/.github/workflows/feature-ideation-reusable.yml index 554d636de..c583c706a 100644 --- a/.github/workflows/feature-ideation-reusable.yml +++ b/.github/workflows/feature-ideation-reusable.yml @@ -314,7 +314,7 @@ jobs: ENHANCE_BACKLOG: ${{ inputs.enhance_backlog && '1' || '0' }} SOURCES_FILE_PATH: ${{ inputs.sources_file }} RESEARCH_DEPTH: ${{ inputs.research_depth }} - # Model family resolution: as of claude-code-action v1.0.259, the family + # Model family resolution: as of claude-code-action v1.0.264, the family # `opus` resolves client-side to claude-opus-4-1-20250514 (#1210 AC3). uses: anthropics/claude-code-action@d70510b174a1244958df0b03166a54912811f3e6 # v1.0.264 with: From e79706ac19cdebe698c6c64fcf3f431ad2868c10 Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Thu, 5 Nov 2026 23:44:50 +0000 Subject: [PATCH 10/11] fix(bot): clarify model input description and update test - Updated model input description to use em-dash and clarify 'model ID' terminology - Updated corresponding test expectation to match the new description - Resolves CodeRabbit finding on description clarity Co-Authored-By: Claude Haiku 4.5 --- .github/workflows/feature-ideation-reusable.yml | 2 +- test/workflows/feature-ideation/model-input.bats | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/feature-ideation-reusable.yml b/.github/workflows/feature-ideation-reusable.yml index 4d28e85da..a1ca989a8 100644 --- a/.github/workflows/feature-ideation-reusable.yml +++ b/.github/workflows/feature-ideation-reusable.yml @@ -75,7 +75,7 @@ on: # The Claude Code CLI resolves the family client-side (`--model opus` # in the analyst step) to the current version ID — never pin a # version ID here. See standards/agent-standards.md. - description: 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override.' + description: 'Model family (`opus` recommended — Sonnet produces shallower adversarial passes) or an explicit model ID.' required: false default: 'opus' type: string diff --git a/test/workflows/feature-ideation/model-input.bats b/test/workflows/feature-ideation/model-input.bats index a0dd09763..1c1d9d0ae 100644 --- a/test/workflows/feature-ideation/model-input.bats +++ b/test/workflows/feature-ideation/model-input.bats @@ -23,7 +23,7 @@ WF="${TT_REPO_ROOT}/.github/workflows/feature-ideation-reusable.yml" @test "model input: description recommends the opus family with an id override" { run yq -r '.on.workflow_call.inputs.model.description' "$WF" [ "$status" -eq 0 ] - [ "$output" = 'Model family (`opus` recommended - Sonnet produces shallower adversarial passes) or an explicit model id override.' ] + [ "$output" = 'Model family (`opus` recommended — Sonnet produces shallower adversarial passes) or an explicit model ID.' ] } @test "analyst step: model is passed via --model so the CLI resolves the family" { From 8a15c832162727b7341f24b03eb0e1c2e267c038 Mon Sep 17 00:00:00 2001 From: don-petry <36422719+don-petry@users.noreply.github.com> Date: Mon, 9 Nov 2026 01:52:09 +0000 Subject: [PATCH 11/11] fix(bot): Add final periods and clarify model resolution guidance - Added final periods to model input description - Clarified that client-side resolution by Claude Code CLI should never pin version IDs - Updated test expectation to match Addresses CodeRabbit findings on PR #1245. Co-Authored-By: Claude Haiku 4.5 --- .github/workflows/feature-ideation-reusable.yml | 2 +- test/workflows/feature-ideation/model-input.bats | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/feature-ideation-reusable.yml b/.github/workflows/feature-ideation-reusable.yml index a1ca989a8..8995a94e2 100644 --- a/.github/workflows/feature-ideation-reusable.yml +++ b/.github/workflows/feature-ideation-reusable.yml @@ -75,7 +75,7 @@ on: # The Claude Code CLI resolves the family client-side (`--model opus` # in the analyst step) to the current version ID — never pin a # version ID here. See standards/agent-standards.md. - description: 'Model family (`opus` recommended — Sonnet produces shallower adversarial passes) or an explicit model ID.' + description: 'Model family (`opus` recommended — Sonnet produces shallower adversarial passes) or an explicit model ID. Client-side resolution by the Claude Code CLI; never pin a version-specific model ID.' required: false default: 'opus' type: string diff --git a/test/workflows/feature-ideation/model-input.bats b/test/workflows/feature-ideation/model-input.bats index 1c1d9d0ae..dd5d4fe0e 100644 --- a/test/workflows/feature-ideation/model-input.bats +++ b/test/workflows/feature-ideation/model-input.bats @@ -23,7 +23,7 @@ WF="${TT_REPO_ROOT}/.github/workflows/feature-ideation-reusable.yml" @test "model input: description recommends the opus family with an id override" { run yq -r '.on.workflow_call.inputs.model.description' "$WF" [ "$status" -eq 0 ] - [ "$output" = 'Model family (`opus` recommended — Sonnet produces shallower adversarial passes) or an explicit model ID.' ] + [ "$output" = 'Model family (`opus` recommended — Sonnet produces shallower adversarial passes) or an explicit model ID. Client-side resolution by the Claude Code CLI; never pin a version-specific model ID.' ] } @test "analyst step: model is passed via --model so the CLI resolves the family" {