Repository navigation
feat(pm): a project seat's patrol is part of seating, recorded on the stub, and its absence is a half-state reading - #28687
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
|
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc Contract reviewServed-tier: Written 2026-11-01T14:03Z 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 (PR body "Acceptance notes" / report
④ Design judgmentScenario accepted against: #28560 (p1,
Cited gate
No must-fix: the rule holds against the incident it is accepted against, the gate reads the exact spelling the rule names, and both rows are readings that write nothing. Implemented-by: VERDICT: PASS |
… matches the director seat anywhere in the seat name 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-01T14:17Z by the same at-tier subagent that rendered record 6558991413 on the previous head ① Derived judgments
② Semver levelUnchanged from 6558991413: no publishable package touched, no changeset, ③ Boundary flags
④ Design judgmentThe three 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>
Requested by 田騏 · project thread
Fixes #28642
Clause-②: no
Metadata-protocol: none
维护者速读
Patrol: TRIGGER_ID · CRON行,收班同笔删掉;队列空是待命而非停查,「连查几次没变化就停」的习惯不适用;半状态巡查新增两行只读读数:H70(在任项目席的座位贴没有Patrol:行)、H71(有 🟢 席位的车道上,无人认领且超过 2 小时无动静的pm:queue卡)。.claude/skills/pm-dispatch/references/seat-lifecycle.md〈座位贴协议〉首两行与〈停止条件与待命〉新两行;②seat-post-protocol.md存根行与〈座位 Routine 创建〉末行;③scripts/pm/check-half-states.mjs的h70HeldSeatWithoutPatrol/h71UnclaimedOnDutyLane。node scripts/pm/check-half-states.mjs --self-test,预期 exit 0,末行电池清单含H70/H71 seat patrol 27/26。What changes
Rules text (
.claude/skills/pm-dispatch/references/, every line rewritten in place; no ceiling moved):seat-lifecycle.md〈座位贴协议〉 — the rule's one home: seating creates the self-bound patrol routine, recordsPatrol:on the stub and sendsseat-onlinein the same act; the sign-off deletes it in the same act asseat-offline. The key pointer moved to the next line.seat-lifecycle.md〈停止条件与待命〉 — an empty queue is standby: the patrol runs until sign-off, only the maintainer's order stops it, and the "stop after N quiet checks" habit does not apply. The patrol prompt claims up to the seat'sbatchlimit first, then runs the five standby items listed right below it (pm:blocked/pm:on-holdunlock, in-flight PRs to MERGED, and the rest).seat-lifecycle.md〈断粮与跨墙恢复〉 — the old line 「项目席巡查 routine 默认每小时跑各车道待命项…」 is deleted; each part has a home already: hourly isseat-post-protocol.md〈座位 Routine 创建〉, the standby items are the new prompt line, the wall note is the stub's line, no cron chain is SKILL.md 〈唤醒〉.seat-post-protocol.md— the stub adds aPatrol:line; 〈座位 Routine 创建〉 names its spellingPatrol: TRIGGER_ID · CRONas where the current value lives (the director seat has none).project-forms.md〈席位是读出来的〉 — 「首次坐席自建」 becomes 「坐席即建巡查 routine」 with a pointer toseat-lifecycle.md.Half-state rows (
scripts/pm/check-half-states.mjs, report-only, zero extra requests — both read listings the sweep already holds):state) — a heldpm:seatpost (🟢 a login; not🟢 Routine, not the director seat, not vacant or paused) whose body has noPatrol:line. The shared directive reader is used, so- **Patrol:** …counts as a line. The value is not judged.stall) — an open, unassignedpm:queuecard (notpm:epic) on a lane where some seat post reads 🟢, quiet for more thanQUEUE_ON_DUTY_UNCLAIMED_HOURS= 2. The clock isupdated_at(H10/H30's clock), so the age is a lower bound on time in the queue.H70/H71 seat patrol, 27 cases, floor 26: firing cases, the live decorated spelling, out-of-scope arms (Routine, director, vacant/paused, assigned, epic, closed, PR rows), the 2 h boundary, an unreadable stamp, the lane alias, and the band and push registry.Tests
node scripts/pm/check-half-states.mjs --self-test→ exit 0,5158 cases pass, batteryH70/H71 seat patrol 27/26.f4027cfe, 2026-11-01: H70 fired on 16 seat posts ([PM seat] repo:cloud#1 — 🟢 baozhoutao · session_01FSg7JRUiTPo8GrgT38tAWP #6026 [PM seat] domain:server · seat 1 — 🟢 os-elon-musk · 由 os-elon-musk 账户的项目负责 #6367 [PM seat] domain:skills — 🟢 os-elon-musk · 由 os-elon-musk 账户的项目负责 #7623 [PM seat] repo:docs.objectos.ai — 🟢 zhuangjianguo · 由 zhuangjianguo 账户的项目负责 #9831 [PM seat] repo:www.objectos.ai — 🟢 held · hotlong · session_01FeA1nwBz1ohH65dvffUGKr · R1 opened 2026-10-05 · positioning wave (copy PR + 5 posts on slots 10-08…10-22) · slot Routine trig_017aGwYCcm4ToQxSuQxU1gSi #12224 [PM seat] domain:spec · seat 3 — 🟢 os-sales · 由 os-sales 账户的项目负责 #18883 [PM seat] domain:spec · seat 4 — ⏳ vacant #18917 [PM seat] domain:spec · seat 5 — ⏳ vacant · 留守 #29571 #29618 (os-warren) #19357 [PM seat] domain:devx · seat 2 — 🟢 marchtian #20163 [PM seat] domain:server · seat 2 — 🟢 os-bill · 由 os-bill 账户的项目负责 #20966 [PM seat] repo:cloud · seat 2 — 🟢 os-zhuang #24145 [PM seat] domain:ui — 🟢 os-sales · 由 os-sales 账户的项目负责 #25966 [PM seat] domain:ui · seat 4 — 🟢 os-sales · 由 os-sales 账户的项目负责 #26620 [PM seat] domain:server · seat 3 — 🟢 os-elon-musk · 由 os-elon-musk 账户的项目负责 #26761 [PM seat] domain:server · seat 4 — 🟢 os-elon-musk · 由 os-elon-musk 账户的项目负责 #27737 [PM seat] domain:server · seat 5 — 🟢 os-elon-musk · 由 os-elon-musk 账户的项目负责 #28677). [PM seat] domain:skills · seat 2 — ⏳ vacant #19287 was clean because it carries a decoratedPatrol:line. The triage Routine post and the vacant director post were not judged. H71 fired on 3 cards: lint/types: 14,366 no-explicit-any warnings can never red CI — make it an error on packages/types/src, delete the vestigial (schema as any) reads, and type ComponentRendererProps with unknown #25918 (~28h,domain:ui), retire the zero-consumer surface: nine dead modules (2,211 LOC), plugin-ai, runner's publish flag, test-only reset helpers on public barrels, the providers trio, 122 dead i18n keys, root orphans #25921 (~7h,domain:ui), pm:mailbox migration: close the three per-login mailboxes and open one per seat, after per-seat mailboxes land (#27637 follow-up) #27890 (~58h,domain:skills).Acceptance notes
Notify: seat-onlinekey is not extended. The card says theseat-onlinerecord carries the patrol line. The mailbox key template is parsed byrecord-recognisers.mjs, so adding a field there changes the recogniser grammar, which is outside this claim's file surface and belongs to the mailbox-keys card serial behind this one. The patrol line lives on the stub only.dispatch-runbook.mdis not edited. Item ④ lives inseat-lifecycle.md〈停止条件与待命〉, next to the standby list it points at.project-forms.md(总监席不建),seat-post-protocol.md(总监席无) and SKILL.md 〈唤醒〉 each carry the exemption.seatIsHeld. So a 🟢 title whose first token is not a login (🟢 held …,🟢 session_…) reads as held, as it does for H32..claude/**at Tier S. Triage's binding note makes the maintainer's approval the ruling for this rule change, so this PR waits for that approval either way.Verification
Rules ratchets — head 58de368
pnpm check:pm-skill-ratchet→ exit 0 (project-forms 54/54, seat-lifecycle 96/96, seat-post-protocol 88/88; every edited line ≤ 120 bytes)pnpm check:pm-skill-id-lint→ exit 0pnpm check:skill-frame-sync→ exit 0pnpm check:pm-governed-prose→ exit 0Derived gate list — head 58de368
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackgave 55 commands. All 55 ran and exited 0.check:doc-formula-expressionsfirst exited 3 (PREREQUISITE NOT MET: formula/lint not built). It exited 0 afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lint.--ranreconciliation:55 derived famil(ies) accounted for — 55 run, 0 NOT-MEASURED (a DERIVED zero — all 55 recorded an exit code and none of them is 3).Roster families under the touched directories, run as readings:
check-published-list-mirrors,check:dts-closure,check:engine-double-contract,check:i18n-stale-fill,check:pm-label-desc-capandcheck:pm-settings-deny-rosterall exited 0.check:published-readme-exportsis NOT MEASURED: exit 3, PREREQUISITE NOT MET, 63 packages not built. CI runs it.No published package is touched (
.claude/**andscripts/pm/**only), so this PR carriesskip-changesetand no changeset.Session:
session_017ihL2g7RyXa8ErM6GAkHyc(os-dev fordomain:skills#2).🤖 Generated with Claude Code