mirror of
https://github.com/Comfy-Org/github-workflows.git
synced 2026-11-05 00:17:37 +00:00
[PR #88] [MERGED] fix(cursor-review): survive a rebranded model family in the drift check (BE-4852) #100
Labels
No labels
cursor-review-catalog-drift
groom
groom
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Comfy-Org/github-workflows#100
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/Comfy-Org/github-workflows/pull/88
Author: @mattmillerai
Created: 7/28/2026
Status: ✅ Merged
Merged: 8/4/2026
Merged by: @mattmillerai
Base:
matt/be-4819-cursor-review-catalog-drift← Head:matt/be-4852-catalog-drift-lab-heuristics📝 Commits (3)
1cc0d8bfix(cursor-review): survive a rebranded model family in the drift check (BE-4852)89d7bb6fix(cursor-review): drop the digit id rule, close the judge-pin shape hole (BE-4852)03dbf7bfix(cursor-review): budget every drift-report list, admit bare o-series ids (BE-4852)📊 Changes
5 files changed (+514 additions, -59 deletions)
View changed files
📝
.github/cursor-review/README.md(+6 -2)📝
.github/cursor-review/catalog-drift.py(+250 -46)📝
.github/cursor-review/tests/test_catalog_drift.py(+253 -10)📝
.github/workflows/cursor-review-catalog-drift.yml(+4 -0)📝
README.md(+1 -1)📄 Description
STACKED — merging lands on
matt/be-4819-cursor-review-catalog-drift(owned by @mattmillerai, PR #87), NOTmain. The file this PR edits does not exist onmainyet; #87 introduces it. Merge #87 first, then this.ELI-5
The weekly checker looks at Cursor's model list and tells us if one of our four review models disappeared, or if a newer one showed up that we might want to switch to. It figures out "which lab is this?" by taking the first chunk of the model's name —
gpt-5.6-sol-max→gpt. That works right up until a lab renames its family: when OpenAI shipso5-pronext togpt-*, the checker reads the lab aso5, sees that nobody pinso5, and quietly drops it. So the one thing the check exists for — "a newer model shipped and nobody noticed" — is exactly the thing it could miss. This PR adds a second, quieter list for models from families we pin nothing from, so a renamed family shows up instead of vanishing. It also stops the parser treating a hyphenated English word at the start of a line (gpt-based models are …) as if it were a model name.What changed
Both fixes were deferred out of #87 by the review panel (thread) — they change the design, not just a regex, so they were out of scope there.
1. Unpinned-families catch-all (
analyze→report["unpinned_labs"]). Catalog ids whose family prefix matches no pin at all now get their own section instead of being dropped. This is the ticket's first proposed option, chosen over an explicitLAB_ALIASES = {"gpt": "openai", "o": "openai", …}table: the alias table is more precise but reintroduces exactly the hand-maintained list that deriving labs from the pins exists to avoid, and it needs a human edit before the rebrand it is supposed to catch. The catch-all costs one section and stays zero-maintenance.Deliberate placement, per the ticket's "keep it out of
urgent" note:urgent— it is a standing watchlist, not breakage, so it never reddens the weekly run.has_findings— it has to be, or a rebranded family renders into a body nobody ever sees (a cleanhas_findingscloses the sticky issue). See the judgment call below on auto-close.A lab whose only pin was just delisted still counts as pinned, so its successors stay in the same-lab list (with the delisted-pin context) rather than being demoted into the quiet fold — covered by a test.
2. Model ids must carry a digit (
_is_model_id).gpt-basedis lowercase, hyphenated and has letters, so it parsed as a catalog id and added noise to the review-me list — and, with change 1 in place, would have minted a phantomgpt-basedfamily. Every id a lab has actually shipped carries a version number somewhere; a prose word does not. This is the ticket's first proposed option for (2); "require the token to appear in more than one catalog line" was rejected because a real catalog lists each id exactly once.The rule lives in the single
_is_model_idthat the pin validator and the catalog parser both call, so the two cannot drift apart — relaxing it is one edit, not two.test_pin_and_catalog_id_shape_rules_agree(the tripwire the ticket names) is extended rather than weakened: it now also pinscode-supernova/gpt-basedas rejected ando5-proas accepted, on both sides.Verification
python3 -m unittest discover -s .github/cursor-review/tests -p 'test_*.py'— 103 passed (the exact commandtest-cursor-review-scripts.ymlruns).check_agents_md.py --root .passes (one pre-existing CODEOWNERS warning). No shell changed, soshellcheckis unaffected.New tests: the rebranded-family catch-all (
o5-pro→ familyo5, invisible to the same-lab list), finding-but-never-urgent, a catalog of exactly the pins still having no unpinned families (the auto-close path is not unconditionally broken), a delisted pin's lab still counting as pinned, prose-word rejection, digit-less pin rejected loudly rather than read as delisted, the collapsed-section render, backtick-injection safety on the new section's notes, and a 4000-family catalog still fitting under GitHub's body cap.Judgment calls
_is_model_idgates extraction, so a digit-less pin (code-supernovais a real Cursor id shape) now fails extraction with an actionable message and a red run, rather than being silently reported as delisted every Monday. I checked this against the live pins rather than assuming:gpt-5.6-sol-max,claude-opus-4-8-thinking-max,gemini-3.1-pro,kimi-k2.7-codeand thejudge_modeldefault all carry digits and extract cleanly from the realcursor-review.yml(asserted bytest_extraction_works_against_the_real_cursor_review_workflow). The cost of the tightening is that a digit-less catalog id would no longer reach the review-me list — it is still reproduced verbatim in the raw-catalog fold, which is where a human reads it anyway.unpinned_labsintohas_findingsdoes not newly pin the issue open:unpinnedalone already makeshas_findingstrue on any real catalog, since Cursor lists more tiers per pinned lab than the panel pins four of. The auto-close path was already reserved for a catalog trimmed to exactly the pins, and still is. I chose not to add a separate "worth an issue" gate — it would reintroduce the miss (a rebranded family with no other drift would file nothing), and splitting the two flags is a bigger design change than this deferred follow-up should carry. Flagging it in case you'd rather the catch-all be step-summary-only.LAB_ALIASEStable (see above), andlab_ofitself is unchanged — its docstring now says plainly that it returns a family prefix, not a vendor, and points at the catch-all.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.