Skip to content

Shift-close = immediate seat release + linger mode: fix the round-open mutex's two false positives and codify the outgoing PM driving named tails to merge #12678

Description

@os-litant

Filed by the skills seat (session_01MnijPVVDakqK2J335JoJtq) executing a maintainer ruling issued in live PM chat, 2026-08-27 ~06:4xZ.

Ruling (verbatim, untranslated)

The maintainer's proposal-question:

「是否建议项目经理下班的日常流程应该是立刻进行交接,并继续处理完手上的任务到合并,这样可以方便下一任项目经理尽快接手。」

The seat answered with a three-part design (below); the maintainer's execution ruling on that exact three-part shape, verbatim: 「落协议」. The three parts are therefore the ruled scope — not a menu.

Evidence — the observed failure this fixes

2026-08-27 04:19Z: the maintainer summoned a fresh engine-lane PM. It ran the four mutual-exclusion readings and self-recused, offering the maintainer only "wait ~40–50 minutes" or "explicitly override". Two false positives compounded:

  1. Reading ① found the predecessor's shift-close briefing posted 4 minutes earlier and treated its recency as occupation. A close-out briefing is the predecessor's explicit declaration that it will write no more — it should read as a release marker, not as a lock. (Compounding half-state: the briefing was posted but the seat post title still said 🟢 — the close sequence has no defined final stroke.)
  2. Reading ③ found fresh non-self claims on two lane cards and read them as seat occupation — but those strokes were the skills seat's contract-review chain landing a cross-lane takeover patch, not an engine seat at work. Claims carry session ID and seat identity; cross-seat chain strokes are distinguishable and should not count.

Net effect: the maintainer's explicit summon was bounced by a passive timer, exactly the outcome the seat-availability design should prevent.

The three ruled changes

① Close-out briefing = seat release. The four-readings rule changes so that a shift-close briefing, when it is the latest event, releases the seat immediately — the recency window applies only to un-closed activity (a live or silently-dead predecessor). Close-sequence ordering is defined: seat-post body/title refresh first, briefing comment as the final stroke; the successor's release condition is the briefing's presence (a lagging title is a repairable half-state the successor fixes on seating, not a blocker).

② Linger mode (离任留守). The outgoing PM may keep driving its in-hand items to merge after close. Its post-close write surface is exactly the items named in the briefing (accepted PRs awaiting queue, review-chain carriers mid-landing) — no queue reads, no new dispatches, no un-named cards. The successor seats immediately and treats the named set as fenced (same declarative-collision shape as the hot-file serial queue). Residual timers of the outgoing session may only touch fenced items. When the last tail merges, the outgoing PM posts one tail-clear note on the seat post. Title vocabulary is NOT extended: a closed seat shows ⏳ vacant; the linger register (who lingers, which tails) is one line in the 说明 section. This flips the default from "hot-handoff custody to the successor" to "custody retained by the reviewer who accepted the work" — the natural extension of the 2026-08-25 清标即落地 ruling (the one who reviewed lands it).

③ Reading-③ cross-seat filter + explicit-summon override. Reading ③ counts only claims claiming this seat's lane dispatch — strokes by the review chain / Director seat on lane cards are cross-seat and do not occupy the seat. And a maintainer's explicit summon is the arbiter: with a close-out briefing present, the summoned session seats directly (repairing any title half-state on the way in); with no briefing (predecessor possibly dead mid-round), the conservative path stays — ask the maintainer to confirm termination, their confirmation seats.

Non-goals (binding)

  • 宁少跑 stays the rule for the un-closed case; nothing here weakens the mutex where no close-out exists.
  • No new seat-post title state word; no new labels; no change to the claim marker or any patrol predicate (check-half-states.mjs untouched by this card).
  • The dead-claim reclaim path and the takeover-liveness rules (>24h no output etc.) are untouched.

File surface

.claude/skills/pm-dispatch/SKILL.md (four-readings mutex clause + 收班 line) + references/seat-post-protocol.md (close sequence, linger-mode rules, title/说明 register) + references/dispatch-runbook.md only if the four-readings detail rows live there (bounded to the clauses this card names). All files sit at zero-headroom ratchets — every add is paid by same-file cuts with a cut ledger naming surviving homes.

Acceptance

  • The engine-case transcript replayed against the new text yields: seat immediately (briefing present), title repaired, fenced set = the briefing's named tails, no wait and no question bounced to the maintainer.
  • A predecessor with NO briefing still triggers the conservative path verbatim.
  • Ratchets hold (SKILL.md 1005/1005 etc.); check:pm-skill-ratchet, id-lint, frame-sync/freshness green; governed PR stays draft for human merge.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions