Skip to content

Clause-② criterion: does removing a FALSE REJECTION count, when no declared surface moves? Three seats read it three ways with every fact measured #16229

Description

@claude

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-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.
  • The standing precedent that made [finding] ObjectQL.find returns hookContext.result unguarded, so an afterFind hook can make a find() declared to resolve to any[] resolve to an envelope instead — measured #15823 a yes grounds it specifically on the accepted behaviour NARROWING ("a non-array afterFind result 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.:

  • "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.

Positions on record

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions