Skip to content

skills: encode the review-chain-stall takeover rule (four conditions) into contract-review.md's clear-equals-land section #13791

Description

@huangyiirene

Provenance: maintainer ruling 2026-08-31 (director seat summon #7, decision batch #17, verbatim 「同意」 on #13758's option B). Ruling record: #13758 comment 5478594239. Filed by the director seat, session session_01KGtaLpkW1mycWgkbSb3H6t.

The rule to encode (ruled text, carry the substance verbatim)

In .claude/skills/pm-dispatch/references/contract-review.md, the 清标即落地 (clear-equals-land) section gains the stall-takeover clause: when ALL four conditions hold —

  1. a review-chain PASS is on record (an at-tier verdict comment on the card),
  2. needs:contract-review is cleared on both carriers,
  3. the PR's checks are all green (every check, ⛔ not the required subset),
  4. the review chain has been stalled past a timeout (no reply to a status probe for more than one patrol interval)

— the dispatching seat may itself flip the PR ready and arm auto-merge, leaving a provenance comment that cites the PASS. Governed surfaces stay draft-only (the terminal four-piece is unchanged). Rationale recorded on #13758: with a PASS on record there is no review left to bypass; the rule exists because a review-chain session interrupt orphaned a green, PASSed PR for four hours (PR #13669, 2026-08-31).

Boundaries

  • This is a references/** face edit ⇒ opus-build with fable-tier review per the standing tiering clause; the PR is governed (.claude/**) ⇒ draft-only + human merge / pinned-approval queue path.
  • ⛔ Do not widen: the clause covers non-governed code PRs only, and only after a recorded at-tier PASS — it is not a general "dispatch seat may land" license.
  • Mind the line ratchet: the skill main file must not grow; this lands in the references file, which is outside the ratchet.

Refs: #13758 (the ruled card) · PR #13669 (the incident).

Activity

  1. os-warren commented on Aug 31, 2026

    @os-warren
    Collaborator

    分诊补车道 → domain:skills · p1 · tooling。

    锚定。 落点 .claude/skills/pm-dispatch/references/contract-review.md ⇒ 技能根 ⇒ domain:skills(维护者 2026-08-18 裁决:「skills 相关的应该都归你管」)。

    定级 p1。 裁决当天已下(batch #17,「同意」option B),且事故是实的 —— PR #13669 一张全绿、已 PASS 的 PR 被评审链会话中断孤儿化 4 小时。这条规则消除的是无活性(liveness)缺陷,不是便利性改进。


    ⚠️ 与 #13795 冲突:同一天、同一份 skill、两条裁决,后者会架空前者大半

    这两张卡都在改 pm-dispatch 的条款② 流程,间隔 4 分钟立卡,各自独立带着「已裁决、可派发」的姿态:

    #13791(本卡) #13795
    立卡 12:48:41 12:53:02
    落点 references/contract-review.md SKILL.md +(grep 命中的)references/**
    实质 评审链停摆超时后,派发席可自行 ready + auto-merge,四条件齐备为前提 评审链不再是放行必要条件 —— 契约复核由派发席在席内以 fable 完成

    问题在这里:本卡四条件的第 1 条是「评审链 PASS 在案」、第 4 条是「评审链停摆超过一个巡逻周期」。在 #13795 之后,PASS 由派发席自己出,第 1 条与第 4 条同时塌缩 —— 一个不再作为必要条件的评审链,也就无所谓「停摆」。本卡编码的规则会变成一段几乎不可能触发的文本,躺在同一份 references 里,与新流程并列。

    ⛔ 两张卡不能并行派发 —— 落点重叠(references/** 与 grep 命中面),并行必冲突;更糟的是即使不冲突,也会在同一份章程里留下两套口径。

    分诊裁定(排序,非改写裁决):

    1. [skill] pm-dispatch 条款② 复核改制:席内 fable contract review 取代「停靠等外部评审链」,缺位死等成为历史 #13795 先落。 它是更宽的那条,且直接消除无活性。
    2. 本卡落地前重新界定范围。 [skill] pm-dispatch 条款② 复核改制:席内 fable contract review 取代「停靠等外部评审链」,缺位死等成为历史 #13795 合并后,重读本卡四条件,把仍然成立的部分写进去 —— 我的判断是「席内复核 PASS 在案 + 双载体清标 + 全绿 ⇒ 派发席 ready + auto-merge」这条主干仍然需要被明文写下([skill] pm-dispatch 条款② 复核改制:席内 fable contract review 取代「停靠等外部评审链」,缺位死等成为历史 #13795 的第 3 点只说了放行动作,没说四条件的判据形状),只是「等外部链停摆」这个触发条件要换成「席内复核完成」。⛔ 不要按现文照抄。
    3. ⚠️ 这个顺序请你确认。 两条都是你今天下的裁决,我只是排了先后、没有改动任何一条的实质;如果你的本意是两条并存(外部链在时走本卡的四条件、不在时走 [skill] pm-dispatch 条款② 复核改制:席内 fable contract review 取代「停靠等外部评审链」,缺位死等成为历史 #13795),说一声,我把本卡改回独立可派发并在两卡上写明分界。

    本卡自身的边界,派单时原样保留

    Refs:#13758(裁决卡)· PR #13669(事故)· #13795(同日、同面的更宽裁决)


    Generated by Claude Code

  2. claude commented on Aug 31, 2026

    @claude
    Contributor

    Claim (os-dev, dispatched by the skills seat):
    Session: session_01Msg17tAHJ3jVTYFgHydCm2 (mode:subagent — dev shares the dispatching seat's session)
    Branch: claude/issue-13791-stall-takeover-rescope
    Worktree: objectstack-issue-13791 (base origin/main @ 5994611)
    File surface: .claude/skills/pm-dispatch/references/contract-review.md only
    Clause-②: no

    Re-scope contract in force per the PM claim above (comment 5483086042) and triage's reconciliation (comment 5479006050): encode the criteria SHAPE of clear-equals-land under the in-seat regime; the ruled conditions 1 and 4 collapse with the external chain's demotion. Read channel this run: REST (probe 200) plus git — MCP reserved for writes only.


    Generated by Claude Code

  3. claude commented on Aug 31, 2026

    @claude
    Contributor

    os-dev-report

    {
      "issue": 13791,
      "status": "blocked",
      "branch": "claude/issue-13791-stall-takeover-rescope",
      "pr": null,
      "premise_still_valid": true,
      "summary": "Premise VERIFIED, not falsified: the criteria SHAPE is genuinely NOT yet encoded. The current 放行 = 清标即落地 bullet (contract-review.md L33-38 on origin/main 5994611a) states the release ACTION (PASS then strip both carriers, provenance comment, pre-land check, ready, auto-merge) but carries no walkable precondition list. Condition 3 (every check green, NOT the required subset) is absent from this file AND from landing-operations.md; it exists only as a general enqueue rule single-sourced at SKILL.md L742. Condition 1 (in-seat PASS ON RECORD as an at-tier verdict comment) is not stated as an arm precondition. COMPOSITION IS CLEAN — no intent fork to report: the batch-17 option-B ruling supplies the criteria list, the later same-day in-seat reform (delivered by PR 13812) supplies the regime, and ruled conditions 1 and 4 collapse exactly as triage recorded (an external chain that is no longer a release precondition cannot stall). BLOCKED ON THE LINE RATCHET, measured on my own head, not recalled: contract-review.md is 57 lines against ceiling 57 with headroom 0. I drafted three honesty levels of the criteria list and measured each; ALL exceed the ceiling even after applying the one line of legitimate real-deletion payment I could find. The dispatch forbids a ceiling raise, and the only remaining payment is deleting a ruled clause — refused on the state-machine precedent, and the nearest candidate is the governed-surface boundary the dispatch explicitly forbids widening. So: no PR, no edit committed, worktree restored to base. NO file-surface breach, nothing flipped, nothing armed, nothing queued.",
      "tests": "All readings on head 5994611a (branch pushed, zero commits ahead of origin/main; worktree verified clean by `git status --short` empty and `git diff HEAD --stat` empty). [1] BASELINE `node scripts/pm/check-skill-line-ratchet.mjs` exit 0, its own verdict line: 'check-skill-line-ratchet: .claude/skills/pm-dispatch/references/contract-review.md is 57 lines (ceiling 57; headroom 0).' [2] MUTATION LEG — applied the full criteria-list encoding PLUS the one-line dedup payment, then re-ran the same gate: exit 1, verdict 'contract-review.md is 60 lines; the ratchet ceiling is 57' plus a second red 'has 3 line(s) over the 120-byte budget'. Mutation confirmed on disk by the gate reading 60 lines and naming the three over-cap lines, not by any editor exit code. [3] RESTORE LEG — `git checkout HEAD -- .claude/skills/pm-dispatch/references/contract-review.md`, restore proven by `git status --short` empty and `git diff HEAD --stat` empty, then the gate re-run to exit 0 at 57 lines. Tree is back on the measured baseline, so nothing downstream measured a mutated tree. [4] FLOOR MEASUREMENT of three honesty levels, byte-exact, each packed at the gate's own 120-byte cap and each already crediting the 1 line of dedup payment: A (full: provenance + `--pair` reader + its exit-code register) = 60 lines; B (drop the exit-code register) = 59; C (drop BOTH the maintainer provenance and the `--pair` reader, bare three-item list) = 58. Ceiling is 57, so even C is over by 1 — there is no encoding of the ruled list, however stripped, that fits. [5] `node scripts/pm/check-clause2-carriers.mjs --self-test` exit 0, '64 cases pass'. Flag spelling VERIFIED against the merged script as the dispatch required: `node scripts/pm/check-clause2-carriers.mjs --pair PR-NUMBER`, documented in its own header as 'ONE PR: a pre-arm predicate', exit register 0 = limbs legible and carriers agree, 4 = they do not, 3 = environment could not answer (deliberately NOT 3-as-clean). The dispatch's citation is exact. [6] GATE UNION `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` exit 2 on an empty diff ('this branch changes nothing against origin/main'), which is the correct reading for a no-PR delivery. Hypothetical-surface derivation for the target file, for whoever lands this next: exit 0, 7 families — check:agent-test-spelling, check:doc-authoring, check:doc-formula-expressions, check:pm-governed-merges, check:pm-skill-id-lint, check:pm-skill-ratchet, check:skill-frame-sync; and it independently confirms 'no path-derived mandate' for references/**, matching the PM claim. Read channel: REST probe returned HTTP 200 so all card and comment reads went over REST plus git; no wide-table scans.",
      "mcp_calls": "0 — every GitHub read and write this run went over REST (probe HTTP 200) or git; no MCP GitHub call was made",
      "open_questions": [
        {
          "question": "The ruled criteria list cannot be encoded inside contract-review.md's ceiling of 57 (file is AT 57, headroom 0). Measured floors after crediting the one line of legitimate real-deletion payment: full encoding 60, reduced 59, bare-minimum 58. The dispatch forbids a ceiling raise and the only remaining payment is deleting a ruled clause. Which resolution does the seat take?",
          "options": [
            "A — raise the ceiling to 60 and land the FULL encoding (provenance + `--pair` reader + exit-code register), quoting the maintainer ruling (2026-08-31 batch 17, verbatim agreement on option B) in the PR body. This is the ratchet's own prescribed escape: its red text says 'Raising a ceiling requires a maintainer ruling quoted in the PR', and the ruling here explicitly ORDERED the text into this file's 清标即落地 section. It is also the standing precedent for THIS FILE, used twice already the same day — 48 to 51, then 51 to 57 — both recorded in the CEILINGS map with the identical reasoning ('could not be paid in place', 'landed count, headroom 0, same convention').",
            "B — rule which existing clause is deleted to pay 3 lines. I found no candidate that is not a ruled clause; the nearest ones are the governed-surface boundary and the terminal-two clause, i.e. exactly the text the dispatch forbids widening away from. This option needs a maintainer ruling of its own, not a seat judgment.",
            "C — land the bare-minimum variant at 58 and raise the ceiling by 1. It does not escape the decision (still a raise), and it buys a worse artifact for the same governance cost: it drops the maintainer provenance the file's own convention requires on every ruled bullet, and drops the `--pair` mechanical reading the PM explicitly authorized as composition.",
            "D — close the card as not-encodable and leave the criteria as they stand. Rejected on the merits: the liveness defect the ruling exists to remove stays unencoded, and condition 3 in particular has no home anywhere in the clear-equals-land path."
          ],
          "recommendation": "A. The governance cost of a raise is paid ONCE regardless of the size landed, so the two lines that separate C from A are free at the margin and buy the mechanical per-pair reading plus the provenance line the corpus convention requires. The ratchet is explicitly a proxy for CONTENT VOLUME with a quoted-ruling escape, and the qualifying ruling already exists and already names this file and this section — so a raise here is the mechanism working as designed, not an erosion of it. B is refused on the state-machine precedent already recorded in the CEILINGS map and would put the dispatch's own non-widening constraint at risk. Note this is a budget decision the dispatch reserved to the PM, so I stopped rather than taking it: I did not raise the ceiling, did not commit the edit, and left the tree on its measured baseline. The drafted text and the byte-exact floors above make the follow-up dispatch mechanical."
        }
      ],
      "out_of_scope_findings": [
        "NOT filed as a card, deliberately, and the reason is a serial one: contract-review.md L46-48 restates the downgrade-fuse READING mechanism that platform-readings.md L281-284 already single-sources (the get_session MCP spelling, the external_metadata.last_served_model field, and the self-attestation rationale) — while the same bullet ALREADY carries a pointer to platform-readings for it, so the file both points at the single source and copies it. That is the 'one rule, one home' drift this corpus punishes elsewhere. Deduping it to a pointer is a real deletion worth exactly 1 line (measured: 432 bytes over 4 lines becomes 348 bytes over 3), and it is the payment I credited in every floor above. Filing it as its own card would create a second same-file claim on the section family this very card is serialized on — the collision the seat's serial discipline exists to prevent — so it belongs to whichever round lands 13791, and I am handing it to the PM rather than filing it. No other out-of-scope defect found."
      ]
    }

    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

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions