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
Clause-② criterion: does removing a FALSE REJECTION count, when no declared surface moves? Three seats read it three ways with every fact measured #16229
Does Clause-② apply to a fix that removes a false rejection — a door that wrongly refused a legitimate body now accepts it — when no exported symbol or signature moves?
This is a criterion question, not a question about any particular diff. It came up on #15950 / PR #16223, where three seats read it three ways with every relevant fact already measured and the disagreement resting entirely on how the criterion is worded.
Why it needs naming once rather than per PR
"A fix that removes a false rejection" is a recurring shape, not a one-off: any declared-but-not-enforced repair, any gate whose resolution universe was too small, any validator keyed on a stale source. Each one will re-derive this from scratch, and the two readings lead to different lanes — one takes a contract review at CONTRACT_REVIEW_TIER, the other is an ordinary blocking-defect round.
The two readings, as they were actually argued
A — yes, it is Clause-② (what the implementing seat declared, and it hung needs:contract-review on both carriers):
The criterion as written is "any card that changes accept-or-reject behaviour, however small" (「不论多小」), phrasing that appears designed to defeat exactly the "it is only a bug fix" reading.
PUT /api/v1/meta/dashboard flips 422 → 200 on a published contract face, measured against a prod-like deployment.
The error costs are asymmetric: an over-declaration costs one visible review round; an under-declaration crosses a maintainer guardrail invisibly.
B — no, it is not:
The rejection being removed is a phantom. packages/lint/src/runtime-gate.ts:165 already declares the field as "The live dataset declarations", so the set of legitimate bodies accepted is unchanged — the implementation is moving into conformance with an already-published contract. That is the declared-not-enforced class, an ordinary blocking-defect lane.
Measured support: 0 exported symbols or signatures move; the sole declaration delta is private foldStoredCollection;, a private member's bare name.
Whatever the answer, the useful output is one named boundary in the criterion, e.g.:
"Clause-② covers a narrowing of accepted behaviour and any movement of a declared surface; a widening that removes a refusal the published contract already contradicted is NOT clause-② — it is the declared-not-enforced lane" — or
"Clause-② covers any change to accept-or-reject at a published door, in either direction", which settles it the other way and makes the declared-not-enforced lane a subset.
⛔ This card does not decide PR #16223. That PR carries needs:contract-review on both carriers and its reviewer decides it on the day; if this criterion later says otherwise, that is a downgrade someone can apply in one line rather than a re-derivation.
PM dispatch seat: read no in the dispatch brief's Zone 2; on the measured facts I now think B is the better reading — and ⛔ I did not act on that: a PM seat never strips a needs:contract-review hung by the implementing seat, and the one reason I must not act on is the one that would benefit me (this seat cannot perform contract reviews at all, so a yes costs me a held PR — throughput is not an argument about a contract criterion).
Refs
#15950 (the card) · PR #16223 (the diff, held on needs:contract-review) · #15823 (the ruled precedent, grounded on narrowing) · the ruling and full record: #15950 (comment)
The question
Does Clause-② apply to a fix that removes a false rejection — a door that wrongly refused a legitimate body now accepts it — when no exported symbol or signature moves?
This is a criterion question, not a question about any particular diff. It came up on #15950 / PR #16223, where three seats read it three ways with every relevant fact already measured and the disagreement resting entirely on how the criterion is worded.
Why it needs naming once rather than per PR
"A fix that removes a false rejection" is a recurring shape, not a one-off: any
declared-but-not-enforcedrepair, any gate whose resolution universe was too small, any validator keyed on a stale source. Each one will re-derive this from scratch, and the two readings lead to different lanes — one takes a contract review atCONTRACT_REVIEW_TIER, the other is an ordinary blocking-defect round.The two readings, as they were actually argued
A — yes, it is Clause-② (what the implementing seat declared, and it hung
needs:contract-reviewon both carriers):PUT /api/v1/meta/dashboardflips 422 → 200 on a published contract face, measured against a prod-like deployment.B — no, it is not:
packages/lint/src/runtime-gate.ts:165already declares the field as "The live dataset declarations", so the set of legitimate bodies accepted is unchanged — the implementation is moving into conformance with an already-published contract. That is thedeclared-not-enforcedclass, an ordinary blocking-defect lane.private foldStoredCollection;, a private member's bare name.ObjectQL.findreturnshookContext.resultunguarded, so anafterFindhook can make afind()declared to resolve toany[]resolve to an envelope instead — measured #15823 ayesgrounds it specifically on the accepted behaviour NARROWING ("a non-arrayafterFindresult is now refused"). Narrowing can break a working consumer; a widening that deletes a false refusal cannot, because nothing could have relied on it except the defect itself.What a ruling would look like
Whatever the answer, the useful output is one named boundary in the criterion, e.g.:
declared-not-enforcedlane" — ordeclared-not-enforcedlane a subset.⛔ This card does not decide PR #16223. That PR carries
needs:contract-reviewon both carriers and its reviewer decides it on the day; if this criterion later says otherwise, that is a downgrade someone can apply in one line rather than a re-derivation.Positions on record
widget.datasetagainst the boot-time stack, so a dataset saved throughPUT /meta/datasetis a phantomwidget-dataset-unknownuntil the runtime restarts #15950 round): A, recommended with the asymmetry argument, and it recorded B's full argument in its own PR body and claim comment so a reviewer can downgrade in one line rather than re-derive.noat triage time).noin the dispatch brief's Zone 2; on the measured facts I now think B is the better reading — and ⛔ I did not act on that: a PM seat never strips aneeds:contract-reviewhung by the implementing seat, and the one reason I must not act on is the one that would benefit me (this seat cannot perform contract reviews at all, so ayescosts me a held PR — throughput is not an argument about a contract criterion).Refs
#15950 (the card) · PR #16223 (the diff, held on
needs:contract-review) · #15823 (the ruled precedent, grounded on narrowing) · the ruling and full record: #15950 (comment)Generated by Claude Code