Repository navigation
docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 - #25385
Conversation
…the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178pvZcJjqXL36QzPi1jbSX
…the term seat-lifecycle already defines Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178pvZcJjqXL36QzPi1jbSX
Contract reviewServed-tier: Spec read: card #25379 body (the maintainer's words 「同意,你现在就立卡派发处理。」, the six Wanted items, the one-sentence rule, Acceptance, out-of-scope) and its one comment (the ① Derived judgments
② Semver levelNo published package is touched ( ③ Boundary flags
Implemented-by: VERDICT: PASS |
…-hxtlri # Conflicts: # .claude/skills/pm-dispatch/references/seat-lifecycle.md
…inator reads a card thread's branch at spawn and the seat claims it (no probe push for card threads), and a direct-session seat runs only when summoned Ruled on the card (batch #4, 1A / 2A): dispatch-runbook 〈卡线程〉 L141–L142 now say the coordinator reads the new thread's branch from its session record and hands it to the seat (the thread reports it only when the coordinator cannot read it), the seat writes assignee, `pm:dispatched` and the `Claim:` naming that branch, and the thread starts once the newest claim names its branch. os-dev.md rule 1 keeps the empty-branch probe push for self-made branches and exempts card threads, whose branch the platform designates and the harness pushes; the two probe lines merge into one so the file stays at its ceiling. SKILL.md's triage-seat line now carries the direct-session rule: summoned only, no self-wake, not resident. Every file keeps its line count; every edited line is at or under 120 bytes. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178pvZcJjqXL36QzPi1jbSX
Contract reviewServed-tier: Delta review on top of the PASS record at head ① Derived judgments
② Semver levelUnchanged from the ③ Boundary flags
Implemented-by: VERDICT: PASS |
…-hxtlri # Conflicts: # .claude/skills/pm-dispatch/SKILL.md
…on main — 项目协调者 → 协调者, the coordinator's pointer to the project-seat form, 派发令全文, the patrol line names the stale-premise check, and the board is 看板 in cross-repo rule 5 Deferred by the card's own schedule until the coordinator reference landed: its title and SKILL.md's `coordinator` row read 协调者 (the card's naming item); its opening line points at the project-seat form in seat-lifecycle.md, paid in place because the file sits at its ceiling; its candidate line and the runbook's 〈卡线程〉 candidate line say 派发令全文, the word item 2 made stale. From the contract review's boundary flags: the project patrol line names the stale-premise check beside the lanes' standby items, and cross-repo-coordination rule 5 calls the org Project 看板 like the other two naming lines. Every file keeps its line count; every edited prose line is at or under 120 bytes. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178pvZcJjqXL36QzPi1jbSX
Contract reviewServed-tier: Delta review on top of the PASS record at head ① Derived judgments
② Semver levelUnchanged from the ③ Boundary flags
Implemented-by: VERDICT: PASS |
Requested by Elon · project thread
Fixes #25379
Clause-②: no
Metadata-protocol: none
维护者速读(草稿)
send_later链与跨墙定时器链;轮报 = 卡线程清单,五项健康指标进总监项目的每日摘要;「项目总监」改称「总监席」、「项目协调者」改称「协调者」,GitHub 的 org Project 改称「看板」,并在入口表定义「车道项目」与「总监项目」。第五个提交是卡上预告的跟进:coordinator.md 落地后补指针与改名,两处「派发令文件」改「派发令全文」,巡查行点名前提过时检查,cross-repo 规则 5 的 org Project 也改「看板」。send_later加速器、跨墙每小时 cron 链),正是卡上点名的付账行;维护者在 UI 建的 Routine 席不受影响;同批 2A 补上直连会话的唤醒规则(按召唤跑,⛔ 无自醒不常驻),写在 SKILL.md 分诊席那一行。What changed
Nine files under
.claude/skills/pm-dispatch/**(references/coordinator.mdjoins once PR #25255 landed, andreferences/cross-repo-coordination.mdby the seat's one-line widening) plus, after the maintainer's batch-4 ruling,.claude/agents/os-dev.md(the seat widened the claim's file surface by that one file, same Tier S); rule text only; every file lands at the same line count it had, every edited line is at or under 120 bytes, no ratchet ceiling moves (soscripts/pm/check-skill-line-ratchet.mjsis untouched).SKILL.md红线org Project 只是视图看板(org Project)只是视图— the vocabulary line for GitHub's board; 「任何」 dropped to stay under the byte cap, meaning unchangedSKILL.md入口与角色 (thedomainrow, thedirectorrow)directorrow reads 「总监席」 and defines 「总监项目」 (the project the director seat sits in). Table rows, under the 342-byte row pinSKILL.md入口与角色 bulletssend_later是可选加速器…」references/seat-lifecycle.md」 and 「项目席唤醒 = PR 订阅事件 + 每项目一个巡查 routine;⛔ 无自绑 cron、无send_later链」 — the two Routine-seat-only mechanisms the card names as payment are the two lines replacedSKILL.md升级与决策references/seat-lifecycle.md〈座位贴协议〉seat-post-protocol.md); posture, ledger and round reports live in the project; title, assignee, the seating audit comment and the cross-account hand-over brief stayreferences/seat-lifecycle.md〈轮次报告与节奏〉references/seat-lifecycle.md〈断粮与跨墙恢复〉send_laterchain the card names as payment); the recovery line keeps its steps and ends in 「照常跑轮」 (the 「重挂常规巡检」 clause referred to the deleted chain); +1: the project patrol routine runs the lanes' standby items every 2–4 hours, a wall leaves only a stub note, ⛔ no cross-wall timer chainreferences/seat-post-protocol.md〈贴的四段与派生视图〉references/seat-post-protocol.md〈交接收尾清单〉list_triggers清点本会话定时器:删入座 Routine,一次性的逐个清理或随移交物转交」platform-readings.md〈断粮检测与跨墙恢复〉references/seat-post-protocol.md〈座位 Routine 创建〉create_trigger的 fresh-session Routine 不挂 repo sources,拿不到 GitHub 工具」 + 「表现为静默零产出;⛔ 不要在会话里create_trigger出一个座位 Routine 就当它在跑」create_triggerRoutine as a running seat); the 「不挂 repo sources」 mechanism is already the reading inplatform-readings.mdreferences/dispatch-runbook.md〈卡线程〉/mnt/project-files/…/dispatch-….md:线程读不到席位 scratchpad」references/execution-duties.md〈收集〉 ①②list_triggers确认 Routine 启用,在飞重挂加速器;唤醒归 Routine,漏挂不断链」 / 「在飞期间主巡检间隔 ≤45 分钟…」references/dispatch-runbook.md〈卡线程〉 handshake (ruling 1A, third commit)pm:dispatched,再贴带该Branch:的认领;之后线程才开工」pm:dispatched+带该Branch:的认领;线程核对最新认领指向本分支方开工」 — the ruled shape: the coordinator reads the branch from the child's session record at spawn, the seat claims it, the thread starts once the newest claim names its branch; the thread's own report is the fallback.claude/agents/os-dev.md基本规则 1 (ruling 1A, third commit)git push -u origin <branch>」 + 「它既是认领评论所指分支的落地标记,又是写路由探针(容器凭据不对称)」git push -u origin <branch>):落地标记兼写路由探针」 and the freed line reads 「卡线程分支由平台指定、harness 推送,⛔ 不推空分支;探针规则只对自建分支」 — the file sits at its 404-line ceiling, so the new rule is paid inside rule 1SKILL.md入口与角色 triage-seat line (ruling 2A, third commit)references/lanes/director.mdL1# 席位章程:项目总监(Project Director)# 席位章程:总监席(Director Seat)references/coordinator.mdtitle andSKILL.mdcoordinatorrow (follow-up commit, after PR #25255)# 项目协调者(Project Coordinator)/ 「以项目协调者身份运行…」# 协调者(Coordinator)/ 「以协调者身份运行…」 — the card's naming item for the coordinatorreferences/coordinator.mdL3 (follow-up)seat-lifecycle.md。」 — the pointer to the project-seat form, folded into the opening line because the file sits at its 49-line ceilingreferences/coordinator.md三 andreferences/dispatch-runbook.md〈卡线程〉 candidate lines (follow-up)references/seat-lifecycle.md〈断粮与跨墙恢复〉 patrol line (follow-up; contract review ③-4)references/cross-repo-coordination.md规则 5 (follow-up; contract review ③-6, surface widened by the seat)references/lanes/skills.mdreferences/rest-channel.md不可迁移 ②main)The rule after the change, as the card states it: GitHub keeps what another account reads (six-state labels, assignee,
Claim:/Release:, the seat stub, the PR and its ACCEPT, the ruling record); the project keeps the working layer (posture, ledger, orders, round reports, memory). It is written as the two 〈座位贴协议〉 lines, not restated elsewhere.Acceptance checks on this head:
git grep -n '项目总监' -- .claude/skills→ no hit;git grep -n '总监席' -- .claude/skills/pm-dispatch/SKILL.md→ L56 (thedirectorrow), L75 (ruling 2A), L237 (main's, from #25348) and L275–L276 (the old summons line is gone by #25255).Item 3 — filed as
needs_decision, ruled 1A in batch #4, written in the third commitRuling record: card comment 6363872862 (maintainer 「同意」 2026-10-23T11:29Z = 1A 2A). The text below is the analysis as filed; the ruled shape is option A, now on
dispatch-runbook.md〈卡线程〉 L141–L142 andos-dev.mdrule 1 (see the table above). Item 2 of that batch (2A, the direct-session wake rule) is on SKILL.md L75 (L74 before the merge added thecoordinatorrow).The card's item 3 (「branch named before the thread opens」: the seat claims first with the
Claim:naming the branch the coordinator will give the thread, then asks for the thread) rests on the coordinator being able to name a project thread's branch. Measured on this very thread (A2 below): it cannot. The branch is platform-assigned at thread creation (claude/project-thread-+ a random suffix; 27 such heads onorigin), the coordinator's opening message carried none, and the thread may push only that branch. So the 〈卡线程〉 handshake lines were left as they were until the ruling; the options as filed, ⛔ none picked by this thread (A was ruled by the maintainer):get_sessionon the child listsoutcomes[].git_info.branchesbefore any push — measured) and hands it to the seat in the same stroke; the seat claims; the thread's first act stays 「verify the newestClaim:names my branch」 and it starts as soon as the claim is up. Cost: one read per thread; the thread still waits for the seat, usually less than today because the read beats the thread's own report.os-dev.mdrule 1) is dropped for card threads because the branch is platform-designated and the push route is the harness's. Cost: zero protocol change on the seat side; the 5–10 minute wait the card measured stays. (The probe-push drop touches.claude/agents/os-dev.md, outside this card's file surface either way.)Branch: pendingand the thread's first report fills it by a body edit of the claim comment. Cost: a claim comment that is edited after it is written, which the claim protocol (「认领评论时间戳是唯一仲裁」) does not foresee.The PM's mechanism assumptions, measured
#25348at2bf0113,#25255at3e6e35e,#25247atd062675);#25348landed 06:19Z and was merged in (7198a099, one adjacent-line conflict inseat-lifecycle.mdresolved by keeping both lines; SKILL.md now 319/319,lanes/director.md70/70). This PR started frommainat448374dand touches none of their hunks:#25348's SKILL.md L30/L106/L212–L222/L234/L264/L267/L276,seat-lifecycle.mdL69,dispatch-runbook.mdL57/L77/L115/L146,execution-duties.mdL103,contract-review.md,triage-duties.md,lanes/director.mdL13–L24 and L45–L60 — not touched;#25255's SKILL.md L57 insertion (thecoordinatorrow) anddispatch-runbook.mdL136 — not touched;#25247's 〈域车道〉 table andlanes/*other than the two one-line renames — not touched. Two known overlaps, both trivial:#25255deletes SKILL.md L274, which this PR only renames (the merge takes the deletion);#25247and#25348move SKILL.md's count (317 and 319) while this PR leaves it at 318 under the 319 ceiling, so whichever lands last re-measures.#25255,#25247and#25393landed 13:14Z and were merged in (bd78f67d): two SKILL.md conflicts, both resolved as foreseen — thedirectorrow keeps this PR's rename and#25255'scoordinatorrow is added beneath it;#25255's deletion of the 总监席 summons line wins over this PR's rename of it. The follow-up commit then wrote the deferred items (coordinator.md pointer and rename, 「派发令全文」 in both candidate lines) plus the two review flags (patrol line, cross-repo rule 5).get_sessionon this thread shows the branchclaude/project-thread-hxtlriinsession_context.outcomes[].git_repository.git_info.branchesat creation (04:51:59Z); the coordinator's opening note named no branch;git ls-remotehad no such head until this thread pushed it; the suffix appears in neither the thread id nor the session id. So the branch is readable after spawn, not nameable before it — item 3 goes to the ruling batch as above.#25348lands) — holds and is respected: SKILL.md stayed at 318 lines until#25348landed and sat at 319/319 after the first merge and 318/318 after the second (the ruling-2A clause is in place on L75, net zero). No re-wrap used as payment; the two lines removed are the two mechanisms the card names.check:pm-skill-id-lint) — holds; the operating text names rules by file and section only; 87 files clean.Line budget
SKILL.md#25255/#25247merged in)references/seat-lifecycle.mdmainshrank it)references/seat-post-protocol.mdreferences/dispatch-runbook.mdreferences/execution-duties.mdreferences/lanes/director.md#25348)references/lanes/skills.mdreferences/rest-channel.mdreferences/coordinator.mdreferences/cross-repo-coordination.md.claude/agents/os-dev.mdWidest edited prose line 119 bytes; the two edited SKILL.md table rows are 143 and 145 bytes against the 342-byte row pin.
Gates
Head
f08bab5c(the follow-up commit, on top of theorigin/mainmergebd78f67dthat brought in#25255,#25247and#25393):node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 22 commands (the 20 of the first head pluspnpm check:agent-model-declaredandpnpm check:commit-card-trailers, which.claude/agents/os-dev.mdin the change set adds). Every one was run in this worktree with its exit code captured before any pipe and recorded asCOMMAND :: exit CODE, then reconciled with--ran: 22 derived, 22 run, 22 ×exit 0, 0 NOT-MEASURED, 0 UNRUN (✓ dispatch-gates --ran). Earlier heads, each reconciled the same way:f81aab8a20/20, the merge head7198a09920/20, the ruling head9700ab9d22/22; the first pass on2b1450chad oneexit 3(pnpm --filter @objectstack/lint run check:doc-formula-expressions, a PREREQUISITE — the@objectstack/formulaand@objectstack/lintbuilds absent in a fresh worktree — cleared by building those two packages underscripts/pm/os-verify-lock.sh). The four the dispatch order names on this head:pnpm check:pm-skill-ratchet✓ (declared cross-file moves 2; SKILL.md 318/318,coordinator.md49/49,cross-repo-coordination.md51/51,os-dev.md404/404, no row moved),pnpm check:pm-skill-id-lint✓ (87 files clean),pnpm check:skill-frame-sync✓,pnpm check:skill-frame-freshness✓. CI onf81aab8a,7198a099and9700ab9dwas all green (40, 35 and 42 check runs, none failed); this head has its own check runs. No published package moves (.claude/**only), soskip-changesetrides the create.Acceptance notes
os-dev.md〈干净收尾〉 forbids HTML comments in GitHub text. Measured on the sibling PRs of this project, the relay read-back keeps it byte for byte. Reported as a deviation, not hidden.references/cross-repo-coordination.md规则 5 was outside the claim's file surface at the first push; the seat widened the surface by that one line and the follow-up commit carries the review's exact 119-byte rewrite.execution-duties.md(unlock scan, hold release, stale premise, awaiting-landing list, wall note)」; the standby itemsseat-lifecycle.md〈停止条件与待命〉 enumerates cover all but the stale-premise check, which the follow-up commit names on the line (「含前提过时」, the term ofexecution-duties.md派发节).../objectstack-issue-25379) on the designated branch; the primary checkout was left detached atd12e650. The empty-branch push was made before the first edit, asos-dev.mdrule 1 asked then; the third commit exempts card threads from it per ruling 1A.Governed surface
.claude/**(Tier S): draft, awaiting the seat'sCONTRACT_REVIEW_TIERreview and the maintainer's word; ⛔ not to be flipped ready, queued or armed by this thread.Generated by Claude Code