Skip to content

Commit 5581d30

Browse files
docs(north-star,pm-dispatch): the p2/p3 dispatch gate reads the lane's own queue, not the whole product repo (#20009)
Fixes #19980 Clause-②: no North-Star 「优先级」 item 3 stops p2/p3 tooling and contract-hygiene cards from being dispatched while P0/P1 work is open. Today it reads open P0/P1 **across the whole product repo**. The maintainer ruled that it reads **the lane's own queue** instead. This PR writes the ruling into the rule and into the two pm-dispatch skill lines that restate it. The unlock-chain inheritance clause is unchanged, byte for byte. ## Maintainer ruling (verbatim, as filed on the card) > 当前车道队列中如果已经没有 p0 p1,就应该可以派其他卡。这应该提交一个 skills 卡。 ## What changed: three sentences, each rewritten in place ```diff docs/NORTH-STAR.md :114 (「优先级」 item 3, Tier H) -3. 产品仓还有开放的 P0/P1 时,任何车道不派 p2/p3 的工具卡、契约卫生卡;解锁产品 P0/P1 的仪器卡沿链继承其优先级。 +3. 本车道队列还有开放的 P0/P1 时,该车道不派 p2/p3 的工具卡、契约卫生卡;解锁产品 P0/P1 的仪器卡沿链继承其优先级。 .claude/skills/pm-dispatch/references/execution-duties.md :45 (take-card precondition) -- 取卡前置 = `docs/NORTH-STAR.md`「优先级」第 3 条:产品仓开放 P0/P1 每次取卡现读。 +- 取卡前置 = `docs/NORTH-STAR.md`「优先级」第 3 条:本车道队列开放 P0/P1 每次取卡现读。 .claude/skills/pm-dispatch/references/triage-duties.md :64 (triage-side close predicate) -- 产品仓 P0/P1 开着时,无解锁对象的 p2/p3 `tooling` 卡同样关。 +- 所入车道队列 P0/P1 开着时,无解锁对象的 p2/p3 `tooling` 卡同样关。 ``` - **NORTH-STAR.** Only the first half of item 3 changes. The subject 产品仓 becomes 本车道队列, and the bar 任何车道 becomes 该车道 to match it: a repo-wide ban turns into the lane's own ban, which is the substance of the ruling. The second half, 「解锁产品 P0/P1 的仪器卡沿链继承其优先级。」, is untouched. No other line of `docs/NORTH-STAR.md` moves (`git diff --stat`: 1 line). - **The rule text mirrors the maintainer's own words** (本车道队列). The two open points on the card are **not** decided in the text. They are proposals for the maintainer to confirm, listed under 你要做的 below. - **Third reader, found by the sweep.** The card and the dispatch named two readers of the rule. The widened sweep found a third: `triage-duties.md` :64. It restates item 3's predicate in other words (「开着」 rather than 「开放」), so both literal patterns miss it. - Its origin, `f151ef2c9^:.claude/skills/pm-dispatch/SKILL.md` :370–374, sits directly under 「定级按北极星「优先级」1–3 条」. - If it kept the repo-wide reading, triage would close on first touch the same p2/p3 tooling cards that the ruling makes dispatchable. - The triage grade on this card (comment 5816120091) already read it lane-scoped: it queued a p2 `tooling` card with no unlock target while the repo still had open P0/P1. - Triage has no lane of its own (no 「本」), so the line reads 「所入车道队列」: the queue of the lane the card is routed into. - This line is **outside the claim's declared file surface**, so the seat adds it to the claim. If the maintainer wants only the dispatch side changed, dropping it is a one-line revert (你要做的 ③). ## Reader sweep: hit counts and control queries `git grep -F`, run over `.claude/**`, `skills/**`, `docs/**`, `AGENTS.md`, `CLAUDE.md`, `content/docs/**` and `scripts/pm/**` of objectstack, at base `cc4ee7758` and at head `1470ba822`: | pattern | base `cc4ee7758` | head `1470ba822` | |---|---|---| | `产品仓开放 P0/P1` | 1: execution-duties :45 | 0 | | `产品仓还有开放的 P0/P1` | 1: NORTH-STAR :114 | 0 | | `开放的 P0/P1` | 1: NORTH-STAR :114 | 1: same line, new subject | | `开放 P0/P1` | 1: execution-duties :45 | 1: same line, new subject | | `产品仓` (the subject alone, widened) | 3: the two above + triage-duties :64 | 0 | | `P0/P1 开着` | 1: triage-duties :64 | 1: same line, new subject | | `本车道队列` | 1: seat-post-protocol :46, an existing use | 3 | | `所入车道队列` | 0 | 1 | - **Controls.** Two terms known to be in these files, on the same subject: `沿链继承` 2 / 2 (NORTH-STAR :114, filing-gate :43) and `「优先级」` 4 / 4. Both are unchanged, which shows the sweep read the tree. - **English spellings.** A case-insensitive regex for `open P0`, `rule 3`, `North-Star gate|rule|item 3` and `lane's own queue` returns 7 hits. None is related: RUNNER "rule 3" in a checklist JSON, doc-authoring "Rule 3" comments in `dispatch-gates.mjs`, a `check-half-states.mjs` comment and a `post-stamped.mjs` test string. No `scripts/pm/**` comment quotes any of the three sentences, and no test pins their text (`取卡现读` / `无解锁对象` / `契约卫生卡` / `任何车道不派` return 0 outside the three files). - **Read, not a reader.** `triage-duties.md` :60, 「定级按北极星「优先级」1–3 条」, cites the rule by number and restates no predicate. It is unchanged. - **Sibling repos.** The regex `产品仓|开放的? ?P0/P1|P0/P1 开着|第 3 条|取卡前置` over each whole tree: - objectui at origin/main `8b1f066`: 0 hits. - cloud at origin/main `c208a71`: 1 unrelated hit, 「按第 3 条分阶段」 in its ADR 0009. It is the positive control that the grep ran. - No copy of the rule lives outside objectstack. ## Budgets - `execution-duties.md`: 183 / 183 lines (ceiling 183, headroom 0). :45 grows from 105 to 111 bytes (cap 120). No line added. - `triage-duties.md`: 120 / 120 lines (ceiling 120, headroom 0). :64 grows from 78 to 87 bytes. No line added. - `docs/NORTH-STAR.md`: 123 lines, not under a line ratchet. :114 grows from 152 to 155 bytes. ## Gates, at head `1470ba822` The head is the change commit `a0c50fb65` plus a merge of `origin/main` at `1f05ea4fb`, which touches none of the three files. The whole union below was re-run after that merge (`@objectstack/formula` and `@objectstack/lint` rebuilt first). Each exit code was captured before any pipe. | command | exit | verdict line | |---|---|---| | `pnpm check:pm-skill-ratchet` | 0 | `execution-duties.md is 183 lines (ceiling 183; headroom 0)` · `triage-duties.md is 120 lines (ceiling 120; headroom 0)` | | `pnpm check:pm-skill-id-lint` | 0 | `34 file(s) clean (pattern /#[0-9]{3,}/g)` | | `pnpm check:skill-frame-sync` | 0 | `the one declared copy of the decision frame is internally coherent` | | `pnpm check:doc-authoring` | 0 | `403 files clean` · `53 published skill files clean` | | `pnpm check:pm-governed-prose` | 0 | `2 instruction surface(s) name all 6 registered governed surfaces` | | `pnpm check:nul-bytes` | 0 | `scanned 9417 text file(s) … no raw ASCII control bytes` | | `node scripts/check-skills-token-ratchet.mjs` | 0 | `54 authored bundle file(s) within their ceilings` | | `node scripts/pm/check-governed-merges.mjs --test docs/NORTH-STAR.md .claude/skills/pm-dispatch/references/execution-duties.md .claude/skills/pm-dispatch/references/triage-duties.md` | 3 (the GOVERNED reading) | `3 of 3 path(s) hit the register` · `landing tier: H(人合)` · `.claude/** ×2`, `docs/NORTH-STAR.md ×1` | | `pnpm check:pm-governed-merges` | 0 | | | `pnpm check:pm-half-states` | 0 | `4912 cases pass` (new against the dispatch-time list; matched via triage-duties.md) | | `pnpm check:pm-settings-deny-roster` | 0 | (artifact-roster family whose roster lives under `.claude`) | | `pnpm --filter @objectstack/lint run check:doc-formula-expressions` | 0 | `22 record-scoped formula example(s) … judged clean`. The first attempt exited 3 (PREREQUISITE NOT MET, nothing measured). It was re-run after `turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under the verify lock (`VERDICT command-exit 0`). | | `node scripts/check-ci-filter-parity.mjs` · `node scripts/check-closing-keyword-parity.mjs` (+ `--self-test`) · `node scripts/check-comment-mask-corpus.mjs` · `node scripts/pm/check-harness-current.mjs --self-test` | 0 each | | | `pnpm check:agent-test-spelling` · `check:cross-package-test-inputs` · `check:driver-memory-census` · `check:gitlink-declared` · `check:refd-timer-probe` · `check:watch-hint-literal` | 0 each | | - **Derivation.** `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` names 19 commands. `--ran` answers `19 derived famil(ies) accounted for — 19 run, 0 NOT-MEASURED (a DERIVED zero — all 19 recorded an exit code and none of them is 3)`. - **NOT MEASURED, CI-only.** The Test Core shard steps, the four type-check lanes, shard attestation and `check-half-states --format=markdown --provenance`. They have no local invocation, and this diff touches no TypeScript. ## Landing - **Tier H.** `docs/NORTH-STAR.md` is on the register's H row, which makes the whole PR Tier H. It stays **draft** for the maintainer's own merge; no seat flips it ready or enqueues it. - **Nothing publishes.** The diff is `docs/**` plus `.claude/**` only, so the PR carries `skip-changeset`. ## Acceptance notes - None beyond the third reader above. ## 维护者速读(草稿) **改了什么**:北极星「优先级」第 3 条的前半句,从「产品仓还有开放的 P0/P1 时,任何车道不派 p2/p3 的工具卡、契约卫生卡」改成「本车道队列还有开放的 P0/P1 时,该车道不派……」。后半句「解锁产品 P0/P1 的仪器卡沿链继承其优先级」一字不动。pm-dispatch 技能里复述这条规则的两句也同步改了,都是原地改写、不加行:执行席的取卡前置(execution-duties),以及分诊席的关卡谓词(triage-duties)。 **为什么改**:依据您的裁决「当前车道队列中如果已经没有 p0 p1,就应该可以派其他卡」。原文按全仓读 P0/P1,而产品仓几乎总有开着的 P0/P1,所以自己队列里一张 P0/P1 都没有的车道(例如 objectui 的 spec 席)也只能干等。改后,每个车道只看自己的队列。 **风险与代价(含回滚)**:只改三句文字,门禁、脚本、工作流都没动,也没有任何东西发布。剩下的风险在「本车道」「队列」这两个词的边界,需要您一句话定下(见下方 ① ②);定下之前,各席先按下面的提案读。回滚就是 revert 本 PR 的这一个 commit。 **席位意见**:(留空,由席位定稿) **你要做的**: - ① 「本车道」怎么算? - 荐:派发席所在仓里、带同一 `domain:*` 标签的开卡。同仓多席共用这一个队列;跨仓席(例如 objectui 的 `domain:spec` 席)只读它所派发的那个仓里的同名车道队列。 - 备选:跨仓车道把两个仓的同名卡合成一个队列。代价是一个仓的 P0/P1 又会让另一个仓的席干等,这正是本次裁决要纠正的情形,只是范围小一些。 - 若您另有读法,一句话即可,本席按您的字改。 - ② 「队列」算不算 `pm:blocked` / `pm:on-hold` 的 P0/P1? - 荐:不算。只算此刻能派的卡:open、带 `pm:queue`、无 assignee。在飞的(`pm:dispatched`)、`pm:blocked`、`pm:on-hold`、决策箱里的 P0/P1 都不计。 - 理由:这些卡本来就派不出去,计入只会让车道干等。被挡住的 P0/P1 已有后半句「沿链继承」兜底:解锁它的那张卡会继承 P0/P1 的优先级。 - 若您要计入,改一处即可;若您另有读法,一句话即可,本席按您的字改。 - ③ 分诊那一句也改了。它是卡上点名的两处之外、全文搜索找到的第三处。 - 原文是分诊时「产品仓 P0/P1 开着」就把没有解锁对象的 p2/p3 工具卡首次接触即关掉。不改的话,裁决放开派发的那批卡在分诊这一步就会被关掉。 - 若您只想改派发、不动分诊,回一句即可,本席撤掉这一行。 - ④ 本 PR 碰到 `docs/NORTH-STAR.md`(Tier H),请您本人批准并合并;席位不会把它翻成 ready。 --- _Generated by [Claude Code](https://claude.ai/code/session_01A22sUB3mUWs6M36VgfijBq)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent adbbc5d commit 5581d30

3 files changed

Lines changed: 3 additions & 3 deletions

File tree

‎.claude/skills/pm-dispatch/references/execution-duties.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
- 自在飞派发升级出的卡首行一句:本卡承哪一半、父卡留哪一半;缺此行不入队不入箱。
4343
- 阻塞项无主 ⇒ 被挡席认领做掉,不限大小;在该卡走完整认领、尊重其热文件串行队。
4444
- 阻塞项在飞 ⇒ 等:`pm:blocking` 在其车道排最前、等待者写该卡;p0/p1 优先级沿链传递。
45-
- 取卡前置 = `docs/NORTH-STAR.md`「优先级」第 3 条:产品仓开放 P0/P1 每次取卡现读。
45+
- 取卡前置 = `docs/NORTH-STAR.md`「优先级」第 3 条:本车道队列开放 P0/P1 每次取卡现读。
4646
- 取卡全序:维护者直派插队卡(出处三件)> 契约面卡(判据见 `references/lanes/spec.md`)> 标签序。
4747
- 标签序:`priority:p0` > `pm:blocking` > 功能点位次 > `target:` 板上项 > p1 > p2 > p3 > 无级。
4848
- `pm:blocking` 级内先按解锁扇出(从 `Blocked-by:` 反向索引现算,⛔ 扇出数不落标签)。

‎.claude/skills/pm-dispatch/references/triage-duties.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
- 定义项取北极星「做出来的是什么」或仪器卡的车队决定;无则关;`none` 非分诊缺口。
6262
- 清单项三态定级(会 fail / 步骤够不到 / 无项断言)与定级判据见 `references/filing-gate.md`。
6363
- 「无则关」= 首触即关 not_planned,带理由与入队两条件,⛔ 不定 p3、不 hold;下行同此。
64-
- 产品仓 P0/P1 开着时,无解锁对象的 p2/p3 `tooling` 卡同样关。
64+
- 所入车道队列 P0/P1 开着时,无解锁对象的 p2/p3 `tooling` 卡同样关。
6565
- 路由是分诊的技术判断,⛔ 永不升级哪个仓的问题;父单是协调节点,永不派发。
6666
- 父单已有子结构的:父单队列标签即可,分诊逐个展开路由、补 `Blocked-by:` 排序。
6767
- 跨层功能点(≥2 层)立父单带 `area:*`+`pm:epic`+清单项级,逐层子单按 `Blocked-by:` 排。

‎docs/NORTH-STAR.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@
111111
**优先级**:
112112
1. 安全与数据完整性永远最高,不等路。
113113
2. 路断了、或清单上的能力断了 ⇒ P0/P1;能跑但出错 ⇒ P2;不在路上、不在清单上 ⇒ p3 或不做。定级读「路上的功能点」:改那张表即改优先级,⛔ 不逐卡改档。
114-
3. 产品仓还有开放的 P0/P1 时,任何车道不派 p2/p3 的工具卡、契约卫生卡;解锁产品 P0/P1 的仪器卡沿链继承其优先级。
114+
3. 本车道队列还有开放的 P0/P1 时,该车道不派 p2/p3 的工具卡、契约卫生卡;解锁产品 P0/P1 的仪器卡沿链继承其优先级。
115115
4. 因为写的是 AI、用的也是 AI:元数据既要 AI 能写——错的必须被响亮拒绝并给处方,永不静默落库;也要 AI 能用——声明了的对象、动作、agent / tool / skill 元数据在运行时兑现,MCP 面暴露的就是应用真能做的。写给 AI 的文档与 skills 说错一句,等于产品缺陷。
116116

117117
**阶段姿态**:速度优先于兼容。用的人少:退役立即生效,无过渡窗口、无别名双拼;兼容层、迁移窗口一类的工作默认 p3;声明了但不兑现的键按发布批量退役,不一键一卡。

0 commit comments

Comments
 (0)