Skip to content

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

Closed

Description

@os-zhuang

Filed by the domain:metadata execution seat (#6367), PM session session_01NTKPDRoynY8i3HmdSFUxFj. ⚠️ Filed by the seat the gate exists to catch — both of this seat's clause-② breaches today are the motivating incidents, so read the disposition suggestions with that interest in mind.

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.ts contract 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.

⚠️ This is the same shape as the three list-derivation findings this shift (#9171, #9182, #9192): a path- or dependency-derived predicate consumed as if it covered the semantic question. The difference, and the reason this one is worse: those cost a missed gate run or a stale docs list. This one is the enforcement mechanism for a maintainer ruling, and its miss is silent by construction.

What a disposition has to decide

  1. 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 & model line.
  2. Make the dispatching seat declare — every claim comment states clause-② yes/no explicitly; a yes binds the enqueue gate. Cheap, but it relies on the same judgement that failed twice today.
  3. 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.
  4. 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.

⚠️ That script uses 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

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

  1. added theissue type on Aug 17, 2026
  2. os-zhuang commented on Aug 17, 2026

    @os-zhuang
    ContributorAuthor

    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):

    Also flagged for the maintainer: the needs:contract-review label object was implicitly created grey/description-less and ensure-pm-labels.sh's || true will never repair it — needs a one-off manual label edit (d93f0b, description at scripts/pm/ensure-pm-labels.sh:49).


    Generated by Claude Code

  3. os-zhuang commented on Aug 17, 2026

    @os-zhuang
    ContributorAuthor

    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.

    1. Mandatory declaration line — every claim comment carries an explicit Clause-②: yes/no line; a yes binds the enqueue gate (fable tier + needs:contract-review required regardless of paths). This is also what makes Option 1 real: the gate now has a durable, machine-readable record to key on. A wrong no becomes an auditable false statement on the record instead of a silent gap — review can catch it, and the deterrent is the point.
    2. Honesty sentence in SKILL.md — the gate's path trigger is documented as covering the path limb only; the content limb is carried by the declaration line. The gate must never be read as complete coverage.
    3. Same batch: the mis-created grey needs:contract-review label object gets its one-off manual edit (d93f0b + the description at ensure-pm-labels.sh:49) — the script's || true can never repair it.
    4. ⛔ Option 3 (widen globs) stays ruled out by the card's own measurement; Option 1 as a separate mechanism is subsumed by the declaration record.

    Dispatch notes: this edits .claude/skills/pm-dispatch/** / the os-dev claim contract ⇒ claude-fable-5 mandatory (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:queue in the same stroke.


    Generated by Claude Code

  4. self-assigned this
    on Aug 17, 2026
  5. os-zhuang commented on Aug 17, 2026

    @os-zhuang
    ContributorAuthor

    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

  6. os-zhuang commented on Aug 17, 2026

    @os-zhuang
    ContributorAuthor

    范围补充(搭载句二,skills 席,2026-08-17):维护者将 re-wrap 筹行的定性授权本席裁定(原话:「待办⑨ re-wrap 定性 这个你决定」)。裁定:⛔ re-wrap(折行合并)不得用作棘轮筹行——棘轮的治理本意是内容体量(维护者:「小心 skills 增长过快」),行数是其机读代理;re-wrap 以有限的密度储备抵偿新增,绕开「新增以删减付账」,且超长行降低 diff 可读性。密度优化仅允许在净减内容的 PR 中顺带发生。既往(#9201)不咎。

    实施:本卡 SKILL.md 面顺带一行,落在棘轮条款处,行中性自筹装不下则弃收本句并报告,⛔ 不挤占主交付(声明行 + 诚实句)。


    Generated by Claude Code

  7. os-zhuang commented on Aug 17, 2026

    @os-zhuang
    ContributorAuthor

    范围补充(搭载三,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

  8. os-zhuang commented on Aug 17, 2026

    @os-zhuang
    ContributorAuthor
    {
      "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

  9. os-zhuang commented on Aug 17, 2026

    @os-zhuang
    ContributorAuthor

    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 | no declaration line in the claim template (English machine criterion, exact spellings, yes binds the gate path-independently); the enqueue gate rewritten as two limbs (path OR declaration, either + below-tier ⇒ no enqueue; a wrong no is 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.sh locally once this lands, so the fixed descriptions seed the sibling repos.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions