Repository navigation
feat(models): bump platform defaults to Claude Opus 5.5 / Haiku 5.5 (#953) - #954
Merged
Merged
Conversation
…953) Move PLATFORM_DEFAULT_MODEL_ID to anthropic.claude-opus-5-5 and DEFAULT_HAIKU_MODEL_ID to anthropic.claude-haiku-5-5. Add the 5.5 family (opus, sonnet, haiku) to DEFAULT_BEDROCK_MODEL_IDS additively; every previously granted model stays so per-repo pins keep working at turn 0. Mirror the geo-prefixed fallbacks in agent/src/config.py, models.py and the CLI display default; update the doc-parity-guarded prose and the Starlight mirrors. The larger grant list pushes the AgentCore runtime role's inline policy past the IAM size limit, so CDK now splits it into a managed-policy overflow. compute-selection.test.ts audits both resource kinds, as agent.test.ts already did. Refs #953
… 5.5 (#953) The Claude 5.5 models are rejected by Claude Code CLI builds older than 2.1.280 ("does not support this model; version 2.1.280 or newer is required"), so with the pinned 0.2.110 / 2.1.191 pair every task on the new platform default failed at turn 1. Verified with agent/scripts/diagnostics/test_sdk_smoke.py against us-east-1: both global.anthropic.claude-opus-5-5 and global.anthropic.claude-haiku-5-5 now return a completion with a non-zero reported cost, so the SDK price table also recognises them and max_budget_usd enforcement holds. Keep the npm CLI pin in the Dockerfile in lockstep with the SDK's bundled CLI (#215) and refresh the design docs that quote the pair. Also audit managed-policy overflow in the ECS exact-set grant test, matching the AgentCore half. Refs #953
… prose (#953) Sonnet 5.5 has no `jp.` cross-Region inference profile (verified 2026-10-16 via list-inference-profiles in ap-northeast-1), so granting it would put a bedrockGeoRegion=jp deployment back in the granted-but-uninvocable state the constants header forbids. Opus 5.5 and Haiku 5.5, the two defaults, have profiles in every geography. Also align the remaining prose that still named Opus 5 / Haiku 4.5 as the default or the granted set (plugin skills, deployment guide, architecture model table, CLI and smoke-script example IDs). Refs #953
Bump the direct mcp pin 1.28.1 -> 1.30.0 so the dependency scan passes. Pre-existing on main; included here because this branch already relocks agent/uv.lock for the claude-agent-sdk bump. agent pytest: 1800 passed. Refs #953
isadeks
approved these changes
Oct 16, 2026
isadeks
left a comment
Contributor
There was a problem hiding this comment.
Approving. I reviewed the diff and deployed it on a throwaway stack (AgentCore, default context, us-east-1) at d739e47.
Live result: a task with no model pin runs on Opus 5.5
- The deployed runtime has
ANTHROPIC_MODEL=global.anthropic.claude-opus-5-5andANTHROPIC_DEFAULT_HAIKU_MODEL=global.anthropic.claude-haiku-5-5. bgagent repo showon a repo onboarded without--modelshows(platform default) global.anthropic.claude-opus-5-5.bgagent platform doctorpasses, and all 6 granted models resolve asglobal.profiles.- An unpinned
new-taskcompleted in 23 s (4 turns, $0.11, build passed). Everyagent_turnevent reportsmodel=claude-opus-5-5, and the runtime log showsglobal.anthropic.claude-opus-5-5was invoked. The image's bumped CLI/SDK pair handled the 5.5 model fine. - IAM simulation on the runtime role: the
global.profiles for Opus 5.5, Haiku 5.5 and Opus 5 are allowed; Sonnet 5.5 is denied, as intended. The task made no auxiliary call, so Haiku 5.5 was checked by grant only, not live.
Review
- Bare IDs and
global./us.profiles for both new models are ACTIVE in us-east-1.@anthropic-ai/claude-code@2.1.301andclaude-agent-sdk==0.2.168both exist and stay in lockstep. - The grant list is additive and no old default IDs are left in source. The bootstrap already allows
iam:CreatePolicy, so the overflowManagedPolicypath deploys under the least-privilege bootstrap.
Nit (non-blocking): the description says the larger grant list can push the AgentCore runtime role past the IAM size limit. Under default context it doesn't. The runtime role's inline policy synthesizes at about 8.3k chars with no overflow. The only overflow policy belongs to the Linear webhook processor role and has no Bedrock statements. The tests cover both cases, so this is only wording.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The platform default models (Opus 5 main, Haiku 4.5 auxiliary) are no longer the latest Anthropic models on Bedrock. Opus 5.5 and Haiku 5.5 have ACTIVE
global.,us.,eu.,au.andjp.cross-Region inference profiles. Fixes #953Approach
Move
PLATFORM_DEFAULT_MODEL_IDandDEFAULT_HAIKU_MODEL_IDin the single source of truth (cdk/src/handlers/shared/bedrock-model-constants.ts), add the two new models toDEFAULT_BEDROCK_MODEL_IDSadditively so every previously granted model stays invocable for repos that pin it (the #744 regression rule), and mirror the geo-prefixed fallbacks inagent/src/config.py,agent/src/models.pyandcli/src/repo-display.tsso the doc-parity test stays green. Grants remain per-model (no wildcard); the geo prefix is still derived frombedrockGeoRegionat every grant site and env injection.Two things the issue did not anticipate, both required for the acceptance criterion "a task with no pin runs on Opus 5.5":
claude-agent-sdk==0.2.110/@anthropic-ai/claude-code@2.1.191pair rejects the 5.5 models (400 Claude Code 2.1.191 does not support this model; version 2.1.280 or newer is required), so without this every default task would fail at turn 1. Bumped in lockstep (feat: Bedrock cost attribution — session tags, request metadata, and operator FinOps guidance #215) to0.2.168/2.1.301. Verified end to end withagent/scripts/diagnostics/test_sdk_smoke.pyagainst us-east-1: bothglobal.anthropic.claude-opus-5-5andglobal.anthropic.claude-haiku-5-5return a completion with non-zero reported cost, so the SDK price table knows them andmax_budget_usdenforcement holds. The arm64 image builds with finch andclaude --versioninside it reports2.1.301, matching the SDK's bundled CLI.jp.profile, so adding it would recreate the granted-but-uninvocable state the constants header forbids for one geography. Opus 5.5 and Haiku 5.5 have profiles everywhere.IAM side effect: the larger grant list can push the AgentCore runtime role's inline policy past the IAM size limit, in which case CDK splits it into a
ManagedPolicyoverflow (it does under the default test context; whether a given deployment overflows depends on its feature set). Operators who overridebedrockModelsmust add both new bare IDs or synth fails on the coherence guard — documented in the developer guide. The existing cdk-nag suppression aspect already covers this path; template resource budgets still pass. Tests that audit the grant set now read both policy kinds.Changes
cdk/src/handlers/shared/bedrock-model-constants.ts— defaults → Opus 5.5 / Haiku 5.5; grant list additive (+opus-5-5, +haiku-5-5; haiku-4-5 kept as a literal).agent/src/config.py,agent/src/models.py,cli/src/repo-display.ts,cli/src/model-id.ts,agent/scripts/diagnostics/test_sdk_smoke.py— mirrored fallbacks / example IDs.agent/pyproject.toml,agent/uv.lock,agent/Dockerfile—claude-agent-sdk0.2.110→0.2.168, CLI 2.1.191→2.1.301 (lockstep);mcp1.28.1→1.30.0 (OSV advisory).cdk/test/stacks/agent.test.ts,cdk/test/constructs/ecs-agent-cluster.test.ts(exact-set baselines, default env assertions, coherence tests; ECS set now audits ManagedPolicy overflow),cdk/test/stacks/compute-selection.test.ts(overflow-aware),cli/test/platform-doctor.test.ts,agent/tests/test_config.py.docs/guides/{DEVELOPER,USER,DEPLOYMENT}_GUIDE.md,docs/design/{REPO_ONBOARDING,ARCHITECTURE,BEDROCK_COST_ATTRIBUTION,INTERACTIVE_AGENTS}.md,agent/README.md,docs/abca-plugin/skills/{onboard-repo,troubleshoot}/SKILL.md; Starlight mirrors regenerated.Tests & checks
mise run build✅ — cdk 5764 tests / 235 suites, cli 1079 / 65, agent 1800 pytest, docs build + link check.mise run security: secrets ✅, sast ✅, retire ✅, gh-actions ✅, deps ✅ after bumping the directmcppin 1.28.1→1.30.0 (GHSA-84m7-p3x7-pcfv, pre-existing onmain; included as its own commit because this branch already relocksagent/uv.lock— happy to split it out if preferred).security:sast:masking❌ pre-existing — flagsagent/src/server.py,linear-oauth-resolver.ts,orchestration-store.ts, none touched here.agent:security:imagenot runnable locally (needsdocker; this machine has finch).finch build --platform linux/arm64 -f agent/Dockerfile .✅;claude --versionin image = 2.1.301.prek installfails on this machine (globalcore.hooksPath, documented in CONTRIBUTING); equivalent checks run viamise run build+mise //docs:sync(tree clean after sync).Documentation
agent/README.mdenv-var table. Generated mirror regenerated: yes.runner.pynarrative comment are left as-is (they describe past measurements).Self-review
/code-review(high) — no code bugs; 5 doc-drift findings + Sonnet 5.5jp.gap, all fixed./security-review— no findings; confirmed grants stay per-model, overflow ManagedPolicy binds only to the originating role. Reporeview_pr— approve with nits; operator-note and source-path nits fixed here; the pre-existingus.hardcode inlambda-microvm-compute.tsis filed as a follow-up issue. Omitted:/simplify— diff is constants, literals and test baselines; nothing to restructure.docs/guides/DEVELOPER_GUIDE.mdcost table still shows the Opus 4.8 vs Opus 5 measurement — it is a historical data point illustrating rate-vs-volume, not a default claim.