chore(taxonomy): close #3216's automation-label decision with a guard - #3436
Merged
Merged
Conversation
…#3216) The 2026-09-17 label/census audit applied its 17 fixes and stopped at the taxonomy residue it could not settle unilaterally. Decision 1 was that Dependabot names labels which may not exist, and GitHub drops a nonexistent label without a word -- so the PR opens, the grouping works, and the triage filter never matches. Nothing fails, which is why it sat for ten days. Re-reading the live catalogue first: `github-actions`, `go` and `containers` were created on 2026-09-27, so that half of the decision was already answered by the time this landed and re-creating them would have been noise. The residue that was still real: - `frontend` was the only label of 35 with an empty description, and the only one still at zero documentation, so "is this a duplicate of `dashboard`?" stayed unanswerable from the catalogue itself. Its description now scopes it to the Dependabot npm scope and says it is not the `dashboard` product area. Name and colour unchanged. (The live catalogue mutation is recorded in the PR body -- it is not a repo change.) - Nothing in the repo checked that automation-referenced labels are real. check-label-taxonomy.py records every automation-referenced label and which of two kinds it is: `applies` (Dependabot must have it to pre-exist) or `creates` (a watcher runs `gh label create`, so absence self-heals and zero usage does not make it obsolete -- the audit's own conclusion). Offline it cross-checks that ledger against dependabot.yml and the watchers; with --live it asks GitHub whether each label is really there and really has a description, and refuses rather than passing when it cannot see. Two holes closed while reviewing it, both false passes: a YAML block-style `labels:` list would have stopped being read at all, and a full page of results would have reported everything past the cut as deleted. Both are pinned in the test. No issue was relabelled, closed, assigned or commented on. #3135's `decision` label and the round-7/#shadcn child-body aliases are left alone and escalated in the PR body: both need an issue edit.
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-through on the open taxonomy decisions from the 2026-09-17 label/census audit published in #3216. The 17 label fixes are not redone here.
What the live catalogue actually said when I re-read it
The brief said the repo is busy, so I re-read everything immediately before acting rather than trusting the 2026-09-17 snapshot. Two of the six open decisions had already moved:
Decision 1 was already answered by someone else.
github-actions,goandcontainerswere created on 2026-09-27 — after the audit, before this branch. All six labelsdependabot.ymlreferences now exist. Re-creating them would have been noise, and pruning them fromdependabot.ymlwould have been wrong:goandcontainerscarry heavy historical usage. The create-route is what the audit's own options list implied, and it is the route taken.Decisions made
1.
frontendgets a description — the only real residue of decisions 1+2. It was the only label of 35 with an empty description. Decision 2 could not be answered from the catalogue, because the one label whose relationship todashboardwas in question was the one that documented nothing. Live catalogue mutation, not a repo change:frontenddescriptionFrontend dependency updates (Dependabot npm scope) — not the dashboard product areafrontendname / colourfrontend/eda087Read-back after the edit: description set,
nameandcolorunchanged, catalogue still 35 labels, andempty-description labels: []across the whole catalogue. Carriers untouched: issue #3279 and PRs #3290/#3274 hold the same label as before — no issue was relabelled.frontendis kept distinct fromdashboard(decision 2's default), and the description now says so in the place someone looks. It is not retired: decision 2 conditioned retirement on Dependabot labels being pruned, and they were created instead. Colour is left alone deliberately —dashboardis1d76dband movingfrontendonto the Dependabot family colour would make the two indistinguishable in the sidebar, which is the exact question decision 2 asks.2. Decision 1's drift class is now guarded. Nothing in the repo checked that automation-referenced labels are real, which is why it sat for ten days.
scripts/check-label-taxonomy.pyrecords every automation-referenced label and which of two kinds it is:applies— Dependabot must have the label to pre-exist, or it is dropped on every PR with no error;creates— a watcher owns it and runsgh label create, so absence self-heals and zero usage does not make it obsolete (the audit's own conclusion for the alarm family).Offline it cross-checks that ledger against
dependabot.ymland the watcherLABELconstants;--liveasks GitHub whether each label is really there and really has a description. Unreadable catalogue → exit 2, never a silent pass.Regression evidence
tests/docs/test_3216_label_taxonomy.py— 14 tests, each rule pinned against a synthetic tree with the real script under test:origin, not hardcoded — my first hardcoded slug made the live test skip while appearing to verify);labels:are read.Replaying the real pre-2026-09-27 state against the real tree fails with exactly the four defects the audit named:
Two false-pass holes I found reviewing my own guard are closed and pinned: a YAML block-style
labels:list would have stopped being read entirely (verified: the old single-spelling regex returns[]for block form), and a full page of results would have reported everything past the cut as deleted.Decisions confirmed, no change (as the audit found)
analysisvsresearch— both live and used as documented; no merge.blocked,decision,parked,HALTED,in-progresskeep distinct semantics.Escalated — not actioned, needs an operator or an issue edit
HALTEDis the only uppercase label among five lowercase state labels. The case mismatch is real but cosmetic; the audit proposed no consolidation for this family, and renaming a label rewrites it on 16 issues (15 closed + open epic Epic: rewrite dashboard from scratch with TanStack Start, Bun, and Astryx #3279, which is under active work). That is a relabel, so it is left alone. No automation referencesHALTED(grep across the repo excluding vendored corpora: no hits), so a rename is mechanically safe whenever you want it — it is a judgement call, not a hazard.dashboardandfrontend. Real-world evidence that the two are distinct — it is a product-area epic and a Dependabot npm-scope carrier — but carrying both on a human epic is the taxonomy smell decision 2 left open. Droppingfrontendfrom Epic: rewrite dashboard from scratch with TanStack Start, Bun, and Astryx #3279 is a relabel. Not done.decisionalthough it reads like a documented procedure. Removing a label is a relabel. Not done.#shadcn-Nchild aliases. The corrective fix lives in the child bodies, by their own campaigns. Editing issue bodies is out of scope here.compose-drift-alarm's description is narrow relative to its watcher's current scope (retired stacks, health streaks, resource drift). Left as-is: it matches the watcher's owngh label createtext. Worth a separate pass to widen both together.main-red-alarm(created 2026-09-26) andbackup-staleness-alarm(2026-09-23) post-date the audit; both are watcher-created and consistent with the doctrine, so nothing to do — noting them so the next audit does not re-derive it.Verification
python3 -m pytest tests/docs/— 600 passed, 1 xfailed (pre-existing), 17 subtests, 0 failures. The pre-existing xfail count is unchanged and no test was skipped, weakened or deleted.check-label-taxonomy.pyofflinerc=0;--liverc=0.py_compileclean on both new files.One thing worth knowing for whoever runs grit here:
grit claimcreates a worktree copy at.grit/worktrees/<agent>/, andtests/docs/test_3321_fix.py::test_pins_are_not_duplicated_anywhere_by_greprglobs the repo tree while excluding.git/andnode_modulesbut not.grit/. The trivy pin therefore appears twice and that test fails for any agent using grit in-tree. I removed my worktree to leave the tree green and did not weaken the test — flagging it as a real interaction worth a separate fix.Refs #3216. Not merging.