Skip to content

docs(agents): name the missing tool, not an absent sibling scripts/pm/ - #17375

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-17244-os-dev-sibling-scripts-pm
Sep 10, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-17244-os-dev-sibling-scripts-pm

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes #17244

One sentence in .claude/agents/os-dev.md — in the 本地验证范围 gate-derivation rules — stated that sibling repos have no scripts/pm/. objectui has one. The sentence is rewritten in place, net-zero, to name the missing tool instead of an absent directory, and to claim nothing about cloud.

The line

Before (71 bytes):

- 读之前先核对;姊妹仓(objectui / cloud)没有 `scripts/pm/`。

After (114 bytes; the corpus line cap is 120):

- 读之前先核对;姊妹仓未必有 `scripts/pm/dispatch-gates.mjs`:objectui 只有 `check-half-states.mjs`。
  • Net-zero: 403 lines before, 403 after. Ratchet verdict, verbatim: ✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 403 lines (ceiling 403; headroom 0). — no ceiling raise, headroom was and is zero.
  • The operative instruction is untouched. The two bullets that follow it still say what they said: feeding a sibling's paths into an objectstack checkout yields objectstack's own gate families (complete-looking, exit 0, all wrong), and that repo's list is derived by hand from its own package.json and .github/workflows/. What changes is only the premise the reader carries into them.
  • cloud is no longer asserted, in either direction. It is attached to no seat in this container, so the corrected sentence measures objectui and says nothing about cloud rather than generalising over it.
  • Punctuation follows the corpus convention the ratchet pins (ASCII ; and : in CJK prose, fullwidth 。), and the line carries no control bytes: grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' over the file returns no hits, pnpm check:nul-bytes exit 0.

The measurement, re-verified at this branch tip

objectui origin/main is a646262; the shared objectui checkout at /home/user/objectui was read, never edited.

$ git -C /home/user/objectui ls-tree --name-only origin/main scripts/pm/
scripts/pm/check-half-states.mjs

$ git -C /home/user/objectui ls-tree --name-only origin/main .github/workflows/ | grep half-state
.github/workflows/half-state-patrol.yml

$ git -C /home/user/objectui cat-file -e origin/main:scripts/pm/dispatch-gates.mjs; echo "exit=$?"
fatal: path 'scripts/pm/dispatch-gates.mjs' does not exist in 'origin/main'
exit=128

The control is the third command: the same reader, the same tree, the same channel, answering absent for a path that genuinely is not there — so the first command's answer is a reading and not a channel artefact.

In-repo corroboration, independent of the card — scripts/pm/check-half-states.mjs already carries this comment:

// objectui's `scripts/pm/` holds this file alone.

The sweeper's own source and this measurement agree; only the dev-agent text disagreed.

Gates

Derived on the real diff with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (the tool takes its change set from the merge base itself). 17 derived families, 17 run, 0 UNRUN, 0 NOT-MEASURED — reconciled with --ran, exit codes recorded per line and captured before any pipe:

✓ dispatch-gates --ran: 17 derived famil(ies) accounted for — 17 run, 0 NOT-MEASURED (a DERIVED zero — all 17 recorded an exit code and none of them is 3).

family exit
node scripts/check-closing-keyword-parity.mjs (and --self-test) 0
node scripts/check-comment-mask-corpus.mjs 0
node scripts/pm/check-governed-queue-guard.mjs --self-test 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions 0
pnpm check:agent-model-declared 0
pnpm check:agent-test-spelling 0
pnpm check:doc-authoring 0
pnpm check:driver-memory-census 0
pnpm check:nul-bytes 0
pnpm check:partof-closing-keyword 0
pnpm check:pm-governed-merges 0
pnpm check:pm-skill-id-lint 0
pnpm check:pm-skill-ratchet 0
pnpm check:refd-timer-probe 0
pnpm check:skill-frame-sync 0
pnpm check:watch-hint-literal 0

check:pm-governed-prose was run beyond the derived set (exit 0); the derivation scores it silent because its population is a tracked roster, not this path. check:doc-formula-expressions first refused with PREREQUISITE NOT MET (exit 3, explicitly not a finding) until @objectstack/formula and @objectstack/lint were built — that build ran through scripts/pm/os-verify-lock.sh (VERDICT command-exit 0 · held the lock 170s · waited 0s) and the gate then exited 0.

Repo-wide scans (pnpm lint and the wide-population families the derivation names) are CI's run, not this card's.

Acceptance notes

  • Nothing filed. The one sentence was the whole surface; no defect, contract violation or metadata-authoring trap surfaced beside it.
  • Noted, not filed: 姊妹仓 is now used in this file without an in-file enumeration of which repos it covers (it was enumerated only inside the false half). Not a gap — AGENTS.md Prime Directive Migrate documentation site to Fumadocs with monorepo structure and shared content #11 defines the term repo-wide, naming objectui and cloud. Carrier: the skills lane's next os-dev.md edit, if it ever wants the term localised; nobody owes it today.
  • Assumption A (PM's) holds: git grep -n '姊妹仓' -- .claude/agents/os-dev.md hits exactly two lines — the worktree-per-repo rule and this one. One rewrite closes the whole claim.
  • Assumption B (PM's) holds: no twin outside this file. The scripts/pm/ claims under .claude/skills/pm-dispatch/ are about this repo's tree or about the derivation answering only its own tree (references/platform-readings.md, references/true-green.md), and references/lanes/hotcrm.md's sibling-repo patrol-carrier clause is consistent with the corrected sentence. Nothing was edited outside the declared surface.
  • Assumption C (PM's) holds with one correction to the expected set: the derivation returns the skill-file families it predicted plus several this card also owes — closing-keyword parity, the comment-mask corpus, the governed-queue-guard self-test, doc-formula-expressions, agent-test-spelling, doc-authoring, driver-memory-census, partof-closing-keyword, refd-timer-probe and watch-hint-literal. All were run.
  • skip-changeset is measured, not assumed: .claude/** is on the fast track — nothing under it is published by any package's files[], so this diff moves nothing that ships.

维护者速读(草稿)

改了什么 — .claude/agents/os-dev.md 里的一句话,原地改写、行数不变(403 → 403)。原句说「姊妹仓(objectui / cloud)没有 scripts/pm/」,改成「姊妹仓未必有 scripts/pm/dispatch-gates.mjs:objectui 只有 check-half-states.mjs」。全 PR 只动这一行。

为什么改 — 原句是错的,不是过时:objectui 的 main 上确实有 scripts/pm/,里面躺着 check-half-states.mjs,还挂着一个每天跑四次的 half-state-patrol.yml。缺的只是 dispatch-gates.mjs 这一个工具。开发 agent 读到「没有 scripts/pm/」,就会带着一个自信的「没有」去做判断——而这一班里已经有一次派发词把同样的前提写进了受管文件的草稿,差一行就被版本化进 .claude/。改法是点名缺的那个工具,而不是宣称目录不存在;同时把没人实测过的 cloud 从这句话里摘出去(本容器没有 cloud 的座位,不实测就不表态)。真正的操作指令没动:姊妹仓没有 dispatch-gates.mjs,门禁族仍然从该仓自己的 package.json 与 .github/workflows/ 手推。

风险与代价(含回滚) — 风险极低:纯操作性文本一行,无代码、无发布面、无 changeset。代价是这句话现在对 cloud 不再表态,想知道 cloud 有没有 scripts/pm/ 的人得自己去测——这是把未实测的断言换成沉默,不是信息丢失。回滚成本一个 revert:单文件单行,行数与 ratchet 天花板都不动(403/403,headroom 0,未抬上限)。

席位意见 — (留空,待复核席填写)

你要做的 — 人工合并本 draft PR(.claude/** 属受管面,只能由维护者手动合并;没有别的动作)。


Generated by Claude Code

The gate-derivation rules in `.claude/agents/os-dev.md` stated that sibling
repos have no `scripts/pm/`. Measured on objectui `origin/main` (`a646262`):
`scripts/pm/check-half-states.mjs` is there, with a live standing caller
(`.github/workflows/half-state-patrol.yml`); only `dispatch-gates.mjs` is
absent (control, same tree, same channel). The operative half is unchanged —
a sibling without `dispatch-gates.mjs` still derives its gate families by
hand from its own `package.json` and `.github/workflows/`.

Rewritten in place, net-zero (403 lines before and after), 71 -> 114 bytes,
under the 120-byte line cap. The sentence no longer claims anything about
cloud, which is attached to no seat here and was never measured.

Claude-Session: https://claude.ai/code/session_01YKEjmbYNvYWJvWGSWx26zK
Co-authored-by: Claude <noreply@anthropic.com>
@os-litant os-litant added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 10, 2026 — with Claude
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Sep 10, 2026

Copy link
Copy Markdown
Collaborator Author

维护者速读

改了什么 —— .claude/agents/os-dev.md(开发 agent 的定义文件)里的一句话原地改写,行数不变(403 / 403)。原句「姊妹仓(objectui / cloud)没有 scripts/pm/」改为「姊妹仓未必有 scripts/pm/dispatch-gates.mjs:objectui 只有 check-half-states.mjs」。全 PR 只动这一行,相邻的操作指令(姊妹仓的门禁族按该仓自己的 package.json 与 workflows 手推)一字未动。

为什么改 —— 原句是错的:objectui 的 main 上有 scripts/pm/check-half-states.mjs(半状态巡查,配一天四次的 workflow),缺的只是 dispatch-gates.mjs 这一个工具。每个开发 agent 都读这个文件,读到「没有 scripts/pm/」就会带着一个自信的「没有」去做判断——上一班里已有一次派发词把这个假前提写进了受管文件的草稿,差一行就被版本化。改法是点名缺的那个工具,而不是宣称目录不存在;cloud 没人实测过,也不再表态。

风险与代价(含回滚) —— 极低:一行操作性文本,无代码、无发布面、无 changeset;派生的 17 个门禁族在 dev 本地全绿,ratchet 403/403 未抬。PR 的三个 CI job 在本席复核时(10:0xZ)仍在跑,人合前会收敛,本席下次巡检复读。代价:这句话对 cloud 不再表态——把未实测的断言换成沉默,不是丢信息。回滚 = revert 一个单行提交。

席位意见 —— 通过。本席在契约复审档对照 diff 自读,并在本容器的 objectui 检出上复测(origin/main a646262:scripts/pm/ 下恰好一个文件 check-half-states.mjs,对照 dispatch-gates.mjs 不存在)。新句 114 字节,在 120 字节行宽内;「未必有」的措辞正确地不对未测的仓下断言。受管面:本席不翻 ready、不入队、不批准。

你要做的 —— 一个动作:人工合并本 draft PR。

skills 席,session session_01YKEjmbYNvYWJvWGSWx26zK,2026-09-10T10:08Z。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 10, 2026 10:09
@os-zhuang
os-zhuang enabled auto-merge September 10, 2026 10:09
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 10, 2026
Merged via the queue into main with commit 8f8dcd2 Sep 10, 2026
35 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-17244-os-dev-sibling-scripts-pm branch September 10, 2026 10:50
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/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants