Skip to content

pm-dispatch protocol: a contract-review PASS must complete the landing in the same stroke — close the clear→land seam #12268

Description

@os-trump

Filed by the PM seat (session session_01H9StxQgG2DPA26XzZZqnJB) on the maintainer's instruction (2026-08-25, live PM chat, verbatim: 「立卡」), recording a ruling already in force.

The seam

The pm-dispatch protocol splits the close of a clause-② card between two seats and stops short of naming one actor for the last step:

  • .claude/skills/pm-dispatch/references/contract-review.md ends the review chain's duty at label clearing — "PASS 双载体同笔清标 … 标清后卡方可入队". Who performs the queueing is out of that file's scope.
  • .claude/skills/pm-dispatch/references/landing-operations.md (§B) assigns ready-flip + auto-merge to the lane PM's landing window ("auto-merge 由 PM 挂、dev 永不碰").

On paper the landing has an owner. In practice the design assumes a resident, cycling lane-PM seat — but seats are ephemeral sessions, and by the time the review chain clears the label, the dispatching seat is usually gone. A cleared PR then sits in "gate cleared, nobody landing" until some seat happens to sweep. The protocol already knows this seam drops PRs: scripts/pm/check-half-states.mjs carries a dedicated detection for exactly this state (已复核就绪却无人落地的孤儿 PR 检测) — a radar was built for the failure mode while the responsibility split that produces it was left in place.

Measured instance (2026-08-25)

Three PRs PASSed contract review with dual-carrier labels cleared: PR #12130 (#12047), PR #12210 (#11900), PR #12189 (#11713). Each owning seat's claim comment had declared "Draft + gated is the intended end state … this seat does not flip ready, does not arm auto-merge"; the chain's verdicts initially said "landing stays with the owning seat" — mutual deferral, each side pointing at the other. Resolved live by maintainer ruling, verbatim and untranslated:

「审核通过你应该直接负责合并吧,还要等原始的项目经理吗」

The chain then flipped all three ready and armed the queue in the same stroke; the ruling is recorded on each PR.

The ruled practice (in force since 2026-08-25; this card encodes it in the protocol text)

A contract-review PASS on a non-governed code PR is completed by the review chain in the same stroke: clear both carriers → run the landing-operations preflight (mergeable_state, closing-keyword scan, true-green check, ready-before-auto-merge ordering) → flip ready → arm auto-merge/queue. The lane-PM landing window and the half-states orphan patrol become backstops, not the primary mechanism. Unchanged: governed surfaces (draft-only, human/delegated merge — never queued by the chain), FAIL/REWORK paths, and the tier fuse (a below-tier session still cannot clear, so it still cannot land).

Scope of the edit

  • references/contract-review.md — 归属 section: after "PASS 双载体同笔清标", the same stroke completes the landing per the landing-operations preflight; quote the ruling verbatim with its date, per the file's convention. ⚠️ That file forbids issue-number citations (⛔ 不引用 issue 编号) and check:pm-skill-id-lint enforces it repo-wide on skill files — cite by date + verbatim quote only.
  • references/landing-operations.md — §B: one line noting that PRs landed by the contract-review chain arrive already ready+armed; the window's own duties (follow to MERGED, kick-out handling, post-merge reconciliation) are unchanged.
  • ⚠️ Line ratchet: scripts/pm/check-skill-line-ratchet.mjs ceilings are shrink-only. The edit must fit inside the existing ceilings (pay by deletion if needed); if a raise is unavoidable, the raising PR must quote a maintainer ruling — the quotes above are available for that purpose.

Discipline

Governed surface (.claude/**): worktree-first, draft-only PR, human merge (or the maintainer's delegated-merge flow) — ⛔ the PR for this card is never queued or armed by its author. Clause-②: no (internal protocol text; no public contract surface moves). Acceptance: the protocol names the review chain as the landing actor after PASS; the orphan detection in check-half-states.mjs stays as backstop; check:skill-line-ratchet, check:pm-skill-id-lint, and the governed-merges self-test stay green.

Refs: the three recorded instances above · check-half-states.mjs (the pre-existing radar for this seam)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions