docs(pm): rules-only rewrite of the pm-dispatch SKILL.md — 红线 first, one rule per line, templates last - #15460
Draft
claude[bot] wants to merge 4 commits into
Draft
docs(pm): rules-only rewrite of the pm-dispatch SKILL.md — 红线 first, one rule per line, templates last#15460claude[bot] wants to merge 4 commits into
claude[bot] wants to merge 4 commits into
Conversation
…one rule per line, templates last The PM operating protocol keeps every binding rule, every lookup table and every form, and drops the provenance narratives, ruling dates, verbatim quotations and incident post-mortems. A 红线 section of 15 absolute prohibitions and a five-line precedence section lead the file; the sections keep their order; the decision-frame block is byte-identical. The digest moves its guardrails to the top under the same name, and the line ratchet re-pins the SKILL.md ceiling (1005 → 804) and its widest-table-row pin (642 → 342) at the landed counts. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
Contributor
Author
Table 1 — part B (continuation of the PR body's Table 1; same legend; re-rendered after the fourth patch round)
Generated by Claude Code |
…ine names what it forbids Two in-place rewrites in SKILL.md, no line added or removed: the self-timer default now says 轮末 (班 is a whole tenure, so 收班时挂 read as arming only at handover), and the triage red line now says the seat never claims a card and never dispatches a dev flight, leaving its graded duties to the contract-review-tier subagent named four lines later. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
This was referenced Sep 4, 2026
…d a verification layer; the claim form's Clause-② row stays bare Six rules in 入队与落地 and one in 座位贴协议: on a repository whose default-branch push triggers an outward-facing deploy the lane merges only if a verification layer exists (deploy gated on CI, the live surface probed after every deploy, a failed deploy rolled back and filed), the landing criterion there is published-and-probed rather than MERGED, post-merge workflows are registered as their own check class because no PR check list shows them, and a human click is not a substitute for a probe; the seat post records per repository whether a merge publishes and what its verification layer is. The digest carries the same rule in one line, paid by merging its two adjacent state-on-GitHub bullets, staying at 150. The claim-comment form keeps its bare Clause-② line, which the carrier checker reads as declared. The SKILL.md ceiling moves to the landed 811, still below the base 1005. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
This was referenced Sep 4, 2026
…ention is a stall, not a delivery One PM-side detection rule in 收集: a report that ends on an intention rather than a result marks a stalled dev, not a completed one — the seat resumes it at once with SendMessage and never reads it as a delivery or as death. Paid for at the same 811 lines by merging the two adjacent notification-reading rules (replay never re-accepts; arrival proves neither life nor death), with their prohibition kept. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #15412
Part of #15379
Fixes #15364
Part of #14965
Part of #15146
.claude/skills/pm-dispatch/SKILL.mdis now a rules-only file: a 红线 section of 15 absolute prohibitions and a five-line 优先级 section lead it, then the file's own sections in their existing order, each a list of one-rule-per-line entries (≤120 bytes, identifiers in backticks), with the lookup tables kept in place and the claim-comment form kept in a final 模板与表 section. Provenance narratives, ruling dates, verbatim quotations, incident post-mortems and rationale tails are gone; the decision-frame block is byte-identical to its watched copy. The digestreferences/core-rules.mdmoves its 护栏 section to the top as 红线 at the same 150 lines, andscripts/pm/check-skill-line-ratchet.mjsre-pins the SKILL.md ceiling 1005 → 811 and its widest-table-row pin 642 → 342 (both down, no other row moves). Every gate that pins a literal in this file was read first and each literal is kept verbatim (Table 3).Legend for Table 1 notes: D date stripped · Q quotation stripped · N narrative / rationale tail dropped · S split out of a multi-rule sentence · P detail replaced by a pointer to a reference file · T table row kept · F form kept · U unchanged · M(old Lx–y) absorbed from those lines of the previous file · NEW new placement or definition. Angle-bracket placeholders inside quoted lines are shown with 〈 〉 so the platform sanitizer does not eat them.
Added on 15364 / 14965 (third patch round). Seven rule lines for the deploy-on-merge card, in the card's final shape (the maintainer's arc ended at a verification layer, not a human click): six in 入队与落地 — on a repository whose default-branch push triggers an outward-facing deploy the lane merges only if a verification layer exists (deploy gated on CI, the live surface probed after every deploy, a failed deploy rolled back automatically and filed as a card); there the landing criterion is published-and-probed, ⛔ not MERGED, followed to the publish; post-merge workflows sit on no PR check list so every PR-check-reading rule is blind to them and the deploy workflow is registered as its own check class; a human gate that cannot answer "will it break" buys delay, ⛔ not safety — and one in 座位贴协议: the seat post registers per repository whether a merge publishes and what its verification layer is, a missing entry reading as unverified. The digest carries the same rule in one line under 执行座位职责, paid for by merging its two adjacent state-on-GitHub bullets (still 150). The ceiling row moves to the landed 811 (base 1005; the table-row pin stays 342, no table changed). For the carrier card's template half: the claim form's
Clause-②row is already the bareClause-②: yes | noline (the em-dash-and-rationale shape was dropped in the rewrite) and the criterion already sits as two rule lines in 认领; probing the carrier checker'scardDeclaration()directly reads that line asdeclared, and its--self-testpasses — no further template change was needed, and no other form in 模板与表 carries the old shape.Added on 15146 (fourth patch round). One PM-side detection rule in 收集, right after the stall-signal rule: a dev report whose last line is an intention rather than a result marks a stalled dev, not a completed one — the seat resumes it at once with SendMessage, ⛔ never reading it as a delivery or as death (the dev-side rule lands on the agent definition's own PR). Paid for at the same 811 lines by merging the two adjacent notification-reading rules (
重放 ⛔ 不重新验收、不重复 ACCEPT+通知到达不读作还活着,不到达也不读作已死→ one line, prohibition kept). Digest untouched at 150.Table 1 — one row per rule line of the new SKILL.md (part A; part B follows in the first PR comment)
os-dev开发 agent 完成,一单一 agent 一 worktree。needs-user-decision决策卡。.claude/内部工具 PR。needs-user-decision或pm:retriage的卡。git stash。content/docs/releases/。domain:*。AGENTS.md〉 红线 〉 核心条款 〉 细则 〉 座位判断。references/core-rules.md,是本文的子集;细则是本文其余各节与其它 references。/pm-dispatch [args],自由组合,全部可选:director/epiccross-refs de-quoted;moderow Ddirector/epiccross-refs de-quoted;moderow Dtriage| 以分诊座位身份运行(只扫/分类/路由,永不认领) | — |director/epiccross-refs de-quoted;moderow D〈domain〉(如spec、skills) | 以该domain:*车道的执行座位身份运行 | — |director/epiccross-refs de-quoted;moderow Depic:#〈n〉| 以父单 #n 的 epic PM 身份运行(见 Epic 子树车道 节) | — |director/epiccross-refs de-quoted;moderow Ddirector| 以项目总监席身份运行(人工召唤;四职见 升级与决策 节与references/lanes/director.md) | — |director/epiccross-refs de-quoted;moderow Dlabel:〈name〉| backlog 过滤标签;label:all= 全部 open 未认领 |pm:queue|director/epiccross-refs de-quoted;moderow Drepo:〈owner/name〉| 扫哪个仓的 backlog(单 issue 的落地仓看它自己的repo:*标签) |objectstack-ai/objectstack|director/epiccross-refs de-quoted;moderow Dbatch:〈n〉| 同时在飞的 dev 上限 |3|director/epiccross-refs de-quoted;moderow Drounds:〈n〉| 跑 N 轮后停 | 队列清空为止 |director/epiccross-refs de-quoted;moderow Dmode:subagent|mode:cloud| 派发后端 | 按卡分流:S+M ⇒subagent,cloud只留 L/XL 等保留面 |director/epiccross-refs de-quoted;moderow D#12 #34 …| 显式 issue 清单,整体覆盖标签查询 | — |director/epiccross-refs de-quoted;moderow Dmodel的契约复审档子代理。references/contract-review.md。pm:dispatched卡最新非本 session 的Claim:评论,只计认领本车道派发的。state=CLOSED按updated_at降序第一张卡的Claim:session ID。pm:seat座位贴读写。AGENTS.md冲突时,AGENTS.md胜。pm:retriage的除外) |pm:dispatched| 已派发(派发评论记轮次);与摘pm:queue同一次标签写入成对落地 |needs-user-decision| 决定待做:永不派发、除代裁通道外永不代答;维护者的收件箱 |pm:on-hold| 决定已做且答案是暂不做:不派发不催;仅当带机器可读Restart-when:行才合法 |pm:blocked+ 正文行Blocked-by: #N| 等上游:选择期跳过,#N 关闭时由解锁扫描放回;工已完、PR 被外部门禁卡住的同用本态 |pm:awaiting-maintainer| 决定已做,只剩一次 GitHub 之外的人工动作:不派发不催;与其它 pm 状态标签互斥 |pm:blocking| 有 open 下游依赖者(自Blocked-by:索引推导的缓存,⛔ 不手工挂);进选择全序 |pm:retriage| 等分诊改判:与现行pm:*并存、⛔ 不摘原标;带本标签的pm:queue卡跳过派发 |finding| 观察类记录,恒 = 待首次定级;定级即离标;不占队列不进收件箱 |target:〈major〉| 发版阻塞:每个 backlog 恰好一个生产者 |pm:epic(父单) | 子树已委托 epic PM;其它 PM 不把其 sub-issue 当候选 |pm:seat| 座位登记贴:协议载体,不是待分诊的工作 |priority:p0| 插队:可超batch、破轮次立即派发;⛔ 不豁免同文件串行与认领协议 |Fixes #n| 完成(GitHub 关单) |needs-user-decision共六态互斥,转换恒一笔 replace ⛔ 不 add。pm:queue卡逾三天欠一次显式转换(派发/转箱/停放/撤单/改前提),⛔ 不是排期。Restart-touch:触发文件细则见references/state-machine.md。Unlock-action: re-check PR #M行改写完工卡的解锁动作,只认此一值,别的拼写静默回落。needs-user-decision是决定待做,pm:on-hold是决定已做;manual — 〈理由〉⛔ 不是合法出口。pm:queue。pm:*状态标;domain:*与类型标签留下,归属不是状态。state_reason与关闭理由一致:撤单/不做 ⇒not_planned,重复 ⇒duplicate+duplicate_of。Blocked-by:行是机器可 grep 的反向索引,一遍读喂三个职责,⛔ 只做第一件。pm:blocking即其推导缓存,读者以词表脚本注为权威。pm:on-hold+Restart-when:加消费方安装面判据,⛔ 不回pm:queue。needs:contract-review)挂与清两向同此四步。references/platform-readings.md。references/platform-readings.md,做对应操作的那一刻查阅。origin/main:先 fetch,再git grep PAT origin/main -- PATHS或git show origin/main:PATH。YYYY-MM-DDThh:mmZ,树读数另带 ref 或 tip。completed: success),⛔ 不认聚合读数。references/landing-operations.mdB 节。needs-user-decision卡,该 PR 不挂 auto-merge 留异议窗口。references/rest-channel.md。rate_limit,余量装不下整批就减批,⛔ 不靠撞墙发现。objectstack(后端,packages/spec是唯一契约)→objectui(前端)与cloud。pnpm objectui:refresh回流。objectstack、objectui:中央分诊是domain:*/type/定级的唯一生产者。cloud、objectos、hotcrm、www.objectos.ai;未来新仓默认此类。repo:*席自理机械三务,⛔ 不产domain:*;决策卡默认入 objectstack 收件箱。type、自做finding首触定级。references/lanes/hotcrm.md。domain:ui是唯一新增标签。domain:devx(工程面)与domain:spec(契约面)跨仓归各自车道。domain:ui执行席;症状位置不改流向,docs 随所记录的面走。scripts/pm/**等住 objectstack 的全板工具链单写手恒为 objectstack 侧席,他侧上游立卡回链。#N改全名 + 关源单为 moved。repo:*,正文点名读者(哪个座位、哪一步)。Blocked-by: 〈owner/repo〉#〈n〉;Blocked-by未关闭/未合并的不派发,对 GitHub 现验。compare核祖先。merge-base在浅检出上给假非祖先;未覆盖 ⇒ 派发令要求 PR 正文留档分叉窗口。Blocked-by:。pm:retriage+ 异议评论同笔。repo:*席 = 执行座位 + 机械三务自理;skills 车道 finding 自分诊例外照旧。batch,持续积压按仓拆席走 PR;⛔ 不跨车道借调。pm:queue、出处行与一行可执行判据,依赖用Blocked-by:。packages/spec一律转domain:spec座位,不论谁需要它。pm:blocked+Blocked-by:指向请求卡;⛔ 不设新标签新 sweep。repo:*+ 具名读者。domain:*= 修复落地的那个包所属的域。domain:engine|packages/objectql、packages/core、packages/formula(CEL /matches-filter/ RLS 谓词求值)、plugin-pinyin-search;packages/metadata*、packages/platform-objects;packages/drivers/driver-*;退役标签domain:engine-core/domain:metadata/domain:drivers只退出流通,GitHub 标签对象保留 |domain:services|packages/services/*、packages/connectors/*、packages/triggers/*、plugin-approvals、plugin-webhooks、plugin-email、plugin-reports、embedder-openai、knowledge-*;plugin-auth、plugin-security、plugin-sharing、plugin-audit;退役标签domain:identity同上只退流通 |domain:devx|packages/lint、packages/sdui-parser、content/docs/**、apps/docs、scripts/(门禁类;与domain:skills的分界按门禁的 SUBJECT:治理 agent 指令面/governed 面的归 skills,治理代码/文档质量的归本域);与domain:spec相交的面按是否围着 spec 契约转切分 |domain:skills|.claude/skills/**(含本文件)+skills/**;根AGENTS.md+ 根CLAUDE.md;governed 面的治理执行文件:.github/CODEOWNERS+ SUBJECT 是 governed 面本身的门禁/审计(现为scripts/pm/check-governed-merges.mjs) |domain:spec|packages/spec整包:schema 形状、contracts/**、退役行为半边、strictness 台账;describe/JSDoc/墓碑散文/错误 guidance 与 alias 表;packages/spec/scripts/**、packages/spec/docs/**及围着 spec 契约转的工具链;一般开发工具面留devx;席内分派见references/lanes/spec.md|domain:cli|packages/cli、runtime、verify、qa、types、packages/rest、packages/mcp、packages/observability、packages/client*、cloud-connection、create-objectstack、packages/adapters/*、plugin-hono-server、plugin-dev|packages/apps/*、packages/console(dist 由脚本生成 ⛔ 不手改;UI 缺陷走repo:objectui)、examples/*(归它演练的子系统) |domain:*必须同批改本表。label:pm:seat索引为准,每个domain:*与repo:*恰一张座位贴。domain:*只由分诊席产出;打标签不等于认领,未打标签的 issue ⛔ 任何人不得认领。pm:seat),正文固定四段现值:当前 PM / 继承台账 / 热文件串行队 / 说明。references/lanes/〈lane〉.md。updated_at或标题推死活;活性只认在任者自己的产出。finding入 skills 车道由该席分诊;三类之外默认关 not planned。list_triggers清点自设定时器。references/seat-post-protocol.md。packages/spec恒归 spec 座位。/pm-dispatch epic:#〈n〉。pm:epic+ 正文写会话 ID 与声明的文件领地。label:pm:epic索引,避开领地相交。domain:*座位;认领纪律全套照做。packages/spec的 sub-issue 照旧转 spec 座位。Blocked-by:。references/seat-post-protocol.md。model的契约复审档子代理(逐份过转录核验),或达档总监席。ToolSearch用select:形式。since窗口读增量,锚 = 座位贴上一份收班简报的时间戳。totalCount,不等 ⇒ 报sweep INCOMPLETE点名缺口,⛔ 永不报干净。since读法与成本对价见references/dispatch-runbook.md。pm:*、无needs-user-decision、无domain:*)。pm:queue无domain:*(仅多车道仓);析取 ③:有domain:*无 pm-state。updated_at早于 ~2 分钟的卡。tracking、status:parked、全部pm:seat贴、qa-run记录。.objectstack-shabump 单。pm:queue= 有具名落点或复现的具体缺陷,或范围明确的工具/门禁修复,无可问之事。pm:queue也收恢复不变量的 finding 与 test-only pin。needs-user-decision= 设计卡、feature/契约形状提案、需要 appetite 的多周程序。finding= 观察类(死代码、未演练漂移、抛光;真实但今天没有用户撞上),待首次定级。type字段的唯一权威生产者;立单者可预填,分诊校正。Bug,扩大接受集/公开面 ⇒Feature,其余 ⇒Task。Bug无具名落点或复现路径不入pm:queue(标记补复现)。Blocked-by:排序。Triage: lands in …; rationale: …),可选带Size/model suggestion:行。Blocked-by:不派;open 未认领 ⇒ 先收敛成一个派发入口。finding恒 = 待首次定级、定级即离标;hold 重验只在Restart-when:命中时发生。Restart-when:命中同 closed 命中待遇:回队前 ref 重验再回队。references/dispatch-runbook.md。pm:retriage重判每 fire 高优先处理:按异议评论的证据与建议定级重裁。target:〈major〉:判据二元,⛔ 不做优先级渐变:不修它,当前 RC 能不能发。target:*随工作走,对每一半重跑二元判据,默认继承,不继承按四类写明理由。references/seat-post-protocol.md。needs-user-decision为工作态。auto-adjudicated标记,轮次报告设代裁清单专节。pm:queue,⛔ 裁不派。half-state-patrol.yml置顶 issue)。list_issues带labels: [domain:X]+ 最小字段拿回全车道 open 集。needs-user-decision、无pm:retriage。pm:epic父单的子树除外。git log --oneline -20 -- 〈paths〉。origin/main上还没被做掉。batch封顶,同批按构造文件面不相交;priority:p0插队可超batch。references/dispatch-runbook.md。priority:p0插队 〉pm:blocking〉target:板上项 〉 typeBug〉 其余;同级按卡龄。pm:blocking级内先按解锁扇出(从Blocked-by:反向索引现算,⛔ 扇出数不落标签)。pm:dispatched与摘pm:queue放进同一次标签写入。Claim:开头是机器判据。Claim:这一个拼写且保持严格,修法是全舰队向它收敛,⛔ 不放宽谓词。mode:subagent的 dev 与 PM 同会话同 ID,甄别身份是分支。Clause-②: yes | no是条款②内容肢的强制申报,恒英文机器判据,恰这两种拼写。yes绑定入队闸门。node scripts/pm/dispatch-gates.mjs --tier 〈paths〉输出,⛔ 不凭记忆。Fixes #〈n〉每成员一行、逐卡 commit;完整串行约束检查落链首认领。already claimed — yielding另选。merged/merged_at。Table 2 — passages left out, by class (old file
be2594e6, 971 lines)(YYYY-MM-DD 裁定),维护者 YYYY-MM-DD)「…」)实测:tailsCONTRACT_REVIEW_TIER)Net: 971 → 811 lines (−160); 59 rule bullets → 631 (the old file packed several rules per 120-byte line); table lines 51 → 51; fence lines 0 → 11 (the claim template); dates 97 → 2 (frame block only); quote marks 124 → 3 (frame block only); ⛔ 142 → 172 (one per prohibition line, every one on a prohibition).
Table 3 — literal sentences and spellings kept because a gate or a predicate pins them
**ACCEPT 之后的路径分叉(start anchor) and本段只适用本循环派发的 dev PR(end anchor), with the five governed globs as code spans between them and no other**-shaped spanscripts/pm/check-governed-prose.mjs(PROSE_SURFACES)**每个方案必须沿四条固定评估轴分析…through推荐意见必须基于这四条轴给出理由;四轴冲突时如实呈现权衡,— byte-identical, md5b9a0de17880c39e412055e656a953222scripts/check-skill-frame-sync.mjs(COPIESanchors, axis map, count mentions, anti-dormancy fingerprints) andcheck:skill-frame-freshnessClaim:as the first word of the claim commentscripts/pm/check-half-states.mjsclaim predicate (H2 / H34)Clause-②: yes/Clause-②: nocheck-half-states.mjs,scripts/pm/check-clause2-carriers.mjsBlocked-by:,Restart-when:,Restart-touch:,Unlock-action: re-check PR #Mcheck-half-states.mjsline-anchored directives (the ratchet'sanchoredexemption class names the same spellings)os-dev-reportmarker (plain-text first line; HTML-comment form read as equivalent).claude/agents/os-dev.mdGOVERNED_APPROVERS,os-zhuang,hotlongscripts/pm/check-governed-queue-guard.mjsCONTRACT_REVIEW_TIERscripts/pm/dispatch-gates.mjstier constantneeds:contract-review,auto-adjudicated,awaiting a human merge,UNRECOGNISED/NOT APPLICABLE,sweep INCOMPLETE,already claimed — yielding,INCOMPLETE AND UNREVIEWED,Triage: lands in …; rationale: …,Size/model suggestion:docs/adr/**·.claude/**·skills/**·AGENTS.md·CLAUDE.mdinside the ACCEPT-fork regioncheck-governed-prosecontainment (must equalGOVERNED_SURFACES)Table 4 — conflicts found and the reading taken (not resolved by editing any other file)
dispatch-gates(--tieroutput); the claim template'smodel:value becomes a placeholder pointing at that output.claude/exceptionrepo:*seat of a single-lane repo does the three mechanical duties itself (incl.findingfirst-touch grading); lane files differneeds:contract-review事后审计, optional; release stays in-seat)Two Phase-3 riders recorded on the audit anchor are folded in as single lines and are flagged here for the seat's strike-or-keep: the clause-② pointer now names 适用面 among the topics routed to
references/contract-review.md(line 646); the close-reason discipline (state_reason⇔ recorded reason) is line 136. The Epic 子树车道 section is kept as its own section in its current position (it is one of the file's own sections even though the ruling's section list omitted it).Gate verdicts (run on the pushed head
ca431ec1b; exit codes captured before any pipe)Fourth patch round (head
66338b6a0, +1 −1 lines in SKILL.md, 811 unchanged):node scripts/pm/check-skill-line-ratchet.mjs→ exit 0 (SKILL.md is 811 lines (ceiling 811; headroom 0),widest table row is 342 bytes (pin 342; headroom 0),core-rules.md is 150 lines (ceiling 150; headroom 0));pnpm check:skill-frame-sync→ exit 0 (2 copies … isomorphic across 2 files; 4 count mention(s) agree);pnpm check:pm-skill-id-lint→ exit 0 (24 file(s) clean);pnpm check:pm-governed-prose→ exit 0 (name all 5 registered governed surfaces … and claim no others);pnpm check:nul-bytes→ exit 0; hygiene greps on both files all 0 outside the front matter and the frame block.Third patch round (head
4f4c05a14, +7 lines in SKILL.md, digest merge + 1 line, ceiling row → 811):node scripts/pm/check-skill-line-ratchet.mjs→ exit 0 (SKILL.md is 811 lines (ceiling 811; headroom 0),widest table row is 342 bytes (pin 342; headroom 0),core-rules.md is 150 lines (ceiling 150; headroom 0));--self-test155 cases pass;pnpm check:skill-frame-sync→ exit 0 (2 copies … isomorphic across 2 files; 4 count mention(s) agree);pnpm check:pm-skill-id-lint→ exit 0 (24 file(s) clean);pnpm check:pm-governed-prose→ exit 0 (name all 5 registered governed surfaces … and claim no others);pnpm check:nul-bytes→ exit 0;node scripts/pm/check-clause2-carriers.mjs --self-test→ exit 0 (150 cases pass); hygiene greps on both files all 0 outside the front matter and the frame block (dates, quotes, card numbers, markers, fingerprints, seat voice, model aliases, and the withdrawn phrase 人工确认).Patch round (head
366f97cc4, two in-place rewrites, 804 lines unchanged):node scripts/pm/check-skill-line-ratchet.mjs→ exit 0 (SKILL.md is 804 lines (ceiling 804; headroom 0),core-rules.md is 150 lines (ceiling 150; headroom 0));pnpm check:skill-frame-sync→ exit 0 (2 copies … isomorphic across 2 files; 4 count mention(s) agree);pnpm check:pm-skill-id-lint→ exit 0 (24 file(s) clean);pnpm check:pm-governed-prose→ exit 0 (name all 5 registered governed surfaces … and claim no others);pnpm check:nul-bytes→ exit 0; hygiene greps on both files all 0 outside the front matter and the frame block.pnpm check:pm-skill-ratchet→ exit 0 —✓ .claude/skills/pm-dispatch/SKILL.md is 804 lines (ceiling 804; headroom 0)·widest table row is 342 bytes (pin 342; headroom 0)·references/core-rules.md is 150 lines (ceiling 150; headroom 0);--self-test→155 cases pass.pnpm check:skill-frame-sync→ exit 0 —2 copies … structurally isomorphic across 2 files; 4 axes; binding sentence present in all 2; 4 count mention(s) agree; 73 markdown files scanned for undeclared copies;--self-test13 + 5 + 3 cases pass;check:skill-frame-freshness→ exit 0 (the frame itself is unchanged).pnpm check:pm-skill-id-lint→ exit 0 —24 file(s) clean (pattern /#[0-9]{3,}/g).pnpm check:pm-governed-prose→ exit 0 —2 instruction surface(s) name all 5 registered governed surfaces … and claim no others;--self-test28 cases pass.pnpm check:nul-bytes→ exit 0;pnpm check:pm-governed-merges→ exit 0 (263 assertions).node scripts/pm/check-governed-merges.mjs --teston the three paths → exit 3 (GOVERNED:.claude/**×2; the ratchet script is not on the register) — this PR stays a draft for a human merge.Derived union:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(32 commands, identical whether derived from the three paths or from the merge base); every command run and recorded;--ran→ exit 0 —✓ dispatch-gates --ran: 32 derived famil(ies) accounted for — 32 run, 0 NOT-MEASURED.pnpm check:pm-dispatch-gatesran detached as its header requires:✓ dispatch-gates self-test: 1402 cases pass.check:doc-formula-expressionsneeded the@objectstack/formulaand@objectstack/lintbuilds first (both through the lock, VERDICT command-exit 0) and then reported✓ … 22 record-scoped formula example(s) … judged clean.Whole-repo lint through the lock:
OS_VERIFY_LOCK_SLOT=issue-15379-1b bash scripts/pm/os-verify-lock.sh -c 'pnpm lint'→VERDICT command-exit 0 · held the lock 76s · waited 0s.Hygiene greps on both files, outside the front matter and the frame block: dates 0 ·
「」0 · straight double quotes 0 ·#NNN0 · ⚠/⭐ 0 · fingerprint phrases 0 · 本席/上一席 0 · model aliases 0; every ⛔ in both files marks a prohibition.🤖 Generated with Claude Code
https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
Generated by Claude Code