Skip to content

fix(aws-startup-advisor): refresh GPT-5.4/GPT-5.5 Bedrock endpoint metadata from the public model cards - #583

Open
herosjourney wants to merge 9 commits into
aws:mainfrom
herosjourney:fix/gpt54-55-runtime-metadata
Open

herosjourney wants to merge 9 commits into
aws:mainfrom
herosjourney:fix/gpt54-55-runtime-metadata

Conversation

@herosjourney

@herosjourney herosjourney commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

Problem

The aws-startup-advisor plugin describes GPT-5.4 and GPT-5.5 on Bedrock as reachable only through the OpenAI-compatible (bedrock-mantle) endpoint: no cross-region inference (CRIS) ids, no inference profiles, no bedrock-runtime surface, Chat Completions "unconfirmed", a 272K context window, and no long-context price tier. The canonical catalog skills/shared/ai/models/openai-bedrock.json cited an "internal reference" as the provenance for those rows.

The public Bedrock model cards say otherwise. Both models are served by bedrock-runtime (Responses, Chat Completions, Converse) through us.openai.gpt-5.4 / global.openai.gpt-5.4 and us.openai.gpt-5.5 / global.openai.gpt-5.5, and by bedrock-mantle (Responses, Chat Completions) in-region. Context is 1,050,000 tokens shared with 128,000 max output, and each model has a long-context price tier. Because the same stale statements are repeated in roughly 20 places (shared docs, three vendored copies, phase files in gcp-to-aws / azure-to-aws / bedrock-migration-assessment, llm-to-bedrock helpers, agent prompts, and the tests that lock them in), a startup following the plugin today is told its GPT-5.4/5.5 workload cannot use Converse, Guardrails, or CRIS, and is quoted the wrong context limit and price table.

Fix

Re-source the GPT-5.4 and GPT-5.5 rows in the canonical catalog from the two public model cards and bring every piece of prose, every vendored copy, and every test assertion into line with what the cards state. Concretely:

  • Catalog (skills/shared/ai/models/openai-bedrock.json): mantle_openai_chat marked available; a runtime_converse path with CRIS ids; inference_profiles (us, global); region_availability (5.4: us-east-1, us-east-2, us-west-2, us-gov-west-1; 5.5: us-east-1, us-east-2); short and long-context pricing tiers plus the GovCloud rate for 5.4; 1,050,000 / 128,000 context and output limits; provenance is the public card URL. Path-level constraints corrected (Guardrails and application inference profiles on Converse only; implicit prompt caching and structured outputs on Responses only; no server-side tool use; Priority/Flex unsupported).
  • Shared docs (ai-openai-to-bedrock.md, ai-migration-guardrails.md, schema-design-aws-ai.md, bedrock-pricing-cache.md): Tier 0 table, region gate, caching notes, Bedrock-native section, long-context table, GovCloud rate. The schema rule now bans bare openai.gpt-* ids paired with converse / runtime, not the models themselves. The pricing prose keeps the existing ~10% cross-region uplift wording for these two because the cards publish only In-Region Standard rows.
  • gcp-to-aws, azure-to-aws, bedrock-migration-assessment phase and shared files, and the three vendored copies (re-synced with tools/sync-vendored.py).
  • agent-advisor: model-recommend.md documents the engine's current treatment of GPT-5.x as an engine limitation rather than a model fact; openai_model_recommendation.py changes only two message strings (dropped the "GPT-5.x on Mantle rejects Chat Completions" claim and the "Mantle-only GPT-5.x family" wording). No candidate ordering or dispatch logic is touched.
  • llm-to-bedrock: resolve-bedrock-model-id.md (Case A/B), openai-to-bedrock.md behavior delta, SKILL.md, and docstrings/comments plus the preflight 404 remedy string in preflight_bedrock.py, iam_policy.py, bedrock_pricing.py. The is_mantle_model / is_mantle_gpt id-form logic is unchanged.
  • Agents: llm2bedrock-code-rewriter.md (Converse rule is id-form dependent), llm2bedrock-report-generator.md, llm2bedrock-prompt-evaluator.md.
  • Tests: existing GPT-6 review suites and the agent-advisor recommendation tests now assert the corrected facts. New regression tests prove us./global.openai.gpt-5.4|5.5 classify as runtime and bare ids as mantle in all three llm-to-bedrock helpers.

Recording the corrected catalog facts has one visible side effect on recommendations, because the unchanged agent-advisor Chat fallback walks catalog key order and GPT-5.5 / GPT-5.4 precede GPT-6 Astra: a GPT-6 Sol / 6.1 Sol Chat Completions source outside us-east-1 now lands on GPT-5.5 (us-east-2) or GPT-5.4 (us-west-2), and a GPT-5.6 Sol Responses source in us-west-2 lands on GPT-5.6 Terra. Five new regression tests pin those cells so the shift is deliberate and visible, and model-recommend.md calls it out as an engine ordering limitation. It is not fixed here (see below).

What this PR does NOT do

  • It does not change endpoint-selection policy. The agent-advisor candidate walk, _SOURCE_MODEL_KEYS, and the llm-to-bedrock id-form dispatch are byte-for-byte the same logic as main. Reordering the Chat fallback so a newer-generation source does not fall back to GPT-5.4/5.5 ahead of GPT-6 Astra, and recognizing GPT-5.4/5.5 as same-model runtime identities, is PR 2 of this stack.
  • It does not add new Runtime lanes. No new code paths, selectors, or generated artifacts for the bedrock-runtime GPT-5.4/5.5 route are introduced. That is PR 3 of this stack.
  • It does not touch plugin registration, manifests, marketplaces, README.md, or mise.toml.

Scope

Skills: agent-advisor, azure-to-aws, bedrock-migration-assessment, gcp-to-aws, llm-to-bedrock, shared. No new skills.

Files: 46 modified (0 added, 0 deleted), +857 / −390, all under plugins/aws-startup-advisor/.

  • skills/shared/ai/: 5 canonical files (models/openai-bedrock.json, ai-openai-to-bedrock.md, ai-migration-guardrails.md, schema-design-aws-ai.md, bedrock-pricing-cache.md).
  • Vendored copies: 10 files under agent-advisor/references/vendored/ai/ (2), azure-to-aws/references/vendored/ai/ (4), gcp-to-aws/references/vendored/ai/ (4), byte-identical to the canonical files.
  • agent-advisor: model-recommend.md, scripts/openai_model_recommendation.py, scripts/test_openai_model_recommendation.py.
  • azure-to-aws: clarify-ai-only.md, design-ai.md, design.md, generate-artifacts-ai.md, generate.md, shared/openai-on-bedrock.md, shared/schema-design-aws-ai.md.
  • gcp-to-aws: clarify-ai-only.md, design-ai.md, discover-preview.md, generate-ai.md, shared/openai-on-bedrock.md.
  • bedrock-migration-assessment: clarify-ai-only.md.
  • llm-to-bedrock: SKILL.md, resolve-bedrock-model-id.md, behavior-delta-detection/references/openai-to-bedrock.md, scripts/preflight_bedrock.py, scripts/iam_policy.py, scripts/bedrock_pricing.py, and their three test files.
  • agents/: llm2bedrock-code-rewriter.md, llm2bedrock-prompt-evaluator.md, llm2bedrock-report-generator.md.
  • tests/: test_gpt6_review_round2.py, test_gpt6_review_round5.py, test_gpt6_round4_findings.py.

Base: main at 0a218f8c. Two commits: the metadata refresh, and a follow-up that pins and discloses the fallback shift described above.

Not touched: endpoint-selection and dispatch logic (_mantle_candidate_order, _catalog_model_for_path, _SOURCE_MODEL_KEYS, is_mantle_model, is_mantle_gpt), plugin.json, plugin manifests, marketplaces, plugin README.md, mise.toml, heroku-to-aws and the other non-AI skills, .mcp.json.

Validation

Figures in this section are from earlier heads and are kept as history. See "Update after merging main" below for the current head.

Sources: the public Bedrock model cards, read 2026-11-06.

Local gates, all run from this branch against main at 0a218f8c, all exit 0 unless noted:

  • Plugin CI mise -C plugins/aws-startup-advisor run ci: PASS. test 1,395 passed / 222 subtests passed; test:telemetry 311 passed; test:heroku-source-review 44 pass / 0 fail; lint:md 0 errors; lint:model-id OK (19 retired ids enforced); lint:model-staleness fresh (4 days old, 45-day window); lint:model-catalog-drift OK (3 pre-existing warnings, sonnet-5-5, haiku-5-5, gpt-6.1-terra not in catalog, unrelated); lint:startup-model-pricing OK; lint:artifacts 99 checked / 0 errors; lint:vendored-parity 62 files byte-identical; lint:skill-refs 1,482 checked / 0 missing; lint:consent-disclosure OK (6 checked).
  • agent-advisor pytest (skills/agent-advisor/scripts): 569 passed / 0 failed (562 at base, 7 new).
  • llm-to-bedrock pytest (skills/llm-to-bedrock/scripts): 418 passed / 0 failed (415 at base, 3 new; needs --with httpx --with aws-bedrock-token-generator).
  • Root: python3 tools/validate.py "All validations passed"; mise run lint:md 0 issues / 2,763 files; lint:manifests, lint:spec, lint:skill-parity pass; test:tools OK.
  • mise run build: the security step fails only on a pre-existing gitleaks finding in upstream commit f8d09fd1 (tests/test_bedrock_migration_assessment_discover.py:118, a claude-3.5-sonnet model string), unrelated to this branch. gitleaks protect --staged over this change set: no leaks found.
  • Grep over plugins/ for "mantle-only", "no CRIS", "no inference profile", "no runtime path", "unconfirmed", "internal reference", "no 1M tier" near GPT-5.4 / GPT-5.5 / GPT-5.x: no remaining claims. The only hits are negative test assertions, the GovCloud Opus 5.5 pricing row, and the bare-id rule ("bare proprietary openai.gpt-* ids use Mantle only"), which is still correct.

Review round 2 (head 8c37ef0f, replies to the three inline threads by leon1418 on 6b873f8c):

  1. IAM default-project grant (iam_policy.py:29): is_gpt54_55_cris_model() / requires_default_project_grant() added; generate_policy() emits arn:aws:bedrock:{region}:{account-id}:project/default for the us./global.openai.gpt-5.4|5.5 ids and profile ARNs; GPT-6-only wording updated in gcp generate-ai.md, gcp/azure generate-artifacts-ai.md and the report generator. Tests: test_iam_policy.py::TestGpt54Gpt55CrisProjectArn.
  2. Application inference profiles are Converse-only (gcp design-ai.md:425): GCP/Azure Design require required_client_api: "converse" when application profiles drive the move on GPT-5.5/5.4, keep the responses default for a region-only move, and record a conflicting Responses-only need as an explicit decision; checklist items added to the GCP checklist and Azure shared schema.
  3. Unpublished Geo/Global prices (ai-openai-to-bedrock.md:46): the ~10% premium is scoped to the commercial In-Region option across the canonical guide, both openai-on-bedrock.md fact bases, the report generator and the pricing-cache rows; CRIS plans source a Geo/Global price separately or report the comparison unavailable. bedrock_pricing.lookup() available: false for the CRIS ids pinned by test_bedrock_pricing.py::test_gpt54_55_cris_ids_are_unpriced_not_inferred_from_in_region. This supersedes the third Limitations bullet below.

Text contracts for all three in new tests/test_gpt54_55_runtime_review_round3.py; tools/sync-vendored.py re-run (5 copies). Updated counts: plugin CI test 1,407 passed / 222 subtests (was 1,395); test:telemetry 311; heroku-source-review 44/44; lint:vendored-parity 62 files; lint:skill-refs 1,482. agent-advisor pytest 570 passed; llm-to-bedrock pytest 453 passed (via uv run --project scripts). python3 tools/validate.py passed; tools/sync-vendored.py --check PASS. mise run security still reports only the pre-existing upstream gitleaks false positive at f8d09fd1.

Limitations

  • The agent-advisor Chat fallback now routes a GPT-6 Sol / 6.1 Sol Chat Completions source outside us-east-1 to GPT-5.5 or GPT-5.4 (an older generation) because the catalog walk is in key order. This is pinned by tests and documented in model-recommend.md; the ordering fix is deferred to PR 2 of this stack so that this PR stays a metadata correction.
  • GPT-5.4 and GPT-5.5 are not yet in _SOURCE_MODEL_KEYS, so a GPT-5.4/5.5 source workload still maps to Claude tiers rather than being recognized as a same-model runtime identity. Also deferred to PR 2.
  • The model cards publish only In-Region Standard pricing for these two models (no Geo or Global rows). The prose therefore keeps the existing ~10% cross-region uplift estimate and does not claim price parity.
  • lint:model-catalog-drift carries 3 pre-existing warnings and mise run build's security step a pre-existing gitleaks finding, both inherited from main and not addressed here.

Update after merging main

Head e17c00ac. Main was merged into this branch, including #567, #581, #600, #607, #619 and #620. The only conflict was the generated OpenAI model catalog. Main no longer edits skills/shared/ai/models/openai-bedrock.json by hand: it is rendered from skills/shared/ai/models/bedrock-model-registry.json by tools/build-model-catalogs.py, and the vendored copies come from tools/sync-vendored.py. This PR's GPT-5.4/GPT-5.5 corrections were therefore ported into the registry and the catalogs re-rendered; wherever this description says "canonical catalog", the registry is the source and the catalog is its rendered output. The full plugin CI (mise run ci) passed at this head (1,731 tests). The base 0a218f8c and the counts above are from the first revision.

Type of Change

  • New skill
  • Documentation update
  • New plugin
  • Bug fix
  • CI/CD change
  • Other

Checklist

  • I have read the CONTRIBUTING guide
  • My changes pass python3 tools/validate.py
  • I have updated relevant documentation

Startup Advisor review checklist

  • I have reviewed the full diff and understand all changes I am submitting.
  • I have tested my changes and confirmed they work as intended.
  • I have run mise -C plugins/aws-startup-advisor run ci and all checks pass.
  • I have disclosed any known issues, limitations, or untested scenarios.

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Logan Kleier added 2 commits November 6, 2026 23:17
…tadata from the public model cards

The plugin recorded GPT-5.4 and GPT-5.5 as bedrock-mantle-only (no CRIS, no
inference profile, no bedrock-runtime surface) with Chat Completions
"unconfirmed", a 272K context window and no long-context price tier, and the
canonical catalog cited "internal reference" probes as provenance. The public
model cards no longer say any of that. This PR corrects the metadata only; it
does not change endpoint selection, dispatch, or add new code paths.

Sources (read 2026-11-06 via the AWS Documentation MCP tools):
- https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-openai-gpt-54.html
- https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-openai-gpt-55.html

What the cards state, now recorded verbatim in the catalog and prose:
- Endpoints: bedrock-runtime supported (Responses, Chat Completions, Converse;
  not Messages/Invoke) and bedrock-mantle supported (Responses, Chat
  Completions). Runtime has no in-region form; requests name
  us.openai.gpt-5.4 / global.openai.gpt-5.4 and us.openai.gpt-5.5 /
  global.openai.gpt-5.5. Mantle in-region: 5.4 = us-east-1, us-east-2,
  us-west-2, us-gov-west-1; 5.5 = us-east-1, us-east-2. US Geo CRIS from 6
  regions, Global CRIS from 33.
- Context 1,050,000 tokens shared, 128,000 max output.
- Pricing (Standard, In-Region only; Priority/Flex unsupported): 5.4 short
  2.75 / 0.275 cache read / 16.50, long 5.50 / 0.55 / 24.75, GovCloud short
  3.375 / 0.3375 / 20.25; 5.5 short 5.50 / 0.55 / 33.00, long 11.00 / 1.10 /
  49.50. No Geo/Global price rows, so prose keeps the ~10% figure for these
  two on every inference option and never claims parity.
- Runtime features: invocation logs, streaming, Guardrails and application
  inference profiles (Converse only), implicit prompt caching and structured
  outputs (Responses only); no server-side tool use.

Changes:
- skills/shared/ai/models/openai-bedrock.json: GPT-5.4/5.5 rows re-sourced to
  the public cards (no "internal reference"), mantle_openai_chat available,
  runtime_converse path with CRIS, inference_profiles (us/global),
  region_availability, pricing tiers, context/output limits; path-level
  constraints corrected.
- Canonical shared docs: ai-openai-to-bedrock.md (Tier 0 table, region gate,
  caching, Bedrock-native section, volume guidance), ai-migration-guardrails.md,
  schema-design-aws-ai.md (ban is on BARE ids paired with converse/runtime,
  not on the models), bedrock-pricing-cache.md (rows, long-context table,
  caching note, GovCloud rate).
- gcp-to-aws and azure-to-aws: references/shared/openai-on-bedrock.md,
  shared/schema-design-aws-ai.md (azure), design-ai.md, design.md/generate.md
  _assert lines (azure), generate-artifacts-ai.md (azure), generate-ai.md,
  discover-preview.md and clarify-ai-only.md (gcp), clarify-ai-only.md (azure).
- bedrock-migration-assessment clarify-ai-only.md; agent-advisor
  model-recommend.md (documents the engine's current GPT-5.x reshape as an
  engine limitation, not a model fact).
- llm-to-bedrock: resolve-bedrock-model-id.md (Case A/B), behavior-delta
  openai-to-bedrock.md, SKILL.md (two id-form sentences); docstrings/comments
  in preflight_bedrock.py, iam_policy.py, bedrock_pricing.py and the preflight
  404 remedy string. The is_mantle_model / is_mantle_gpt ID-form logic is
  unchanged.
- agents: llm2bedrock-code-rewriter.md (Converse rule is id-form-dependent),
  llm2bedrock-report-generator.md (cost text), llm2bedrock-prompt-evaluator.md.
- openai_model_recommendation.py: only the chat_completions_to_responses block
  message text (dropped the "GPT-5.x on Mantle rejects Chat Completions" claim).
- Tests: tests/test_gpt6_review_round2.py, test_gpt6_review_round5.py,
  test_gpt6_round4_findings.py and agent-advisor
  scripts/test_openai_model_recommendation.py now assert the corrected public
  facts (CRIS ids present, "mantle-only"/"no CRIS"/"unconfirmed" absent, catalog
  provenance is the public card). New regression tests in
  test_preflight_bedrock.py, test_iam_policy.py, test_bedrock_pricing.py prove
  us./global.openai.gpt-5.4|5.5 classify as runtime and bare ids as mantle in
  all three helpers.
- Vendored copies under agent-advisor, gcp-to-aws, azure-to-aws re-synced with
  tools/sync-vendored.py.

Validation (all run from the worktree with mise Python 3.12):
- mise -C plugins/aws-startup-advisor run ci: PASS
  - lint:md 0 errors; lint:model-id OK (19 retired IDs enforced);
    lint:model-staleness fresh (4d old, 45d window);
    lint:model-catalog-drift OK (3 pre-existing warnings: sonnet-5-5,
    haiku-5-5, gpt-6.1-terra not in catalog; unrelated);
    lint:startup-model-pricing OK; lint:artifacts PASS (99 checked, 0 errors);
    lint:vendored-parity PASS (62 files byte-identical);
    lint:skill-refs PASS (1482 checked, 0 missing);
    lint:consent-disclosure OK;
    test: 1395 passed, 222 subtests passed;
    test:telemetry: 311 passed; test:heroku-source-review: 44 pass, 0 fail
- agent-advisor pytest (skills/agent-advisor/scripts): 564 passed, 0 failed
  (562 at base + 2 new)
- llm-to-bedrock pytest (skills/llm-to-bedrock/scripts): 418 passed, 0 failed
  (415 at base + 3 new; needs --with httpx --with aws-bedrock-token-generator)
- root: python3 tools/validate.py "All validations passed";
  mise run lint:md 0 issues / 2763 files; lint:manifests, lint:skill-parity,
  lint:spec all pass; test:tools 6 OK. mise run build's security step fails on
  a pre-existing gitleaks false positive in upstream commit f8d09fd
  (tests/test_bedrock_migration_assessment_discover.py:118, "claude-3.5-sonnet");
  gitleaks protect over this change set: no leaks found.
- grep over plugins/ for mantle-only / "no CRIS" / "no inference profile" /
  "no runtime path" / "unconfirmed" / "internal reference" / "no 1M tier"
  near GPT-5.4/5.5: no remaining claims (only negative test assertions and
  the bare-id rule "bare proprietary openai.gpt-* IDs use Mantle only").

Base: 0a218f8 (upstream/main)
…ift caused by the GPT-5.4/5.5 catalog facts

Review round 1 (CHANGES_REQUESTED, 2 blockers) on c1944a5.

Finding 1: recording the public GPT-5.5/GPT-5.4 facts in
skills/shared/ai/models/openai-bedrock.json (mantle_openai_chat available,
region_availability) changes agent-advisor recommendations through the
unchanged catalog-order fallback in openai_model_recommendation.py
(_mantle_candidate_order -> _catalog_model_for_path): GPT-5.5 and GPT-5.4
precede GPT-6 Astra in catalog key order, so a GPT-6 Sol / 6.1 Sol Chat
Completions source outside us-east-1 now lands on
- openai.gpt-5.5 via mantle_openai_chat in us-east-2 (base: decision_required,
  mantle_region_unavailable, options mantle chat / runtime_converse)
- openai.gpt-5.4 via mantle_openai_chat in us-west-2 (base: openai.gpt-6-astra)
and a GPT-5.6 Sol Responses source in us-west-2 lands on openai.gpt-5.6-terra
(base: openai.gpt-5.5, whose cataloged footprint is us-east-1/us-east-2 only).
The previous commit message called this PR "no behavior change"; that was
wrong for these cells. The catalog facts are kept (they are what the public
cards state); the engine ordering is NOT changed in this PR. Instead:
- skills/agent-advisor/scripts/test_openai_model_recommendation.py: new
  regression tests pin all five cells so the shift is deliberate and visible
  (test_gpt6_chat_outside_own_footprint_falls_back_to_in_region_gpt5_chat x4,
  test_gpt56_sol_responses_outside_us_east_skips_gpt55_for_in_region_terra).
- skills/agent-advisor/references/phases/model-recommend/model-recommend.md:
  the engine-limitation paragraph now states that Chat fallbacks walk catalog
  order, that GPT-5.5/5.4 precede GPT-6 Astra, and that a GPT-6 Chat source
  outside us-east-1 lands on GPT-5.5 (us-east-2) / GPT-5.4 (us-west-2); a
  newer-generation source falling back to an older-generation model is an
  engine ordering limitation to resolve in the follow-up selection PR (PR 2).

Finding 2: skills/agent-advisor/scripts/openai_model_recommendation.py:118-119
still said "the (Mantle-only) GPT-5.x family". Reworded to the engine fact
(GPT-5.x sources not recognized as same-model runtime identities map to Claude
tiers; GPT-5.5/5.4 do carry a cataloged runtime_converse path via us./global.
CRIS ids). Grep over plugins/ for mantle-only / "no CRIS" / "no inference
profile" / unconfirmed / "internal reference" near GPT-5.4/5.5/5.x is now
clean apart from negative test assertions, the GovCloud Opus 5.5 pricing row,
and the bare-id rule ("bare proprietary openai.gpt-* IDs use Mantle only").

Carry-forward for PR 2 (endpoint selection): reorder / tier the
mantle_openai_chat candidate walk so a GPT-6 source does not fall back to
GPT-5.4/5.5 ahead of GPT-6 Astra; add GPT-5.5/5.4 to _SOURCE_MODEL_KEYS so
they are recognized as same-model runtime identities.

No new behavior added; no dispatch or endpoint-selection code changed.
No vendored files affected (none of the three files is in the sync manifest);
lint:vendored-parity re-run and still 62/62 byte-identical.

Sources (public model cards, read 2026-11-06 via the AWS Documentation MCP tools):
- https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-openai-gpt-54.html
- https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-openai-gpt-55.html

Validation (run from the worktree with mise Python 3.12):
- mise -C plugins/aws-startup-advisor run ci: PASS
  - lint:md 0 errors; lint:model-id OK (19 retired IDs enforced);
    lint:model-staleness fresh (4d old, 45d window);
    lint:model-catalog-drift OK (3 pre-existing warnings, unrelated);
    lint:startup-model-pricing OK; lint:artifacts PASS (99 checked, 0 errors);
    lint:vendored-parity PASS (62 files byte-identical);
    lint:skill-refs PASS (1482 checked, 0 missing);
    lint:consent-disclosure OK (6 checked);
    test: 1395 passed, 222 subtests passed;
    test:telemetry 311 passed; test:heroku-source-review 44 pass, 0 fail
- agent-advisor pytest (skills/agent-advisor/scripts): 569 passed, 0 failed
  (564 at c1944a5 + 5 new)
- llm-to-bedrock pytest (skills/llm-to-bedrock/scripts): 418 passed, 0 failed
- root: python3 tools/validate.py "All validations passed";
  mise run lint:md 0 issues / 2763 files; lint:manifests, lint:spec,
  lint:skill-parity pass; test:tools OK. mise run build's security step
  still fails only on the pre-existing gitleaks finding in upstream commit
  f8d09fd (tests/test_bedrock_migration_assessment_discover.py:118);
  gitleaks protect --staged over this change set: no leaks found.

Base: 0a218f8 (upstream/main)
@herosjourney
herosjourney requested review from a team as code owners November 7, 2026 07:41
Logan Kleier added 3 commits November 7, 2026 08:52
…re constraints per model for GPT-5.4/5.5

The GPT-5.4 and GPT-5.5 model cards publish only us. and global. CRIS ids;
the in. profile exists for GPT-5.6 only. The runtime_converse path strength
and both schema-design vocabulary/checklist lines attached us./in./global.
to all three models, contradicting the catalog's own next constraint and
openai-on-bedrock.md. Rewritten so in. stays on GPT-5.6 / GPT-6.

The GPT-5.6 runtime constraint ("does not support server-side tool use,
structured outputs, or application inference profiles") is now scoped to
GPT-5.6, and a separate GPT-5.4/5.5 constraint records what their cards
mark: server-side tools unsupported; structured outputs and implicit prompt
caching Responses-only; Guardrails and application inference profiles
Converse-only.

Vendored copies re-synced (62 checked, 3 synced). Regression test added.
… the rewriter and Design/Generate checklists

bc51f0c scoped the in. prefix to GPT-5.6 in the catalog and schema, but
three consumers of that rule still said us./in./global. for GPT-5.4/5.5:
agents/llm2bedrock-code-rewriter.md, gcp-to-aws design-ai.md's checklist,
and azure-to-aws generate-artifacts-ai.md's checklist. Their model cards
publish only us. and global. ids. Each now reads: us./in./global. for
GPT-5.6; us./global. only for GPT-6, GPT-5.5 and GPT-5.4.

Adds tests/test_gpt54_55_cris_prefix_scope.py, which reads the catalog, the
shared/Azure schemas, the guardrails guide, and the three consumer files and
fails on any window that pairs GPT-5.4/5.5 with a grouped us./in./global.
grant without scoping in. to GPT-5.6. Verified to fail against the previous
wording of all three files.
…and Luna only, not Sol

The GPT-5.6 Sol card (read 2026-11-07) publishes us.openai.gpt-5.6-sol and
global.openai.gpt-5.6-sol only; Terra and Luna publish us./in./us-gov./global.
Prior wording granted in. to "GPT-5.6" family-wide in the catalog strength,
the rewriter, the GCP Design and Azure Generate checklists, both schema
copies, and ai-migration-guardrails.md ("GPT-5.6 Sol/Terra/Luna
(us./in./global.)"). Each now reads: us./in./global. for GPT-5.6 Terra and
Luna; us./global. only for GPT-5.6 Sol, GPT-6, GPT-5.5 and GPT-5.4.

tests/test_gpt54_55_cris_prefix_scope.py now also scans the catalog strength
text and rejects any grouped in. grant to GPT-5.6 that does not name
Terra/Luna and place Sol in the us./global.-only set. Verified to fail
against the dfd07bd wording of every file above.

@leon1418 leon1418 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[🤖 AI review 🤖]

Reviewed all 47 changed files at 6b873f8c9c1752f891c5a3195ce15bacf0cea839, including the Markdown workflows and unchanged consumers. Three corrections are needed before this metadata change can safely enable the documented runtime paths:

  1. Add the required default-project IAM grant for GPT-5.4/5.5 runtime IDs and profile ARNs, in the policy helper and both GCP/Azure setup recipes.
  2. Persist Converse as the selected client API when GPT-5.4/5.5 application inference profiles are required. Carry that choice through the current GCP/Azure design contracts; surface incompatible API requirements as a decision.
  3. Keep unpublished GPT-5.4/5.5 Geo/Global prices unverified. A planning proxy can be labeled as an assumption, but cannot establish a verified premium or savings percentage.

The inline comments identify the failure paths and acceptance checks. The disclosed source-recognition and fallback-order limitations are outside this correction list.

Validation: agent-advisor 570 passed; llm-to-bedrock 418 passed; plugin tests 1,398 passed plus 222 subtests. Vendored parity (62 files), artifact validation (99 fixtures), model-ID, pricing coverage, freshness, skill references, consent disclosure, root manifest validation and git diff --check passed. Independent source probes covered policy resources, model/profile selection, generated client API dispatch and stale-verification invalidation. GitHub checks were green at review time. No live AWS inference or deployment was performed.

…-project IAM grant, Converse for application profiles, In-Region-only pricing

Three inline findings by leon1418 on 6b873f8, each verified against the public
GPT-5.4 / GPT-5.5 model cards (read 2026-11-07):
https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-openai-gpt-54.html
https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-openai-gpt-55.html

1. IAM default-project grant (iam_policy.py:29). The cards require
   bedrock:InvokeModel on arn:aws:bedrock:{region}:{account-id}:project/default in
   addition to the inference profile. iam_policy.py gated that grant on
   is_gpt6_cris_model(). Added is_gpt54_55_cris_model() (exact us./global.
   openai.gpt-5.4 / -5.5 short ids and their inference-profile ARNs; bare mantle
   ids, GPT-5.6 CRIS ids and unrelated models do not match) and
   requires_default_project_grant(); generate_policy() now emits the third ARN
   for those ids. Updated the GPT-6-only sentence in gcp generate-ai.md,
   gcp/azure generate-artifacts-ai.md Step 3, and the report generator §6.4.

2. Application inference profiles are Converse-only (gcp design-ai.md:425).
   GCP and Azure Design now require required_client_api: "converse" when
   application inference profiles are the driving need on GPT-5.5 / GPT-5.4
   (and any model whose card lists them Converse-only), forbid leaving the field
   absent, keep the responses default for a region-only move, and record a
   conflicting Responses-only need (structured outputs, implicit caching) as an
   explicit decision instead of a silent drop. Added checklist items to the GCP
   Validation Checklist and the Azure shared schema (required_client_api section
   and checklist).

3. Unpublished Geo/Global prices (ai-openai-to-bedrock.md:46). The cards publish
   commercial In-Region prices only. Scoped the verified ~10% premium to the
   In-Region option in the canonical guide (Tier 0 rows included), both
   openai-on-bedrock.md fact bases, the report generator and the pricing-cache
   rows; a CRIS plan needs a separately sourced Geo/Global price or reports the
   comparison unavailable, and an In-Region proxy is an unverified planning
   assumption with no verified premium or savings percentage.
   bedrock_pricing.lookup() already returns available:false for the CRIS ids;
   pinned with a test (short ids and profile ARNs, no PriceList call).

Tests: test_iam_policy.py TestGpt54Gpt55CrisProjectArn (short ids, profile
ARNs, bare/GPT-5.6/Anthropic controls, mixed run); test_bedrock_pricing.py
test_gpt54_55_cris_ids_are_unpriced_not_inferred_from_in_region; new
tests/test_gpt54_55_runtime_review_round3.py text contracts for all three
findings. tools/sync-vendored.py re-run (5 copies synced).

Validation (this commit, in the worktree):
- mise -C plugins/aws-startup-advisor run ci: exit 0 (test 1407 passed +
  222 subtests; test:telemetry 311 passed; heroku-source-review 44/44;
  lint:md 0 errors; vendored-parity PASS 62 files; skill-refs PASS 1482)
- llm-to-bedrock: uv run --project scripts python -m pytest: 453 passed
  (bare mise python3 shows 10 ModuleNotFoundError: httpx in
  test_astra_execution_contract.py — environment, not the change)
- agent-advisor: python3 -m pytest skills/agent-advisor: 570 passed
- tests/test_gpt54_55_cris_prefix_scope.py: still green
- python3 tools/validate.py: All validations passed (exit 0)
- tools/sync-vendored.py --check: PASS
- mise run security (gitleaks): 1 pre-existing upstream false positive at
  f8d09fd (tests/test_bedrock_migration_assessment_discover.py,
  generic-api-key), unrelated to this PR; nothing new flagged.

@leon1418 leon1418 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[🤖 AI review 🤖]

Verified the three requested corrections at 8c37ef0f1e9a83d123d6662637fc6fadb6f068f8: GPT-5.4/5.5 runtime IAM now includes the default-project grant, application-profile requirements select Converse, and unpublished CRIS prices remain unverified. Evidence replies are in the original conversations, which are now resolved.

The follow-up covered all 49 changed files and relevant unchanged consumers. Local validation passed: 570 agent-advisor tests, 453 llm-to-bedrock tests, and 1,407 plugin tests plus 222 subtests. Focused policy/API/pricing probes, vendored parity, artifact validation, model-ID, pricing-coverage, reference and diff checks also passed. No live AWS inference or deployment was performed.

No remaining substantiated findings from this review. Approval is recommended for the user to submit; this is a COMMENT, not an approval or dismissal of the earlier review.

herosjourney pushed a commit to herosjourney/agent-toolkit-for-aws that referenced this pull request Nov 8, 2026
…policy and make Runtime the primary same-model OpenAI path in design guidance

Base: 6b873f8 (PR 1 aws#583 tip). Public basis: Amazon Bedrock User Guide
endpoints.html, models-endpoint-availability.html, inference-responses-api.html,
inference-chat-completions.html, inference-messages-api.html,
tool-use-server-side.html, web-search.html, projects.html, workspaces.html,
cost-mgmt-application-inference-profiles.html, model-invocation-logging.html,
monitoring-mantle-metrics.html, quotas-runtime.html, quotas-mantle.html,
scaling-throughput-best-practices.html (all read 2026-11-07).

- New canonical skills/shared/ai/bedrock-endpoint-policy.md (rule, mantle_selector
  enum, public matrix, lifecycle and quota wording), vendored into gcp-to-aws and
  azure-to-aws (README rows + sync).
- ai-openai-to-bedrock.md / ai-openrouter-to-bedrock.md: runtime_openai_cris with
  the source app's required_client_api is the Tier 0 default; mantle_* only with a
  mantle_selector; Runtime steps shown first; "smallest change" phrasing removed.
- Three schema-design-aws-ai.md copies: runtime_messages, messages,
  same_model_runtime, mantle_selector vocabulary; Runtime default stated.
- gcp/azure design-ai.md, azure design.md/generate.md _assert, gcp/azure
  generate-artifacts-ai.md, gcp generate-ai.md, gcp estimate.md, azure
  estimate-assemble.md, both openai-on-bedrock.md Client setup: Runtime first and
  labelled default, Mantle selector-gated, same_model_runtime route added.
- Fixtures: mantle_selector on the two mantle_openai_responses rows.
- Tests: new tests/test_endpoint_policy_contract.py; extended
  test_generate_mantle_dispatch.py, test_ai_only_option_c_framework_route.py,
  test_gpt6_review_round2.py, test_gpt6_round4_findings.py.

Verification (from plugins/aws-startup-advisor):
- python3 tools/sync-vendored.py --check -> PASS, 64 files
- uv run --no-project --with pytest python -m pytest tests -q -> 1406 passed
  (base 6b873f8: 1398)
- uv run --project skills/llm-to-bedrock/scripts --with pytest python -m pytest
  skills/llm-to-bedrock/scripts -q -> 418 passed (unchanged)
- uv run --project skills/agent-advisor/scripts --with pytest python -m pytest
  skills/agent-advisor/scripts -q -> 570 passed (unchanged)
- mise run lint:md (0 errors / 823 files), lint:skill-refs (1508 refs, 0
  missing), lint:artifacts (99/0), lint:vendored-parity (64), lint:model-id -> PASS
- grep -rn -i -E 'primary path|smallest (possible )?change|remains the default|
  Mantle is the PRIMARY' skills | grep -v vendored -> every Mantle-related hit
  gone; remaining hits are pre-existing, unrelated to Bedrock endpoints
  (design-ref-harness.md:29, heroku-to-aws, gcp elastic-beanstalk.md,
  prompt-library bedrock-quota-manager.md, agent-advisor test_unit_grouping.py).
  agents/llm2bedrock-code-rewriter.md:260 is left for the execution-lane change.
leon1418
leon1418 previously approved these changes Nov 8, 2026
GPT-5.4 and GPT-5.5 publish an In-Region price only, so a Geo or Global plan stays unpublished.

Co-authored-by: Cursor <cursoragent@cursor.com>
herosjourney pushed a commit to herosjourney/agent-toolkit-for-aws that referenced this pull request Nov 9, 2026
…policy and make Runtime the primary same-model OpenAI path in design guidance

Base: 6b873f8 (PR 1 aws#583 tip). Public basis: Amazon Bedrock User Guide
endpoints.html, models-endpoint-availability.html, inference-responses-api.html,
inference-chat-completions.html, inference-messages-api.html,
tool-use-server-side.html, web-search.html, projects.html, workspaces.html,
cost-mgmt-application-inference-profiles.html, model-invocation-logging.html,
monitoring-mantle-metrics.html, quotas-runtime.html, quotas-mantle.html,
scaling-throughput-best-practices.html (all read 2026-11-07).

- New canonical skills/shared/ai/bedrock-endpoint-policy.md (rule, mantle_selector
  enum, public matrix, lifecycle and quota wording), vendored into gcp-to-aws and
  azure-to-aws (README rows + sync).
- ai-openai-to-bedrock.md / ai-openrouter-to-bedrock.md: runtime_openai_cris with
  the source app's required_client_api is the Tier 0 default; mantle_* only with a
  mantle_selector; Runtime steps shown first; "smallest change" phrasing removed.
- Three schema-design-aws-ai.md copies: runtime_messages, messages,
  same_model_runtime, mantle_selector vocabulary; Runtime default stated.
- gcp/azure design-ai.md, azure design.md/generate.md _assert, gcp/azure
  generate-artifacts-ai.md, gcp generate-ai.md, gcp estimate.md, azure
  estimate-assemble.md, both openai-on-bedrock.md Client setup: Runtime first and
  labelled default, Mantle selector-gated, same_model_runtime route added.
- Fixtures: mantle_selector on the two mantle_openai_responses rows.
- Tests: new tests/test_endpoint_policy_contract.py; extended
  test_generate_mantle_dispatch.py, test_ai_only_option_c_framework_route.py,
  test_gpt6_review_round2.py, test_gpt6_round4_findings.py.

Verification (from plugins/aws-startup-advisor):
- python3 tools/sync-vendored.py --check -> PASS, 64 files
- uv run --no-project --with pytest python -m pytest tests -q -> 1406 passed
  (base 6b873f8: 1398)
- uv run --project skills/llm-to-bedrock/scripts --with pytest python -m pytest
  skills/llm-to-bedrock/scripts -q -> 418 passed (unchanged)
- uv run --project skills/agent-advisor/scripts --with pytest python -m pytest
  skills/agent-advisor/scripts -q -> 570 passed (unchanged)
- mise run lint:md (0 errors / 823 files), lint:skill-refs (1508 refs, 0
  missing), lint:artifacts (99/0), lint:vendored-parity (64), lint:model-id -> PASS
- grep -rn -i -E 'primary path|smallest (possible )?change|remains the default|
  Mantle is the PRIMARY' skills | grep -v vendored -> every Mantle-related hit
  gone; remaining hits are pre-existing, unrelated to Bedrock endpoints
  (design-ref-harness.md:29, heroku-to-aws, gcp elastic-beanstalk.md,
  prompt-library bedrock-quota-manager.md, agent-advisor test_unit_grouping.py).
  agents/llm2bedrock-code-rewriter.md:260 is left for the execution-lane change.
Conflict resolution (plugins/aws-startup-advisor/skills/shared/ai/models/openai-bedrock.json,
top-level metadata only; every model entry auto-merged):

- source: union. Keeps main's Haiku 5.5 model-card evidence (read 2026-11-09) and
  the Opus 5.5 line, plus this branch's GPT-5.5/GPT-5.4 model-card re-read
  (2026-11-06, runtime CRIS ids, Chat Completions on mantle). Trailing sentence
  merged to "Other OpenAI and unchanged entries retain their evidence ...".
- disclaimer: union. Main's Haiku 5.5 fast/low-cost Converse tier sentence first,
  then this branch's GPT-5.5/GPT-5.4 re-read note (runtime CRIS paths, Chat
  Completions on mantle, 1.05M context, long-context pricing), then the shared
  Opus 5.5 / Fable / Mythos / eu-west-2 text that both sides carried unchanged.
- verified_at: main's 2026-11-09 (newer than the branch's 2026-09-24).
- openai_gpt_5_5 / openai_gpt_5_4 entries: branch values (refreshed runtime
  metadata, pricing, inference_profiles, region_availability, capabilities);
  main did not touch these entries.
- anthropic_claude_haiku_5_5, Haiku 4.5 display_name/capability_source, and the
  pretty-printed GPT-6 Sol/Luna/6.1 Sol arrays: main values; the branch did
  not touch these.
- Vendored copy regenerated with tools/sync-vendored.py (--check passes), not
  hand-edited.

Verification on this merge:
- cd plugins/aws-startup-advisor && mise run ci: all tasks finished
  (lint:md 0 errors, lint:model-id, lint:model-staleness, lint:model-catalog-drift,
  lint:startup-model-pricing, lint:artifacts PASS 104 artifacts, lint:vendored-parity
  PASS 62 files, lint:skill-refs PASS 1498 refs, pytest 1489 passed + 225 subtests,
  telemetry 311 passed).
- skills/agent-advisor/scripts pytest: 597 passed.
- skills/llm-to-bedrock/scripts pytest: 453 passed (run via uv with httpx/openai/
  aws-bedrock-token-generator/jsonschema/boto3 available).
Port GPT-5.4/5.5 catalog edits into bedrock-model-registry.json and re-render
openai-bedrock.json via tools/build-model-catalogs.py, re-sync vendored copies.
Add optional pricing object to registry/catalog schemas and renderer.
Verified: mise run ci (plugins/aws-startup-advisor) passed, 1731 tests.
herosjourney pushed a commit to herosjourney/agent-toolkit-for-aws that referenced this pull request Nov 12, 2026
…un ci green (1857 passed); build-model-catalogs/sync-vendored --check pass
@herosjourney
herosjourney dismissed leon1418’s stale review November 12, 2026 04:55

Stale: made against an older head. Findings were addressed and all threads resolved; the branch was merged with current main and re-pushed. Re-review requested.

@herosjourney

Copy link
Copy Markdown
Contributor Author

All review threads are replied to and resolved. The branch is now merged up to current main (head e17c00ac). The conflict was in the generated OpenAI model catalog: this PR's GPT-5.4/5.5 corrections were ported into bedrock-model-registry.json and the catalogs re-rendered from it. Full CI passed. Requesting a fresh review of e17c00ac. The older CHANGES_REQUESTED review was against an earlier head and is dismissed as stale. Merge still needs one code-owner approval from someone who did not push.

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.

2 participants