Measured incident, 2026-08-18 ~23:4xZ, filed by the seat that committed it (skills seat, session session_01WswfK2yNYT9hNnMH6TzAwL; maintainer's correction verbatim: 「devx 一直在上班处理任务,至于为什么显示没在,还是你skills 的问题」).
What happened
This seat reported the devx seat as "possibly dead" to the maintainer, reasoning from the seat post's updated_at (18h stale) against a doubling queue. The correct reading — taken one query later — showed 15 cards in flight, six with outputs minutes old. The seat was not merely alive; it was running hot.
The structural trap
Seat posts refresh at round boundaries by design (写侧刷新点 = 轮次边界; mid-round state lives on cards as claim/ACCEPT comments). Therefore the harder a seat works inside one long round, the staler its post looks — the busiest seat is exactly the one the board shows as dead. The fleet board (label:pm:seat listing) leads every reader — patrols, sibling seats, the maintainer — straight to updated_at, the one number the protocol's own liveness criterion says not to use. The criterion (会话座位查最近一条产出评论的时间戳) is already right; what is missing is ① an explicit ⛔ against the proxy, and ② a runnable one-line reading so nobody derives liveness from a glance.
Change (.claude/skills/pm-dispatch/references/seat-post-protocol.md, the 活性判定 bullet)
- Add: ⛔ never infer liveness (or death) from the seat post's
updated_at or title — a mid-round seat is stale-by-design there; the busiest seat looks deadest. - Add the runnable reading: latest platform-stamped output by the seat — e.g. the lane's
pm:dispatched cards sorted by updated_at desc (one search query), or the seat's latest claim/ACCEPT/audit comment timestamp. Minutes-fresh card churn = alive, whatever the post says. - Ratchet: file is 101/101 headroom 0 — payment owed in the same file, ⛔ no re-wrap.
Graded at filing by the skills seat (own-lane exception): promote pm:queue — the reading cost one wrong report to the maintainer today and the fix is two lines; S, but clause ① path (pm-dispatch references) ⇒ fable.
Measured incident, 2026-08-18 ~23:4xZ, filed by the seat that committed it (skills seat, session
session_01WswfK2yNYT9hNnMH6TzAwL; maintainer's correction verbatim: 「devx 一直在上班处理任务,至于为什么显示没在,还是你skills 的问题」).What happened
This seat reported the devx seat as "possibly dead" to the maintainer, reasoning from the seat post's
updated_at(18h stale) against a doubling queue. The correct reading — taken one query later — showed 15 cards in flight, six with outputs minutes old. The seat was not merely alive; it was running hot.The structural trap
Seat posts refresh at round boundaries by design (写侧刷新点 = 轮次边界; mid-round state lives on cards as claim/ACCEPT comments). Therefore the harder a seat works inside one long round, the staler its post looks — the busiest seat is exactly the one the board shows as dead. The fleet board (
label:pm:seatlisting) leads every reader — patrols, sibling seats, the maintainer — straight toupdated_at, the one number the protocol's own liveness criterion says not to use. The criterion (会话座位查最近一条产出评论的时间戳) is already right; what is missing is ① an explicit ⛔ against the proxy, and ② a runnable one-line reading so nobody derives liveness from a glance.Change (
.claude/skills/pm-dispatch/references/seat-post-protocol.md, the 活性判定 bullet)updated_ator title — a mid-round seat is stale-by-design there; the busiest seat looks deadest.pm:dispatchedcards sorted byupdated_atdesc (one search query), or the seat's latest claim/ACCEPT/audit comment timestamp. Minutes-fresh card churn = alive, whatever the post says.Graded at filing by the skills seat (own-lane exception): promote
pm:queue— the reading cost one wrong report to the maintainer today and the fix is two lines; S, but clause ① path (pm-dispatch references) ⇒ fable.