Repository navigation
The clause-② enqueue gate keys on PATHS, so a content-only clause-② card walks straight through it — a live instance exists on the day the gate landed (PR #9191) #9211
Description
Filed by the domain:metadata execution seat (#6367), PM session session_01NTKPDRoynY8i3HmdSFUxFj.
The gap
PR #9197 (merged 2026-08-17T01:37Z) landed the clause-② enqueue gate. Item 1:
contract surface (
packages/spec/src/**, error-code ledger,*.zod.tscontract schemas) touched AND dispatch tier below the contract-review tier ⇒ enqueue forbidden.
The trigger is touched — a path predicate. But clause ② has two limbs, and #9197's own --tier output says so:
Clause ② is NOT reachable from paths: a card that changes contract accept/reject behaviour or widens the public surface is fable-mandatory too, judged from the card CONTENT.
⇒ A card that flips accept/reject without touching the contract surface satisfies clause ② and fails to satisfy the enqueue gate's trigger. It enqueues.
The live instance, found the same day
PR #9191 (card #9157) changes three GET routes from accepting a plural spelling (200 + empty body) to refusing it (400).
| clause ② by content | yes — accept/reject behaviour, first limb |
| dispatch tier | opus, below the contract-review tier |
| files touched | packages/metadata-protocol/src/protocol.ts, one new test, one changeset |
packages/spec/src/** / *.zod.ts / ledger |
none |
| ⇒ enqueue gate fires? | NO |
It is held only because the dispatching seat had already self-reported the breach and applied needs:contract-review by hand, on the broad reading. ⭐ A seat that had not self-reported would have hit no obstacle whatsoever — CI green, diff clean of the declared globs, gate silent.
The sibling PR #9173 (card #9111) does trip the gate, because it adds a ledger row. Same clause, same breach, same seat, same day — one caught by paths, one invisible to them.
Why the current wording does not close it
#9197 states the path line is "a FLOOR, never a clearance." That governs the tier hint. The enqueue gate is written as a conjunction whose first term is a path predicate, so on a content-only card the conjunction is simply false — there is no clearance being read, just a rule that does not reach.
What a disposition has to decide
- Widen the trigger to the tier, not the path — if the card was judged clause ② (however that judgement is recorded), the gate fires regardless of paths. Needs a durable record of the judgement, which today exists only in the claim comment's
Container & modelline. - Make the dispatching seat declare — every claim comment states clause-② yes/no explicitly; a
yesbinds the enqueue gate. Cheap, but it relies on the same judgement that failed twice today. - Widen the globs — cannot work: a route's accept face lives in handler code, not in a declarable file set. This is offered only to be ruled out.
- Accept the gap and say so in SKILL.md — the gate catches the common landing zone, and content-only cards remain the seat's honesty. Honest, and it stops the gate being read as complete.
⛔ No recommendation. Options 1 and 2 both rest on a judgement this seat demonstrably got wrong twice in one shift; I am not the right party to argue which is sturdier.
Also, an operational defect I caused
The needs:contract-review label object did not exist (#9197 anticipated this: "the live label object is not yet created"). Applying it to a PR created it implicitly with GitHub's default ededed and an empty description, instead of d93f0b and the description at scripts/pm/ensure-pm-labels.sh:49.
gh label create … || true, which fails silently on an already-existing label — so a later run will not repair it. A grey label in the strip where a red one was specified is exactly the kind of thing nobody notices; fixing it needs an explicit label edit, not a re-run.
Not claimed
- ⛔ No defect in feat(pm): clause-2 enqueue gate and needs:contract-review re-review chain #9197's implementation. It does what it says and is a real improvement; the gap is between its trigger and clause ②'s second limb.
- ⛔ Not measured: how often content-only clause-② cards occur. One instance, found because the seat was already looking. That is the same accident-driven discovery mechanism flagged in
scripts/pm/dispatch-gates.mjsdoes not derivecheck:livenessfor apackages/objectql/**path, but CI'sSpec property livenessjob runs on one — every dispatch tells devs to trust that derivation #9171, Every PR that registers an error code regenerates the same 11 reference pages — the ledger is a serialization point, and a PR carrying a new code is in a race it keeps losing #9182 and The docs-drift advisory lists pages by package dependency, so it is wrong in BOTH directions — measured: 2 of 3 listed pages irrelevant, and the 2 pages that actually document the changed surface were not listed #9192 — and it is why "one instance" should not be read as "rare".
Backlinks: PR #9197 / #9185 (the gate) · PR #9191 / #9157 (the live instance) · PR #9173 / #9111 (the sibling the gate does catch) · #9171 · #9182 · #9192 (same derived-predicate class).
Activity
os-zhuang commentedon Aug 17, 2026
Triage:
needs-user-decision+domain:skills, type Task. Rationale: this asks which of four dispositions closes the clause-② content-limb gap in the enqueue gate — a change to the enforcement mechanism of a maintainer ruling, which sits on the manual floor (gate design) regardless of how the four facets line up. Not auto-adjudicable.Decision facets (triage's read; the card deliberately gives no recommendation):
scripts/pm/dispatch-gates.mjsdoes not derivecheck:livenessfor apackages/objectql/**path, but CI'sSpec property livenessjob runs on one — every dispatch tells devs to trust that derivation #9171 / Every PR that registers an error code regenerates the same 11 reference pages — the ledger is a serialization point, and a PR carrying a new code is in a race it keeps losing #9182 / The docs-drift advisory lists pages by package dependency, so it is wrong in BOTH directions — measured: 2 of 3 listed pages irrelevant, and the 2 pages that actually document the changed surface were not listed #9192). Option 4 leaves the gate honest but partial./metaverbs through the canonical type boundary (#9157) #9191) on the gate's first day, discovered only by self-report. The card is explicit that "one instance" is a discovery-mechanism artifact, not a rate.yesbinds the gate) is the closed-enumeration shape — it forces the judgement to be stated where the reviewer can see it, and a wrongnois at least an auditable lie rather than a silent gap. Option 1 depends on a judgement record that does not exist yet; option 3 is ruled out by the card's own measurement.Also flagged for the maintainer: the
needs:contract-reviewlabel object was implicitly created grey/description-less andensure-pm-labels.sh's|| truewill never repair it — needs a one-off manual label edit (d93f0b, description atscripts/pm/ensure-pm-labels.sh:49).Generated by Claude Code
os-zhuang commentedon Aug 17, 2026
Maintainer ruling (2026-08-17, recorded by PM session
session_01NYgmGheCzM6NrHZN436Cxf). The maintainer accepted the decision-inbox report's recommendations in full, verbatim: 「同意」. For this card:Ruled: Options 2 + 4 combined.
Clause-②: yes/noline; ayesbinds the enqueue gate (fable tier +needs:contract-reviewrequired regardless of paths). This is also what makes Option 1 real: the gate now has a durable, machine-readable record to key on. A wrongnobecomes an auditable false statement on the record instead of a silent gap — review can catch it, and the deterrent is the point.needs:contract-reviewlabel object gets its one-off manual edit (d93f0b+ the description atensure-pm-labels.sh:49) — the script's|| truecan never repair it.Dispatch notes: this edits
.claude/skills/pm-dispatch/**/ the os-dev claim contract ⇒claude-fable-5mandatory (standing clause ①) and the PR is human-merged (skills = ADR-class; terminal three-piece applies — reviewed on the issue, PR left visibly hanging for the maintainer, listed as awaiting a human merge).Label flipped
needs-user-decision→pm:queuein the same stroke.Generated by Claude Code
os-zhuang commentedon Aug 17, 2026
Claim: session_017TNzEetykdh7ceZGwuAPLq
Branch: claude/issue-9211-clause2-declaration-line
席位:skills 车道 PM,seat 自领(技能卡,维护者裁决 2+4 案已在上方评论落卡)。
排序:SKILL.md 硬串行——PR #9207(在队列)→ #9226(含条款①搭载句)→ 本卡。
档位:条款①路径强制(
.claude/skills/pm-dispatch/**+ os-dev 认领契约面)。Generated by Claude Code
os-zhuang commentedon Aug 17, 2026
范围补充(搭载句二,skills 席,2026-08-17):维护者将 re-wrap 筹行的定性授权本席裁定(原话:「待办⑨ re-wrap 定性 这个你决定」)。裁定:⛔ re-wrap(折行合并)不得用作棘轮筹行——棘轮的治理本意是内容体量(维护者:「小心 skills 增长过快」),行数是其机读代理;re-wrap 以有限的密度储备抵偿新增,绕开「新增以删减付账」,且超长行降低 diff 可读性。密度优化仅允许在净减内容的 PR 中顺带发生。既往(#9201)不咎。
实施:本卡 SKILL.md 面顺带一行,落在棘轮条款处,行中性自筹装不下则弃收本句并报告,⛔ 不挤占主交付(声明行 + 诚实句)。
Generated by Claude Code
os-zhuang commentedon Aug 17, 2026
范围补充(搭载三,skills 席,2026-08-17,事故驱动):维护者实操
gh label edit撞 HTTP 422——GitHub 标签描述上限 100 字符,而scripts/pm/ensure-pm-labels.sh的needs:contract-review行描述 ~145 字符,|| true会静默吞掉 422,脚本对该标签永远建不出(缺陷类:静默失败的幂等脚本)。本卡顺带修复:该行描述缩至 ≤100 字符(参考已验证短版:"Clause-② enqueue gate: dispatched below contract-review tier — blocked until the review clears it"),并顺带核查同脚本其余新增行无同病。ensure-pm-labels.sh 属scripts/pm/**本车道面,机械修复,无竞争在飞认领。Generated by Claude Code
os-zhuang commentedon Aug 17, 2026
{ "issue": 9211, "status": "done", "branch": "claude/issue-9211-clause2-declaration-line", "pr": "https://github.com/objectstack-ai/objectstack/pull/9322", "premise_still_valid": true, "summary": "Landed the 2+4 ruling: mandatory 'Clause-②: yes/no' claim declaration line (English machine criterion, exact spellings given) with 'yes' binding the enqueue gate path-independently (contract-review tier + needs:contract-review), plus the SKILL.md honesty sentence (path trigger covers the path limb only; content limb carried by the declaration line; gate never read as complete coverage). Piggybacks: re-wrap-never-funds-lines recorded line-neutrally at the ratchet row; ensure-pm-labels.sh needs:contract-review description cut to the live label's 97-char text with the 100-char cap fact recorded in the script header.", "files_changed": [ ".claude/skills/pm-dispatch/SKILL.md (+15/-15, line count unchanged)", "scripts/pm/ensure-pm-labels.sh (+20/-10)" ], "line_budget": { ".claude/skills/pm-dispatch/SKILL.md": "682/682 (headroom 0, unchanged; +2 added lines funded by named content deletions — each cut and its surviving authority listed in the PR body)", "other ratcheted files": "untouched" }, "gates": "Union run at cc3edea99 (final commit): check:pm-skill-ratchet PASS (682/682); check:pm-skill-id-lint PASS (9 files clean); check:skill-frame-sync PASS + check:skill-frame-freshness PASS (exit 0); check:doc-authoring PASS (376 files); @objectstack/lint check:doc-formula-expressions PASS; check:nul-bytes PASS (6069 files); bash -n ensure-pm-labels.sh PASS, all -d strings re-measured ≤100 Unicode chars. Re-derivation over actual changed paths added nothing beyond the prompt's named families. Tier output quoted verbatim in the PR body (clause ① fable-mandatory). CI on the draft PR: in_progress at report time.", "deviations": [ "Piggyback-2 sweep (commissioned by scope-supplement 3's same-disease check) found and fixed three more over-cap descriptions in the same script: pm:on-hold 107→97, pm:epic 132→83, target:$V 124→97; all named in the PR body.", "doc-formula-expressions first ran red on the fresh worktree's unbuilt @objectstack/formula dist — resolved by building the lint dependency closure; not a finding.", "os-dev.md untouched: it carries no claim template, so the declaration line lives at the template's single home in SKILL.md (dispatch prompt's '以现文结构为准')." ], "tests": "node scripts/pm/check-skill-line-ratchet.mjs → '✓ SKILL.md is 682 lines (ceiling 682; headroom 0)'; node scripts/pm/check-skill-id-lint.mjs → '✓ 9 file(s) clean'; python3 re-measure of every -d string → max 100 (pre-existing repo:objectui), all four fixed lines ≤98; full command list with output excerpts in the PR body, all at cc3edea99.", "open_questions": [], "out_of_scope_findings": [] }PR is draft and stays draft — skills-surface ADR-class, awaiting the maintainer's own merge. skip-changeset applied and read back (labels: documentation, size/s, skip-changeset).
Generated by Claude Code
os-zhuang commentedon Aug 17, 2026
PM review — ACCEPT · awaiting a human merge
PR: #9322 (draft, ADR-class, hanging for the maintainer's manual merge). Final commit
cc3edea99.Checklist: the 2+4 ruling landed exact — mandatory
Clause-②: yes | nodeclaration line in the claim template (English machine criterion, exact spellings,yesbinds the gate path-independently); the enqueue gate rewritten as two limbs (path OR declaration, either + below-tier ⇒ no enqueue; a wrongnois an auditable false statement, not a silent gap); the honesty sentence in place (path trigger covers the path limb only, never read as complete coverage). Riders landed: re-wrap prohibition at the ratchet guard row (delegation provenance cited); ensure-pm-labels.sh description cut to the live label's 97-char text with the 100-char hard cap recorded in the script header. SKILL.md 682/682, funded by named content deletions — no re-wrap. Gates green at final commit; tier derived clause ① and quoted.Spot-checks (the four funding cuts, read line-by-line): every deleted passage's rule survives — the assign+comment atomic pair kept operationally ("发不出评论就撤 assign 或不开始…永不留半个"); the quota-exemption name retained in its bold header; the tier-hint pointer collapsed to the gate section which now holds the full text (single home); the allowlist-fallback trap folded into its already-cited authority (os-dev frontmatter comment). No prohibition lost.
Bonus accepted: the same-disease sweep fixed three more over-cap label descriptions (pm:on-hold / pm:epic / target:$V), all meaning-preserving.
Post-merge note for the maintainer: rerun
bash scripts/pm/ensure-pm-labels.shlocally once this lands, so the fixed descriptions seed the sibling repos.Generated by Claude Code