Skip to content

Commit be488ce

Browse files
os-steveclaude
andauthored
docs(pm-dispatch): land the maintainer's filing/merging directive — items 1 2 3 4 5 8 — as in-place charter deltas, net 0 per ratcheted file (#19449)
Fixes #19340 Clause-②: no Lands the DELTA between the six adopted items of the director's record (comment 5750077963 on #19340 — the maintainer's verbatim answer 「1 2 3 4 5 6 8」, 2026-09-20T13:24Z, items 1 2 3 4 5 6 8 adopted, 7 and 9 not) and the charter as it stood on `origin/main` `23f1de0`. Item 6 is carried by #19344 (out of scope here; #19344 remains open). Items 7 and 9 were not adopted and nothing here re-proposes them. Every ratcheted file lands at **net 0** — each new rule is paid by retiring a second pointer to the same reference file or a line restated verbatim in a sibling (the pointer-retirement pattern of the last two director-charter PRs) — and every landed line is at or under 120 bytes (widest: 120 B). `state-machine.md` is untouched (reasons below). Diff: 4 files, +24 / −24. ## Per item — the line that stood, the line that lands, what was already in place | item | before (`origin/main` `23f1de0`) | after (this branch, `a2665ce`) | already in place — untouched | |:--|:--|:--|:--| | **1** filing threshold inverted | `SKILL.md` :347–:351 named the three classes and 「其余进 PR `## Acceptance notes`,⛔ 不立卡」 but said nothing about reachability today, a named producer, dormant / zero-pull findings, digests or quotas | `SKILL.md` :351 (new) 「(a) 须今天可达,(c) 须具名生产者;观察、休眠、零拉动 ⛔ 不立卡、不进汇总卡、无配额」 · `os-dev.md` :45 「(a) 须今天可达,…」, :46 「…须具名生产者…」, :48 adds 休眠、零拉动 to the not-filed list · `core-rules.md` :87 twin (今日可达可复现缺陷 · 具名生产者陷阱) | `SKILL.md` :347–:350 (three classes, (a)/(c) boundaries), :352–:354 (承接者:无), :376 (三类外关 not planned); `os-dev.md` :41–:44, :47 | | **2** devs do not file; report contract | `SKILL.md` :778 「只列三类立卡与 `noted, not filed`;立卡附查重词、归挂、立在修复仓」 and :779 「席位在 ACCEPT 读 … 由席位补立」 named no `class:` / `carrier:` field and no per-entry disposition; `os-dev.md` :49–:50 spelled entries as `noted, not filed: …`; :60–:61 and :65 still read as the dev filing (「立成它的 sub-issue」「独立立单」「无 assignee 立单」) | `SKILL.md` :777 (every entry `class: a\|b\|c` + evidence, or `carrier:` = 承接者; neither ⇒ Acceptance notes), :778 (dev 不立卡; ACCEPT disposes each entry in one line `filed #N` / `Acceptance notes` / `dropped — reason`; the seat files the three-class ones in the fix repo), :779 (seat reads Acceptance notes, files the true three-class ones with 归挂 + 查重词; out-of-class cards already filed are closed not planned) · `os-dev.md` :49–:50 (the two fields; `carrier:` defined; neither ⇒ Acceptance notes only), :60–:61, :65 (the REPORT names the sub-issue / `Blocked-by:` anchor; the seat files), :376 (report template) · `core-rules.md` :151 twin | `os-dev.md` :55 「dev 不 `POST /issues`」 already said devs do not file; :51 (3–5 dedupe words); :53 (four-write budget) | | **2** the mechanical lock | see **Item 2's lock — measured** below | no file change | MCP half: `issue_write` and `sub_issue_write` are in `settings.json` `permissions.deny`, pinned by `check-settings-deny-roster.mjs` | | **3** triage merges at first grading | `SKILL.md` :367 「同文件同缺陷 = 同一发现,不分车道:证据搬到先卡,后卡关 `duplicate_of`,⛔ 不并排派发」 and :368 「其余在飞 ⇒ `Blocked-by:` 不派;open 未认领 ⇒ 先并成一个派发入口;已完成 ⇒ 卡可能过期」 — a label-pass rule with no first-touch timing, no same-family rule and no execution-seat route | `SKILL.md` :368 「同文件同机制 = 同一发现,不分车道,首触定级即并:证据搬先卡,后卡关 `duplicate_of`」, :369 「同族异缺陷 ⛔ 不并:互链排同批;在飞(assignee/open PR)永不并,`Blocked-by:` 不派;完工查过期」, :370 「执行席 ⛔ 不并卡,疑重复挂 `pm:retriage` 写明哪两张同文件同机制;…」 | `SKILL.md` :223 (分诊唯一生产 `duplicate_of`), :224 (执行席误标 ⇒ `pm:retriage`), :366 (查重先按文件/机制); `core-rules.md` :137 (去重并卡 = 记账不升级) — no core-rules line states the merge rule itself, so no twin | | **4(i)** escalated card names its half | nothing: `SKILL.md` :454–:455 (在飞卡衍生三分 / sub-issue) and :471 (`Release:` 行点名已落项与余项去向) never required the new card's face to say which half it carries | `SKILL.md` :458 (new) 「自在飞派发升级出的卡首行一句:本卡承哪一半、父卡留哪一半;缺此行不入队不入箱」 | `SKILL.md` :456–:457 (sub-issue inherits domain / priority; the one dispatch bypass), :471 | | **4(ii)** ruled card re-enters only with `Prior rulings on this card:` | `SKILL.md` :357 「决策箱勤务:落卡入箱时校验/补全四棱块与速读;…」 checked the 速读 and four-facet block only; no intake refusal existed anywhere | `SKILL.md` :357 (intake also checks the `Prior rulings on this card:` line), :358 (new) 「线程有 `Ruling:`/RULED 的卡再入箱,该行逐 id 各一句变化;缺行 ⇒ 拒入,`pm:retriage` 回立卡者」 | `SKILL.md` :340 (`Prior rulings read:` line at classification), :733 (出决策箱须引裁决 id); `decision-analysis.md` :45; `dispatch-runbook.md` :84 (`Ruling-ref:`); `state-machine.md` :40–:41 (who hangs and who removes `pm:retriage`) | | **5** first batch after five cards | `director.md` :40 「第一步:逐卡过一类自裁三判据;全立者录裁转工作态、只入收班追认表,⛔ 不呈批」 — read as 「screen the whole inbox, then present」 | `director.md` :40 「首批读完前 ≤5 张同族卡即呈;一类自裁按批过,⛔ 不先扫全箱,自裁者由下一候选补位」, :41 「取下五张只用便宜扫描:标签、assignee、PR 引用、速读首行;全文只读手上五张」, :42 「判据:开场标记→首批 ≤ 读五张;全立者录裁转工作态、只入收班追认表,⛔ 不呈批」 (the old :40 tail kept verbatim) | `director.md` :44 「一次只开一批」 (pacing, not the pre-read); :23 (每批 5 张) | | **8** same-holder duplicates | `SKILL.md` :223 「分诊座位唯一生产:…`duplicate_of`」 with no exception anywhere | `SKILL.md` :370 tail 「同 assignee 者自关后卡」 — the holding seat closes the later card as `duplicate_of` itself, no `pm:retriage` round trip | :223 kept verbatim: no 120-byte spelling of the exception fits on it (four variants measured 125–153 B); the exception sits beside the merge rule it widens | ## Paid for by retiring five second pointers and two restated lines — net 0 per file | retired | what it was | the rule still lives at | |:--|:--|:--| | `SKILL.md` :321 「`since` 读法与成本对价见 `references/dispatch-runbook.md`」 | pointer, one of six to the same file | `dispatch-runbook.md`, still pointed at from :384, :532, :588, :729 | | `SKILL.md` :560 「云卡四课与接手协议增量见 `references/dispatch-runbook.md`」 | pointer | `dispatch-runbook.md` :115 「## 云卡(`mode:cloud`)四课」, :143 「## 接手中断的 dev」; pointed at from :532 | | `SKILL.md` :650 「os-regen 的陷阱与锚点禁令见 landing-operations A」 | pointer, second to the same file | :637 「细则见 `references/landing-operations.md`」; `os-dev.md` :197–:198 carry the trap | | `SKILL.md` :657 「首次入队 flip 定点、MERGED 两读数、关键 PR 订阅与退订/归档细则见 landing-operations B」 | pointer, third to the same file | :637 | | `SKILL.md` :771 「总监席不占 `domain:*`,永不认领 backlog、永不写码;章程见 `references/lanes/director.md`」 | restated verbatim + duplicate pointer | `director.md` :19 (the rule); `SKILL.md` :57 and :675 (the pointer) | | `director.md` :42 「一行回批即全链执行,裁后四件原子执行不再请示」 | restated | `decision-analysis.md` :14 (⛔ 不为它另起请示轮), `SKILL.md` :728 (四件同笔); `director.md` :46 points at decision-analysis | | `director.md` :51 「代裁通道的置信门与人工地板见 SKILL.md 分诊座位职责,⛔ 不另抄」 | pointer | `SKILL.md` :392–:399 (人工地板, 置信门), :770 (总监席是唯一裁决者) | Clauses compressed inside a rewritten line, and where each now lives: | clause | now covered by | |:--|:--| | `SKILL.md` :357 「语言按不变量」「子轮」 | :99 (中文只留四通道), :372 (低频子轮) | | `SKILL.md` :367 「⛔ 不并排派发」 | :368 merge at first grading + :369 「在飞 … `Blocked-by:` 不派」 + :370 (execution seat raises `pm:retriage`): two same-finding cards can no longer be dispatched side by side | | `SKILL.md` :368 「open 未认领 ⇒ 先并成一个派发入口」 | superseded by 「首触定级即并」 (:368) and 「同族异缺陷 … 互链排同批」 (:369) — item 3 moves the merge from the dispatch entry to first grading | | `SKILL.md` :368 「已完成 ⇒ 卡可能过期」 | kept as 「完工查过期」 (:369) | | `os-dev.md` :46 「由写它的人以外的人」→「他人」 · :48 「文档 nit」→「nit」 | same meaning, 21 B and 7 B shorter | | `os-dev.md` :49 「席位 ACCEPT 读」 | `SKILL.md` :778–:779 (the seat's ACCEPT disposition) | | `core-rules.md` :87 「先发修复指令再跳过,不可派发」→「发修复指令不派」 | `SKILL.md` :355 (the full rule) | | `core-rules.md` :151 「核验对读同轮报告」→「对读同轮」 | `SKILL.md` :780 (unchanged) | ## Ceilings before / after (`node scripts/pm/check-skill-line-ratchet.mjs`, green before and after) | file | before | after | ceiling | |:--|--:|--:|--:| | `.claude/skills/pm-dispatch/SKILL.md` | 813 | 813 | 813 | | `.claude/agents/os-dev.md` | 403 | 403 | 403 | | `.claude/skills/pm-dispatch/references/core-rules.md` | 151 | 151 | 151 | | `.claude/skills/pm-dispatch/references/lanes/director.md` | 72 | 72 | 72 | | `.claude/skills/pm-dispatch/references/state-machine.md` | 42 | 42 | 42 (untouched) | No ceiling raised, no cross-file move declared. Twin rule: a rule changed in `SKILL.md` that has a `core-rules.md` twin changed there in this PR (:87 for item 1, :151 for item 2); items 3, 4, 5, 8 have no core-rules twin line, so none was added. ## Item 2's lock — measured, not written - `.claude/settings.json` `permissions.deny` holds 17 `mcp__github__*` write tools, including `issue_write` and `sub_issue_write` — the MCP half of 「devs do not file」 is already mechanical (lock 1; `check-settings-deny-roster.mjs` pins the roster). - `permissions.allow` pre-approves `curl -sS -X POST …/issues/*/labels` (labels) and no `POST …/issues` (create): the REST create is neither allowed nor denied — it falls to the session's permission mode, not to a rule. - No hook inspects a curl target: of the five PreToolUse hooks only `guard-main-checkout-bash.sh` mentions `curl`, as a write-redirection shape, not a URL. - `references/rest-channel.md` :41 declares `POST …/issues` a ✓ seat channel (「建卡带标签 `POST .../issues`」) and the seats file cards through it; a dev subagent runs inside the seat's session under the same `settings.json`. A Bash deny rule on `POST …/issues` would refuse the seat's own filing — exactly the conflict the claim anticipated — so **no rule is added**. The report's `open_questions` carries the two mechanisms that could bind the dev without the seat (an agent-scoped PreToolUse hook declared in `os-dev.md` frontmatter; a guard branch keyed on a subagent signal in the hook payload), both needing a measurement of what the harness hands a subagent's hook, and both on the human floor (新增必需 hook). ## Why `state-machine.md` is untouched The claim listed it for item 4(ii). It is 42 / 42 on the ratchet (mechanism assumption 4: the row exists), has no `needs-user-decision` section, and its `pm:retriage` section already governs the refusal's mechanics — :40 (挂标者 = 提出异议的席位, evidence + the ask in one stroke) and :41 (摘标者 = 分诊 Routine, next fire). The intake duty the card itself names (「落卡入箱时校验/补全」) lives at `SKILL.md` :357, so 4(ii) lands there. Nothing in `state-machine.md` is a second pointer or a restated line worth retiring to add a twin. ## Mechanism assumptions — each verified 1. **Tier.** `dispatch-gates --tier --repo objectstack-ai/objectstack` on the five paths → MANDATORY, path-derived from `SKILL.md` and `os-dev.md`; the register (`check-governed-merges.mjs` row `claude-tree`) puts `.claude/**` in Tier S. `node scripts/pm/check-governed-merges.mjs --pr N` runs after this PR opens; its reading is in the report comment on #19340 (GOVERNED, exit 3, Tier S expected). 2. **Serial.** At 2026-09-20T21:54Z the file lists of all 21 open PRs were read: none touches the five files; only #19292 touches `.claude/settings.json`, which this PR does not. `origin/main` moved by one commit since the branch point (`57ceb9d`, `scripts/` only, no `.claude/` path) — nothing to merge. 3. **Gates.** The line ratchet, the id-lint and the governed-prose pin are all in the derived union and green (below). There is no token ratchet over `.claude/**`: `scripts/check-skills-token-ratchet.mjs` prices the published `skills/**` only; `.claude/**` is priced in lines by `check-skill-line-ratchet.mjs`. Ceilings not raised. 4. **`state-machine.md` row.** Present at 42 — see above. ## Verification (head `a2665ce`) Derived union — `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; change set 4 paths vs merge base `23f1de0`, 48 changed lines vs the 5000 threshold: under) → 23 commands, each exit captured before any pipe, reconciled with `--ran`: 「23 derived famil(ies) accounted for — 23 run, 0 NOT-MEASURED (a DERIVED zero — all 23 recorded an exit code and none of them is 3)」. ```text pnpm check:pm-skill-ratchet :: exit 0 pnpm check:pm-skill-id-lint :: exit 0 pnpm check:pm-governed-prose :: exit 0 pnpm check:pm-governed-merges :: exit 0 pnpm check:pm-expected-skips :: exit 0 pnpm check:skill-frame-sync :: exit 0 pnpm check:agent-model-declared :: exit 0 pnpm check:nul-bytes :: exit 0 pnpm check:commit-card-trailers :: exit 0 node scripts/check-closing-keyword-parity.mjs :: exit 0 node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 node scripts/check-comment-mask-corpus.mjs :: exit 0 pnpm check:agent-test-spelling :: exit 0 pnpm check:doc-authoring :: exit 0 pnpm check:gitlink-declared :: exit 0 pnpm check:watch-hint-literal :: exit 0 pnpm check:refd-timer-probe :: exit 0 pnpm check:driver-memory-census :: exit 0 pnpm check:cross-package-test-inputs :: exit 0 node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0 node scripts/pm/check-harness-current.mjs --self-test :: exit 0 pnpm check:pm-half-states :: exit 0 pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 ``` `check:doc-formula-expressions` first exited 3 (PREREQUISITE NOT MET — `@objectstack/formula` and `@objectstack/lint` unbuilt; not a measurement); both were built under `bash scripts/pm/os-verify-lock.sh` (VERDICT command-exit 0, 4 tasks, cached) and the gate re-ran to exit 0. The three named gates plus `check-nul-bytes` and `check-agent-model-declared` were also run directly via `node` on the working tree before the commit, exit 0 each. `pnpm check:pm-dispatch-gates` (not in the derived union) runs detached with its exit captured to a log; at PR open it stood at 1715 cases ✓ / 0 ✗ and still running — its final exit is in the report comment. ## 四维分析 — 每处措辞的取舍 - **实际业务需求** — 每一条都对应本场总监席实测到的成本:51 张全读后才呈第一批(第 5 项);5 张已裁卡以新速读重入决策箱、每张换来一次全线程重读与一句「维持原裁」(第 4(ii) 项);16 张裸 `finding` 积压超过运行手册 15 张告警线(第 1、2 项)。措辞只写机制与判据,不写故事;判据可核验(开场标记→首批 ≤ 读五张;线程有 `Ruling:` 而卡面缺行 ⇒ 拒入)。 - **项目长远合理性** — 全部落成在位改写与退指针,不抬棘轮上限、不加文件、不加工作流;规则住在它的自然家(入箱检在 `SKILL.md` :357 的决策箱勤务行,并卡规则在查重三行,总监节奏在章程 :40–:42),不另起一节。第 2 项的锁没有落:实测无规则拒 `POST …/issues`,而 `settings.json` deny 会一并锁住席位自己的立卡通道 —— 加一条会破坏立卡的规则是「workaround」,故按裁决意图只落报告契约半边,机制半边作为待决问题带四轴上报。 - **防 AI 写错** — 报告契约从散文(`noted, not filed: …`)改成两个具名字段(`class: a|b|c` + 证据 / `carrier:`),缺字段的条目有确定去向(Acceptance notes),席位处置是三选一的固定拼写;入箱拒入是机械判据(线程有 `Ruling:`/RULED 而卡面缺行),不靠席位记得去读线程 —— 这正是本场 5 张重入卡的失效形态。 - **创业阶段不扩散需求** — 未采纳的第 7、9 项与汇总卡、配额都没有被重新提出;第 1 项明确写「不进汇总卡、无配额」封住两条被拒的路。`state-machine.md` 不为一个已有归宿的规则新增一节。 ## 维护者速读(草稿) **改了什么** — 把您 2026-09-20 对立卡与并卡流程的裁定(「1 2 3 4 5 6 8」,总监席记录 5750077963)中的六项(第 6 项由 #19344 另落)逐条落进章程:立卡门槛反转(只立三类,且缺陷须今天可达、元数据陷阱须具名生产者;观察类 / 休眠 / 零拉动 不立卡、不进汇总卡、不设配额);dev 不立卡,报告每条带 `class:` + 证据或 `carrier:`,席位在 ACCEPT 逐条一行处置;分诊首触定级即并同文件同机制的卡,同族异缺陷互链排同批、在飞永不并,执行席只挂 `pm:retriage`;同 assignee 的重复由持有席自关;从在飞派发升级出的卡首行写明承哪一半;线程已有裁决的卡再入决策箱必须带 `Prior rulings on this card:` 行,否则拒入;总监席读完前五张同族卡即呈首批,一类自裁按批过,排序只用便宜扫描。四个受棘轮文件全部净 0 行(813 / 403 / 151 / 72),每条新规则以退掉一条重复指针或一条他处已原样陈述的行付账;`state-machine.md` 未动。 **为什么改** — 章程原文与已生效裁定相反或缺失:`director.md` :40 仍写「第一步:逐卡过一类自裁」(本场总监席因此读完 51 张卡才呈第一批);`SKILL.md` 没有「首触即并」「同持有自关」「Prior rulings on this card」任何一句;`os-dev.md` 的报告契约没有 `class:` / `carrier:` 字段,且三行仍把「立单」写成 dev 的动作。每个席位每次 fire 都读这些文件,错一句就整队照错。 **风险与代价(含回滚)** — 纯文本改动,零代码、零工作流、零 settings;派生门禁 23 / 23 绿。代价是为了净 0 而退掉的 7 行(5 条第二指针、2 条他处原样陈述的规则)与重写行里压缩掉的几个短语,每一条都在上方表格里点名了现在住在哪一行;若您认为任一条不该退,恢复它是一行 revert,但要同时退另一行才能过棘轮。第 2 项的机械锁没有落:实测今天没有任何规则拒绝 dev 会话的 REST `POST /issues`(MCP `issue_write` 已 deny;REST 建卡既不在 allow 也不在 deny),而在 `settings.json` 加 deny 会同时锁住席位自己的立卡通道,故作为待决问题上报而不硬加。 **席位意见** —(留空,由席位定稿) **你要做的** — 本 PR 走 Tier S 席内复核落地,不需要您点击。唯一待您一字的是第 2 项机械锁的形态(报告 `open_questions`):A 以 `os-dev.md` frontmatter 的 agent 级 PreToolUse hook 只锁 dev 会话 / B 暂不加锁、只靠报告契约与 ACCEPT 处置 / C 其它。 ## Acceptance notes - noted, not filed: `Prior rulings read:` (tool-printed by `check-prior-rulings.mjs`, ids only; `decision-analysis.md` :45) and the ruled `Prior rulings on this card:` (hand-written, id + one sentence each) are now two spellings for one fact on a card face; the tool could print a stub of the second. 承接者: the skills seat (this lane), when a card asks for it — no PR heads for `check-prior-rulings.mjs` today. - noted, not filed: `SKILL.md` :223 still reads 「分诊座位唯一生产 … `duplicate_of`」 with the item-8 exception only at :370; no 120-byte spelling of the exception fits on :223 (four variants measured 125–153 B). 承接者: the next PR that touches :223. - noted, not filed: `os-dev.md` :48 keeps 「未演练漂移」 while the seat-side list (`SKILL.md` :351) says 「休眠」 — same class, two words. 承接者:无. - noted, not filed: the record's 「Tier H — the maintainer merges by hand」 for `.claude/**` is the superseded boundary; PR #19379 repairs the two carriers still spelling it (out of scope here; #19379 remains open). --- _Generated by [Claude Code](https://claude.ai/code/session_017ETYWqMQD4qMtZzAGovWNi)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent fc1a790 commit be488ce

4 files changed

Lines changed: 24 additions & 24 deletions

File tree

‎.claude/agents/os-dev.md‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ model: opus
4242
- (a) 可复现缺陷(复现或失败探针具名);(b) 违背已声明契约(引契约原文,带 `Seam:` 行);
4343
- `Seam: spec:<键或符号> → runtime:<调用点> | renderer:<组件>`,无消费者写 `consumer: none`。
4444
- (c) 让 AI 写出运行时拒收或静默丢弃的元数据的陷阱;三类内 ⛔ 不因看着小揣着不报。
45-
- (a) 分错误与不完整,不分文档与代码:示例照抄即失败是 (a),漏列成员不是。
46-
- (c) 元数据 = 由写它的人以外的人存储并再作者化的键:React prop 不是,存储视图配置是。
45+
- (a) 须今天可达,分错误与不完整,不分文档与代码:示例照抄即失败是 (a),漏列成员不是。
46+
- (c) 元数据 = 他人存储并再作者化的键,须具名生产者:React prop 不是,存储视图配置是。
4747
- 把作者引向运行时会兑现却让事情更糟的元数据的警告不在 (c) 内,记为边界不扩类。
48-
- 其余 ⛔ 不立卡:观察、死代码、未演练漂移、抛光、风格、文档 nit、命名。
49-
- 它们进 PR `## Acceptance notes`,报告 `out_of_scope_findings` 记 `noted, not filed: …`,席位 ACCEPT 读。
50-
- 写 `noted, not filed` 前先答哪一个 PR 或人会碰到这个文件;答不出就写明「承接者:无」。
48+
- 其余 ⛔ 不立卡:观察、休眠、零拉动、死代码、未演练漂移、抛光、风格、nit、命名。
49+
- 它们进 PR `## Acceptance notes`;报告 `out_of_scope_findings` 逐条带 `class: a|b|c`+证据或 `carrier:`。
50+
- `carrier:` = 将碰该文件的 PR 或人,答不出写「承接者:无」;皆无 ⇒ 只进 Acceptance notes。
5151
- 立卡者不查重,只在卡面附 3–5 个查重词;查重归分诊席,⛔ 不扫 open issues、不拉板。
5252
- GitHub 写一律走 REST 代理(`curl` 带 `GITHUB_TOKEN`);归属 = 文本里的 session ID,非 `user.login`。
5353
- 写预算四笔:`git push`、一次 `POST /pulls`(draft)、`POST /issues/{n}/labels`、`os-dev-report` 评论。
@@ -57,12 +57,12 @@ model: opus
5757
- 通道对照表见 `.claude/skills/pm-dispatch/references/rest-channel.md`,其 ✓ 按座位实测。
5858
- 报告记 `api_writes`(次数 + 端点清单)与 `mcp_calls`;越界真写了的照列注明缘由,⛔ 不漏记。
5959
- PM 的去重读数随派发词下发,当既有事实用,只复核其后增量,⛔ 不重跑。
60-
- 归挂不散落:落在已排队 issue 完成范围内的发现,立成它的 sub-issue(自动进派发池)。
61-
- 只是依赖它的,独立立单带一行 `Blocked-by:`;立在修复落地的仓,带回链。
60+
- 归挂不散落:落在已排队 issue 范围内的发现,报告点名为它的 sub-issue(自动进派发池)。
61+
- 只是依赖它的,报告点名独立单带 `Blocked-by:` 行;立在修复落地的仓,带回链;席位代立。
6262
- 有界就地修豁免,四条全立才就地修:① 与本卡同一缺陷类;② 机械修且形态已被钉死。
6363
- ③ 该文件无其他认领持有;④ 同一批门禁族,不新增验证面。
6464
- 就地修欠两样:认领申报的文件面同轮增补;PR 正文点名该修复并附证据。
65-
- 优先扩展一个守卫关掉整个类;任一条不成立 ⇒ 回默认:无 assignee 立单、列出、不碰。
65+
- 优先扩展一个守卫关掉整个类;任一条不成立 ⇒ 回默认:报告列出交席位立单、不碰。
6666
- 本轮改动令其变假或触碰的已发布缺陷必修;其余立卡并记明已发布面,PR 照常落地。
6767
4. ⛔ 永不推 `main`、合并任何 PR、在代码 PR 里改 `content/docs/releases/`;改错另开 docs-only PR。
6868
- force-push 按落地仓 AGENTS.md:objectui/cloud 绝对禁;objectstack §3 五条全立才 `--force-with-lease`。
@@ -373,7 +373,7 @@ model: opus
373373
"open_questions": [
374374
{ "question": "…", "options": ["A …", "B …"], "recommendation": "A, because …" }
375375
],
376-
"out_of_scope_findings": ["to file (3 classes, dedupe words): one-liner", "noted, not filed: one-liner"]
376+
"out_of_scope_findings": ["class: a|b|c · evidence · dedupe words", "carrier: PR or person · noted, not filed"]
377377
}
378378
```
379379

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,6 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
318318
- 选层按 fire 时刻,⛔ 不用计数器;简报写明本轮跑的层。
319319
- 从不更新的卡不入窗;老化欠账归半状态巡查不归小时轮。
320320
- 每条枚举比对返回数与 `totalCount`,不等 ⇒ 报 `sweep INCOMPLETE` 点名缺口,⛔ 永不报干净。
321-
- `since` 读法与成本对价见 `references/dispatch-runbook.md`。
322321
- Backlog sweep 是常设职责,每 fire 扫任一析取命中的卡。
323322
- 析取 ①:全裸(无 `pm:*`、无 `needs-user-decision`、无 `domain:*`)。
324323
- 析取 ②:有 `pm:queue` 无 `domain:*`(仅多车道仓);析取 ③:有 `domain:*` 无 pm-state。
@@ -349,12 +348,14 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
349348
- (a) 的分界是不完整 vs 错误,不是文档 vs 代码:示例照抄即失败是 (a),漏列成员不是。
350349
- (c) 元数据 = 由写它的人以外的人存储并再作者化的键:React prop 不是,存储的视图配置是。
351350
- 把作者引向运行时会兑现却让事情更糟的元数据的警告不在 (c) 内;记为边界,⛔ 不扩类。
351+
- (a) 须今天可达,(c) 须具名生产者;观察、休眠、零拉动 ⛔ 不立卡、不进汇总卡、无配额。
352352
- 判「进 Acceptance notes」前先问:哪一个 PR 会碰到这个文件?说得出具体 PR 或人 ⇒ 写进去。
353353
- ⛔ 说不出(`.changeset/*`、无人在改的文档页、生成物、已扫完的批次)⇒ 兜底不成立。
354354
- 仍然关,但关闭理由必须写明「承接者:无」。
355355
- 先修复:正文被 sanitizer 截断的卡不可派发,评论修复指令后跳过。
356356
- 停摆指令判据必须比其它分类更硬(双读取),事后证伪同处公开作废。
357-
- 决策箱勤务:落卡入箱时校验/补全四棱块与速读;存量卡低频子轮回填,语言按不变量。
357+
- 决策箱勤务:入箱校验/补全四棱块、速读与 `Prior rulings on this card:` 行;存量卡低频回填。
358+
- 线程有 `Ruling:`/RULED 的卡再入箱,该行逐 id 各一句变化;缺行 ⇒ 拒入,`pm:retriage` 回立卡者。
358359
- `type`(Bug/Feature/Task)是分诊固定产出,分诊席唯一权威生产;立单者可预填,分诊校正。
359360
- 判据:违背已声明契约 ⇒ `Bug`,扩大接受集/公开面越出已声明 ⇒ `Feature`,其余 ⇒ `Task`。
360361
- `Bug` 无具名落点或复现路径不入 `pm:queue`(标记补复现)。
@@ -364,8 +365,9 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
364365
- 父单已有子结构的:父单队列标签即可,分诊逐个展开路由、补 `Blocked-by:` 排序。
365366
- 每张留一条英文审计评论(`Triage: lands in …; rationale: …`),可选带 `Size/model suggestion:` 行。
366367
- 查重/shadow 检查先按文件/机制查本仓与姊妹仓 open 卡(含 `pm:dispatched`),再跟引用与关键词。
367-
- 同文件同缺陷 = 同一发现,不分车道:证据搬到先卡,后卡关 `duplicate_of`,⛔ 不并排派发。
368-
- 其余在飞 ⇒ `Blocked-by:` 不派;open 未认领 ⇒ 先并成一个派发入口;已完成 ⇒ 卡可能过期。
368+
- 同文件同机制 = 同一发现,不分车道,首触定级即并:证据搬先卡,后卡关 `duplicate_of`。
369+
- 同族异缺陷 ⛔ 不并:互链排同批;在飞(assignee/open PR)永不并,`Blocked-by:` 不派;完工查过期。
370+
- 执行席 ⛔ 不并卡,疑重复挂 `pm:retriage` 写明哪两张同文件同机制;同 assignee 者自关后卡。
369371
- 生产者在哪是常设分诊问题:declared ≠ enforced 形状的卡先问谁在写这个字段。
370372
- 派发前按生产者的答案改卡的范围与域标签。
371373
- 发现分诊轮:`finding` 恒 = 待首次定级、定级即离标;hold 重验只在 `Restart-when:` 命中时发生。
@@ -453,6 +455,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
453455
- 派发后一单前用该回答重读它的选项与成本,⛔ 不沿用立单时那份。
454456
- 在飞卡衍生三分:不修它验收过不过;in-scope ⇒ 父卡 sub-issue,认领席自有、优先级继承。
455457
- 该 sub-issue 带父卡域与优先级直接派发,唯一绕过分诊;sweep 事后扫,重复关 `duplicate`。
458+
- 自在飞派发升级出的卡首行一句:本卡承哪一半、父卡留哪一半;缺此行不入队不入箱。
456459
- 阻塞项无主 ⇒ 被挡席认领做掉,不限大小;在该卡走完整认领、尊重其热文件串行队。
457460
- 阻塞项在飞 ⇒ 等:`pm:blocking` 在其车道排最前、等待者写该卡;p0/p1 优先级沿链传递。
458461
- 取卡前置 = `docs/NORTH-STAR.md`「优先级」第 3 条:产品仓开放 P0/P1 每次取卡现读。
@@ -557,7 +560,6 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
557560
- 一次性云卡用 `create_session`,⛔ 不用 create_trigger+fire;trigger 流只留给定时/重复型。
558561
- 云会话 `SendMessage` not-reachable 是设计非故障,⛔ 不复测。
559562
- 接手中断的 dev:先试 SendMessage 复活,不可用才走接手协议,⛔ 不重跑原派发词。
560-
- 云卡四课与接手协议增量见 `references/dispatch-runbook.md`。
561563

562564
### 收集
563565

@@ -647,14 +649,12 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
647649
- 挂标后复核完成前短暂停靠;⛔ 不前瞻预挂。
648650
- 契约复核的适用面、载体纪律、资格与归属、降档保险丝见 `references/contract-review.md`。
649651
- 碰生成物的 PR 入队前先同步 + 整体重生成:四步序 `bash scripts/pm/os-regen-merge.sh`。
650-
- os-regen 的陷阱与锚点禁令见 landing-operations A。
651652
- 跟到 MERGED 为止,入队后的看护归车道 PM 的落地窗口:每轮同时读队列分支与 `origin/main`。
652653
- 默认分支 push 即触发对外部署的仓,只在验证层存在时才合并;无验证层 ⛔ 不合并。
653654
- 验证层 = 部署以 CI 为闸、发布后探测线上面、失败自动回滚并立卡。
654655
- 该类仓的落地判据是已发布且探测通过,⛔ 不是 MERGED;跟到发布为止。
655656
- 合并后工作流不在 PR 检查清单上,读 PR 检查的规则对它全盲;按独立检查类登记分开读。
656657
- 人闸不是验证层的替代:答不了会不会坏的人闸只买延迟,⛔ 不以人闸代替探测。
657-
- 首次入队 flip 定点、MERGED 两读数、关键 PR 订阅与退订/归档细则见 landing-operations B。
658658
- 信任 suite/check 事件前先重读 PR 对象取 head:检查读数绑定该 head,⛔ 不绑事件带的 SHA。
659659
- 落地记账:座位贴落地清单即账本,逐轮即时记;确需全仓核对时首选 `head:claude/` 精确过滤。
660660
- 红/踢出处置在同一落地窗口内做:机器输入是 merge-queue triage workflow 的分诊评论。
@@ -768,15 +768,15 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
768768
- 每场召唤把带席内 ACCEPT 的受管草稿呈为一批 ≤5 行决裁;批准与合并仍是维护者的点击。
769769
- 总监席档位由维护者按项目人工定,每场记入摘要台账;⛔ 无档位硬门、无免档整理态。
770770
- 总监席是唯一裁决者:决策箱、代裁与一类自裁只出自本席,⛔ 无子代理无自述。
771-
- 总监席不占 `domain:*`,永不认领 backlog、永不写码;章程见 `references/lanes/director.md`。
772771

773772
## 报告契约
774773

775774
- 终报 JSON 的权威形状住 `.claude/agents/os-dev.md` 终报消息节,⛔ 本文不抄第二份。
776775
- `premise_still_valid: false` + `pr: null` 是合法终报,当再分诊输入复核,永不当失败派发。
777776
- `status: needs_decision` 时 `open_questions` 必须非空。
778-
- `out_of_scope_findings` 只列三类立卡与 `noted, not filed`;立卡附查重词、归挂、立在修复仓。
779-
- 席位在 ACCEPT 读 PR `## Acceptance notes`,实属三类的由席位补立;三类外已立的卡关 not planned。
777+
- `out_of_scope_findings` 每条 `class: a|b|c`+证据,或 `carrier:`(承接者);皆无 ⇒ Acceptance notes。
778+
- dev 不立卡;ACCEPT 逐条一行 `filed #N`/`Acceptance notes`/`dropped — 因`;三类由席位立在修复仓。
779+
- 席位读 PR `## Acceptance notes`,实属三类的补立、归挂、附查重词;三类外已立卡关 not planned。
780780
- PM 核验它们存在,并把同轮并行报告互相对读:两个 dev 同一小时审相邻代码会立出孪生卡。
781781

782782
## 机械守卫索引

‎.claude/skills/pm-dispatch/references/core-rules.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
- 裸卡超过十五张则下一轮改域分批集中模式,每批不超过五张同族卡。
8585
- 有落点或可复现的缺陷、范围明确的工具修复与实现未被裁错的说明书脱节进 `pm:queue`。
8686
- 设计卡、契约形状提案、碰迁移形状或删已发布能力的进决策箱;无出处说明书脱节不进。
87-
- 立卡限三类:可复现缺陷、契约违背、元数据陷阱;截断卡先发修复指令再跳过,不可派发。
87+
- 立卡限三类:今日可达可复现缺陷、契约违背、具名生产者陷阱;截断卡发修复指令不派。
8888
- 三类边界:缺陷问错不问缺、文档同判;元数据须他人再作者化;引向更糟的警告在类外。
8989
- 类型字段由分诊席唯一生产,违背已声明契约是缺陷、扩出已声明是功能、其余是任务。
9090
- 缺陷卡无具名落点或复现路径不入队列 ⛔ 不回填存量;每张卡留一条英文审计评论。
@@ -148,4 +148,4 @@
148148
## 报告契约
149149
- 终报 JSON 的权威形状住 `.claude/agents/os-dev.md`,⛔ 本协议不另存第二份。
150150
- 前提被证伪且无 PR 是合法终报,当再分诊输入复核,⛔ 永不当失败派发。
151-
- needs_decision 必带 open_questions;范围外发现三类立卡、其余 noted not filed,核验对读同轮报告。
151+
- needs_decision 必带 open_questions;范围外逐条 `class:`/`carrier:`,dev 不立卡,席位处置、对读同轮。

‎.claude/skills/pm-dispatch/references/lanes/director.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@
3737

3838
## 职责二:决裁勤务
3939

40-
- 第一步:逐卡过一类自裁三判据;全立者录裁转工作态、只入收班追认表,⛔ 不呈批。
40+
- 首批读完前 ≤5 张同族卡即呈;一类自裁按批过,⛔ 不先扫全箱,自裁者由下一候选补位。
41+
- 取下五张只用便宜扫描:标签、assignee、PR 引用、速读首行;全文只读手上五张。
42+
- 判据:开场标记→首批 ≤ 读五张;全立者录裁转工作态、只入收班追认表,⛔ 不呈批。
4143
- 决策收件箱 `needs-user-decision` 跨仓勤务,按基本原则批呈;⛔ 不复活已退役的汇总 issue。
42-
- 一行回批即全链执行,裁后四件原子执行不再请示。
4344
- 一次只开一批:维护者对批 N 回字(一字即可)后,新到才合成批 N+1;续批至清零才收工。
4445
- 受管草稿批:两仓 `is:pr is:open is:draft label:needs-user-decision` 对照等人合清单,差集点名。
4546
- 有席内 ACCEPT 者呈一批 ≤5 行,写法见 `../decision-analysis.md`;四件缺一者列缺口不呈。
@@ -48,7 +49,6 @@
4849
- 以协议为准:消费面对齐协议 ⇒ 一类自裁,协议没有的能力删,⛔ 不立卡问协议。
4950
- 协议是否正确由本席按①读协议原文与主流平台自判,有误即裁改动而非立卡提问。
5051
- ADR 条目被协议取代 ⇒ 条目下加带日期注记点名 spec 符号,⛔ 不改写原文、不沉默。
51-
- 代裁通道的置信门与人工地板见 SKILL.md 分诊座位职责,⛔ 不另抄。
5252

5353
## 职责三:维护者动作台账
5454

0 commit comments

Comments
 (0)