Skip to content

[finding] clause-② wording lacks its negative boundary: two independent seats read a PERMISSION-GATE behaviour change as "契约接受/拒绝行为" and pre-hung needs:contract-review on a non-contract card #12887

Description

@os-elon

Filed by the director seat (session session_016SG9S6V15MqeAgkehDcTwk, 2026-08-28), after the maintainer caught the mis-hung label live (verbatim: 「我的意思是 12597 还挂着 label:"needs:contract-review"」). Skills-lane finding — the fix, if adopted, is pm-dispatch protocol text, so it is the skills seat's to grade and carry as a skill PR.

What happened (the evidence that this is a TEXT gap, not only one seat's slip)

Two independent seats made the identical conflation on the same card:

  1. The card author (a dev seat) wrote on the permission-boundary card security(engine): reference-cleanup set_null write clears ONLY the object-level CRUD check (__referentialFieldClear-scoped) — FLS/RLS guards stay enforced; cascade untouched (RULED 2026-08-28) #12597: 「⚠️ 无论哪个方向都是权限边界语义变更,条款②适用」 — asserting clause-② over a plugin-security runtime permission-gate change.
  2. The director seat, executing the maintainer's ruling on that card, adopted the card's assertion instead of re-deriving from the boundary test, and attached needs:contract-review at ruling time.
  3. The maintainer spotted and corrected it; the label was removed with a recorded rationale (security(engine): reference-cleanup set_null write clears ONLY the object-level CRUD check (__referentialFieldClear-scoped) — FLS/RLS guards stay enforced; cascade untouched (RULED 2026-08-28) #12597, 2026-08-28 comment).

By this board's own standard — applied the same day on the SHRINK-ONLY header question — two independent readers deriving the same wrong reading from one text is evidence the text cannot self-disambiguate.

The distinction the text carries only implicitly

  • SKILL.md's clause-② sentence: 「凡改变契约接受/拒绝行为或扩大公开面的卡(domain:spec 语义面;…)」 — the restriction to the published contract face lives in a parenthetical, and the claim template's criterion line (「本卡改变契约接受/拒绝行为或扩大公开面吗?」) repeats the phrase without it.
  • The manual floor meanwhile lists 安全/权限边界 and 协议/公开契约变化 as two separate categories. A permission-gate behaviour change (which deletes succeed, what an elevation bypasses) is the former: it needs the maintainer, but its control is the ruling itself — ⛔ not the contract-review chain, whose carriers, tier fuse and clear-label mechanics all assume a contract increment to review. Mis-hanging the label fails SAFE (over-review, carrier-enumeration noise — never a missed review), but it pollutes the review chain's carrier set every timed round.

Proposed fix (for the skills seat to shape; both halves are one-line-scale)

  1. The negative example, stated where the phrase is read: one line beside the clause-② criterion (SKILL.md and/or the claim template's Clause-② line): a runtime permission/security behaviour change is NOT clause-② — it is the 安全/权限边界 manual-floor category; clause-② is the published contract face only.
  2. Write down the pre-marking rule the board already practices: pre-hanging needs:contract-review on a queue card (the triage seat's "提前挂…免得到合并队列才发现" practice) is legitimate only when the future diff's path face is certainly contract (packages/spec/src/** — the path limb would fire anyway). Content-limb-only suspicions stay with the claim-time Clause-②: yes|no declaration, which is the binding mechanism regardless.

Not proposed

No new label, no new gate, no mechanism change — the enqueue gate's two limbs already work; this is wording plus one recorded convention. The ratchet applies to the skill file; the skills seat prices the lines.

Refs: #12597 (the mis-hung card, corrected) · the 2026-08-28 director-session correction comment there · SKILL.md 条款② / 条款②入队闸门 · references/contract-review.md.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions