Skip to content

docs(north-star,pm-dispatch): the p2/p3 dispatch gate reads the lane's own queue, not the whole product repo - #20009

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-19980-lane-scoped-priority-gate
Sep 24, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/issue-19980-lane-scoped-priority-gate

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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

 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

…s own queue, not the whole product repo

Maintainer ruling, verbatim: 「当前车道队列中如果已经没有 p0 p1,就应该可以派其他卡。这应该提交一个 skills 卡。」

- docs/NORTH-STAR.md 「优先级」 item 3: the P0/P1 reading moves from 产品仓 to
  本车道队列 and the bar from 任何车道 to 该车道; the unlock-chain clause is
  unchanged byte for byte.
- references/execution-duties.md: the take-card precondition reads the same
  lane-scoped queue (rewritten in place, 183 lines kept, 111 bytes).
- references/triage-duties.md: the triage-side close predicate that mirrors
  item 3 reads the queue of the lane the card is routed into (rewritten in
  place, 120 lines kept, 87 bytes).

Claude-Session: https://claude.ai/code/session_01A22sUB3mUWs6M36VgfijBq
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)

席位(domain:skills#1,session_01A22sUB3mUWs6M36VgfijBq)对照自己读的 diff 校正 dev 的草稿并填席位意见,于 2026-09-24T18:05Z;ACCEPT 记录在卡 #19980。本 PR 是 Tier H(碰 docs/NORTH-STAR.md):留 draft,由您批准并合并,席位不翻 ready、不入队。

改了什么:三句话,各自原地改写、不加行。① 北极星「优先级」第 3 条前半句:「产品仓还有开放的 P0/P1 时,任何车道不派 p2/p3 的工具卡、契约卫生卡」→「本车道队列还有开放的 P0/P1 时,该车道不派……」;后半句「解锁产品 P0/P1 的仪器卡沿链继承其优先级」一字不动。② 执行席取卡前置(execution-duties.md :45):「产品仓开放 P0/P1」→「本车道队列开放 P0/P1」。③ 分诊席关卡谓词(triage-duties.md :64):「产品仓 P0/P1 开着时,无解锁对象的 p2/p3 tooling 卡同样关」→「所入车道队列 P0/P1 开着时……」。全仓搜索:改后再无「产品仓」字样的规则读者;对照词计数不变,证明搜到了。

为什么改:您的原话「当前车道队列中如果已经没有 p0 p1,就应该可以派其他卡。这应该提交一个 skills 卡。」原文按整个产品仓读 P0/P1,产品仓几乎总有开着的 P0/P1,于是自己队列里一张 P0/P1 都没有的车道(触发本卡的是 objectui 的 spec 席)只能干等。第三句是 dev 全文搜索多找出来的读者:不改它,分诊在首次接触时就会把您刚放开派发的那批 p2/p3 工具卡关掉,裁决落空。

风险与代价(含回滚):只改三句文字;门禁、脚本、工作流、放行规则都没动,没有任何东西发布。风险在两个词的边界——「本车道」与「队列」——规则文本只镜像您的原话,边界由您一句话定(见下)。定下之前各席按下面的推荐读法执行;三处读法一致,不会出现一个席派、另一个席关的分叉。回滚 = revert 本 PR(一个 commit,squash 后);只撤分诊那一句也是一行。

席位意见:建议批准并合并。 三句改写忠于原话,继承句未动,dev 的全文搜索把第三个读者也找齐了(本席原以为只有两处,被证伪——这正是要它搜的原因)。两个开放点本席与 dev 的推荐一致:(①)「本车道」= 派发席所在仓里带同一 domain:* 标签的开卡,同仓多席共用一队,跨仓席只读自己派发仓的同名车道;(②)「队列」只算此刻能派的卡(open、pm:queue、无 assignee),在飞 / blocked / on-hold / 决策箱里的 P0/P1 不计——它们本就派不出去,而被挡的 P0/P1 已由「沿链继承」兜底。(③)分诊那句保留。CI 在 head 上 16 绿 + 10 例行跳过、3 在跑;您合并时按当时读数。

你要做的:批准并合并本 PR。 若对 ①②③ 任一读法另有意见,回一句即可,席位按您的字改;不回即按上面的推荐读法执行。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 24, 2026 22:59
@os-zhuang
os-zhuang enabled auto-merge September 24, 2026 22:59
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 24, 2026
Merged via the queue into main with commit 5581d30 Sep 24, 2026
44 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-19980-lane-scoped-priority-gate branch September 24, 2026 23:18
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/xs 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): the NORTH-STAR p2/p3 dispatch gate reads repo-wide open P0/P1; maintainer ruling makes it read the lane's own queue

2 participants