From 85fc6838aa9842044a75c77d6c46e279e2945860 Mon Sep 17 00:00:00 2001 From: aimock-drift-bot Date: Fri, 24 Jul 2026 07:04:25 +0000 Subject: [PATCH 1/4] fix(drift-sync): mechanical model-family sync (needs-human note file(s)) --- .../gemini-gemini-1.5-flash-deprecated-referenced.md | 7 +++++++ .../gemini-gemini-1.5-pro-deprecated-referenced.md | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 drift-proposals/gemini-gemini-1.5-flash-deprecated-referenced.md create mode 100644 drift-proposals/gemini-gemini-1.5-pro-deprecated-referenced.md diff --git a/drift-proposals/gemini-gemini-1.5-flash-deprecated-referenced.md b/drift-proposals/gemini-gemini-1.5-flash-deprecated-referenced.md new file mode 100644 index 00000000..257880e7 --- /dev/null +++ b/drift-proposals/gemini-gemini-1.5-flash-deprecated-referenced.md @@ -0,0 +1,7 @@ +# Deprecated-but-still-referenced model family: gemini-1.5-flash + +Provider: gemini +Detected: 2026-07-24 +Status: NEEDS HUMAN REVIEW + +This family no longer appears in the live /models listing, but aimock's own source still references it (builders, DEFAULT_MODELS, or fixtures). drift-sync never silently removes a still-referenced family. diff --git a/drift-proposals/gemini-gemini-1.5-pro-deprecated-referenced.md b/drift-proposals/gemini-gemini-1.5-pro-deprecated-referenced.md new file mode 100644 index 00000000..234fb984 --- /dev/null +++ b/drift-proposals/gemini-gemini-1.5-pro-deprecated-referenced.md @@ -0,0 +1,7 @@ +# Deprecated-but-still-referenced model family: gemini-1.5-pro + +Provider: gemini +Detected: 2026-07-24 +Status: NEEDS HUMAN REVIEW + +This family no longer appears in the live /models listing, but aimock's own source still references it (builders, DEFAULT_MODELS, or fixtures). drift-sync never silently removes a still-referenced family. From 1f3fa0163be94eae33b9b72c9bab9d3e8d7e26a7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 24 Jul 2026 13:14:53 +0000 Subject: [PATCH 2/4] chore(deps): update github actions --- .github/workflows/publish-docker.yml | 2 +- .github/workflows/zizmor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml index 8547c9a6..a32f1ea9 100644 --- a/.github/workflows/publish-docker.yml +++ b/.github/workflows/publish-docker.yml @@ -37,7 +37,7 @@ jobs: - name: Log in to GHCR if: github.event_name != 'pull_request' - uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0 + uses: docker/login-action@abd2ef45e78c5afb21d64d4ca52ee8550d9572c7 # v4.5.1 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml index 7afc09a3..db43f7bd 100644 --- a/.github/workflows/zizmor.yml +++ b/.github/workflows/zizmor.yml @@ -27,7 +27,7 @@ jobs: steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: { persist-credentials: false } - - uses: zizmorcore/zizmor-action@6599ee8b7a49aef6a770f63d261d214911a7ce02 # v0.6.0 + - uses: zizmorcore/zizmor-action@6fc4b006235f201fdab3722e17240ab420d580e5 # v0.6.1 with: min-severity: medium config: .github/zizmor.yml From a3dc2500c123b757e06bb225f8ebd781668e8c83 Mon Sep 17 00:00:00 2001 From: Jordan Ritter Date: Fri, 24 Jul 2026 15:28:45 -0700 Subject: [PATCH 3/4] fix(drift): classify gemini-1.5-pro/flash in excludeFamilies (retired upstream, still mocked) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both families are gone from Gemini's live /models listing but are still legitimately referenced in aimock source, so the deprecation canary kept routing them to needs-human every run (see the two notes under drift-proposals/). The human decision is: keep mocking them. Move them out of includeFamilies.gemini into excludeFamilies.gemini's "Retired / legacy specialty" bucket, the established pattern for a retired-but-still-mocked family (gemini-pro, gpt-3.5, gemini-2.0-flash-exp; prior art in #315). excludeFamilies means "not counted as text-generation drift", not "not mocked" — every fixture, capability test and the isReasoningModel() === false verdict for gemini-1.5-* is untouched. Re-pin the two affected DATA_FROZEN membership hashes accordingly. Side effect: gemini's truncated-listing trust floor drops from 11 to 9 (floor = includeFamilies[provider].size). --- src/__tests__/drift/logic-pin.test.ts | 4 ++-- src/__tests__/drift/model-registry.ts | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/__tests__/drift/logic-pin.test.ts b/src/__tests__/drift/logic-pin.test.ts index 8e31bab9..74c41884 100644 --- a/src/__tests__/drift/logic-pin.test.ts +++ b/src/__tests__/drift/logic-pin.test.ts @@ -204,7 +204,7 @@ const DATA_FROZEN: Record = { }, "includeFamilies.gemini": { members: [...includeFamilies.gemini].sort(), - pin: "4a9428b64ffcff0fbb79878d88ed993ffac53e43d64e26bcf5d86509626f593d", + pin: "c2e2c56b8f8d5fc56152b4633e7d3782e95b7eeb9bc123da71f00e884a54a743", }, "excludeFamilies.openai": { members: [...excludeFamilies.openai].sort(), @@ -216,7 +216,7 @@ const DATA_FROZEN: Record = { }, "excludeFamilies.gemini": { members: [...excludeFamilies.gemini].sort(), - pin: "e3545138234ad782937f66760bef942fca7d4bd0934a87da30bf6e5816ba69b1", + pin: "c95dedab7588212bbba0bf9ab6434bfd43a449adbe7b35f81f48271ee849a9c2", }, }; diff --git a/src/__tests__/drift/model-registry.ts b/src/__tests__/drift/model-registry.ts index 5857a50c..b851336a 100644 --- a/src/__tests__/drift/model-registry.ts +++ b/src/__tests__/drift/model-registry.ts @@ -135,9 +135,7 @@ export const includeFamilies: Record> = { "claude-fable-5", ]), gemini: familySet("gemini", [ - // Gemini 1.5 / 2.0 / 2.5 text families - "gemini-1.5-pro", - "gemini-1.5-flash", + // Gemini 2.0 / 2.5 text families "gemini-2.0-flash", "gemini-2.5-flash", "gemini-2.5-pro", @@ -226,6 +224,14 @@ export const excludeFamilies: Record> = { // Retired / legacy specialty "gemini-pro", "aqa", + // Gemini 1.5 retired upstream 2026-07 (absent from the live /models listing) + // but aimock still mocks it for clients pinned to older SDKs, and + // `isReasoningModel()` must keep answering false for it (model-utils.ts's + // NONREASONING_FAMILIES). Same treatment as gemini-pro above: still + // referenced + still mocked, just not counted as text-generation drift. + // See drift-proposals/gemini-gemini-1.5-{pro,flash}-deprecated-referenced.md. + "gemini-1.5-pro", + "gemini-1.5-flash", // Embeddings (non-text-generation) "text-embedding-004", "gemini-embedding", From 72f85f8d125a96836ad3a47e485b52b9cc30915f Mon Sep 17 00:00:00 2001 From: Jordan Ritter Date: Fri, 24 Jul 2026 15:54:16 -0700 Subject: [PATCH 4/4] chore(drift): classify claude-opus-5 in includeFamilies (live GA text chat) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The live /models family canary is red on main: Anthropic shipped `claude-opus-5` (Claude Opus 5, created_at 2026-07-24) and the registry has no classification for it, so `unclassifiedFamilies` flags it as a new-family decision and keeps routing it to a human every run. Classify it as INCLUDE — it is a GA text-chat/reasoning family on the live listing, exactly like its already-included siblings `claude-sonnet-5` and `claude-opus-4-8`. All 11 ids the live Anthropic listing returns are text-chat Claude families and every other one is already in includeFamilies.anthropic; opus-5 was simply missed because it landed after the last classification wave (34056c2). No reasoning-map change. `isReasoningModel("claude-opus-5")` already returns true via the documented fail-open default (no NONREASONING_FAMILIES prefix matches), which is the correct verdict for an extended-thinking Opus-class model. That matches the precedent set for claude-sonnet-5 and claude-fable-5, which also rely on the default rather than a REASONING_FAMILIES entry, so src/model-utils.ts is untouched. No mock/fixture work needed: aimock's Anthropic surface is fixture-driven and model-agnostic, so claude-opus-5 already behaves identically to the included claude-sonnet-5. Re-pin includeFamilies.anthropic membership — the DATA_FROZEN canary correctly trips on the deliberate addition. New pin derived independently from the test's own sha256(JSON.stringify(sorted)) and cross-checked against vitest's reported value. Registry data is test/script-only (no shipped importer, absent from the npm tarball, dist/ semantically identical pre/post), so this carries zero behavior delta and no version bump. --- src/__tests__/drift/logic-pin.test.ts | 2 +- src/__tests__/drift/model-registry.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/__tests__/drift/logic-pin.test.ts b/src/__tests__/drift/logic-pin.test.ts index 74c41884..bbff756e 100644 --- a/src/__tests__/drift/logic-pin.test.ts +++ b/src/__tests__/drift/logic-pin.test.ts @@ -200,7 +200,7 @@ const DATA_FROZEN: Record = { }, "includeFamilies.anthropic": { members: [...includeFamilies.anthropic].sort(), - pin: "dbd8b4ef9afd50057143480d89db373886e7c19abe36ef9b4421456305ca2509", + pin: "ab79ff332fadeff93c2678ebe3e0af7a6280ce6f0deb4694228e316944dfeb74", }, "includeFamilies.gemini": { members: [...includeFamilies.gemini].sort(), diff --git a/src/__tests__/drift/model-registry.ts b/src/__tests__/drift/model-registry.ts index b851336a..56e20593 100644 --- a/src/__tests__/drift/model-registry.ts +++ b/src/__tests__/drift/model-registry.ts @@ -129,6 +129,7 @@ export const includeFamilies: Record> = { "claude-sonnet-4-5", "claude-sonnet-4-6", // Claude 5 families (text chat) + "claude-opus-5", "claude-sonnet-5", // claude-fable-5 is included ahead of a recorded fixture (intended — mirrors // the forward-looking rationale for the exclude-by-rule patterns above).