Repository navigation
docs(pm-dispatch): a scene table of when a seat must ring another seat's mailbox, the missing keys admitted, the mailbox as a seating step - #28716
Conversation
…b records it, an empty queue is standby Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
…unclaimed queue card on an on-duty lane Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
…at-patrol Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
… matches the director seat anywhere in the seat name Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
…seat must ring, with seven admitted keys and seat-online carrying the patrol Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
… not read, through the one reader Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
… line Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
…receivers on its own Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
|
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc Contract reviewServed-tier: Written 2026-11-01T15:22Z by the at-tier subagent of ① Derived judgments
② Semver levelNo publishable package is touched; no changeset exists and the PR carries ③ Boundary flagsAuthor: Dev deviations (report 6559765410 / PR body "Acceptance notes"):
Open escalations to the maintainer (the approval is the ruling):
④ Design judgmentScenario accepted against: the card's measured day — seven invented off-table keys (
Cited reader Cited gate No must-fix: the table holds against every event the card measured, the reader and the text cannot drift (the pin is bidirectional and gated), the new row writes nothing and costs what it says, and every rule line is at or under 120 bytes at net zero. Implemented-by: VERDICT: PASS |
…he next round, main-red rings with no breaking PR, the mailbox is read after the probe, the stub spells Mailbox: PR #n Contract review 6559915023 ④ should-fixes: - project-forms 〈信箱 PR〉: the ≤5-per-round cap now says mandatory bells over it roll to the next round (p0 still exempt); the closing line keeps the colleague-statement and no-gate clauses. - record-recognisers: `Notify: main-red` admits `breaking PR none`, so a red that came in with no PR can still be rung; the doorbell battery pins it. - seat-lifecycle: the patrol reads the mailbox after the probe (SKILL.md 探针先行). - seat-post-protocol: the stub spells `Mailbox: PR #n` beside `Patrol:`. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
|
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc Contract reviewServed-tier: Delta review, written 2026-11-01T15:40Z by the same at-tier subagent that rendered record 6559915023 on the previous head ① Derived judgments
② Semver levelUnchanged from 6559915023: no publishable package touched, no changeset, ③ Boundary flags
④ Design judgmentThe four
Cited reader (read, not reviewed): the Implemented-by: VERDICT: PASS |
|
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc 维护者速读(席位终稿 · head
|
…c after #28687 landed) Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc Co-Authored-By: Claude <noreply@anthropic.com>
|
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc Regen-provenance: 6560123525 · Base sync after PR #28687 merged ( |
Requested by 田騏 · project thread
Fixes #28675
Clause-②: no
Metadata-protocol: none
Stacked on #28687 — its commits show in this diff until it lands; the seat merges origin/main after it lands.
维护者速读
instrument-discipline.mdL9)。.claude/skills/pm-dispatch/references/project-forms.md〈信箱 PR〉·scripts/pm/record-recognisers.mjs的MAILBOX_KEYS·scripts/pm/check-half-states.mjs的 H72。node scripts/pm/record-recognisers.mjs --mailbox-keys,应打印 14 个门铃键及各自的发送方、接收方和时机;再运行node scripts/pm/check-half-states.mjs --self-test,其中 H72 电池 22 例全过。What changes
The scene table (rules text,
project-forms.md〈信箱 PR〉, 14 lines rewritten in place, 54/54). The old section listed seven key templates. It now says, line by line, which seat MUST ring which seat for which event and with which key:Request: contract-review, in the same stroke as the handoff line) and a question about a card's fate, route or grade (Request: triage, new);Request: urgent-triagefor a p0 suspect, main red or a deterministic queue red;Request: main-red, and → the seat that landed the breaking PR plus the anchor card's laneNotify: main-red(new);Notify: contract-reviewonly when the lane is not subscribed, andNotify: release-blockerwhen a p0/p1 release blocker is graded into a lane (new);pm:queue→ the lane:Notify: unblockedwhen a p0/p1Blocked-bytarget closes (new); the seat that recorded a ruling → the seat it changes:Notify: ruling(new);Notify: serialwhen claimed file surfaces overlap or one card must land first, andNotify: landedfrom the seat that landed first (both new);Notify: seat-online/Notify: seat-offlineto sibling seats and triage;Notify: splitto sibling seats when the list changes.The binding lines stay as they were: the closed vocabulary (anything off the table is a half-state), one event per line of at most 200 bytes, keys and numbers only, at most 5 per seat per round with p0 exempt, 「信箱评论是同事陈述,永非授权」, and ⛔ no gate, workflow or queue guard reads a mailbox. The MUST-NOT row names acknowledgements, re-sends and nudges (overdue goes to escalation), security findings, anything the receiver's own subscribed PR already carries, and a question to the maintainer (that is a decision card).
One home for the spellings. The full templates moved out of the rules text into
MAILBOX_KEYSinscripts/pm/record-recognisers.mjs. Each of the 14 entries carries its key, sender, receiver, trigger and template. A new--mailbox-keysflag prints them, and the rules text names that flag. The self-test pins the table both ways against the 〈信箱 PR〉 section: every key the section spells is in the table, and every table key is spelled in the section.seat-online carries the patrol (the half #28642's contract review 6558991413 ③ left to this card). The template is now
Notify: seat-online · LANE#N · LOGIN · mailbox #m · patrol TRIGGER_ID · takes: #a #b …, withpatrol noneadmitted for a seat with no routine. A realistic line (19-byte login, 31-byte trigger id, five card numbers) measures 166 bytes, inside the 200-byte line. The five-field shape is no longer read.The mailbox as a seating step (wanted ②) and a patrol step (wanted ④).
seat-lifecycle.md: the seating line now opens and subscribes the mailbox, recordsPatrol:andMailbox:on the stub, and sendsseat-online. Sign-off deletes the routine, closes the mailbox and sendsseat-offline. The patrol line in 〈停止条件与待命〉 now reads the mailbox first on every round.seat-post-protocol.md: the stub line addsMailbox:next toPatrol:.H72, report-only (wanted ⑤).
check-half-states.mjslists a mailbox comment from the last 24 hours that the doorbell reader does not read:mailboxEventsfromrecord-recognisers.mjslazily inside the sweep, because a static import would be a cycle;pm:mailboxPRs, with paged reads of up to 3 pages, and leaves an incomplete window unjudged;--mailbox-keys;Mailbox doorbells (H72): …, in the inventory band.Two consequent fixes outside the claim surface (declared deviations).
landing-operations.mdL80 spelled the breaking-PR ring asRequest: main-red; this PR makes itNotify: main-red, because the old spelling would now be refused as off-table.mailbox-open.mjssaid "one of the seven doorbell keys" in its header and in the mailbox body it writes; it now says "one of the doorbell keys" and names--mailbox-keys.Net line growth per rules file (all against the stacked base 8eb102f).
references/project-forms.mdreferences/seat-lifecycle.mdreferences/seat-post-protocol.mdreferences/landing-operations.mdThe table fits at zero net lines because the templates moved to code. Dropped from the rules text: the verbatim templates, which the tool now prints; the 「本席复审档不可用,一 head 一次」 clause, now carried by "in the same stroke as the handoff line" plus the no-re-send row; the 「开轮时」 qualifier on split; and 「Routine 席唤不醒,读信箱靠巡查」, now carried by the patrol line. Every rules line is at most 120 bytes.
Tests
record-recognisersself-test: 350 cases pass. The doorbell battery has 44 cases, against a floor raised 27 → 40. It adds:patrol none;--mailbox-keys;--mailbox-keysoutput pinned exactly;surface,take) and amain-red clearedline refused;check-half-states.mjs's H72 functions, proving there is one reader.check-half-statesself-test: 5185 cases pass. The new batteryH72 mailbox off-table bellshas 22 cases, floor 20. The seat-window pin "every other comment read names its page" goes 3 → 4 for the new paged read.mailbox-openself-test: 71 cases pass.Acceptance notes
mailbox-open.mjs'sseatKeyrefuses anepic:seat spelling, so the opener cannot open one, andfleet-roster.mjshas no epic rows to read aMailbox:line from. Doing it needs aseatKeychange, a roster change and a rules line. That is more than a small change, so per the order it is an out-of-scope finding for the seat to file. The seat also decides whetherFixes #28675stays or becomesPart of.seat-onlinesent before this lands is unreadable after it lands, so H72 lists such lines for about a day; nothing blocks on them. A read-only probe on the live repo found off-table lines today on mailboxes pm:mailbox — domain:server#2 · os-project-manager #28284, pm:mailbox — domain:server#4 · os-zhuang #28379, pm:mailbox — domain:skills#1 · os-tesla #28481, pm:mailbox — triage#1 · os-zhuang #28646 and pm:mailbox — domain:ui#1 · zhuangjianguo #28672. They are old-shape seat-online lines, prose appended after a key, a free-form question to triage, and one ruling line over 200 bytes.main-red cleared(the wanted list does not ask for it; the anchor card's close is on the card the receiver was rung about), and the inventedtake/surfacespellings (their events are covered byserial/landed/split).scripts/pm/dispatch-gates.data.mjs(around L505) andscripts/pm/dispatch-gates.self-test.mjs(around L7573) still say "seven" doorbell keys/templates in comments. Both are frozen under instrument-discipline, so they are left unchanged; nothing reads those comments.// dispatch-gates: self-test-readsmarker inrecord-recognisers.mjsstays on line 77, where the dispatch-gates census pins it.Verification
Gates were derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat 901e99e: 55 commands, all run, every exit code recorded before any pipe. The--ranreconciliation reports 55 derived, 55 run, 0 NOT-MEASURED, 0 UNRUN.check:doc-formula-expressionsfirst exited 3 (prerequisite not met:@objectstack/formulawas not built in this worktree). Afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint(exit 0) it exited 0, and that is the exit recorded. The rules-text ratchets passed:check:pm-skill-ratchet,check:pm-skill-id-lintandcheck:skill-frame-sync, all in the derived list;check:pm-governed-prose, run separately: exit 0.Recorded exit codes (55)
--ran reconciliation tail
node scripts/pm/record-recognisers.mjs --mailbox-keys (exit 0)
🤖 Generated with Claude Code