skills(pm-dispatch): enforce the North Star in the rules layer — 优先序, 取卡前置, Path: line, three faces, domain:cloud, governed register - #19142
Conversation
The maintainer's North Star (docs/NORTH-STAR.md, landing via its own PR) becomes the law the PM protocol cites: 优先序 gains 北极星 above AGENTS.md, 取卡全序 gains its precondition (「优先级」第 3 条), triage grades by 「优先级」第 1、2 条 and stamps a body-leading `Path:` line, the type criterion gains the 「已声明」 qualifier, the skills lane self-triages by 「仪器为车队服务」, the spec lane's three faces take the maintainer's terms (契约面 / 辅助面 / 机器面), the domain table and label roster gain `domain:cloud` (parking, not a lane), AGENTS.md points at the North Star, the governed register gains `docs/NORTH-STAR.md`, and PRIORITIZATION.md becomes a pointer. Line-neutral at every ratchet ceiling. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF
…text `docs/NORTH-STAR.md` lands through its own PR, so the PRIORITIZATION.md pointer cites the path in a code span instead of a relative link that check-adr-links cannot resolve before that file merges. The objectui `domain:cloud` description differs from the objectstack one so the label desc-cap dry run sees one distinct description per parsed line. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF
…loud + status:parked lanes/spec.md: a narrowing card is still 契约面 and does not trigger 条款②; the earlier 「只触条款①」 misread clause ① (scoped to the 协议语义面) and would have sent every spec narrowing to the contract-review tier. SKILL.md domain table: the domain:cloud row now says how a parked card stays sweep-silent — add status:parked, the exemption the sweep's disjunct ③ and H13 already read. ensure-pm-labels.sh: status:parked joins the roster for both repos (absent in objectui), distinct descriptions per repo, colour of the other sweep-exempt label. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF
维护者速读(终稿)· skills 席 · 2026-09-18T23:12Z这个 PR 做什么:把北极星写进 PM 协议的规则层,协议只引用、不复述。八项:① 优先序里「维护者裁决」之后加「北极星」,排在 我复核时改了两处(dev 已修,记录 5737301010):spec 车道一行把「收窄」误接到条款①(那是协议面的条款,会让所有 spec 收窄卡按契约复审档施工),已恢复「不触条款②」; 两处 dev 做了判断、您可以否决:(a) 验收:ACCEPT 在 #18489;门禁全绿(棘轮 812 / 43 / 1099 不变、id-lint、governed-prose 6/6、标签描述 ≤100、clause2 请您做的一件事:approve(os-zhuang 或 hotlong 任一)——之后落地由我做,不用您点合并。#19144(受管两档)排在它后面,等它合了再合一次 main。 Generated by Claude Code |
Fixes #18489
Clause-②: no
Rules-layer enforcement of the maintainer's North Star (
docs/NORTH-STAR.md, landing through PR #19134 — open draft,Fixesits own card; this PR lands after it). The eight items of the seat's re-scope comment 5736794156 on the card, verbatim; ⛔ no ninth item, no ceiling raise, no new gate, no new half-state row. Every rule cites the North Star by path and section name (「优先级」第 N 条, 「仪器为车队服务」, 「现在不做」) and restates none of it.Maintainer rulings, verbatim (chat 2026-09-18): 「skills 是驱动车队正确工作的核心,影响车队效率的卡都要派啊」 · 「云服务旅程混在 objectstack / objectui 里的 ⇒保留 domain:cloud 标签 等 cloud 项目经理迁移」 · 「其他同意」.
The North Star text this PR cites (from the card #19131 body / PR #19134, verbatim):
维护者速读(草稿)
改了什么:把北极星写进 PM 协议的规则层。① 优先序里「维护者裁决」之后加「北极星」,排在
AGENTS.md之前。② 取卡全序前面加一条前置:取卡前先按北极星「优先级」第 3 条现读产品仓有没有开放的 P0/P1。③ 分诊定级只按北极星「优先级」第 1、2 条,每张分诊过的卡正文首行写一行Path:(在路上的哪一步 / 清单的哪一区 / none);缺这一行的卡在轮报里记作分诊缺口;type 判据加「已声明」限定(越出已声明接受集才是 Feature)。④ skills 车道的 finding 自分诊只问「它落地后车队的哪个决定或动作会不一样」,答不出立刻 p3 或不做,不排队。⑤ spec 车道的三面改成你的叫法:契约面(同一份输入的接受/拒绝结果变了)、辅助面(判定逐字节不变,再问「它误导了 AI 吗」)、机器面(按「仪器为车队服务」评级)。⑥AGENTS.md顶部一行指向北极星;受管面登记表加docs/NORTH-STAR.md;docs/adr/PRIORITIZATION.md改成一行指针。⑦ 域表与标签清单加domain:cloud(停放,不派)。⑧ 核心条款的孪生行同改。五个受棘轮文件全部行数不变(812 / 151 / 33 / 43 / 1099),每行 ≤ 120 字节。为什么改:北极星是法,协议只引用不复述——分诊、取卡、自分诊三处判据以前各自成文,现在都指向同一份文本;以后改优先级只改北极星一处。
风险与代价(含回滚):代价是删了几句冗余(明细在下方逐行表);风险是两处我做了判断而不是照抄:(a)
PRIORITIZATION.md保留了第二行「ADR 实现落地时同 PR 翻 Status」的规则,因为 ADR-0110 引用它且它没有别的家——你不要就删那一行;(b) 定级引「优先级」第 1、2 条而不只第 2 条,因为第 1 条(安全与数据完整性)也是定级规则,只引第 2 条会把不在路上的安全缺陷读成 p3。回滚:revert 本 PR 即可,不动任何生成物、不动棘轮上限。席位意见:(席位填写)
你要做的:一个动作——批准或在 PR 上删你不要的那一行。
Line budget — before / after per file, per changed line (bytes), what paid for what
Every ratcheted file lands at its ceiling with headroom 0; every landed line ≤ 120 B (
check:pm-skill-ratchetgreen on022b06f6c). Payment is content folded (redundant words deleted), never re-wrap..claude/skills/pm-dispatch/SKILL.md— 812 → 812domain:cloudtable row (item 7)Path:line (item 3)Path:轮报记分诊缺口 (item 3, mechanism assumption 2)docs/NORTH-STAR.md(item 6 consequence,check:pm-governed-prose)references/core-rules.md— 151 → 151: :89 117 → 117 (扩大接受面是功能 → 扩出已声明是功能), twin of SKILL.md :359.references/lanes/skills.md— 33 → 33: :9+:10 (75+62) → :9 117 (CODEOWNERS 路由半边 + SUBJECT 门禁/审计脚本, both facts kept) pays :25 113 (item 4: the 「仪器为车队服务」 question; 答不出 ⇒ 即刻 p3 或不做, ⛔ 不入队).references/lanes/spec.md— 43 → 43 (item 5): :7 语义/文本/机器 → 契约/辅助/机器 (76 → 76); :17–:24 the three faces in the maintainer's terms — 契约面 test (114) · 契约面五形 (105) · 辅助面 changeset/sweep-first + 第二刀「它误导了 AI 吗」 (94) · 误导 ⇒ P2 保留 / 不误导 ⇒ 关 not planned 或搭下一个触碰 PR 的 Acceptance notes (107) · :19 stays with 收窄 → 只触条款① (108) · :20 unchanged (93) · 机器面 与辅助面不交 (119) · 机器面按「仪器为车队服务」评级 (77). Three new lines paid by three folds: :9+:22 (74+97 → 111, 产物随源走 kept as 归源 PR); :24+:25 (58+78 → 108, 单源 kept as ⛔ 不另抄); :31+:33 (42+84 → 115, ① and the 兜底不变 condition on one line, 纯增量 renumbered ③ — the numbers are referenced nowhere else, grep-verified).AGENTS.md— 1099 → 1099: :7 new pointer (120 B, one physical line):docs/NORTH-STAR.md(先做什么: goals, priority) outranks it;content/docs/concepts/north-star.mdx= architecture — Prime Directive #8 untouched per the seat's note; paid by deleting :22 「一条规则一个通道,互不重叠。」 (40 B, a preamble sentence restating the bullets under it, no rule). PD #14 :258–:259 re-flowed in place (119+92 → 116+117) to namedocs/NORTH-STAR.md(the prose gate's containment half).Positive greps with controls (worktree at
022b06f6cvsorigin/main14a762f)NORTH-STARin SKILL.md (≥ 2)NORTH-STARin AGENTS.md (≥ 1)Path:in SKILL.md (≥ 1)domain:cloudin SKILL.mddomain:cloudin ensure-pm-labels.shdomain:skillsin SKILL.mdTwins (SKILL.md ↔ core-rules.md, rule :44)
Deviations (declared, each deletable by the maintainer on the PR)
docs/adr/PRIORITIZATION.mdkeeps ONE line beyond the pointer: the status-hygiene rule (a PR that lands an ADR's implementation flips itsStatus:line with evidence). ADR-0110 line 395 cites it as 「the PRIORITIZATION status-hygiene rule」 and it has no other home in the tree (grep-verified); deleting it would orphan a live rule. Delete that line on the PR if you want the pure pointer.check-adr-linksreds on../NORTH-STAR.mduntil PR docs: add the North Star (the maintainer's text, verbatim) #19134 merges.lanes/skills.md:25, SKILL.md :381 unchanged — :381 is 119 B and the question needs +18 B minimum (measured 128–137 B in every spelling); the lane file is the seat's 岗位说明 and the acceptance greps do not read :381.Path:卡轮报记分诊缺口」 (135 B); 优先是排序不是豁免 → 优先非豁免 (118 B) keeps venue (轮报) and qualifier (分诊缺口).docs/NORTH-STAR.mdis also named in SKILL.md :605 and AGENTS.md PD feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 — the register's containment gate (check:pm-governed-prose) demands both; not a ninth item, a mechanical consequence of item 6.scripts/pm/check-governed-merges.mjsself-test:rootExactsnow filters exact rows WITHOUT a separator (docs/NORTH-STAR.mdcarries one, so it reaches dispatch-gates as written and declares no hint); count strings 5 → 6; one new casenorth-star-exact, three new near-misses (docs/north-star.md,docs/NORTH-STAR.md.bak,examples/docs/NORTH-STAR.md), one new assert that a separator-carrying exact row declares no hint. No floor lowered (331 assertions, was 331 at minimum).domain:clouddescription differs from the objectstack one (…not dispatched from objectui…):check:pm-label-desc-cap's dry run requires one distinct description per parsed line. Both ≤ 100 chars (100 and 99).Gates (all on
022b06f6c, exit codes captured redirect-then-$?)Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat93330d643and re-derived at022b06f6c(list unchanged, 49 commands). Green:check:pm-skill-ratchet,check:pm-skill-id-lint,check:skill-frame-sync,check:pm-governed-prose(2 surfaces name all 6 registered surfaces),check:pm-governed-merges(331 assertions),check:pm-half-states(5043 cases),check:pm-label-desc-cap(25 descriptions),check:nul-bytes,check-adr-links(680 links resolve),check:doc-formula-expressions(afterpnpm --filter '@objectstack/lint...' buildunderos-verify-lock.sh, held 175 s on a shared box), and every other derived command (adr anchors/symbol anchors, ci-filter parity, closing-keyword parity, comment-mask corpus, declaration mirrors, scripts symbol anchors, self-test wired/workflow commands, skills token ratchet, whole-set label write, bare-root worklist, queue-guard self-test, harness-current, adr-anchors, agent-test-spelling, bash32-floor, cli-command-ids, cross-package-test-inputs, doc-authoring, docs-audit-scope, driver-memory-census, entry-guard, parse-guard, expected-skips, prior-rulings, pnpm-filter-targets, ratchet-remedy-authority, refd-timer-probe, required-contexts, watch-hint-literal) — exit 0 each.check:pm-dispatch-gatesdetached (exceeds the foreground cap): verdict in the report comment. Ratchet re-run after the final commit on022b06f6c: 812 / 151 / 33 / 43 / 1099, headroom 0 each.Not run locally (CI owns them):
pnpm lint, the package test/typecheck farm — this diff touches no package.Acceptance notes (noted, not filed)
docs/NORTH-STAR.md(先做什么) andcontent/docs/concepts/north-star.mdx(architecture, PD Convert to monorepo with scoped packages #8). Whether the.mdxis retitled is the maintainer's word, pending in chat (seat note). 承接者: the skills seat, next AGENTS.md touch.domain:cloudand nopm:*state is picked up by the sweep's 「域卡缺 pm 状态」 disjunct and H13 unless it also carriesstatus:parked(SKILL.md :325 excludes that label). The row says 停放; the label pairing is the triage seat's at labelling time. 承接者: the triage seat.scripts/pm/ensure-pm-labels.shwas NOT run against GitHub (the seat runs it); the objectstackdomain:cloudobject exists with whatever colour/description it was auto-created with until--reconcile.Generated by Claude Code