Skip to content

feat(usai-catalog): refresh models and withhold undeployed gateway entries - #519

Merged
mogul merged 3 commits into
mainfrom
fix/usai-models-refresh
Oct 21, 2026
Merged

mogul merged 3 commits into
mainfrom
fix/usai-models-refresh

Conversation

@wz-gsa

@wz-gsa wz-gsa commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

Summary

USAi released new models. This regenerates the harness-neutral catalog and both downstream kit artifacts from the live gateway and models.dev feeds, and withholds three models the gateway advertises but cannot serve.

Nothing here was hand-edited. Every artifact is generated output.

Model delta

The gateway now lists 26 models against the committed catalog's 20.

Added and shipped

  • claude-sonnet-5.5
  • gpt-6-astra

Retired upstream

  • gemini-2.5-pro — no longer in /v1/models

Already filtered by the existing non-chat pattern

  • cohere_english_v3, text-embedding-005 — embedding models

Final shipped catalog: 21 chat models.

Three advertised GPT-6 models are withheld

The gateway lists these in /v1/models, but a /chat/completions call to each returns HTTP 404:

{"detail":"404: The API deployment for this resource does not exist. …"}
Model HTTP
gpt-6-luna 404
gpt-6-sol-latest-guardrails-defaultv2 404
gpt-6.1-sol-latest-guardrails-defaultv2 404

Each was confirmed with a real completion request and re-probed to rule out a transient. Against a control group on the same route, the failure is specific rather than environmental:

Control HTTP
gpt-5.6-luna 200
gpt-5.6-sol-latest-guardrails-defaultv2 200
gpt-5.6-terra 200
claude-sonnet-5 200
gemini-2.5-flash 200
claude-sonnet-5.5 (new) 200
gpt-6-astra (new) 200

Shipping them would put a model in the picker that fails the moment a user selects it. They are suppressed through the existing non-chat exclusion map in both the catalog builder and the kit generator, each carrying the measured reason, so the mechanism is not new and the rationale travels with the code. Remove the entries once the deployments land.

This is a gateway-side inconsistency, not a defect in this repo. Reporting it to the USAi team separately so the model list and the deployments can be reconciled at the source.

Snapshot subset correction

model-catalog-snapshot.json is a hand-trimmed subset with one model per vendor, guarded by a byte-equality test against the normalizer. It kept gemini-2.5-pro, which no longer exists upstream, so that test failed.

It moves to gemini-2.5-flash, the surviving model on that line, preserving the subset's vendor coverage. The subset is deliberately small; this is the minimum change that keeps the gate meaningful rather than dropping a vendor.

prime-agent lockstep

prime-agent/files/home/prime-agent-config/models.json is generated from the same catalog.json by the prime-agent emitter. Its byte-exact lockstep test correctly caught the committed file as stale once the catalog moved, so it is regenerated from the emitter rather than edited.

That test earning its keep here is worth noting: without it, the prime-agent kit would have silently shipped a stale model list.

One behavioral note

gpt-6-astra rejects max_tokens below 16:

{"detail":"integer below minimum value. Expected a value >= 16, but got 8 instead."}

Other models accept 8. A reasoning-model floor. Harmless with the shipped config, which sets no such cap, but it will surface for anyone who sets a very small limit. Not worked around here, since the right fix belongs to whatever sets the cap.

Verification

  • build-catalog.mjs --check — up to date, 21 models
  • usai-provider tests — 76/76
  • providers/usai tests — 100/100, including both byte-exact emitter guards
  • validate-kits.py --strict — 10 kits plus 2 templates valid
  • generate_index.py --check — INDEX current
  • git diff --check — clean

Beyond the suites, the shipped JSONC was parsed through the real startup merge path (parseJsonc from merge-global-config.mjs), confirming:

  • 21 models parse
  • both working new models present
  • all three withheld models, gemini-2.5-pro, and both embedding models absent
  • model and small_model defaults still resolve to models that exist

Default selections are unchanged: usai/claude-sonnet-5 and usai/claude_4_5_haiku.

make validate fails 4 validators (frontmatter schema, cross-reference, network-tier baseline, balanced-allowlist guard). I verified by stashing that all four fail identically on unmodified origin/main — pre-existing and unrelated to this change. Not introduced here, and not fixed here.

Downstream

Kits are consumed at a pinned ref, so this does not reach users until a patterns release is cut and GSA-TTS/agentic-coding-quickstart bumps PATTERNS_KIT_REF. That pin currently sits two releases behind, which is a separate problem already being addressed.

Type of Change

  • New feature (non-breaking change that adds functionality)

Safety Checklist

  • No secrets, API keys, or tokens. The catalog's apiKeyEnv holds the env-var name, never a value; a test asserts no key material appears in any emitted artifact.
  • No PII, CUI, customer data, or internal URLs
  • Validation run before submitting
  • Generated artifacts regenerated, not hand-edited

AI Assistance Disclosure

  • AI tools were used in this contribution (OpenCode).
  • I verified all AI-generated content, including every model probe above.

…tries

USAi released new models. Regenerates the harness-neutral catalog and both
downstream kit artifacts from the live gateway and models.dev feeds.

Added: claude-sonnet-5.5 and gpt-6-astra. Retired upstream: gemini-2.5-pro.
Two embedding models the gateway now lists, cohere_english_v3 and
text-embedding-005, were already excluded by the non-chat filter.

Three advertised GPT-6 chat models are withheld. The gateway lists gpt-6-luna,
gpt-6-sol-latest-guardrails-defaultv2 and gpt-6.1-sol-latest-guardrails-defaultv2
in /v1/models, but a /chat/completions call to each returns HTTP 404, "The API
deployment for this resource does not exist". Every one was confirmed with a
real completion request and re-probed to rule out a transient, against a
control group of sibling models on the same route, including gpt-5.6-luna and
gpt-5.6-sol, that answered 200. Shipping them would place a model in the
picker that fails the moment a user selects it, so they are suppressed through
the existing non-chat exclusion map in both the catalog builder and the kit
generator, each carrying the measured reason. Remove the entries once the
deployments land.

The shipped snapshot subset kept gemini-2.5-pro, which no longer exists
upstream. It moves to gemini-2.5-flash, the surviving model on that line, so
the subset's one-per-vendor coverage stays intact.

The prime-agent kit's committed models.json is regenerated from the same
catalog; its byte-exact lockstep test caught it as stale.

Verified: 21 chat models; usai-provider tests 76/76; providers/usai tests
100/100 including both byte-exact emitter guards; build-catalog --check clean;
validate-kits --strict 10 kits plus 2 templates; INDEX current; the shipped
JSONC parses through the real startup merge path with both working new models
present, all withheld and retired ids absent, and both default selections
still resolving.

Co-authored-by: OpenCode [claude-opus-4] <[email protected]>
@wz-gsa
wz-gsa requested a review from a team as a code owner October 21, 2026 16:33

@basiliskus basiliskus 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.

Verdict: request changes — 85f8c6e

The acq-kits sync script now excludes the three undeployed GPT-6 models, but its required lockstep sbx-kits counterpart was not updated. The repository's drift guard fails on this exact mismatch, and an SBX user who runs model sync would still reintroduce those advertised-but-unusable models. Please mirror the exclusion change into integrations/isolation/sbx-kits/usai-provider-kit/scripts/sync-usai-models.mjs and rerun the full test suite.

Assisted-by: OpenCode [usai/gpt-5.6-sol-latest-guardrails-defaultv2] skill:change-review

…-kits sync

The acq-kits sync script gained the three undeployed GPT-6 exclusions, but its
sbx-kits counterpart did not. The two are required to be byte-identical, so the
repository's acq/sbx drift guard failed, and an SBX user running model sync
would have reintroduced the advertised-but-unusable models the acq path now
withholds.

Copies the acq-kits script over the sbx-kits one so the two are byte-identical
again rather than hand-editing the second copy, which is how they drift.

Verified: the drift guard passes 12/12; sbx-kits usai-provider-kit tests 64/64;
acq-kits 76/76; providers/usai 100/100; full python suite 483 passed;
build-catalog --check clean at 21 models; validate-kits --strict 10 kits plus
2 templates; INDEX current.

Co-authored-by: OpenCode [claude-opus-4] <[email protected]>
@wz-gsa

wz-gsa commented Oct 21, 2026

Copy link
Copy Markdown
Contributor Author

@basiliskus — valid finding, fixed in bae3dfc.

You were right that I missed the lockstep counterpart. scripts/tests/test_kit_provenance_and_drift.py::TestAcqSbxDriftGuard::test_merge_and_sync_scripts_identical requires scripts/sync-usai-models.mjs to be byte-identical between the two variants, and I only touched the acq-kits side. I reproduced the failure before fixing it:

AssertionError: scripts/sync-usai-models.mjs differs between acq-kits and sbx-kits variants (#273)
1 failed, 11 passed

Your user-impact read is also correct: an SBX user running npm run sync:usai-models from usai-provider-kit would have regenerated the config with gpt-6-luna and the two sol variants, reintroducing exactly the models the acq path now withholds. The acq-side exclusion alone was half a fix.

I copied the acq-kits script over the sbx-kits one rather than hand-editing the second copy, since hand-maintaining two copies is how they diverge in the first place. They are byte-identical again and the exclusions are present at lines 193-197 of the sbx-kits script.

Worth noting for anyone reading later: the opencode.jsonc payload did not need mirroring because the sbx-kits copy is a symlink into the acq-kits tree, so it followed automatically. Only the two .mjs files are real duplicates under that guard.

Re-verified after the fix

  • drift guard — 12/12
  • sbx-kits/usai-provider-kit tests — 64/64
  • acq-kits/usai-provider tests — 76/76
  • providers/usai tests — 100/100
  • full python suite — 483 passed
  • build-catalog.mjs --check — clean, 21 models
  • validate-kits.py --strict — 10 kits + 2 templates valid
  • generate_index.py --check — INDEX current
  • git diff --check — clean

The four make validate validator failures I noted in the description are unchanged and still reproduce on unmodified main.

Ready for another look when you have a moment.

@mogul
mogul enabled auto-merge (squash) October 21, 2026 16:58
@basiliskus
basiliskus self-requested a review October 21, 2026 16:59
@mogul

mogul commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

The big comment blocks are repetitive and I'm not sure they're necessary since what's immediately below them didn't change much, but I'm approving because I don't think that should hold up the merge.

@mogul
mogul merged commit 03421e0 into main Oct 21, 2026
7 of 14 checks passed
@mogul
mogul deleted the fix/usai-models-refresh branch October 21, 2026 16:59
mogul pushed a commit that referenced this pull request Oct 21, 2026
🤖 I have created a release *beep* *boop*
---


##
[1.15.0](v1.14.0...v1.15.0)
(2026-10-21)


### Features

* **acq-kits:** add OpenDesign browser kit
([#438](#438))
([83e202f](83e202f))
* **isolation:** define provider-neutral input contract
([#518](#518))
([28a8ebd](28a8ebd))
* **usai-catalog:** refresh models and withhold undeployed gateway
entries
([#519](#519))
([03421e0](03421e0))


### Bug Fixes

* **usai-catalog:** refuse a near-miss instead of enriching from the
wrong model
([#484](#484))
([c3a6dac](c3a6dac))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
mogul pushed a commit to GSA-TTS/agentic-coding-quickstart that referenced this pull request Oct 21, 2026
## Summary

Moves `PATTERNS_KIT_REF` from v1.12.0 (`56d1f5f`) to
agentic-coding-patterns v1.15.0 (`f3c6acb`), so the built-in kit bundle
picks up:

- **opencode kit → OpenCode 2.0.30**
(GSA-TTS/agentic-coding-patterns#499). OpenCode 2.0.0–2.0.29 ignore
config `instructions` (anomalyco/opencode#51341, fixed in 2.0.30), so a
sandbox on an image without a baked OpenCode (`devenv-shell`, or the
`devenv-shell` default proposed in #584) currently runs the bundled
2.0.22 and silently drops `instructions`-based conventions.
- **paseo kit → Paseo 0.12.0** (GSA-TTS/agentic-coding-patterns#504):
fixes for OpenCode v2 under Paseo (daemon OOM on long v2 streams,
multi-select answers, HTTP 500s instead of tool errors) and the
host-sleep daemon-status fix.
- **Kit verify scripts gain a "could not check" verdict**
(GSA-TTS/agentic-coding-patterns#460); it only affects kit verify
output.

Also v1.13.0: usai-provider's host-side catalog normalizer (#436), the
paseo identity-gate script (#453), and the team-kit and personal-kit
templates under `acq-kits/examples/`. None changes what acq applies by
default beyond the two kits above.

Also v1.15.0: refreshed usai-provider model catalog
(GSA-TTS/agentic-coding-patterns#519,
GSA-TTS/agentic-coding-patterns#484), the OpenDesign opt-in kit
(GSA-TTS/agentic-coding-patterns#438), and the provider-neutral input
contract (GSA-TTS/agentic-coding-patterns#518). acq's provider-facts
loader reads `provider-facts/usai.env`, which v1.15.0 does not change.

The doc examples and Bats assertions that spell the pin move with it.
KNOWN_FAILURE_MODES §9 now names 2.0.30 as the version the kit installs
and notes its 15-minute default `chunkTimeout` (the timeout message and
retry limits are unchanged from 2.0.22).

## Verification

On the v1.15.0 pin:

- Focused Bats: `135-configure`, `95-kit-ref-persistence`,
`36-agent-catalog`, `50-kit-list-completeness` (63/63)
- markdownlint on the changed docs

On the earlier v1.14.0 pin (not re-run for v1.15.0):

- `npm run lint:md`
- `RUN_ACQ=1 scripts/verify-backends --only msb` on macOS, msb 0.7.8: 16
passed, 1 skipped (playbook fetch, no `gh` login), run with `TMPDIR` set
to its resolved `/private/var/...` path to get past an unrelated create
failure that also hits `main` (#594)
- Downstream, with this pin on msb 0.7.8 and
`ACQ_IMAGE=devenv-shell:1.0.0`: a team kit's end-to-end verify passed
71/71 (OpenCode 2.0.30 runs and loads `instructions`); with the paseo
kit added, Paseo 0.12.0 drove an OpenCode 2.0.30 agent that received the
team `instructions`, and its sessions survived a backup, `acq rm`,
recreate and restore

## Rollback

Revert this PR to restore the v1.12.0 bundle.
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.

3 participants