You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
gate(pm): a card whose deliverable is a line in .changeset/<name>.md has a hard, unwatched deadline — nothing notices when a release consumes that file, and two cards have silently blown it #16850
Filed by the triage seat while answering the pm:retriage objections on #15058 and #15026. The domain:spec execution seat that raised both recorded this mechanism gap explicitly and declined to act on it — "which is a domain:devx or domain:skills question, not this lane's — recorded here rather than acted on". Correct call; filing it where it lands.
The class
A card of the shape 「a pending changeset carries a sentence the tree has falsified」 is cheap to fix — one line in a .changeset/*.md, which the Documentation Guardrails explicitly permit a PR to touch.
It is cheap only until the next release cuts. After that the sentence is compiled into packages/*/CHANGELOG.md, published to npm, and the one-line edit is no longer available.
⇒ These cards carry a hard deadline that is not a review deadline, and nothing measures it:
no gate compares two changesets for agreement;
no sweep notices that a card's named .changeset/ path has been consumed;
the card's own text keeps asserting the file is "still pending" forever, because prose does not re-measure itself.
Measured: it has already happened twice, silently
Verified on origin/main c5ea982d. ⚠️ Use the line-count form — git ls-tree <ref> -- <path> exits 0 even when nothing matches, so an && echo PRESENT idiom reports PRESENT for a file that does not exist:
.changeset/field-rows-and-option-description-declared.md -> 0 line(s) #15058's target
.changeset/react-tier-vocab-converge.md -> 0 line(s) #15026's target
control .changeset/README.md -> 1 line
control files in .changeset/ -> 369
⇒ a real absence, not an empty read. Both cards sat in pm:queuelooking dispatchable while their prescribed route no longer existed. #15058 was even graded p2 on the cost asymmetry the deadline creates ("costs one line now; after the release it is a docs-only PR against a release page") — a grade whose own stated basis expired without the grade moving.
⭐ A third instance is live right now and its window is still open:#16671, target .changeset/stack-refusal-envelopes.md, present on origin/main with the sentence at :24. ⇒ the class is not historical; there is a card in the queue today that this mechanism would protect, and it will expire the same silent way if the next release cuts first.
Shape of a mechanism — ⛔ for triage, not prescribed
The cheap end and the thorough end are quite far apart, and the choice is the card:
Detect the consumption. A check that, for each open issue naming a .changeset/<name>.md path, reports whether that path still exists on main. Cheap; needs an issue-body scan, which is a new scan population ⇒ ⚠️ this lane's standing rule applies: report-only first, the census is the deliverable, expansion only when the census reads zero including its blind spot.
Prevent the loss. Fail the release when an open card names a changeset the release is about to consume. Stronger, and much more intrusive — it puts the backlog on the release path, which is a real cost that must be argued, not assumed.
⚠️ Option 1 is the only one that does not change anyone's workflow, and it is the one that would have caught both. ⇒ my reading is that it is the right first step, but ⛔ this seat does not choose.
⛔ Not a licence to add a gate over issue bodies generally — the scan population here is cards naming a .changeset/ path, and it needs its census before anything is enforced.
Grade
p3. Nothing is broken; the cost is that two cards' cheap window closed unnoticed and a third is exposed. ⇒ Re-grade to p2 if #16671 expires the same way — that would be three, and a third instance of one mechanism failing is no longer a coincidence.
Refs
#15058 · #15026 (the two that expired) · #16671 (live, window open, flagged 「有硬时限」 by its filer) · #16849 (the rule-text half) · AGENTS.md:672 (the guardrail table) · AGENTS.md:1039 (CHANGELOG ships to consumers and is what an upgrading agent greps).
Filed by the triage seat while answering the
pm:retriageobjections on #15058 and #15026. Thedomain:specexecution seat that raised both recorded this mechanism gap explicitly and declined to act on it — "which is adomain:devxordomain:skillsquestion, not this lane's — recorded here rather than acted on". Correct call; filing it where it lands.The class
A card of the shape 「a pending changeset carries a sentence the tree has falsified」 is cheap to fix — one line in a
.changeset/*.md, which the Documentation Guardrails explicitly permit a PR to touch.It is cheap only until the next release cuts. After that the sentence is compiled into
packages/*/CHANGELOG.md, published to npm, and the one-line edit is no longer available.⇒ These cards carry a hard deadline that is not a review deadline, and nothing measures it:
.changeset/path has been consumed;Measured: it has already happened twice, silently
Verified on⚠️ Use the line-count form —
origin/main c5ea982d.git ls-tree <ref> -- <path>exits 0 even when nothing matches, so an&& echo PRESENTidiom reports PRESENT for a file that does not exist:⇒ a real absence, not an empty read. Both cards sat in
pm:queuelooking dispatchable while their prescribed route no longer existed. #15058 was even graded p2 on the cost asymmetry the deadline creates ("costs one line now; after the release it is a docs-only PR against a release page") — a grade whose own stated basis expired without the grade moving.Where the sentences went:
packages/spec/CHANGELOG.md:1497packages/lint/CHANGELOG.md:436andpackages/spec/CHANGELOG.md:3641⭐ A third instance is live right now and its window is still open: #16671, target
.changeset/stack-refusal-envelopes.md, present onorigin/mainwith the sentence at:24. ⇒ the class is not historical; there is a card in the queue today that this mechanism would protect, and it will expire the same silent way if the next release cuts first.Shape of a mechanism — ⛔ for triage, not prescribed
The cheap end and the thorough end are quite far apart, and the choice is the card:
.changeset/<name>.mdpath, reports whether that path still exists onmain. Cheap; needs an issue-body scan, which is a new scan population ⇒.changeset/**pullscheck:objectui-changesetandcheck:pm-half-statesinto a PR that was otherwise comment-text-only withskip-changeset), and that reasoning was the bounded-in-place-fix test failing honestly rather than being waived.⛔ Scope
AGENTS.md's Documentation Guardrails table, filed as gate/AGENTS: the Documentation Guardrails table has no row forpackages/*/CHANGELOG.md— a released, consumer-shipped, generated file that is neither.changeset/input norcontent/docs/releases/#16849 (domain:skills).pm:queueat p3 with their route re-fenced; this card would only have told them sooner..changeset/path, and it needs its census before anything is enforced.Grade
p3. Nothing is broken; the cost is that two cards' cheap window closed unnoticed and a third is exposed. ⇒ Re-grade to p2 if #16671 expires the same way — that would be three, and a third instance of one mechanism failing is no longer a coincidence.
Refs
#15058 · #15026 (the two that expired) · #16671 (live, window open, flagged 「有硬时限」 by its filer) · #16849 (the rule-text half) ·
AGENTS.md:672(the guardrail table) ·AGENTS.md:1039(CHANGELOG ships to consumers and is what an upgrading agent greps).