Skip to content

docs(pm-dispatch): relax contract-review eligibility condition ② per maintainer ruling 2026-08-21 - #10936

Merged
huangyiirene merged 1 commit into
mainfrom
claude/issue-10822-contract-review-self-clear
Aug 22, 2026
Merged

docs(pm-dispatch): relax contract-review eligibility condition ② per maintainer ruling 2026-08-21#10936
huangyiirene merged 1 commit into
mainfrom
claude/issue-10822-contract-review-self-clear

Conversation

@huangyiirene

@huangyiirenehuangyiirene commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Fixes#10822

What

Relaxes reviewer-eligibility condition ② of the needs:contract-review review chain in .claude/skills/pm-dispatch/SKILL.md (「入队与落地」 section), implementing the maintainer ruling of 2026-08-21, quoted verbatim and untranslated in the clause per the file's dated-ruling convention: 「你自己就是 Fable,自己就可以审核」.

  • Condition ① (runs at CONTRACT_REVIEW_TIER) stays hard, and the finding is machine-read only — the existing 降档保险丝 get_session reading of external_metadata.last_served_model; self-description is still not a reading.
  • Condition ② (not the dispatching seat) is relaxed from an eligibility condition to a routing preference: a dispatching seat machine-verified at tier by that same reading MAY perform the contract review and clear the label on cards it itself dispatched. Rationale kept in-clause: the PM writes no code, so it reviews the lower-tier implementer's contract-face increment, not its own work product.
  • The review itself is NOT waived: a verdict still lands on the card before the label clears; the preceding bullet's 「⛔ 禁止自查放行」 is explicitly disambiguated in-clause as forbidding review-free clearing, not this path.
  • The triage sub-round remains the DEFAULT clearing path; at-tier seat self-clear is the fallback; below-tier seats still leave the label in place and wait (per the 2026-08-20 席位档策略).
  • The 降档保险丝 and 载体不迁移 sentences in the same bullet are intact, byte for byte.

Verification

Initial full pass at the pre-amend HEAD 125d4562b; a PM patch round then amended one byte inside the quoted ruling (half-width comma → the issue body's faithful full-width comma, no other change — the two trees differ by that single character), and the two pm-skill gates were re-run at the final HEAD b0ab63c82:

  • At b0ab63c82: pnpm check:pm-skill-ratchet → "✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md is 682 lines (ceiling 682; headroom 0)"; pnpm check:pm-skill-id-lint → "✓ check-skill-id-lint: 17 file(s) clean (pattern /#[0-9]{3,}/g)".
  • At 125d4562b (tree identical but for the one quote byte): node scripts/pm/dispatch-gates.mjs (no path args; change set derived from git) derived 1 path, 7 matched local gate families — all 7 run, all green:
    • pnpm check:skill-frame-sync → "✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files" — four-prism copies untouched.
    • pnpm check:pm-governed-prose → "✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces"; pnpm check:pm-governed-merges self-test → "✓ check-governed-merges --self-test: 90 assertions".
    • pnpm check:doc-authoring → "✓ doc authoring guard: 389 files clean — no bare metadata literals"; pnpm --filter @objectstack/lint run check:doc-formula-expressions → "✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 416 files / 1444 TS blocks judged clean" (its first run failed only on the fresh worktree's unbuilt @objectstack/formula dist; green after building the dependency closure).
    • pnpm check:nul-bytes → "check-nul-bytes: OK (scanned 6312 text file(s) — 6312 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes)".
    • Plus the two pm-skill gates above, green at both shas.

Governed surface

This PR touches .claude/** — human merge only (Prime Directive #14). It stays draft; it is never queued, armed, or flipped ready by any seat.

Provenance

The interrupted first dispatch run left an unpushed local commit in this container's worktree. This run verified that edit against the issue's binding constraints and against current origin/main (9d101d28; zero churn on the file since the stale base), then rebased it onto that tip via cherry-pick. An intermediate push of the stale-based commit (a fast-forward; no history lost) was superseded by the rebased head. The PM patch round (comma fidelity, option B) amended in place — same branch, lease-pinned force push.

Changeset: none — .claude/-internal protocol text, no published surface; skip-changeset label applied per repo convention.


Generated by Claude Code

@huangyiirenehuangyiirene added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/xs labels Aug 21, 2026 — with Claude
@github-actionsgithub-actionsBot added the documentation Improvements or additions to documentation label Aug 21, 2026
…maintainer ruling 2026-08-21
Condition ② (not the dispatching seat) is relaxed from an eligibility
condition to a routing preference: a dispatching seat machine-verified at
CONTRACT_REVIEW_TIER (the downgrade fuse's get_session reading) may perform
the contract review and clear the label on cards it itself dispatched.
Condition ① stays hard; the review itself stays (verdict on the card before
the label clears); the triage sub-round remains the default clearing path,
seat self-clear is the at-tier fallback; below-tier seats still wait.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ApyDuQY2fkunMCqXiqvBhR
@huangyiirene
huangyiireneforce-pushed the claude/issue-10822-contract-review-self-clear branch from 125d456 to b0ab63cCompareAugust 21, 2026 19:39
@huangyiirene
huangyiirene marked this pull request as ready for review August 22, 2026 01:23
@huangyiirene
huangyiirene added this pull request to the merge queueAug 22, 2026
Merged via the queue into main with commit fb0dd00Aug 22, 2026
27 checks passed
@huangyiirene
huangyiirene deleted the claude/issue-10822-contract-review-self-clear branch August 22, 2026 01:35
@github-actions

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 32543312297 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

失败的 job(日志抽取,best effort):

  • Console Pin Gate — 失败步骤: Build the Console SPA at the pinned objectui SHA

    ✗ Build failed in 5.85s
    

↳ 失败原因 是判读的关键:超时Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

跨 PR 相同签名(24h,按失败测试文件聚合):

  • ⚠️本次没有可用的聚合签名(日志里没有能解析出测试文件名的 FAIL 行)—— 这不是「没有同签名的其他 PR」,是这一轮没测到。跨 PR 聚合本次不可用,请手工比对其他 PR 的同类评论。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 58 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

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

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@huangyiirene@claude