Skip to content

skills(pm-dispatch): enforce the North Star in the rules layer — 优先序, 取卡前置, Path: line, three faces, domain:cloud, governed register - #19142

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-18489-north-star-enforcement
Sep 18, 2026
Merged

os-zhuang merged 3 commits into
mainfrom
claude/issue-18489-north-star-enforcement

Conversation

@os-elon-musk

Copy link
Copy Markdown
Collaborator

Fixes #18489

Clause-②: no

Rules-layer enforcement of the maintainer's North Star (docs/NORTH-STAR.md, landing through PR #19134 — open draft, Fixes its 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):

优先级:

  1. 安全与数据完整性永远最高,不等路。
  2. 路断了、或清单上的能力断了 ⇒ P0/P1;能跑但出错 ⇒ P2;不在路上、不在清单上 ⇒ p3 或不做。
  3. 产品仓还有开放的 P0/P1 时,任何车道不派 p2/p3 的工具卡、契约卫生卡;解锁产品 P0/P1 的仪器卡沿链继承其优先级。

仪器为车队服务:改 PM 协议、门禁、棘轮、技能的卡,以「它落地后车队的哪个决定或动作会不一样」评级——说得出(一次本来会派错的派发、一次落不了的落地、一次放过假货的复核、一个卡住的席位),就按上面的规则定级,与产品卡同场竞争;说不出,就不做。

现在不做:云服务的旅程(注册、控制面、托管)另有自己的清单;企业版内置 Agent 属 cloud 仓,不在本仓的路与清单里;计费未建。

维护者速读(草稿)

改了什么:把北极星写进 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-ratchet green on 022b06f6c). Payment is content folded (redundant words deleted), never re-wrap.

.claude/skills/pm-dispatch/SKILL.md — 812 → 812

line (after) change before B after B paid by
:42 优先序 gains 北极星 (item 1) 92 104 in place
:254 domain:cloud table row (item 7) 104 fold :357+:358 → :358 (66+87 → 110): 原生 issue 类型… / 分诊席是 type 唯一权威… merged, every fact kept
:359 type 判据 gains 已声明 (item 3) 101 116 in place
:362 定级按「优先级」第 1、2 条 + Path: line (item 3) 110 fold :362+:364 → :363 (70+39 → 105): 路由… + 父单是协调节点… — the merged form core-rules :91 already had
:452 重定价 + 必答项 merged 75+85 109 pays :458
:458 取卡前置 = 「优先级」第 3 条 (item 2) 105 fold :452+:453
:461 无级/缺 Path: 轮报记分诊缺口 (item 3, mechanism assumption 2) 120 118 in place: 优先是排序不是豁免 → 优先非豁免
:605 governed 面统一定义 gains docs/NORTH-STAR.md (item 6 consequence, check:pm-governed-prose) 105 102 in place: 「含 agents/hooks/settings」 dropped — AGENTS.md PD #14 carries it verbatim

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 name docs/NORTH-STAR.md (the prose gate's containment half).

Positive greps with controls (worktree at 022b06f6c vs origin/main 14a762f)

grep after control on origin/main
NORTH-STAR in SKILL.md (≥ 2) 3 0
NORTH-STAR in AGENTS.md (≥ 1) 2 0
Path: in SKILL.md (≥ 1) 2 0
domain:cloud in SKILL.md 1 0
domain:cloud in ensure-pm-labels.sh 4 0
「误导」 in lanes/spec.md 2 0
control: domain:skills in SKILL.md 1 1
control: 「取卡全序」 in SKILL.md 1 1

Twins (SKILL.md ↔ core-rules.md, rule :44)

  • :359 type 判据 ↔ core-rules :89 — re-keyed identically (已声明 qualifier). ✅
  • :363 路由/父单 merged ↔ core-rules :91 — core-rules already carried the merged form; byte-identical intent, no edit. ✅
  • :358 type 固定产出/唯一生产 ↔ core-rules :89 first clause — unchanged. ✅
  • :42 优先序 ↔ core-rules :26 「与 AGENTS.md 冲突以之为准」 — NOT re-keyed: the clause stays true (AGENTS.md :7 now points above itself to the North Star) and :26 sits at 120 B; every 北极星 spelling measured 123–131 B. Reported, not hidden.
  • :459 取卡全序 ↔ core-rules :108 — SKILL.md :459 is unchanged (the precondition is :458, a new line), so :108 is untouched; a precondition digest measured 146–153 B on :108 and core-rules has no adjacent bullet pair that merges under 120 B (measured). Reported.
  • :452 重定价 (folded) — no core-rules twin; lanes/services.md :27 points at the clause by name and still resolves.
  • New lines (:254, :362, :458, :605, lanes) — core-rules is a subset (⛔ 不新增规则), no twin owed.

Deviations (declared, each deletable by the maintainer on the PR)

  1. docs/adr/PRIORITIZATION.md keeps ONE line beyond the pointer: the status-hygiene rule (a PR that lands an ADR's implementation flips its Status: 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.
  2. The pointer is a code span, not a relative link: check-adr-links reds on ../NORTH-STAR.md until PR docs: add the North Star (the maintainer's text, verbatim) #19134 merges.
  3. 定级 cites 「优先级」第 1、2 条 (the re-scope says rule 2): rule 1 is the top band of the same grading law.
  4. Item 4 landed in 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.
  5. :461 could not absorb the literal 「无级或缺 Path: 卡轮报记分诊缺口」 (135 B); 优先是排序不是豁免 → 优先非豁免 (118 B) keeps venue (轮报) and qualifier (分诊缺口).
  6. docs/NORTH-STAR.md is 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.
  7. scripts/pm/check-governed-merges.mjs self-test: rootExacts now filters exact rows WITHOUT a separator (docs/NORTH-STAR.md carries one, so it reaches dispatch-gates as written and declares no hint); count strings 5 → 6; one new case north-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).
  8. The objectui domain:cloud description 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/objectstack at 93330d643 and re-derived at 022b06f6c (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 (after pnpm --filter '@objectstack/lint...' build under os-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-gates detached (exceeds the foreground cap): verdict in the report comment. Ratchet re-run after the final commit on 022b06f6c: 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)

  • Two 「north star」 documents now coexist: docs/NORTH-STAR.md (先做什么) and content/docs/concepts/north-star.mdx (architecture, PD Convert to monorepo with scoped packages #8). Whether the .mdx is retitled is the maintainer's word, pending in chat (seat note). 承接者: the skills seat, next AGENTS.md touch.
  • A card parked with domain:cloud and no pm:* state is picked up by the sweep's 「域卡缺 pm 状态」 disjunct and H13 unless it also carries status: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.sh was NOT run against GitHub (the seat runs it); the objectstack domain:cloud object exists with whatever colour/description it was auto-created with until --reconcile.

Generated by Claude Code

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
@os-elon-musk os-elon-musk added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 18, 2026 — with Claude
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation labels Sep 18, 2026
…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

Copy link
Copy Markdown
Collaborator Author

维护者速读(终稿)· skills 席 · 2026-09-18T23:12Z

这个 PR 做什么:把北极星写进 PM 协议的规则层,协议只引用、不复述。八项:① 优先序里「维护者裁决」之后加「北极星」,排在 AGENTS.md 之前;② 取卡前先按「优先级」第 3 条现读产品仓有没有开放的 P0/P1;③ 分诊定级只按「优先级」第 1、2 条,每张卡正文首行写 Path:(路上哪一步 / 清单哪一区 / none),缺这行的卡轮报记分诊缺口;type 判据加「已声明」;④ skills 车道自分诊只问「它落地后车队的哪个决定或动作会不一样」,答不出立刻 p3 或不做;⑤ spec 车道三面改成契约面 / 辅助面 / 机器面,带您给的一句话判据(含「它误导了 AI 吗」);⑥ AGENTS.md 顶部一行指向 docs/NORTH-STAR.md(旧的 .mdx 仍是架构,PD #8 不动),受管面登记表加 docs/NORTH-STAR.md,PRIORITIZATION.md 改成指针;⑦ 域表与标签清单加 domain:cloud(停放 = domain:cloud + status:parked,sweep 免扫);⑧ 核心条款孪生行同改。五个受棘轮文件行数不变,每行 ≤120 字节。

我复核时改了两处(dev 已修,记录 5737301010):spec 车道一行把「收窄」误接到条款①(那是协议面的条款,会让所有 spec 收窄卡按契约复审档施工),已恢复「不触条款②」;domain:cloud 行原先没说怎么让 sweep 不碰停放卡,现已写明加 status:parked,并把该标签加进两仓的标签清单(objectui 原先没有)。

两处 dev 做了判断、您可以否决:(a) PRIORITIZATION.md 保留了一行「ADR 实现落地时同 PR 翻 Status」的规则,因 ADR-0110 引用它——不要就在 PR 里删;(b) 定级引「优先级」第 1、2 条而非只第 2 条,因为第 1 条(安全与数据完整性)也是定级规则。

验收:ACCEPT 在 #18489;门禁全绿(棘轮 812 / 43 / 1099 不变、id-lint、governed-prose 6/6、标签描述 ≤100、clause2 --pair 一致);CI 14 成功 · 8 跳过 · 7 在跑、0 红(2026-09-18T23:11Z);Fixes #18489Clause-②: no

请您做的一件事:approve(os-zhuang 或 hotlong 任一)——之后落地由我做,不用您点合并。#19144(受管两档)排在它后面,等它合了再合一次 main。


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/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

skills(pm-dispatch): ADR-0136 D2 becomes the triage protocol — Journey: line, journey bands, cross-lane product-first order, journeys feed the queue

3 participants