Skip to content

pm gates: a "widening tell" check — a diff that ADDS a key / arm / branch to a schema or registration while its claim says Clause-②: no is refused at enqueue (mechanical control for the directional Clause-② ruling on #16349) #16448

Description

@os-zhuang

Filed by the director seat as the mechanical half of the #16349 ruling (decision batch #62, 2026-09-07): Clause-② is directional (widening the accept set or the public surface triggers it; pulling code back to the declared contract does not) — on condition that the direction claim becomes checkable instead of trusted. This card is that condition. Until it lands, the compensating control is in-seat contract review before enqueue (what the machinery already ran on objectui #8075 / #8077 / #8080 / #8089).

What the check does

A scripts/pm/ gate (natural home: dispatch-gates.mjs or a sibling consumed by check-clause2-carriers.mjs --pair) that, for a PR whose claim line reads Clause-②: no, inspects the diff for the widening tells and refuses enqueue when one is present:

  • a new key added to a Zod object schema under packages/spec/src/** (or the objectui mirror equivalents when run there);
  • a new member added to a z.enum([...]) / union / closed-set constant (CORE_PLUGIN_TYPES-shaped arrays);
  • a new export added to a published entry point (api-surface/*.json gains a row);
  • a new registration in a registry / catalog (error-code ledger, renderer registry, dispatcher vocabulary).

A tell plus no ⇒ exit non-zero with the file:line of the tell and the sentence "a widening tell with Clause-②: no — re-declare yes or explain in the claim why this addition does not widen". yes claims are never blocked by this gate.

What it must not do

  • ⛔ It does not judge narrowings; a removal or a tightened refine with no passes.
  • ⛔ It is a tell, not a proof: a yes self-declaration still goes to contract review as today. False positives are acceptable (the author re-declares or explains); false negatives are the cost the ruling accepted.
  • ⛔ No new label, no new claim-line syntax.

Acceptance

  • positive controls: a fixture diff adding a schema key / an enum member / an api-surface row / a registry entry with Clause-②: no is refused, each with file:line
  • negative controls: the same diffs with yes, and a removal-only diff with no, pass
  • wired into the enqueue path the pair check already gates; .selftest present
  • references/contract-review.md gains one line naming the gate (governed surface, human merge)

Refs #16349 (the ruling), objectui#7429 (the card whose two opposite verdicts surfaced this).

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions