Skip to content

Default to Opus 4.8; freeze v0 and adopt the v1.x release track#2

Merged
sudsali merged 2 commits into
mainfrom
feat/default-opus-4-8-and-release-hygiene
Jul 13, 2026
Merged

Default to Opus 4.8; freeze v0 and adopt the v1.x release track#2
sudsali merged 2 commits into
mainfrom
feat/default-opus-4-8-and-release-hygiene

Conversation

@sudsali

@sudsali sudsali commented Jul 13, 2026

Copy link
Copy Markdown
Owner

What

Two changes, bundled for the v1.8 release:

1. Default model → Opus 4.8

Bumps the built-in default _DEFAULT_MODEL from opus-4-7 to opus-4-8 for the reasoning stages (Investigator + Critic). Reporter and issue-answer paths stay Haiku 4.5 — Opus rejects outputConfig.textFormat (structured output) over Bedrock, which those paths require.

The sampling-param strip pattern (_NO_SAMPLING_PARAMS_PATTERN) already matches opus-4-8, so no call-path change is needed — this was validated when 4.8 support landed. All three adopter repos (deequ, python-deequ, dqdl) already run 4.8 via the BEDROCK_MODEL_ID secret; this just makes it the out-of-the-box default.

DRY hardening: routed every default through config._DEFAULT_MODEL / _DEFAULT_REPORTER_MODEL (the provenance + pricing-fallback paths in main.py, and doctor.py), so the literal lives in exactly one place. This directly prevents the drift class that caused the original 4.7→4.8 sampling-pattern miss.

2. Freeze v0, adopt the v1.x release track

The moving v0 tag had silently stopped advancing at the v1.6 vintage — so the README's "v0 = latest" contract was already false, and @v0 adopters were stuck three releases behind. This:

  • Converts every @v0 / /v0/ / default: v0 reference (README quick-start, caller example, action.yml, the reusable workflow's shadow_ref default, the CFN Launch Stack URL + template) to v1.8.
  • Rewrites the versioning + supply-chain prose to recommend a numbered v1.x tag or a SHA pin, and documents that v0 is now frozen.

3. Doc fix

Adds the missing BEDROCK_ISSUE_MODEL_ID row to the README env-var table (it was only in a .shadow.yml comment + the caller example).

Testing

  • 538 unit/integration/contract tests pass.
  • Deep-reviewed (completeness + comment-rot/doc-contract angles): confirmed no missed 4.7→4.8 flips, pricing table intact, reporter default still Haiku, three-way default agreement (config ↔ README ↔ workflow), and coherent versioning prose.

Release steps (after merge)

  1. Tag v1.8 at the merge commit + create its GitHub Release.
  2. Backfill GitHub Releases for v1.6 and v1.7 (currently zero Releases exist despite the tags).

Note: this PR touches .github/ and the reusable workflow, so per the auto-approve Condition-0 guard it correctly requires human approval.

sudsali added 2 commits July 13, 2026 15:38
Two changes bundled for the v1.8 release:

1. Bump the built-in default model opus-4-7 -> opus-4-8 for the
   reasoning stages (Investigator/Critic). Reporter/issue path stays
   Haiku 4.5 (Opus rejects outputConfig.textFormat over Bedrock). The
   sampling-param strip pattern already covers opus-4-8, so no call-path
   change is needed. Routed every default through config._DEFAULT_MODEL /
   _DEFAULT_REPORTER_MODEL (main.py provenance + pricing fallback,
   doctor.py) so the literal lives in exactly one place and a future bump
   can't drift the early-exit paths out of sync.

2. Freeze the moving v0 tag and document the v1.x numbered-release track.
   v0 had silently stopped advancing at the v1.6 vintage, so the README's
   'v0 = latest' contract was already false. Convert every @v0 / /v0/ /
   default-v0 reference (README, caller example, action.yml, reusable
   workflow default, CFN template) to v1.8, and rewrite the versioning +
   supply-chain prose to recommend a numbered tag or SHA pin.

Also add the missing BEDROCK_ISSUE_MODEL_ID row to the README env table.

538 tests pass.
Full 10-angle review of the default-model + v0-freeze diff surfaced no
correctness bugs but several items worth fixing (four self-introduced):

- main.py _build_provenance_from_env: the investigator line used the
  2-arg os.getenv(name, default), which stamps "" for a set-but-empty
  BEDROCK_MODEL_ID (the normal result of forwarding an unset secret),
  diverging from Config.env_or. Its 3 siblings already used the robust
  '(getenv or "").strip() or default' idiom; align investigator too so
  the comment's 'mirrors the single source of truth' claim is actually
  true. Add a parametrized empty/whitespace regression test.
- infrastructure: drop the 'refs/tags/v1.*' family-wildcard suggestion
  for the OIDC trust pin — it auto-trusts every future v1.x tag (incl. a
  malicious one an upstream attacker could push), defeating the pin.
- README/versioning prose: a git tag is not 'immutable' (it can be
  re-pointed); reword so the tag-vs-SHA tradeoff is honest and doesn't
  undercut the SHA-is-stronger guidance.
- requirements.txt: 'post-v0' -> present-tense 'not hash-pinned yet' so
  the hardening note isn't an unanchored rotting TODO.
- test_config_init: add a bare-Config() test asserting the built-in
  model defaults resolve (was only indirectly pinned via provenance).

541 tests pass (was 538).
@sudsali
sudsali merged commit 5f3386a into main Jul 13, 2026
3 checks passed
@sudsali
sudsali deleted the feat/default-opus-4-8-and-release-hygiene branch July 16, 2026 14:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant