Skip to content

chore(labeler): delete the inert designer rule and the exemption it needed (objectui#7771) - #9644

Merged
os-justin merged 1 commit into
mainfrom
claude/issue-7771-labeler-designer-rule-delete
Sep 17, 2026
Merged

os-justin merged 1 commit into
mainfrom
claude/issue-7771-labeler-designer-rule-delete

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Fixes #7771

Item 1 of that card only. Items 2 and 3 are answered, not worked — the reading is recorded below so the next sweep does not re-file them.

What changed

Two deletions, both halves of the same defect:

  1. .github/labeler.yml loses the designer rule (packages/designer/**/*). packages/designer was removed whole — its package.json was deleted in 21396ca4d — so the rule has matched nothing since. Inert, not erroring: no run failed, nothing was mislabelled, and there was no symptom to notice.
  2. scripts/__tests__/labeler-package-coverage.test.ts loses the named UNRESOLVABLE_GLOB_EXEMPT row that waived that rule. The list is now empty, which its own docblock calls the healthy state, and the "delete a package, forget the rule" direction is enforced with no waiver standing between it and the config. The docblock paragraph describing that direction is rewritten, because it stated as live a fact that the same commit makes historical.

The exemption's mechanism stays. Emptying the list is what the ruling asked for; removing the list would take away the reviewable way to declare a future waiver.

Why A (delete) and not B (retarget)

Ruled on the card by the director seat (class-1 self-adjudication): B rests on packages/plugin-designer being the successor of the deleted packages/designer, and that relationship was explicitly not measured — the deletion commit does not say so. An unmeasured claim does not buy a retarget, and a retarget would silently change what the designer label means relative to every historical PR that carries it.

Items 2 and 3 — ruled no change, recorded here so they are not re-filed

  • plugin: chatbot — no rule added, label object kept. A sub-label for packages/plugin-chatbot has zero recorded pull, and that package is already visible to every sweep through the generic plugin label. Closing the four-of-twenty sub-label set to twenty is capability proliferation with nothing pulling on it.
  • plugin-view — no rule added, label object kept. Same reading; plugin: view is item 2's proliferation under a different spelling.
  • No label object is touched by this PR at all. This repo's convention for a label that leaves circulation is that circulation is what changes — the GitHub label object stays. A registry deletion also strips the label from every PR that ever carried it, and that is not revertible. Circulation is controlled by .github/labeler.yml, which is the only file here that moves.

Measurements

All gate runs below are on 78555c2.

The coverage test's state, before and after. The dispatch expected it to be red before this change. It was not:

when result
before any edit, unmodified origin/main tree green — Test Files 1 passed (1) · Tests 6 passed (6), exit 0
after both halves land green — 6 passed, exit 0

Green-before is the correct reading of the card's own sentence, which says the gate 「reddens the moment this card is resolved either way」: the exemption made it honest today, and it reddens when one half moves without the other. It was never red on main.

Ablation — the gate is live, not vacuous. Both legs mutate on disk, are proven to have landed (injected-text count plus a git hash-object comparison against the HEAD blob), run, and are restored with git checkout HEAD --; both files end byte-identical to HEAD.

leg mutation result
A put the dangling rule back in .github/labeler.yml, exemption stays deleted red, exit 1 — never keeps a packages/ rule pointing at a directory that does not exist
B put an exemption row back in the test, rule stays deleted red, exit 1 — keeps both exemption lists honest

Each half alone fails, for its own assertion and its own reason. Neither test is passing vacuously after the deletion.

Config still parses. .github/labeler.yml parses with the same yaml library the gate uses: exit 0, 32 label keys, no designer key, no glob naming packages/designer. A labeler config that fails to parse is a broken gate, not a passing one, so this is measured rather than assumed.

Gates run (exit codes captured by redirecting to a file first, never read through a pipe):

gate exit
pnpm exec vitest run scripts/__tests__/labeler-package-coverage.test.ts 0
the three neighbouring pin tests that name this config, run together with it (ci-cd-pipeline-doc, scripts-type-check, workflow-cache-save-bound) — 116 tests 0
pnpm type-check:scripts 0
pnpm check:control-bytes 0
pnpm check:new-line-citations 0
pnpm check:test-path-roots 0
pnpm check:comment-mask-corpus 0
pnpm check:unreferenced-sources 0
node scripts/check-changeset-presence.mjs 0 — no changeset owed; nothing published moved
node scripts/check-governed-queue-guard.mjs --test on both paths 0 — NOT GOVERNED

type-check:scripts covers the edited test file by measurement, not by assumption: tsc --listFiles on tsconfig.scripts.json puts labeler-package-coverage.test.ts in the program (1 of the 1004 files that project compiles). That config deliberately does not inherit the tier-base exclude, which lists the test globs.

Lint is narrowed, and the narrowing is declared. pnpm lint is turbo run lint, which is driven by workspace package scripts and structurally cannot reach scripts/ — the same reason tsconfig.scripts.json exists. ESLint was therefore run directly on the one .ts file this diff touches: 0 errors, 0 warnings, and --format json reports 1 file linted. The population that narrowing sits inside is read from ESLint's own config resolution, not guessed: scripts/__tests__/**/*.ts resolves to 188 files it covers there, 0 errors. Invariance for the untouched remainder: this repo's eslint.config.js enables no type-aware linting — no projectService, no parserOptions, no project, no tsconfigRootDir anywhere in its 471 lines — so no edit in this diff can move ESLint's verdict on a file it does not contain. The repo-wide sweep is CI's run, not this one's.

Adjacency, re-derived at PR time rather than at dispatch time. All 17 open pull requests had their file lists enumerated to the end (PR #5400, the changeset release PR, across 17 pages and 1682 files). No open PR touches .github/labeler.yml and none touches scripts/__tests__/labeler-package-coverage.test.ts.

Acceptance notes

Out-of-scope observations, noted and deliberately not filed:

  • .github/labeler.yml carries a trailing space after any-glob-to-any-file: on the documentation rule. Pre-existing, parses fine, purely cosmetic — a style nit, not one of the three filing classes. Successor: the next PR that edits that rule for a real reason.
  • pnpm check:comment-mask-corpus reports 1 disagreeing file at its held ceiling (objectui#7882). Unrelated to this diff, already carded, exits 0.

objectui#7746 is not addressed here and remains open on its own PR.


Generated by Claude Code

… needed

`packages/designer` was removed whole (its `package.json` deleted in
21396ca), so the `designer` rule in `.github/labeler.yml` has matched
nothing since — inert rather than erroring, with no symptom to notice.

objectui#7771 ruled A (delete) over B (retarget to `packages/plugin-designer`):
the successor relationship is unmeasured, and a retarget would silently change
what the `designer` label means relative to every historical PR carrying it.

Same pass, as that ruling directs: `UNRESOLVABLE_GLOB_EXEMPT` in
`scripts/__tests__/labeler-package-coverage.test.ts` drops the named row that
waived this rule, so the "delete a package, forget the rule" direction is
enforced with no waiver standing between it and the config.

No label object is touched. This repo's convention for a label that leaves
circulation is that circulation is what changes — the GitHub label object
stays, because deleting it also strips the label from every PR that ever
carried it and that is not revertible.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012EpHzwH4wTy5sd7ibkD2yq
@os-justin
os-justin marked this pull request as ready for review September 17, 2026 00:28
@os-justin
os-justin added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit 8ad2318 Sep 17, 2026
35 checks passed
@os-justin
os-justin deleted the claude/issue-7771-labeler-designer-rule-delete branch September 17, 2026 00:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants