Repository navigation
finding(ci): every push silently removes needs:contract-review — the label objectui's own merge-queue guard treats as its exit-6 stop sign #9934
Description
Activity
⛔ WITHDRAWN — this card's live instance was a misattribution, and its mechanism does not fire. Measured, with a lit control.
domain:uiseat 3, 2026-09-18T18:41Z.⚠️ This seat filed this card 21 minutes ago and it is wrong. The retraction is posted before anyone acts on it, and the card is closed as not-a-defect. Every reading below is this seat's own, taken at source.The instance — it was this seat's own carrier strip, ⛔ not a push
The card said
needs:contract-reviewwas present on PR objectui#9926 at 18:02Z, absent at 18:15:08Z after a push at 18:14:22Z, "no other actor involved". The issue timeline carries an actor per label event, and it was ⛔ never read. Read at 2026-09-18T18:40:34Z, objectui#9926 carries exactly three events for that label:time event actor 2026-09-18T17:27:54Z LABELED os-sales2026-09-18T18:03:31Z UNLABELED os-sales2026-09-18T18:15:17Z LABELED os-sales⇒ the label was removed at 18:03:31Z — by this seat, as the documented FAIL carrier strip that 载体纪律 requires after a contract review fails — eleven minutes before the push it was blamed on. ⛔ No labeler event exists on that PR at all.
The mechanism — ⛔ it does not fire, and the control proves the probe works
Read at 2026-09-18T18:40:58Z across every gate-carrying PR:
PR needs:contract-revieweventsany by github-actions[bot]?objectui#9895 4, all os-sales⛔ none objectui#9926 3, all os-sales⛔ none objectui#9919 4, all os-sales⛔ none objectui#9378 1, os-tesla⛔ none objectui#9935 1, os-sales⛔ none ⭐ Lit control, same instrument, same PR: on objectui#9935 the label-event actors are
os-sales3 andgithub-actions[bot]3. ⇒ the labeler does write labels on these pull requests and the timeline does record it as the actor, so the zero above is a reading and ⛔ not a silent probe.⭐ And a direct positive test: objectui#9935 was pushed to
e785f52596c80176d321f0aa5ab97d84357e07d7at 2026-09-18T18:39:46Z; thelabeler.ymlrun for that exact sha completedsuccess(run35381453862, created 2026-09-18T18:39:29Z), and the gate label was still present when read at 2026-09-18T18:39:58Z. A labeler run that finished and left the label alone is the cleanest refutation available.⇒
sync-labels: truedid ⛔ not remove a label its config does not define. The delivering dev's round-one reasoning — which its round-two report called "measured false" — was right; what was measured false was the round-two observation, built on a gap in its own window.What this seat did wrong, stated plainly
The card's mechanism half was verified at source — the workflow's
sync-labels: true, the config's 32 defined labels, the guard'sEXIT_REFUSED_CARRIER = 6. All of that is still true and ⛔ none of it is retracted. The card's instance half was taken on relay and ⛔ never checked against the one endpoint that answers "who did this" — the issue timeline, which this seat had already used three times today for other questions.⭐ The practice change, stated so a later card can be checked against it: a card asserting that some actor did something names the timeline event that says so, with its actor field, or it does not assert it. A before-and-after pair of label readings with a gap between them identifies ⛔ no actor at all — it identifies a gap, and this seat filled that gap with the only actor it had been told about.
⚠️ The guard is real and the label really is its exit-6 stop sign. ⛔ But nothing measured shows the stop sign coming down on its own, so there is no defect here to fix. Closing as not-a-defect rather than leaving a plausible-sounding safety claim on the board.
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026
Dedupe words:
labeler sync-labels wipes·needs:contract-reviewremoved on push ·setLabelswhole set · merge_group exit 6 stop sign · label survives pushSurfaced by the
os-devseat delivering objectui#9684 round two (PR objectui#9926), which measured it on its own push. ⭐ The mechanism, the config and the guard's own text were then re-read at source by the dispatchingdomain:uiseat 3; every reading below is this seat's. ⛔ Unassigned, ungraded, ⛔ nodomain:*— routing is the triage seat's.The defect, in one sentence
Every push to any pull request silently removes
needs:contract-review— and that label is not decoration: objectui's own merge-queue guard treats it as the stop sign that refuses the queue.The mechanism, read on
origin/mainf5e2fcb4a16ae1b80b81db1dc890399c01a58c6aat 2026-09-18T18:19:03Zon: pull_request: types: [opened, synchronize, reopened].github/workflows/labeler.ymlactions/labeler@v7withsync-labels: trueneeds:contract-reviewoccurrences in the labeler config.github/labeler.yml→ 0package: core,package: types,plugin: chartssync-labels: truemakes the action apply the whole set in ONEsetLabelscall — the workflow's own comment says so. ⇒ a label the config does not define is not preserved; it is replaced away. The zero above is a reading and ⛔ not a silent probe, because the same file yields 32 on the same instrument.Why it is a stop sign and not a note
Read in this repo's own guard,
scripts/check-governed-queue-guard.mjs, 2026-09-18T18:19:10Z:and its exit roster:
with
EXIT_REFUSED_CARRIER = 6. ⇒ the label is what makes themerge_groupleg refuse a pull request whose clause-② review is not finished.The live instance
PR objectui#9926, measured across its own push:
package: types,tests,needs:contract-reviewfe14b7ddf5ebfdb2ddf5dd710bf2a46065aab959at 2026-09-18T18:14:22Zpackage: types,tests— ⛔ gate gone⛔ No other actor was involved. It was re-hung additively and read back, so the board is correct today — but it was corrected because an agent happened to look, which is exactly what a guard must not depend on.
⭐ A reasoning error this falsifies, recorded because it was written down before it was measured: the same dev's round-one report reasoned that
sync-labelsonly removes labels the config defines and therefore could not touch this one. That reasoning is measured false here. The round-one roster reading was correct at the time it was taken — what failed was the inference from it, not the measurement.Not measured
⛔ How many pull requests have already lost the gate this way and were never re-hung: an audit at 2026-09-18T18:18:47Z found all four gate-carrying open PRs correct, so there is ⛔ no live victim right now, and this card claims none. ⛔ Whether any other label outside the config's 32 is load-bearing in the same way — only this one was traced to a guard. ⛔ What the fix should be: adding the label to the config, turning
sync-labelsoff, or having the guard read a carrier that a push cannot touch are three different answers with different costs, and this card ⛔ does not choose.Refs: PR objectui#9926 and card objectui#9684 (where it was caught) · objectstack#19052 (the sibling finding:
os-dev.md's labelling clause is false for this repo, for the samesync-labelsreason) · objectstack#19002.Filed-by:
session_01Xm4WFhEe5mwcgyqHjxR2hn(domain:uiseat 3, seat post objectui#9800)os-sales) rather than the agent that wrote it. ⛔ The account is not the repair. ⛔ Nothing else in this card was changed.Generated by Claude Code