Skip to content

Commit be2594e

Browse files
claude[bot]os-steveclaude
authored
docs(pm): a plain-language digest of the PM corpus's binding rules (#15402)
* docs(pm): add a plain-language digest of the PM corpus's binding rules One new reference file, `.claude/skills/pm-dispatch/references/core-rules.md`: every binding rule of the PM corpus as one plain-Chinese sentence per line, grouped under the corpus's own section order, 150 lines, every line within the 120-byte cap. Rules only — no provenance narrative, no incident story, no date, no quotation, no issue number. The escalation decision frame is referred to by section and its axes named in short words; the frame block itself stays in exactly its two watched copies. Adds the ceiling row and the max-table-row pin for the new file, both at the landed measurement; no other row moves. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox * docs(pm): keep the gate-label read-back clause in the digest's label-write rule The label-write rule folded to one line lost the clause that gate-semantics labels follow the same four steps in both directions. Restored inside the 120-byte cap. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox * docs(pm): fix the state-set count and drop the first-person voice in the digest Two seat-review fixes to the digest: - the mutual-exclusion rule counted seven states; the corpus has five `pm:*` state labels plus `needs-user-decision`, six in total. Rewritten to say five plus one, keeping the one-replace-write rule and the three-day queue-rot clause. - the handover rule used a first-person seat voice; replaced with a role-neutral form. The file stays at exactly 150 lines with every line inside the 120-byte cap. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox * docs(pm): give the digest a round boundary, and say the timer is the next wake-up Two rules added under the entry section: a round runs from the fire that wakes the seat until the queue is empty or the usage window is exhausted, and the round report is the end-of-round account rather than a stop signal; the self-timer sets only the next wake-up, so an unfinished round is continued on the next fire, never restarted or re-ordered. The triage seat's timer line is reworded to the same reading. Paid for inside the 150-line ceiling by folding two pairs that state adjacent rules: the round-report contents with the health-indicator list, and the claim atomic pair with the claim-comment field list. No prohibition was dropped; both folded-out halves are enumerations already declared as lookup data in the PR body's second table. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox --------- Co-authored-by: os-steve <steve@objectstack.ai> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
1 parent f01adfa commit be2594e

2 files changed

Lines changed: 157 additions & 0 deletions

File tree

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# PM 核心条款(人读摘要)
2+
每行一条有约束力的规则,按 PM 语料自身的章节分组,供人工复核。
3+
细节参数、事实表与操作配方仍以 SKILL.md 与同目录其它 references 为准;本文不新增规则。
4+
## 入口与角色
5+
- 座位角色由 `/pm-dispatch` 参数认定;无角色参数按执行姿态跑,车道由座位贴认定。
6+
- 开轮第一个动作是一次最便宜的车道盘点查询,⛔ 在它之前不读任何长文本。
7+
- 队列空、无在飞、无待复核、决策箱无新答复,本轮即自退。
8+
- 一轮自 fire 唤醒起,到队列清空或用量窗口耗尽止;轮次报告是轮末汇报 ⛔ 不是停止信号。
9+
- 自设定时器只定下次唤醒、不定轮长;新 fire 到时上一轮未清空即接续,⛔ 不重开不重排。
10+
- 分诊席跑普通直连会话,达档职责改派显式传档位的子代理;自排下次唤醒不超过 55 分钟。
11+
- 开轮互斥读四个读数:收班简报、开轮标记、本车道最新他会话认领、最新关闭卡的认领。
12+
- 未收班活动任一未满一个轮次即自退;有收班简报可直接坐席,坐席后先写开轮标记。
13+
## 全体座位的不变量
14+
- 所有状态住 GitHub 的标签、assignee、正文行与 `pm:seat` 座位贴,⛔ 本地不留跟踪状态。
15+
- 循环必须能从全新会话恢复。
16+
- PM ⛔ 不写文件也不写代码,唯一例外是维护者逐 PR 明示授权的 `.claude/` 内部工具 PR。
17+
- 该例外须把授权原话引在 PR 正文并由另一座位或维护者复核,⛔ 不得自审自合。
18+
- GitHub 上的新内容一律英文,中文只留轮次报告、派发令里的裁决引文与决策四维分析。
19+
- 裁决引文照抄不译;存量中文 ⛔ 不追溯改写。
20+
- 一座位一车道双射,每个域恰好一个 PM;与 AGENTS.md 冲突时以 AGENTS.md 为准。
21+
## 状态模型
22+
- 可派发等于 open 加队列标签加无 assignee 且不带 `pm:retriage`,已设 assignee 即 ⛔ 永不碰。
23+
- `pm:dispatched` 与摘 `pm:queue` 恒在同一次标签写入里成对落地。
24+
- `needs-user-decision` 是决定待做:⛔ 永不派发,除代裁通道外 ⛔ 永不代答。
25+
- `pm:on-hold` 仅当带机器可读 `Restart-when:` 行才合法,触发文件走 `Restart-touch:` 行。
26+
- hold 放行须双查:只放最近一次转换评论的条件,其后有更新的 merged PR 即拒。
27+
- 没有可点火出口的卡 ⛔ 不 hold,直接关 not planned 并把理由与出处写进关单评论。
28+
- 缺陷卡 ⛔ 不可自行关闭或藏进 hold:可复现回队列、未兑现走 enforce-or-remove、余下进箱。
29+
- `pm:blocked` 配正文行 `Blocked-by:`,工已完而卡在门禁的同用此态并写 `Unlock-action:` 行。
30+
- `pm:awaiting-maintainer` 只剩站外人工动作;`pm:blocking` 是反向索引推导的缓存 ⛔ 不手工挂。
31+
- `pm:retriage` 并存 ⛔ 不摘原标且跳过派发;`finding` 恒等于待首次定级、定级即离标。
32+
- 插队标签可超 `batch` 立即派发,⛔ 不豁免同文件串行与认领协议。
33+
- 五个 pm 状态标签加 `needs-user-decision` 共六态互斥,转换恒一笔 replace,队列卡逾三天欠转换。
34+
- 关闭即在同一笔摘掉 pm 状态标;状态变更不过夜,半状态在结束会话前补齐或回滚。
35+
- 等待别的座位也是状态、写在卡上才存在;代他人指令的关闭须带指令、原话与出处三件。
36+
- 标签写恒为读现值、增删目标、写合并集、回读比对四步,缺项即重挂,闸门标签同此。
37+
## 平台读数纪律
38+
- 判据取命令输出,⛔ 不取 API 字段字面值、不取本地工作树、不取看着相邻的日志。
39+
- 核验 main 用先 fetch 后的 `origin/main`,⛔ 不用共享检出的工作树。
40+
- 零命中必须用确定存在的邻近词反查才成立;仓不可达时 ⛔ 不得当成查过且干净。
41+
- 板面、树与队列读数一律自带 UTC 取数时刻,无时间戳的读数按未取处理。
42+
- 失效修法按序取:先删掉容许出错的构造,再让正确形态成为唯一拼写,最后才加检查。
43+
- 自设定时器的文本以先重读状态开头,只写关键判据,⛔ 不写可直接执行的祈使句。
44+
- PM 写进 GitHub 的文本 ⛔ 不用尖括号占位符,携带易损片段的评论发出后回读。
45+
- 放行认承载门禁族的 job 结论 ⛔ 不认聚合读数,advisory 红着进 main 即止血并立单。
46+
- 子代理自死不等于维护者中止,需显式信号;立单前查重的空结果须有控制词背书。
47+
- 默认读序 git、payload、REST、MCP;REST 可达性逐会话探一次;派发前读配额不够就减批。
48+
## 多仓协调
49+
- 依赖方向固定:objectstack 提供唯一契约,objectui 与 cloud 消费它。
50+
- 多车道仓的域标签、类型与定级只由中央分诊生产,单车道仓自理三务但 ⛔ 不产域标签。
51+
- 跨仓查重与 shadow 检查恒归中央 ⛔ 不下放,在飞卡 ⛔ 不中途转仓。
52+
- issue 住在修复落地的仓,抽掉 objectstack 仍成立的当场转仓;缝卡须带仓标签并点名读者。
53+
- 跨仓 feature 拆成父单加每仓一张子单,下游带 `Blocked-by:`,上游未关闭 ⛔ 不派发。
54+
- pin 消费的仓派发前核 pin 是否已覆盖那个提交,发布包消费的仓判据是消费方可安装。
55+
- 上游未发版时转 hold ⛔ 不回队列;已验收产物流向另一仓由接受席立即立后续单。
56+
- 任何跨座位请求都是工作,一律立卡进目标车道队列,等待方同笔把自卡翻 `pm:blocked`
57+
- 凡触 `packages/spec` 一律转 `domain:spec` 座位,不论谁需要它。
58+
## 域车道
59+
- 每个包恰好属于一个域,域标签等于修复落地的那个包所属的域,由分诊读代码判定。
60+
- ⛔ 绝不从 issue 标题的词汇猜域;说不出修复碰哪个文件就还不可标。
61+
- 域到包家族的对照表住 SKILL.md,增删一个域标签必须同批改那张表。
62+
- 域标签只由分诊席产出;打标签不等于认领,未打标签的 issue ⛔ 任何人不得认领。
63+
- 跨域单 PR 由分诊席指定一个车道 PM 认领并申报完整文件面,只此路径跑定向在飞检查。
64+
- 合并队列是共享串行资源,谁发现 flake 谁修或立单,⛔ 不绕行。
65+
## 座位贴协议
66+
- 一座位一贴,正文固定四段现值:当前 PM、继承台账、热文件串行队、说明。
67+
- 贴正文由在任 PM 独家编辑且为权威,标题只放慢状态、与 assignee 同为派生视图同笔更新。
68+
- 岗位说明与常设承诺版本化在 `references/lanes/` 下,贴内只放指针,升级走技能 PR。
69+
- 写侧刷新点是轮次边界,读侧只读正文加晚于它的评论;热文件串行队是正文具名段。
70+
- 活性靠惰性判定,超过一天无自有产出即可降级回收;⛔ 永不从更新时刻或标题推死活。
71+
- 收班是状态 flush 加在飞安置而非归零,简报是最终一笔;留守只写简报点名的项。
72+
- 换班报告默认零建议,只收原则错缺、可机械化项与平台事实变化三类。
73+
- 交接按收尾清单逐步走完并清点自设定时器;归档自己派出的会话是不可移交的义务。
74+
## 分诊座位职责
75+
- 执行席 ⛔ 跳过分诊动作,读到标签当既成事实。
76+
- 两级盘点是小时轮读增量加每日全量对账,枚举须比对总数、不等即报不完整并点名缺口。
77+
- sweep 扫全裸卡、队列卡缺域标签、域标签卡缺 pm 状态,排除跟踪、停放与协议载体卡。
78+
- 首触定级跑到清空 ⛔ 无总量预算、未跑完断点续跑;清得空最新优先,否则最老优先。
79+
- 裸卡超过十五张则下一轮改域分批集中模式,每批不超过五张同族卡。
80+
- 有落点或可复现的具体缺陷与范围明确的工具修复进 `pm:queue`
81+
- 设计卡、契约形状提案、碰迁移形状或删已发布能力的进决策箱,落卡即带四棱块。
82+
- 观察类记录打 `finding` 待首次定级;正文被截断的卡先发修复指令再跳过,不可派发。
83+
- 类型字段由分诊席唯一生产,违背已声明契约是缺陷、扩大接受面是功能、其余是任务。
84+
- 缺陷卡无具名落点或复现路径不入队列 ⛔ 不回填存量;每张卡留一条英文审计评论。
85+
- 路由是分诊的技术判断 ⛔ 永不升级哪个仓的问题;父单是协调节点、永不派发。
86+
- 发版板判据二元:不修它当前候选版能不能发 ⛔ 不做渐变,拆票时标签随工作走。
87+
- 发版阻塞四类:用户今天撞上的已发布面缺陷、契约声明未兑现、迁移形状、要道歉的。
88+
- 代裁只由达档者产出 ⛔ 永不凭自述,不达档则通道整体跳过、卡走维护者路径。
89+
- 人工地板恒交维护者:功能新增、ADR、协议与公开契约变化、破坏性或难回滚动作。
90+
- 人工地板同样含安全与权限边界、门禁削弱、花费配额与模型档位、新增运行时依赖。
91+
- 代裁车道只覆盖行为不变的重构与缺陷修复,边界测试是接受面有没有扩大。
92+
- 置信门五条全立才可代裁:四棱同向、不在地板、不推翻既有裁决、否决窗口执行、达档。
93+
- 代裁即换标签、贴四棱块与结论、打自动裁决标记、轮报设专节;发现契约要动则回箱。
94+
- 方向性授权覆盖整条执行链,需裁事项攒批呈报,运维细节 ⛔ 不弹给维护者。
95+
## 执行座位职责
96+
- 每轮巡检先读半状态巡查锚上点名本车道的行并逐行处置,未处置 ⛔ 不开新派发。
97+
- 候选整车道一次读全再本地求交,每张读全文与全部评论并把裁决逐字引入派发词。
98+
- 派发前做前提过时检查,动作面、卡引用面与工作项面三面都对树核验。
99+
- 一批内任两单不得碰同一个包、注册表、barrel 或 spec schema;同文件的单跨轮硬串行。
100+
- 家族派发须过五门:同缺陷同修法、同包区域、成员皆已裁、逐成员可核、点名排除清单。
101+
- 两张以上排队卡共享热文件时,必须以五门为判据显式回答折叠还是串行。
102+
- 取卡全序:插队卡、有下游依赖者的卡、发版板上项、缺陷卡、其余,同级按卡龄。
103+
- 认领原子对:一次标签写入完成认领与状态对调,随后留 `Claim:` 开头的评论并重读全线程。
104+
- 更早的他会话认领即让行并交出已诊断的一切;认领逾一天且无合并证据即疑死。
105+
- 回收前先救工作树,有提交的活分支 ⛔ 永不回收。
106+
- 一单一次派发调用,档位逐卡显式传参,协议语义面与契约变更卡恒走契约复审档。
107+
- 派发词 ⛔ 不整段粘贴 issue 正文,只带增量,并要求子代理自查正文完整性。
108+
- 派发词分三区:裁决不可重裁、机制假设须实测、建议路线可换,⛔ 不把假设写成裁决。
109+
- 标准非协商条款 ⛔ 不抄进派发词,清单、路径与行号在派发那一刻从树上取。
110+
- 危害断言必须有读数,测不了写成问题 ⛔ 不写成栅栏;技能包卡必带净增行数预算。
111+
- 收集先扫 GitHub 且报告缺席 ⛔ 永不读作成功;探活每轮先重挂定时器。
112+
- 45 分钟是发探针的门槛而非判死门槛,判死只认探针回包、宿主信号或超实测基线。
113+
- 停摆永不自愈,按梯度复位、三次即判不可靠重派;报告丢失时按草稿 PR 直接验收。
114+
- 复核对 GitHub 核验 ⛔ 不对自述核验,逐项过清单并亲核形态、范围与整包价值密度。
115+
- CI 收敛读数只属于复核侧;判决三种:验收落卡、返工最多两轮、升级走决策通道。
116+
- 验收后先取 PR 路径面,一条命中受管面即分叉,⛔ 不翻正式、不入队、不挂自动合并。
117+
- 受管面 PR 留 draft 并向两个授权批准账户请审;档位不足的契约卡 ⛔ 禁止入队。
118+
- 入队资格是每一个检查全绿 ⛔ 不是必查子集;碰生成物的 PR 入队前先同步再重生成。
119+
- 跟到合并为止并每轮读队列成员资格与 `origin/main`;踢出按签名台账四分支处置。
120+
- 每轮打中文轮次报告,含判决表、升级项、代裁清单、等人合项、受管合并审计与五指标。
121+
- 收工点是会话内在飞归零、存档后立即派下一波 ⛔ 不等人闸;清空转待命而不是退场。
122+
## 断粮与跨墙恢复
123+
- 权威的用量墙信号是失败本身,重置时刻只在撞墙那一刻可得,拿到就记下来。
124+
- 拿到重置时刻挂一发定点定时器、否则挂每小时循环 ⛔ 不用延时链,成功后删掉循环。
125+
## 升级与决策
126+
- 升级只有两条门槛:公开契约或产品语义真实分歧且规范定不了,或动作破坏性难回滚。
127+
- 其余都是 PM 的裁量,给维护者的是否决窗口而不是许可门。
128+
- 具名不升级类:恢复不变量的修复、技术任务之间的顺序与依赖、验证策略。
129+
- 带前提的裁决三件缺一不可:选路线、挂具名可证伪前提、前提不成立必须报分叉。
130+
- 同族近似单默认并入既有拒收集;两个实现不一致时带治理的一侧胜出并删另一侧。
131+
- 落卡先刷新前提,每条前提行自带一条 re-check 命令;决策默认锚在所属 issue。
132+
- 裁决记录四件同笔:鲜度门、状态转换、依赖行活性现验、条件已知即就地判掉。
133+
- 出决策箱须引一个同趟取回过的裁决 id,⛔ 时间戳加回忆不算引用。
134+
- 方案逐轴过升级与决策段的四轴:业务需求、长远合理性、防 AI 写错、创业阶段聚焦。
135+
- 逐轴分析不是可选项;推荐须逐轴给理由,长远合理性权重不低于一半、其余投不翻它。
136+
- 有实测拉动时荐长远终态一次付清,零拉动时荐不扩散,防错轴打破余下平局。
137+
- 每张决策卡落卡即带标准四棱块;卡先于弹窗,被阻塞的执行卡同笔转 `pm:blocked`
138+
- 项目总监席由人工召唤,四职是复核审计、决裁勤务、维护者动作台账、受管合并审计。
139+
## 护栏
140+
- PM 不写任何文件;⛔ 永不合自己的、红的或未复核的 PR,合并只经合并队列发生。
141+
- 版本发布必须人工,发现未经人工的发布痕迹按事故立案,⛔ 不代跑补救性发布。
142+
- 版本包 PR 默认永不催,唯一例外是重要修复已合 main 在等发布且提醒点名用户后果。
143+
- 受管面由维护者人工合并且合并即审核记录,⛔ 席位永不以任一账号对受管面 PR 批准。
144+
- ⛔ 永不代维护者回答产品或架构问题,唯一例外是已裁的代裁车道。
145+
- ⛔ 永不派发 assignee 属于别人的 issue,⛔ 永不派发带决策标签的 issue。
146+
- 并行度以 `batch` 封顶,同批按构造文件面不相交。
147+
## 报告契约
148+
- 终报 JSON 的权威形状住 `.claude/agents/os-dev.md`,⛔ 本协议不另存第二份。
149+
- 前提被证伪且无 PR 是合法终报,当再分诊输入复核,⛔ 永不当失败派发。
150+
- 报 needs_decision 时 open_questions 非空;范围外发现须已立卡,PM 核验并对读同轮报告。

scripts/pm/check-skill-line-ratchet.mjs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,12 @@ export const CEILINGS = new Map([
599599
// over-120B lines are all `table` rows, structurally exempt and NOT
600600
// re-wrappable; they are metered instead by MAX_TABLE_ROW_BYTES below.
601601
['.claude/skills/pm-dispatch/references/compile-surfaces.md', 26],
602+
// Plain-language digest of the corpus's binding rules, one rule per line, added
603+
// under the 2026-09-04 rules-only ruling so the maintainer reviews the rules
604+
// instead of the corpus. Set at the landed line count (headroom 0, same
605+
// convention as every entry above); it is a NEW file, so this is an added row
606+
// and no other row moves.
607+
['.claude/skills/pm-dispatch/references/core-rules.md', 150],
602608
// Lane job descriptions (maintainer ruling 2026-08-19: per-lane PM job
603609
// descriptions move from seat-post prose into versioned skill references).
604610
// Set at landed line counts (headroom 0, same convention as above).
@@ -916,6 +922,7 @@ export const MAX_TABLE_ROW_BYTES = new Map([
916922
['.claude/skills/pm-dispatch/references/seat-post-protocol.md', 0],
917923
['.claude/skills/pm-dispatch/references/true-green.md', 0],
918924
['.claude/skills/pm-dispatch/references/compile-surfaces.md', 352],
925+
['.claude/skills/pm-dispatch/references/core-rules.md', 0],
919926
['.claude/skills/pm-dispatch/references/lanes/engine.md', 0],
920927
['.claude/skills/pm-dispatch/references/lanes/services.md', 0],
921928
['.claude/skills/pm-dispatch/references/lanes/cli.md', 0],

0 commit comments

Comments
 (0)