Skip to content

docs(pm-dispatch): name the repository each cited instrument answers for - #18666

Draft
os-justin wants to merge 2 commits into
mainfrom
claude/issue-18454-cross-repo-instrument-applicability
Draft

os-justin wants to merge 2 commits into
mainfrom
claude/issue-18454-cross-repo-instrument-applicability

Conversation

@os-justin

@os-justin os-justin commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator

Fixes #18454
Clause-②: no

skip-changeset — text under .claude/skills/pm-dispatch/** only; nothing published moves. Governed .claude/**: draft, four-piece, the maintainer's approval lands it. PR #18656 (SKILL.md :91) is ahead in the SKILL.md serial queue; :89–:92 are untouched here.

What changed — one rule, three citations rewritten in place, one tell added

The card's own correction stands: this is a SKILL-text gap, not a tooling defect. No script changed. Each citation of a repo-scoped instrument now says which repository the instrument answers for, in the spelling that makes the answer checkable.

site before (bytes) after (bytes)
SKILL.md :201 - 落点不明留分诊首触,⛔ 不猜。 (44) deleted — restated verbatim at references/lanes/ui.md:15 and by 〈域车道〉 :242 「说不出修复碰哪个文件就还不可标」
SKILL.md :206 (new, 〈多仓协调〉, directly under the scripts/pm/** 住 objectstack line) - 工装只答被告知的仓,缺 --repo/PM_SWEEP_REPO 即答 objectstack;⛔ 不答手上那张卡的仓。 (112)
SKILL.md :539 〈派发〉 - 门禁清单取 dispatch-gates.mjs --commands 逐条跑,退出码先落盘,--ran 对账;⛔ 不抓人读输出。 (119) - 门禁清单取 dispatch-gates --commands --repo 仓 逐条跑,退出码先落盘,--ran 对账;被拒即手推。 (119)
SKILL.md :628 〈复核〉 - 入队资格 = 每个 check 为 success 或预期 skip(名单:check-expected-skips.mjs),⛔ 不是 required 子集。 (119) - 入队资格:每 check 绿或预期 skip,⛔ 非必查子集;名单 check-expected-skips.mjs 只判 objectstack。 (116)
SKILL.md :645 〈入队与落地〉 - Clause-②: yes认领同笔卡上挂标;PR 开出读check-clause2-carriers --pair PR-NUMBER 为 0 再请审。 (118) - Clause-②: yes认领同笔卡上挂标;开 PRPM_SWEEP_REPO=仓 check-clause2-carriers --pair N 0 才请审。 (118)
references/contract-review.md :41 - ② 双载体已清,逐对机读 node scripts/pm/check-clause2-carriers.mjs --pair PR-NUMBER (99) - ② 双载体已清,逐对机读 PM_SWEEP_REPO=仓 node scripts/pm/check-clause2-carriers.mjs --pair N (109)
references/platform-readings.md :212 - 读 total_count 得 None、打印成 total: None,与真空集只差一个字符,而请求根本没跑。 (108) - 读 total_count 得 None、打印成 total: None,与空集只差一字符;缺键即拒绝,判别式是状态码。 (118)

Fragments dropped to pay the byte cap, disclosed: :539 loses 「⛔ 不抓人读输出」 — the machine modes the line names (--commands, --ran) are that prohibition's mechanism, and the harvest-by-eye history lives in the script header; :628 spells 「⛔ 非必查子集」 as core-rules.md :124 already does and spells success as 绿 (the same twin's word) so the literal check-expected-skips.mjs that the gate's self-test pins stays on the line; :645 compresses 「PR 开出读 … 为 0 再请审」 to 「开 PR … 0 才请审」; :212 trades 「而请求根本没跑」 for the tell. Every line ≤ 120 B; every touched file line-neutral.

Measured behaviour — from an objectstack checkout, 2026-09-17 12:55–13:05Z, tree d6137fd6c (re-derived at 4bbddc5a9)

instrument told the repo by run about objectstack-ai/objectui from this checkout tell on the output
dispatch-gates.mjs --commands / --tier --repo OWNER/NAME asserts the checkout REFUSES, exit 2: REFUSING — asked for 'objectstack-ai/objectui', but this checkout is 'objectstack-ai/objectstack', and names the remedy (hand-derive from the sibling's own manifest and workflows). Without --repo: exit 0, 18 objectstack commands on stdout, the provenance banner on stderr only — a --commands > gates.list harvest is a well-formed list about the wrong repo the refusal; or the stderr banner gate list derived from the tree of 'objectstack-ai/objectstack'
check-expected-skips.mjs --pr N PM_SWEEP_REPO retargets the board only; the roster is always this checkout's workflows (cannot be told) ANSWERS, exit 4 on objectui PR #9604: Test (coverage), Test (coverage shard …), dependabot reported as 3 skips outside the roster — a verdict against the wrong roster (here a false red; a shared job name would make it a false green). Without the env: default board objectstack, PR #9604 → HTTP 404 → exit 3 NOT MEASURED first line board: objectstack-ai/objectui (PM_SWEEP_REPO); roster: this checkout's workflows. — board ≠ checkout ⇒ verdict void
check-clause2-carriers.mjs --pair N PM_SWEEP_REPO (reads no tree file) WORKS: every row below is read from objectstack-ai/objectui (source: PM_SWEEP_REPO); #9604 is closed so the pair is not formed (exit 2, explicitly not a clearance). Without the env: (source: default — set PM_SWEEP_REPO to target another repo) the provenance line names board and source
container proxy, GET /search/issues?q=repo:objectstack-ai/objectui+is:issue+kanban not tellable — session-bound refusal in a success-looking body: HTTP 403; body is valid JSON with keys message, documentation_url and no total_count; a .get('total_count') read prints None/0. Repo-scoped control GET /repos/objectstack-ai/objectui/issues?per_page=1 → 200, one row the status is 403 (never 200); the key is absent, not zero; documentation_url points at docs.anthropic.com (the 415 discriminator at platform-readings :118 generalises)

One rule reaches all four: an instrument answers for the repository it is told (--repo, PM_SWEEP_REPO), defaults to objectstack, and never for the card in your hand; a citation without the repo argument is a clearance for objectstack only. Written once at :206; each citation carries its own half.

Triage's ask — which repo do the round-open step-1/2 readings answer when the seat works objectui from an objectstack checkout

  • Step 1, git-history.mjs touch --path=.claude/skills/pm-dispatch/SKILL.md --ref=origin/main: from the objectstack worktree → 7f4aa9e5c, proven, exit 0. From cwd /home/user/objectui → exit 1, no commit on 'origin/main' touches .claude/skills/pm-dispatch/SKILL.md (the tool also auto-deepened that clone to --deepen=4096; object store only, no tree edit). It answers for the cwd's repo; the charter exists only in objectstack, so run from objectstack it answers the one repo that has it, and a sibling cwd answers not-found, never a wrong sha.
  • Step 2, check-harness-current.mjs: default --shared is the cwd's git common dir → CURRENT -- every harness-loaded path on origin/main is in /home/user/objectstack HEAD d6137fd6c2, exit 0; with --shared /home/user/objectui → UNDECIDED, exit 2 (graft boundary at the time). It answers for the checkout it is pointed at and names it in the verdict line.
  • No SKILL line added: both readings are self-labelling (the verdict names the checkout; the charter path has one home), and the lines that own them (:89–:92) are the serial-queue block of PR skills(pm-dispatch): the round-open harness reading names the load surface .claude/**, not three paths #18656.

Four-axis reasons for the placement

  • 实际业务需求 — measured, not recalled: the one instrument that ANSWERS a sibling board is check-expected-skips (exit 4 against a foreign roster), and --commands without --repo prints a well-formed list at exit 0 with the banner on stderr. Both failures are read AT the citation, so the repair sits at :539 / :628 / :645 / contract-review :41; the principle sits once in 〈多仓协调〉 beside the line that says the toolchain lives in objectstack.
  • 项目长远合理性 — no script change (the card's own correction); the citation becomes the checkable spelling, contract-first: the argument is the contract, the provenance line is the receipt.
  • 防 AI 写代码犯错 — SKILL.md :168's order: delete the error-permitting construct, make the correct form the only spelling, only then add a check. The argument-less spellings were the construct; the cited spellings now carry --repo 仓 / PM_SWEEP_REPO=仓, the non-retargetable one says 只判 objectstack, and the proxy row says 缺键即拒绝 — an absent key can no longer be read as a zero.
  • 创业阶段不扩散需求 — no per-repo rosters, no new gate, no ceiling raise; line-neutral, paid by deleting one line restated twice elsewhere.

Gates

  • pnpm check:pm-expected-skips exit 0 on 4bbddc5a9 (99 cases; the round-1 head 7e78dc6ad failed its pin the SKILL.md enqueue bar names this file because :628 lacked .mjs). Run explicitly: the derivation does not name it for a SKILL.md change, and --ran files it as 'Outside this card's derivation (1)' — filed as [finding] dispatch-gates does not derive check:pm-expected-skips for a SKILL.md change, though that self-test pins a literal in SKILL.md — a SKILL.md PR passed 19 derived gates and went red on the 20th in CI #18673.
  • pnpm check:pm-skill-ratchet exit 0 — SKILL.md 812 lines (ceiling 812; headroom 0), widest table row 342 (pin 342); contract-review.md 60/60; platform-readings.md 466/466. pnpm check:skill-frame-sync exit 0 (one coherent copy; 74 markdown files scanned). pnpm check:pm-skill-id-lint exit 0 (27 files clean). pnpm check:nul-bytes exit 0.
  • Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack from the worktree (no hand-fed paths): 19 commands, each captured redirect-then-$?: Re-run on 4bbddc5a9: 19/19 exit 0 (doc-formula-expressions after the same prerequisite build through the lock, waited 0s).
    check-closing-keyword-parity.mjs 0 · check-closing-keyword-parity.mjs --self-test 0 · check-comment-mask-corpus.mjs 0 · check-governed-queue-guard.mjs --self-test 0 · check-harness-current.mjs --self-test 0 · @objectstack/lint check:doc-formula-expressions 0 (first run exit 3 PREREQUISITE NOT MET — unbuilt @objectstack/formula/@objectstack/lint; built through os-verify-lock.sh after one queue-timeout (exit 99, holder: a sibling's check:pm-dispatch-gates), then 0) · check:agent-test-spelling 0 · check:doc-authoring 0 · check:driver-memory-census 0 · check:nul-bytes 0 · check:pm-governed-merges 0 · check:pm-governed-prose 0 · check:pm-half-states 0 · check:pm-skill-id-lint 0 · check:pm-skill-ratchet 0 · check:refd-timer-probe 0 · check:required-contexts 0 · check:skill-frame-sync 0 · check:watch-hint-literal 0.
  • --ran reconciliation: 19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN, exit 0.
  • check-governed-merges.mjs --test on the three paths: exit 3 GOVERNED, as expected.
  • Tier: --tier --repo objectstack-ai/objectstack on the touched files → MANDATORY, clause ① from SKILL.md.

Acceptance notes

  • noted, not filed: git-history.mjs touch run from a sibling cwd fetches --deepen up to 4096 into that clone before answering not-found — an operator-visible side effect on a checkout the tool does not own (its header says deepening is an operator action). Carrier: none; recorded here for the skills seat.
  • noted, not filed: true-green.md :15–:16 and platform-readings.md :392 already state the dispatch-gates.mjs cross-repo behaviour for the dev side; this PR adds the PM-side citation and the rule, and leaves those readings in place.

维护者速读(草稿)

改了什么:pm-dispatch 技能文本在四处引用住在 objectstack 的工装(门禁派生 dispatch-gates、预期 skip 名单 check-expected-skips、条款②配对检查 check-clause2-carriers)时,现在每处都写明它答的是哪个仓、拼写里带上仓参数;〈多仓协调〉加一条总则「工装只答被告知的仓,缺参数即答 objectstack,⛔ 不答手上那张卡的仓」;平台读数表里代理拒绝那一行补上判别式(缺键即拒绝,看状态码)。零脚本改动,三个文件行数全部中性。

为什么改:一位在 objectui 上工作的席位实测:三件工装三种行为,其中预期 skip 名单会拿 objectstack 的花名册去判 objectui 的板,交出一份它判不了的放行;技能文本里没有任何一行提醒。本 PR 逐件复测并把结论写在被引用的那一行上。

风险与代价(含回滚):纯文本改动。付账方式是删掉 SKILL.md 一行在 lanes/ui.md 与〈域车道〉均已重述的规则;:539 为容纳 --repo 去掉了「⛔ 不抓人读输出」的措辞(机读模式已由 --commands/--ran 拼写承载)。回滚 = revert 单个 commit。

席位意见:(留给席位)

你要做的(一个动作):批准本 PR,或点名要改的那一行。


Generated by Claude Code

One rule in 〈多仓协调〉 — an instrument answers for the repo it is told
(`--repo` / `PM_SWEEP_REPO`), defaults to objectstack, never the card in
hand — and the three citations rewritten in place to carry it: the
`--commands` derivation asserts `--repo` (refused ⇒ hand-derive), the
enqueue-bar roster is stated as judging objectstack only, and both `--pair`
citations spell `PM_SWEEP_REPO=`. The proxy's refusal-in-a-success-shape row
gains its tell (absent key = refusal; the status code discriminates).

Line-neutral at every ratchet: SKILL.md 812/812 (one restated line paid),
contract-review.md 60/60, platform-readings.md 466/466.

Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu
Co-authored-by: Claude <[email protected]>

Copy link
Copy Markdown
Collaborator Author

维护者速读(终稿)

skills 席 session_01Gqi43smmqjJ5sUrhfoPeKu,2026-09-17T13:42Z。对照本席自己读的 diff 校正 dev 草稿;席位意见已填。

改了什么 — 三个受管文件各改一两行,全部行数中性(SKILL.md 812/812、contract-review 60/60、platform-readings 466/466),不动脚本。新增一条规则(SKILL.md :206):「工装只答被告知的仓,缺 --repo/PM_SWEEP_REPO 即答 objectstack;⛔ 不答手上那张卡的仓」;三处引用工装的行照此改写 —— 派发:dispatch-gates --commands --repo 仓,被拒即手推;复核:check-expected-skips 名单只判 objectstack;入队/落地(SKILL.md :645 与 contract-review :41):PM_SWEEP_REPO=仓 check-clause2-carriers --pair N。platform-readings :212 补上代理 403 的判别式(缺键即拒绝,看状态码)。

为什么改 — 章程把几件工装写成动作的具名前置,却不说它答的是哪个仓。脚本住 objectstack,而好几条车道在做 objectui;同一席同一班实测三件工装三种行为:一件响亮拒绝,一件用 objectstack 的名单答 objectui 的 PR(把一份它判不了的放行交给了兄弟仓),一件靠环境变量正常工作;hotlong 又撞上第四种 —— 容器代理用成功的形状答拒绝。填报席自己申报「一开始判反了」:这是章程文本缺口,不是工装缺陷。

风险与代价(含回滚) — 规则层,只改文本。为保持 812 行,删掉 :201「落点不明留分诊首触,⛔ 不猜」—— 它在 references/lanes/ui.md:15 原样保留(还多一句「不代判」)。⚠️ 要请你看一眼的一处::539 为了塞进 --repo 仓,去掉了「⛔ 不抓人读输出」这句禁令;该行仍写着「退出码先落盘,--ran 对账」,也就是禁令的机制,但字面禁令在技能里就此消失。回滚 = revert 一个提交。与 PR #18656(:91)无行重叠,两者任一先合,另一个合 main 即可。

席位意见 — 荐合。规则写在一处、引用处各带一句,消除的是本席自己每天在用、分诊席每隔一轮就踩的缺口;没有新增工装或义务。:539 那句禁令的去留由你定:认可机制即禁令则直接 Approve;若要保留字面,Request changes,本席让 dev 换一处付行。

你要做的(一个动作) — Approve 本 PR(或直接人工合并);席位随后按裁定 C 落地。


Generated by Claude Code

Copy link
Copy Markdown
Collaborator Author

⚠️ CORRECTION by the skills seat, 2026-09-17T13:44Z — the ACCEPT above (5715361711) and the 速读 on the PR (5715362193) read CI on 7e78dc6ad as green. It is not: Lint & Repo Gates (job 105220877730) failed at step 53, pnpm check:pm-expected-skips — 「✗ structural: the SKILL.md enqueue bar names this file (got false, want true)」, 1 of 99 cases; 126 later gates NEVER RAN (not measured). Cause, read from the diff: SKILL.md :628 now spells 「名单 check-expected-skips 只判 objectstack」 and the script's structural self-test pins the literal check-expected-skips.mjs on that line. The seat's poll read the aggregate before the job completed and the seat hung the four-piece on that reading — the seat's error, recorded here. needs-user-decision is stripped until the head is green; the dev is sent back for one repair round (restore the literal on :628 within 120 B; run pnpm check:pm-expected-skips; re-derive), after which the seat re-reviews the new head and re-hangs the four-piece. Reviewers: please hold.


Generated by Claude Code

…e enqueue bar

`check-expected-skips.mjs` pins, in its self-test, that the SKILL.md enqueue
bar names it by file name; the previous commit spelled the citation without
`.mjs` and the pin went red. The literal is back on the same line, paid by
spelling `success` as 绿 (the word core-rules' twin line already uses):
116 B, 812 / 812.

Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu
Co-authored-by: Claude <[email protected]>

Copy link
Copy Markdown
Collaborator Author

Hold lifted — skills seat, 2026-09-17T14:07Z. The repair landed as one commit on top (4bbddc5a9: SKILL.md :628 restored the literal check-expected-skips.mjs, 116 B, 812 / 812); CI on that head is green (21 / 12 skipped rostered, 0 failures, every check run read completed before this act) and the round-2 in-seat ACCEPT is on the card (#18454). The 速读 above (5715362193) still describes the change; its :628 byte count reads 117, now 116. needs-user-decision is re-hung; os-zhuang / hotlong — the PR is ready for your read. An authorized APPROVED lands it by ruling C.


Generated by Claude Code

This was referenced Sep 17, 2026
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 needs-user-decision size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants