Skip to content

docs(pm-dispatch): a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so its instructions name only its lanes - #25255

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-8oo9zb
Oct 23, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-8oo9zb

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

Fixes #25219

Clause-②: no
Metadata-protocol: none

What changed

Four files, all under .claude/skills/pm-dispatch/** plus one ceiling row; no code, no package.

  1. New reference references/coordinator.md (49 lines, every line ≤ 120 bytes, no table row, no issue number). It is the project coordinator's interface with the seat threads — the role that opens seat threads and card threads and schedules across lanes — beside seat-lifecycle.md, because the coordinator is not a domain:* seat and so not under lanes/. Seven sections in the card's order, each naming its reader, each pointing at the rule's single source instead of restating it:
    1. 车道归属登记在座位贴 — a project's instructions name only the lanes it manages; each seat thread sits the lane's vacant seat post and writes 「由 X 账户的项目负责」 in the post's 说明 section; one lane, one project; the seat post (not project memory) is the arbiter; another project's in-flight cards are finished by its own seat, and its sign-off brief is the release (seat-lifecycle's own rule).
    2. 跨车道取卡 — the intake face is the project's lanes' open priority:p1/priority:p2 cards under execution-duties.md's candidate rule; each card goes to its lane's seat thread; a lane with no seat thread and a vacant post gets a seat thread first; the maintainer names no lane per card.
    3. 全项目一个上限,p1 先 — one project-wide card-thread cap, the number the maintainer states for the project (the sum of the seats' batch terms only when none is stated); seats hand candidates over at any time; p1 ahead of p2; a thread waiting on a human or on the seat's review holds no slot; in-seat S subagents count only against the seat's batch. ⛔ No number is written as the rule.
    4. effort 与档位按难度 — points at execution-duties.md 〈派发〉 and dispatch-gates --tier; skill (protocol-semantics) cards at CONTRACT_REVIEW_TIER; the coordinator sets model and effort at thread creation on the seat's request carrying the maintainer's word (dispatch-runbook.md).
    5. 卡线程的 needs_decision — re-pointed after docs(pm-dispatch): revoke every autonomous-adjudication channel — a seat analyses and recommends, every needs_decision goes to the maintainer's ruling batch #25348 revoked every delegated-ruling channel: the rule lives in lanes/director.md and the 〈卡线程〉 section of dispatch-runbook.md, ⛔ not restated; the seat writes the four-axis analysis and a recommendation and the card joins the ruling batch the maintainer rules by hand, ⛔ no ruling thread, no delegated ruling; a thread waiting on a ruling holds no slot; the ruling record is the ruling comment on the card, ⛔ never a project file or memory.
    6. 额度压力 — near the usage wall (the reading of seat-lifecycle.md 〈断粮与跨墙恢复〉) the coordinator opens no new card thread, lets in-flight ones finish, and tells the maintainer once.
    7. 语言与汇报 — the maintainer's language in the project, English on GitHub (SKILL.md's invariant); the coordinator reports on a result, a blocker or a decision, as the seats do.
  2. SKILL.md, one row in 〈入口与角色〉: coordinator — 以项目协调者身份运行(项目会话:开席位线程与卡线程、跨车道调度;接口见 references/coordinator.md), 154 bytes against the file's 342-byte widest-row pin. Paid by one deletion in 〈升级与决策〉: 「项目总监席:维护者在所在仓召唤 /pm-dispatch director;⛔ 无 Routine/cron;未回字 = 不在 = 停。」 — every clause of it survives in references/lanes/director.md (授权面 = 人工定期召唤,⛔ 无 Routine、无 cron; 入口 … /pm-dispatch director; 未回字 = 不在 = 停), which the director row of the same entry table already points at. SKILL.md stays line-neutral (319/319 after merging main with docs(pm-dispatch): revoke every autonomous-adjudication channel — a seat analyses and recommends, every needs_decision goes to the maintainer's ruling batch #25348); no ceiling moved. PR docs(pm-dispatch): fold the engine, services and cli lanes into domain:server #25247 lowers the ceiling to 318 at its own landed count; this PR changes no count, so either landing order holds.
  3. references/dispatch-runbook.md, one line edited in place (241/241, line-neutral): the 〈卡线程〉 cap line read 「全项目上限 = 各席 batch 之和」, which contradicts the card's item 3 (the maintainer sets one number per project — the two values set so far differ). It now reads 「全项目上限由维护者按项目定(coordinator.md)」 and the sum is the new file's stated default when no number is given. This is the one SKILL/reference line that would otherwise contradict the new file (the handover's allowance).
  4. scripts/pm/check-skill-line-ratchet.mjs: a CEILINGS row for the new file at its landed count (49) and a MAX_TABLE_ROW_BYTES pin of 0 (it carries no table row). A new file is not a raise and funds nothing. No other script is touched.

The maintainer's word, verbatim and untranslated, as the card quotes it: 「刚才你让我转帖的项目指令规则,为什么不定义在仓库中呢,我只要穿到具体的车道就行。」

The PM's mechanism assumptions, measured

Gates

Re-merge 2026-10-23: head 72bc519a merges main 5e772c79 (carrying #25348) into the item-5 re-point 3e6e35eb; on it the same 42 families all exit 0 (--ran 42/42), SKILL.md 319/319 (its row paid by the 项目总监席 deletion), dispatch-runbook.md 241/241, coordinator.md 49/49.

First run, head 3788440: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack over the four changed paths derived 42 families (23 pnpm, 19 direct node). Every one was run with its exit code captured before any pipe and recorded as COMMAND :: exit CODE; --ran reconciles 42/42, 0 NOT-MEASURED, 0 UNRUN. All 42 exit 0. One needed a second run: pnpm --filter @objectstack/lint run check:doc-formula-expressions first exited 3 (PREREQUISITE — @objectstack/lint unbuilt in a fresh worktree, the same reading PR #25214 recorded); after pnpm --filter '@objectstack/lint...' build it exits 0. check:pm-skill-ratchet: SKILL.md 318/319, dispatch-runbook.md 241/241, coordinator.md 49/49 (widest table row 0/0). check:pm-skill-id-lint: 88 files clean. check:skill-frame-sync green (the four-axis frame is untouched). CI's remaining families are the PR's check-runs. No published package moved (.claude/** and one scripts/pm ledger row), so skip-changeset rides this PR's create.

维护者速读(草稿)

改了什么: pm-dispatch 技能新增 references/coordinator.md:项目协调者(在项目会话里开席位线程、开卡线程、跨车道调度的那一席)与席位线程之间的接口,按卡上七条写成七节,每节注明读者,只指向规则所在的文件、不复述。SKILL.md 入口表加一行 coordinator,用删掉一条已在 lanes/director.md 写明的总监召唤行抵账,行数不变;runbook 里「全项目上限 = 各席 batch 之和」改为「由维护者按项目定」。棘轮为新文件加封顶行,无上限抬高。

为什么改: 你 10-22 的话:「刚才你让我转帖的项目指令规则,为什么不定义在仓库中呢,我只要穿到具体的车道就行。」——规则进仓库,项目指令只写管哪几条车道。

风险与代价(含回滚): 纯规则文本,不碰代码与门禁;回滚即 revert 本 PR。一处值得你看:新文件写「一条车道恒归一个项目」(卡上第 1 条原话),而今天 skills 车道两个项目各坐一席(seat 1 的交接已说它收完在飞卡就退出)。按这条严格读,本项目本应等 seat 1 收班再坐席;契约复核会读这句并给意见。

席位意见:

你要做的: 席位复核 PASS 后,在席位线程点名回一句「#25255 可以落地」。

Acceptance notes

  • The attribution block's first line is an HTML comment the session requires as the body's first line; os-dev.md 〈干净收尾〉 forbids HTML comments in GitHub text. Measured on PR docs(pm-dispatch): card-thread backend (mode:thread), coordinator scheduling and per-card dispatch effort #25214 (the same shape), the relay read-back keeps it byte for byte. Reported as a deviation, not hidden.
  • The claim's Worktree: line says 「the card thread's own checkout」; the repo's PreToolUse guards block edits in the primary checkout, so the work was done in a linked worktree (../objectstack-issue-25219) on the designated branch, the primary checkout left detached at e58bd0e. No deviation from the branch rule: the branch is the one the claim names.
  • The commit's co-author trailer is the model-free pair the pre-push hook (check:commit-card-trailers) requires; the harness's own trailer spelling was refused once and reworded before the first push — the session trailer is the attribution.

Generated by Claude Code

…threads, as a reference beside seat-lifecycle.md

A project's instructions name only the lanes it manages; the coordinator's
rules (lane ownership on the seat post, cross-lane p1-first intake, one
project-wide card-thread cap, effort and tier by difficulty, ruling threads,
quota pause, language and reporting) live in the repository as
references/coordinator.md, each section naming its reader and pointing at
the rule's single source. SKILL.md gains one coordinator row in the entry
table, paid by deleting the director summons line that lanes/director.md
already carries; the runbook's project-wide cap line now points at the
maintainer-set number instead of a sum.

Claude-Session: https://claude.ai/code/session_01QbWZBrA43um6tADsbopAAA
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 22, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Oct 22, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 37884405d2ef7164fa7a04e00c15345086aa3671
Local-runs: none
Scope: .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/coordinator.md, .claude/skills/pm-dispatch/references/dispatch-runbook.md + scripts/pm/check-skill-line-ratchet.mjs (the gate that enforces the new row), references/seat-lifecycle.md, references/seat-post-protocol.md, references/execution-duties.md, references/lanes/director.md, the ruling-thread text PR #25242 landed (e58bd0e), seat posts #7623 and #19287 (for A4)

Inputs: card #25219 body and all five comments (6342275807, 6343008130, 6343601899 handover, 6345361030 claim, 6345900548 dev report); PR #25255 body, file list and net diff against main at the head (merge-base e58bd0e; main has moved by #25246 only, which touches no pm-dispatch or scripts/pm path); the head's check-runs. Not read: the dispatch order, the dispatching seat's conclusions. Read-only: no worktree, no build, no gate re-run.

① Derived judgments

  1. Seven Wanted items present, in the card's order, each naming its reader (coordinator.md L8, L15, L21, L28, L34, L40, L45). Items 2, 4, 5, 6, 7 point rather than restate: candidate rule → execution-duties.md (L8 there); tier and effort → execution-duties.md 派发 and dispatch-gates --tier (no numbers, no model name copied); ruling thread → lanes/director.md 项目内代裁通道, which is exactly the text PR docs(pm-dispatch): a card thread's needs_decision fork goes to a coordinator-opened ruling thread under the director's delegated channel #25242 landed (director.md L21–L24 and runbook L146, verified against e58bd0e); quota → seat-lifecycle.md 断粮; language → SKILL.md L96. Item 1 is the card's own new text. Concern, not a failure: item 3's L24 (席位随时交候选:卡号、优先级、派发令文件、建议 effort;⛔ 不等自己的槽位) and the release clause of L25 (线程交回或 PR 合入即释放) duplicate dispatch-runbook.md L18 and L20, both written by PR docs(pm-dispatch): card-thread backend (mode:thread), coordinator scheduling and per-card dispatch effort #25214 (03de83b, by blame). The two copies agree today, and the card's item 3 lists these very sentences, so this is the card's own tension rather than the dev's; it is the one place the file restates the seat's half instead of pointing. Named for the seat's ACCEPT; a pointer would be a line-neutral follow-up.
  2. SKILL.md, +1 and −1. The coordinator row (L57, 154 bytes, under the 342-byte widest-row pin) is paid by deleting 「项目总监席:维护者在所在仓召唤 /pm-dispatch director;⛔ 无 Routine/cron;未回字 = 不在 = 停。」. Its clauses live in lanes/director.md: /pm-dispatch director as entry L15; 无 Routine、无 cron L7; 未回字 = 不在 = 停 L16; and the director entry row (L56) already points at that file. One clause has no literal twin: 「在所在仓」 (summoned in whichever repo the maintainer is in); the nearest text is director.md L20 (范围按职责标签跨车道跨仓). The line and director.md L15 were written by the same commit (60b42cd), so the clause was a summary, not a separate rule; noted, not failing. File stays 318 lines under the unchanged 319 ceiling.
  3. dispatch-runbook.md L136, one line in place (116 bytes; 241/241). 「全项目上限 = 各席 batch 之和」 became 「全项目上限由维护者按项目定(coordinator.md)」. Correct: the sum rule contradicted card item 3 (the maintainer states one number per project) and the board (seat post [PM seat] domain:skills · seat 2 — 🟢 os-elon-musk #19287 posts a cap of 3, not a batch sum). The sum survives as the stated default in coordinator.md L23 when no number is given, so no rule is lost; no other file in the skill still states the sum (grep at head).
  4. Ratchet, paid, nothing raised. CEILINGS row 49 equals the measured 49 lines; MAX_TABLE_ROW_BYTES pin 0 is the measurement (no table row); the two maps stay in step as the self-test requires. No existing ceiling moves. The map total rises by 49 because a new file enters it, which the card orders (a new file needs its own ceiling row at its measured length); a new file is not a cross-file move, so conditions (a)–(c) of the move rule are not engaged. Every line of the new file is at most 120 bytes (widest 120).
  5. id-lint. coordinator.md matches no # followed by three or more digits; the verbatim quote and date sit in the ratchet script's comment, outside the lint corpus (which is the skill's .md files, os-dev.md, AGENTS.md, skills/**). Clean.
  6. No contradiction with the three named files (card Acceptance). seat-lifecycle.md: item 1 L13 (另一项目在飞卡由其席跟完,其收班简报在即可坐) is L16 (简报即最新事件 ⇒ 立即坐席) and L29 (⛔ 不取在飞卡,由原认领者跟完) read from the other project's side; 开轮互斥 L7–L15 is per seat number and untouched. execution-duties.md: item 2 points at the candidate rule; item 3 L27 (S 子代理只计该席 batch) agrees with L19 (batch 封顶全部子代理) and runbook L16; item 4 L30 「改技能(协议语义面)的卡恒契约复审档」 is 强制条款① (L29–L30) and, through the parenthetical, does not override L31's references-only downgrade. lanes/director.md: item 5 points and copies nothing; the director stays the sole ruler (SKILL.md L276 kept). SKILL.md L98 (一车道由一组座位管) is satisfied when one project runs the whole group.
  7. Wording noted, not failing. Item 1 L12 says a seat post 「🟢 标着另一项目」, while the seat-post vocabulary (seat-post-protocol.md L10) marks 🟢 with a github-login; the project name is the 说明-section sentence L11 of the same file requires, so the reading is reachable. Item 6 「将近」 is read through its pointer (seat-lifecycle L91: the wall signal is the failure itself), as the card wrote it.
  8. Scope held. Four files, matching claim 6345361030's surface plus the one runbook line the handover allowed; the 〈域车道〉 table, os-dev.md, other scripts and every Tier H file untouched. The coordinator row is a new entry-table row, not a change to any lane row.

② Semver level

skip-changeset, Clause-②: no, Metadata-protocol: none on both the PR body and the claim: correct. The diff is .claude/** rule text plus one ledger row in a repo script; no published package, no schema, no accepted set widened or narrowed. Check Changeset: success.

Check-runs on the head (gate verdicts, read from the API at 2026-10-22, after the last one completed): every non-skipped run is completed / success — Lint & Repo Gates; Lint · repo & tooling gates (the job that runs check:pm-skill-ratchet and check:pm-skill-id-lint); Lint · PM dispatch-gates; Lint · ESLint; Lint · docs & code guards; Lint · CI, release & engine gates; the three scoped lint jobs; Type Check · workspace / source gates / consumer gates / debt ledger; TypeScript Type Check; Test Core 1/6–6/6 and the Test Core summary; Dogfood Regression Gate; Governed Surface Queue Guard; Check Changeset; Check PR Size; Check Documentation Links; Auto Label; the four claim guards (card claims this branch; no other open PR claims the issue; no other open PR claims the single-writer path; part-of PR does not close its card); filter. Nothing pending, nothing red.

③ Boundary flags

Implemented-by: claude/project-thread-8oo9zb
Reviewed-by: session_01REMuzhz6MWRjg8uohedMnM

VERDICT: PASS

…ed decision batch, not a ruling thread

The in-project delegated-ruling channel is revoked; a card thread's
needs_decision now carries the seat's four-axis analysis and recommendation
into the ruling batch the maintainer rules by hand, with no ruling thread.
Section five is re-pointed accordingly; waiting threads still hold no slot
and the ruling comment on the card stays the record.

Claude-Session: https://claude.ai/code/session_01QbWZBrA43um6tADsbopAAA
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 72bc519a94640c6813e05000dcfb72810b36091c
Local-runs: none
Scope: .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/coordinator.md, .claude/skills/pm-dispatch/references/dispatch-runbook.md + scripts/pm/check-skill-line-ratchet.mjs (the gate that enforces the new ceiling row), references/lanes/director.md, references/triage-duties.md, references/execution-duties.md, references/seat-lifecycle.md, references/seat-post-protocol.md, scripts/pm/check-skill-id-lint.mjs (corpus definition), seat posts #7623 and #19287 (for A4)

Inputs: card #25219 body and all five comments (6342275807, 6343008130 unlock, 6343601899 handover, 6345361030 claim, 6345900548 dev report); PR #25255 body, file list and the net diff of head 72bc519a against origin/main (merge-base 5e772c79, the PR's base; main has since moved by six commits, none touching .claude/skills/pm-dispatch/** or scripts/pm/check-skill-line-ratchet.mjs); the head's check-runs read from the API at 2026-10-23T07:11Z. Standing rule applied: the 2026-10-23 revocation merged in PR #25348 (「必须人工决裁」, lanes/director.md L22, SKILL.md L30 and L277, dispatch-runbook.md L146, triage-duties.md L95). The earlier PASS on head 3788440 (comment 6346176507) predates that revocation and no longer governs; this record replaces it. Not fed: the dispatch order's ruling paragraph (it quotes an older project word about a ruling thread, now revoked) and the seat's conclusions. Read-only: no worktree, no build, no gate re-run; line counts and byte widths are wc -l and awk length over git show of the head blobs.

① Derived judgments

  1. Ruling path: nothing reopens one. The four changed files were read line by line for any delegated, autonomous or confidence-gated ruling. coordinator.md 第五节 (L37–L39) reads 「规则一处:lanes/director.md 与 dispatch-runbook.md 卡线程节;本文只指不抄。」, 「席位写四维分析加推荐,卡并入决裁批次由维护者人工裁;⛔ 无裁决线程、无代裁。」, 「等裁的卡线程不占槽(见第三节);裁决记录 = 卡上裁决评论,⛔ 不落项目文件或记忆。」. On main the single source says the same: lanes/director.md L21 「项目内卡线程报 needs_decision ⇒ 席位写四维分析加推荐,并入决裁批次呈维护者人工裁。」, L22 「维护者令「必须人工决裁」撤销「有把握自己决定」;⛔ 无裁决线程、代裁、置信门。」, and dispatch-runbook.md L146 「终报 needs_decision ⇒ 席位附四维分析与推荐,并入决裁批次呈维护者裁;⛔ 无裁决线程。」. The three coordinator.md lines point at those two files and add only the slot rule (card item 3) and the ledger rule (card item 5, 「the ruling comment on the card is the record」), both matching director.md L9 「裁决只存在于本卡」. Section 七 L49 reports to the maintainer 「在结果、阻塞或待裁决时」, so a decision reaches a human, never the coordinator. The SKILL.md deletion removes a summons line only; L277 「总监席是唯一呈裁席:决策箱只经本席呈维护者人工裁;⛔ 无代裁无自裁无子代理。」 and L30 stay. triage-duties.md 人工地板 (L96–L97) and the risk/workload criteria (L102 ff.) are not in the diff and no changed line narrows them. The word 「裁决线程」 appears in the diff only inside a ⛔ clause. Judged correct.
  2. The coordinator never decides for the maintainer. Every discretion the file gives the coordinator is routing or accounting: lane by the card's domain:* (L19), queue order p1 before p2 (L25), slot counting (L26–L27), pausing at the usage wall (L43). Model and effort are set 「只凭维护者明言」 by pointer to dispatch-runbook.md L138 (L33). The cap default 「未言明取各席 batch 之和」 (L23) is main's own prior rule (runbook L136 before this PR) kept as the fallback when the maintainer names no number, so no new discretion is created. Judged correct.
  3. Seven sections point, not restate (coordinator.md L8, L15, L21, L29, L35, L41, L46, each naming its reader). 一 → seat-lifecycle.md (L11); 二 → execution-duties.md 候选 L8 and runbook 卡线程节 (L17, L19); 三 → the card's own item 3 text plus the batch row of SKILL.md (L27 agrees with execution-duties L19 「batch 封顶全部子代理」); 四 → execution-duties.md 派发 L95–L97 and dispatch-gates --tier (L31–L32; 「改技能(协议语义面)的卡恒契约复审档」 is 强制条款① L96 by pointer, no model name, 「⛔ 不抄模型名」 matches execution-duties L73); 五 → see ①1; 六 → seat-lifecycle.md 〈断粮与跨墙恢复〉 L88 (L43); 七 → SKILL.md L95 (L48). Residual duplication, unchanged since the first review and carried by the card's own item 3 wording: L24 and the release clause of L25 repeat runbook L135 and L137 (席位随时交候选 / 交回或合入即释放). The copies agree; noted for ③, not failing.
  4. SKILL.md, +1 row and −1 line, 319/319. The coordinator row (L57, 154 bytes under the 342-byte MAX_TABLE_ROW_BYTES pin, unchanged) is paid by deleting 「项目总监席:维护者在所在仓召唤 /pm-dispatch director;⛔ 无 Routine/cron;未回字 = 不在 = 停。」. Every clause survives in lanes/director.md on main: 召唤 → L7 「授权面 = 人工定期召唤」 and L15 「入口:维护者说处理决裁或处理 contract-review,或 /pm-dispatch director。」; 无 Routine/cron → L7 「⛔ 无 Routine、无 cron、无舰队位。」; 未回字 = 不在 = 停 → L16 「未回字 = 不在 = 停,⛔ 无巡检、审计、快照、聊天、卡评论;⛔ 无任何例外。」; 在所在仓 → L20 「范围按职责标签跨车道跨仓」 (the summons is not repo-bound; the stronger text). The director entry row (L56) already points at that file. Line count: main 319, head 319, ceiling 319 (ratchet L382, unchanged). Judged correct. The PR body's 「SKILL.md stays at 318 lines」 is stale from before the re-merge; its Gates paragraph says 319/319, which is the measured value.
  5. dispatch-runbook.md L136, one line in place, 116 bytes, 241/241. 「全项目上限 = 各席 batch 之和,满即排队。」 → 「全项目上限由维护者按项目定(coordinator.md),满即排队。」. Consistent with card item 3 (the maintainer sets one number per project) and with the new file, where the sum survives as the stated default (coordinator.md L23). On main no other skill line states the sum (git grep at origin/main). Judged correct.
  6. Ratchet rows, nothing raised. Head scripts/pm/check-skill-line-ratchet.mjs L1251 coordinator.md 49 = measured 49; L2117 pin 0 = measured (no | row). SKILL.md 319 and dispatch-runbook.md 241 rows unchanged from main (L382, L409). The map total rises by 49 for a new file, which the card orders; no cross-file move, so the move conditions are not engaged. Gate verdict: Lint · repo & tooling gates (the job running check:pm-skill-ratchet and check:pm-skill-id-lint) is completed / success on this head.
  7. Line width and id-lint. coordinator.md widest line 120 bytes, none over; runbook head has no non-table line over 120; the SKILL.md row is a table row under its pin. coordinator.md matches no # followed by three or more digits; the ratchet comment's date and verbatim quote sit in scripts/pm, outside the id-lint corpus (SCAN_ROOT .claude/skills/pm-dispatch, EXTRA_FILES os-dev.md and AGENTS.md, skills/**/*.md). Clean.
  8. No Tier H path. The four paths are .claude/skills/pm-dispatch/** (Tier S) and scripts/pm/check-skill-line-ratchet.mjs; AGENTS.md, CLAUDE.md, docs/NORTH-STAR.md, skills/**, .github/workflows/**, CODEOWNERS untouched. The 〈域车道〉 table, os-dev.md, other scripts and seat posts untouched, matching claim 6345361030's surface plus the one runbook line handover 6343601899 allows.
  9. A4 — 「一条车道恒归一个项目」 stands as written. seat-lifecycle.md 开轮互斥 (L3–L16) is keyed on 同席号 and session and silent on projects; seat-post-protocol.md L9 admits several posts per lane; SKILL.md L97 「一车道由一组座位管」. Item 1 binds one level up, lane → one project, which several seats of one project satisfy, so no multi-seat rule or per-seat mutex is contradicted. The double occupancy was a board state, not a rule: seat post [PM seat] domain:skills — ⏳ vacant #7623 r269 (⏳ vacant since 2026-10-22T16:22Z, signed off on 「后续 skills 车道你也不再负责」) and [PM seat] domain:skills · seat 2 — 🟢 os-elon-musk #19287 r62 (🟢 os-elon-musk) — at this head the lane has exactly one project and the sentence already holds on the board. Wording note: L12 says a post 「🟢 标着另一项目」 while the 🟢 word carries a github-login (seat-post-protocol L10); the project is the 说明-section sentence L11 requires, so the reading is reachable. No needs_decision.

② Semver level

skip-changeset, Clause-②: no, Metadata-protocol: none on the PR body and on claim 6345361030: correct and consistent. The diff is .claude/** rule text plus one ceiling row and one pin in a repo script; no published package, no schema, no accepted set changed. Check Changeset skipped by the label; Governed Surface Queue Guard success.

Check-runs on the head at 2026-10-23T07:11Z: 47 runs, all completed; every non-skipped run is success — Lint & Repo Gates; Lint · repo & tooling gates; Lint · PM dispatch-gates; Lint · CI, release & engine gates; Lint · ESLint; Lint · docs & code guards; Lint · scoped · tooling self-tests / query-options erasure / slot lookup & corpus; TypeScript Type Check; Type Check · workspace / source gates / consumer gates / debt ledger; Test Core 1/6 through 6/6; Dogfood Regression Gate; Governed Surface Queue Guard; Check PR Size; Check Documentation Links; Auto Label; filter; the four claim guards on both runs. None red.

③ Boundary flags

Implemented-by: claude/project-thread-8oo9zb
Reviewed-by: session_01REMuzhz6MWRjg8uohedMnM

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · domain:skills#2 · os-elon-musk · session_01REMuzhz6MWRjg8uohedMnM · 2026-10-23T12:51Z · head 72bc519a94640c6813e05000dcfb72810b36091c · Tier S (check-governed-merges.mjs --pr 25255: .claude/**, no Tier H path, 65 changed lines ≤ 3000)

Landing authority: the maintainer's own words in this seat's thread of the Claude Code project "Objectstack" (os-elon-musk account), 2026-10-23T12:49Z: 「#25247 #25255 #25393 可以落地」, naming this PR.

  1. Shape: draft, base main, Fixes #25219 the only closing keyword, skip-changeset (.claude/** only or with scripts/pm ceiling rows; no package).
  2. Gates (check-runs pinned to this head): every check-run completed, none failed.
  3. Contract review: CONTRACT_REVIEW_TIER PASS on this head, record 6359568754.
  4. Landing order: the three PRs named together merge cleanly onto main f0fdd45bb in the order docs(pm-dispatch): fold the engine, services and cli lanes into domain:server #25247, docs(pm-dispatch): a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so its instructions name only its lanes #25255, docs(os-dev): name the harness attribution-line exemption in 〈干净收尾〉; Check Changeset reads the PR body #25393 (git merge-tree, no conflict); on the combined tree SKILL.md is 318 lines, .claude/agents/os-dev.md 404, and check-skill-line-ratchet.mjs exits 0. After it lands, PR 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 (card pm-dispatch: a project-run seat form — seat post as a stub, posture and ledger in the Claude Code project, dispatch order in the card thread, branch named before the thread opens; 项目总监 → 总监席 (maintainer's word 2026-10-23) #25379) owes its deferred follow-up commit (the coordinator.md pointer and rename) and a fresh review.
  5. This seat flips ready and arms auto-merge now.

Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants