Repository navigation
Commit 5581d30
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
42 | 42 | | |
43 | 43 | | |
44 | 44 | | |
45 | | - | |
| 45 | + | |
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
64 | | - | |
| 64 | + | |
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
111 | 111 | | |
112 | 112 | | |
113 | 113 | | |
114 | | - | |
| 114 | + | |
115 | 115 | | |
116 | 116 | | |
117 | 117 | | |
| |||
0 commit comments