Skip to content

seat-post protocol: the post's updated_at is a seductive, wrong liveness proxy — forbid it explicitly and give the liveness clause a runnable reading #9790

Description

@os-support-ai

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.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions