Skip to content

chore(drift-sync): needs-human model-family decision (2026-08-07) - #364

Closed
copilotkit-devops-bot[bot] wants to merge 1 commit into
mainfrom
drift-needs-human/2026-08-07-31218975992-9c868d12bd208698
Closed

chore(drift-sync): needs-human model-family decision (2026-08-07)#364
copilotkit-devops-bot[bot] wants to merge 1 commit into
mainfrom
drift-needs-human/2026-08-07-31218975992-9c868d12bd208698

Conversation

@copilotkit-devops-bot

@copilotkit-devops-bot copilotkit-devops-bot Bot commented Aug 7, 2026

Copy link
Copy Markdown

Needs a human decision (drift-sync)

The deterministic, zero-LLM drift-sync found a model-family change it must
NOT auto-apply (a genuinely new/unclassified family, a deprecation —
still-referenced or zero-reference — or a registry structural mismatch). It
wrote the note file(s) below and opened this PR so the decision is REACHABLE
in the repo.

Not auto-merged — a human decides. For a new-family note: set the
note's decision line to Decision: include (to classify it) or delete the
note / close this PR (to reject), then merge this PR. The NEXT drift-sync
run reads the approved note from main and mechanically applies the registry
edit (still zero-LLM — a human-authored marker, not generated code), opening a
separate data-only PR. That two-run hand-off is how the loop closes.

Note file(s) in this PR

  • drift-proposals/anthropic-claude-3-5-haiku-deprecated-referenced.md
  • drift-proposals/anthropic-claude-3-5-sonnet-deprecated-referenced.md
  • drift-proposals/anthropic-claude-3-7-sonnet-deprecated-referenced.md
  • drift-proposals/anthropic-claude-3-haiku-deprecated-referenced.md
  • drift-proposals/anthropic-claude-3-opus-deprecated-referenced.md
  • drift-proposals/anthropic-claude-3-sonnet-deprecated-referenced.md
  • drift-proposals/anthropic-claude-haiku-4-deprecated-referenced.md
  • drift-proposals/anthropic-claude-opus-4-1-deprecated-unreferenced.md
  • drift-proposals/anthropic-claude-opus-4-deprecated-referenced.md
  • drift-proposals/anthropic-claude-sonnet-4-deprecated-referenced.md

drift-sync outcome

npm warn Unknown project config "minimum-release-age". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
npm warn Unknown project config "block-exotic-subdeps". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
needs-human note(s) written this run — routed to human without a live re-collect (no registry edit to re-verify)
  [needs-human-still-referenced] anthropic/claude-3-5-haiku: "claude-3-5-haiku" is deprecated but still referenced in source — routed to human (drift-proposals/anthropic-claude-3-5-haiku-deprecated-referenced.md)
  [needs-human-still-referenced] anthropic/claude-3-5-sonnet: "claude-3-5-sonnet" is deprecated but still referenced in source — routed to human (drift-proposals/anthropic-claude-3-5-sonnet-deprecated-referenced.md)
  [needs-human-still-referenced] anthropic/claude-3-7-sonnet: "claude-3-7-sonnet" is deprecated but still referenced in source — routed to human (drift-proposals/anthropic-claude-3-7-sonnet-deprecated-referenced.md)
  [needs-human-still-referenced] anthropic/claude-3-haiku: "claude-3-haiku" is deprecated but still referenced in source — routed to human (drift-proposals/anthropic-claude-3-haiku-deprecated-referenced.md)
  [needs-human-still-referenced] anthropic/claude-3-opus: "claude-3-opus" is deprecated but still referenced in source — routed to human (drift-proposals/anthropic-claude-3-opus-deprecated-referenced.md)
  [needs-human-still-referenced] anthropic/claude-3-sonnet: "claude-3-sonnet" is deprecated but still referenced in source — routed to human (drift-proposals/anthropic-claude-3-sonnet-deprecated-referenced.md)
  [needs-human-still-referenced] anthropic/claude-haiku-4: "claude-haiku-4" is deprecated but still referenced in source — routed to human (drift-proposals/anthropic-claude-haiku-4-deprecated-referenced.md)
  [needs-human-still-referenced] anthropic/claude-opus-4: "claude-opus-4" is deprecated but still referenced in source — routed to human (drift-proposals/anthropic-claude-opus-4-deprecated-referenced.md)
  [needs-human-zero-reference] anthropic/claude-opus-4-1: "claude-opus-4-1" is deprecated and zero-reference — removal proposed to a human (drift-proposals/anthropic-claude-opus-4-1-deprecated-unreferenced.md)
  [needs-human-still-referenced] anthropic/claude-sonnet-4: "claude-sonnet-4" is deprecated but still referenced in source — routed to human (drift-proposals/anthropic-claude-sonnet-4-deprecated-referenced.md)
npm warn Unknown env config "block-exotic-subdeps". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
npm warn Unknown env config "minimum-release-age". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
npm warn Unknown project config "minimum-release-age". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
npm warn Unknown project config "block-exotic-subdeps". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
^[[33m[STARTED]^[[39m Backing up original state...
^[[32m[COMPLETED]^[[39m Backed up original state in git stash (d1317a0)
^[[33m[STARTED]^[[39m Running tasks for staged files...
^[[33m[STARTED]^[[39m package.json^[[0;90m — 10 files^[[0m
^[[33m[STARTED]^[[39m *.{ts,mts,js,mjs,cjs,json,html,css,md}^[[0;90m — 10 files^[[0m
^[[33m[STARTED]^[[39m *.{ts,mts,js,mjs}^[[0;90m — 0 files^[[0m
^[[33m[SKIPPED]^[[39m *.{ts,mts,js,mjs}^[[0;90m — no files^[[0m
^[[33m[STARTED]^[[39m prettier --write
^[[32m[COMPLETED]^[[39m prettier --write
^[[32m[COMPLETED]^[[39m *.{ts,mts,js,mjs,cjs,json,html,css,md}^[[0;90m — 10 files^[[0m
^[[32m[COMPLETED]^[[39m package.json^[[0;90m — 10 files^[[0m
^[[32m[COMPLETED]^[[39m Running tasks for staged files...
^[[33m[STARTED]^[[39m Applying modifications from tasks...
^[[32m[COMPLETED]^[[39m Applying modifications from tasks...
^[[33m[STARTED]^[[39m Cleaning up temporary files...
^[[32m[COMPLETED]^[[39m Cleaning up temporary files...
[fix/drift-2026-08-07-31218975992 a8b34dd] fix(drift-sync): mechanical model-family sync (needs-human note file(s))
 10 files changed, 83 insertions(+)
 create mode 100644 drift-proposals/anthropic-claude-3-5-haiku-deprecated-referenced.md
 create mode 100644 drift-proposals/anthropic-claude-3-5-sonnet-deprecated-referenced.md
 create mode 100644 drift-proposals/anthropic-claude-3-7-sonnet-deprecated-referenced.md
 create mode 100644 drift-proposals/anthropic-claude-3-haiku-deprecated-referenced.md
 create mode 100644 drift-proposals/anthropic-claude-3-opus-deprecated-referenced.md
 create mode 100644 drift-proposals/anthropic-claude-3-sonnet-deprecated-referenced.md
 create mode 100644 drift-proposals/anthropic-claude-haiku-4-deprecated-referenced.md
 create mode 100644 drift-proposals/anthropic-claude-opus-4-1-deprecated-unreferenced.md
 create mode 100644 drift-proposals/anthropic-claude-opus-4-deprecated-referenced.md
 create mode 100644 drift-proposals/anthropic-claude-sonnet-4-deprecated-referenced.md
unchecked-providers=
reason=needs-human
changeset-key=9c868d12bd208698

@pkg-pr-new

pkg-pr-new Bot commented Aug 7, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@copilotkit/aimock@364

commit: a8b34dd

jpr5 added a commit that referenced this pull request Aug 7, 2026
…an (#365)

A model family that a provider's own live `/models` listing no longer
returns is a **fact**, not a decision. drift-sync was escalating every
one of them to a human, reddening the daily cron and emailing the owner
to rubber-stamp bookkeeping.

Run `31218975992` did exactly that: ten Anthropic families
(`claude-3-opus`, `claude-3-sonnet`, `claude-3-haiku`,
`claude-3-5-sonnet`, `claude-3-5-haiku`, `claude-3-7-sonnet`,
`claude-opus-4`, `claude-sonnet-4`, `claude-haiku-4`,
`claude-opus-4-1`), one PR, one red run, one email — with nothing for a
human to actually decide.

## Why it escalated

Not judgement. A structural dead end. `includeFamilies` membership is
checksum-pinned, drift-sync's own gate re-runs that pin, and the
allowlist forbids re-pinning it — so removing a retired family always
reds its own gate and delivers nothing. With no place to write the fact
down, the only reachable outcome was to ask a human.

## What changes

A `deprecatedFamilies` ledger in `model-registry.ts` gives the fact
somewhere to live. Recording a deprecation is now mechanical, and both
classes collapse to the same action:

- **Deprecated and unreferenced** — recorded, no alert.
- **Deprecated but still referenced** — recorded, and **the mock keeps
serving**. Users' tests pin retired models; removing them to satisfy a
ledger entry would break those tests. The reference class is an
annotation on the recorded line, not a different route.

**A genuinely new or unclassified family still pages a human,
unchanged.** "Should aimock mock this?" is a real product question.

`includeFamilies` is byte-identical — verified by AST extraction
(SHA-256 `281ed637a2f5…`, 2300 bytes both sides), and the pin test reds
when a family is added.

## Verification

Red and green replay the real production input. The replay reproduces
changeset key `9c868d12bd208698` — the exact key from run `31218975992`
— and its notes diff **empty** against PR #364, so this is the input
that paged the owner, not a synthetic stand-in.

- **Red** on `main`: ten `needs-human-*`, `reason=needs-human`, exit 1.
- **Green**: ten `[deprecation-recorded]`, **zero** needs-human,
`reason=ok-applied`, exit 0. All three gates ran and passed. A second
run reports `ok-no-churn` and stays silent.

**The nine still-referenced mocks still serve**: built `dist/`, ran the
real server, POSTed `/v1/messages` per family — 9/9 HTTP 200 with real
mocked bodies.

**Negative control**: a synthetic new family `claude-zephyr-9` still
yields `reason=needs-human`, exit 1, and a `Decision: pending` note.

**The ledger cannot reach the serving path**: zero hits in a fresh
`dist/` (`createServer` scores 42, proving the search works), no
non-test `src/` file references the registry, and the boundary test reds
when the symbol is added to `src/constants.ts`.

Ten mutations, all red — including a stray ledger entry,
unclassify-on-record, a ledger that swallows every fixture, and
detect-but-never-record.

Along the way this surfaced four fixtures hard-coding `claude-3-opus` as
"genuinely retired", which would have reddened CI on the first
post-merge drift PR. They now derive their stand-ins and throw loudly
rather than pass vacuously.

## Unproven

Listings are replayed rather than fetched live; Anthropic fidelity is
established by the changeset-key and note equality above, while
openai/gemini inputs are synthesized. The ledger is append-only by
choice: a resurrected family would keep a stale marker, traded against
record/un-record PR churn.
@jpr5

jpr5 commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Superseded. These ten Anthropic deprecations are now recorded mechanically in deprecatedFamilies on main (#366, merge c9af8c33), and the mocks for the nine still-referenced families are retained. A provider-confirmed deprecation is a fact, not a decision, so this class no longer asks for one — see #365. The notes here describe a route that no longer exists.

@jpr5 jpr5 closed this Aug 7, 2026
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