Found by the domain:skills dev seat while writing references/lanes/ui.md (branch claude/issue-17236-lanes-ui-md, PR #17243), measured on origin/main 559e531a, 2026-09-09. Not in that PR's scope, so it is filed rather than fixed there.
The claim
.claude/agents/os-dev.md, in the 本地验证范围 section's gate-family derivation rules, verbatim:
读之前先核对;姊妹仓(objectui / cloud)没有 scripts/pm/。
The measurement
Repo-scoped REST against objectui main:
GET /repos/objectstack-ai/objectui/contents/scripts/pm?ref=main
-> ["check-half-states.mjs"] # HTTP 200
GET /repos/objectstack-ai/objectui/contents/.github/workflows/half-state-patrol.yml?ref=main
-> HTTP 200
Control, same session, same channel, against a path that genuinely is absent there:
objectui scripts/pm/dispatch-gates.mjs -> absent # the control fires: the reader can say "no"
⇒ objectui does have a scripts/pm/. It holds one file, the adopted copy of this repo's half-state sweeper, and a live standing caller (.github/workflows/half-state-patrol.yml, cron 4×/day). The two most recent scheduled runs are green.
What is still true, and what is not
- Still true — the operative instruction.
scripts/pm/dispatch-gates.mjs does not exist in objectui, so objectui's gate families must be derived by hand from that repo's own package.json and .github/workflows/. Nothing in that half changes.
- Not true — the stated premise. The sentence generalises from one absent tool to an absent directory, and it names
cloud in the same breath (⛔ not measured here — this finding claims nothing about cloud).
Why it is worth a card rather than a note
The false half is load-bearing in exactly one direction: an agent that reads it and needs to know whether objectui has a half-state sweeper, a verify lock, or any other scripts/pm/ tool gets a confident "no" from the repo's own operational text.
That is not hypothetical this shift. The dispatch brief for #17236 carried the same premise («objectui has no half-state-patrol.yml and no dispatch-gates.mjs») and asked the dev to write the half-state-patrol line of a governed lane charter from it. The measurement above falsified it in time and the file records what is actually there — but the premise came within one unchecked line of being versioned into .claude/.
Re-check
curl -s -H "Accept: application/vnd.github+json" \
https://api.github.com/repos/objectstack-ai/objectui/contents/scripts/pm?ref=main
# expect: one entry, check-half-states.mjs
grep -n "没有 .scripts/pm/" .claude/agents/os-dev.md
# expect: one hit, in the gate-derivation rules
Admission class
Class (a): an error, not an omission — a stated fact that measurement contradicts, in operational text every dev agent reads. The remedy is a one-line correction (name the missing TOOL, not an absent directory), plus a decision on whether the cloud half of the same sentence has ever been measured.
Refs: .claude/agents/os-dev.md · .claude/skills/pm-dispatch/references/lanes/hotcrm.md (the sibling-repo patrol-carrier clause this was measured against) · PR #17243
Filed by the domain:skills dev seat, session session_01MoTv7pn338AZ71owsp19gQ.
Found by the
domain:skillsdev seat while writingreferences/lanes/ui.md(branchclaude/issue-17236-lanes-ui-md, PR #17243), measured onorigin/main559e531a, 2026-09-09. Not in that PR's scope, so it is filed rather than fixed there.The claim
.claude/agents/os-dev.md, in the 本地验证范围 section's gate-family derivation rules, verbatim:The measurement
Repo-scoped REST against objectui
main:Control, same session, same channel, against a path that genuinely is absent there:
⇒ objectui does have a
scripts/pm/. It holds one file, the adopted copy of this repo's half-state sweeper, and a live standing caller (.github/workflows/half-state-patrol.yml, cron 4×/day). The two most recent scheduled runs are green.What is still true, and what is not
scripts/pm/dispatch-gates.mjsdoes not exist in objectui, so objectui's gate families must be derived by hand from that repo's ownpackage.jsonand.github/workflows/. Nothing in that half changes.cloudin the same breath (⛔ not measured here — this finding claims nothing about cloud).Why it is worth a card rather than a note
The false half is load-bearing in exactly one direction: an agent that reads it and needs to know whether objectui has a half-state sweeper, a verify lock, or any other
scripts/pm/tool gets a confident "no" from the repo's own operational text.That is not hypothetical this shift. The dispatch brief for #17236 carried the same premise («objectui has no
half-state-patrol.ymland nodispatch-gates.mjs») and asked the dev to write the half-state-patrol line of a governed lane charter from it. The measurement above falsified it in time and the file records what is actually there — but the premise came within one unchecked line of being versioned into.claude/.Re-check
Admission class
Class (a): an error, not an omission — a stated fact that measurement contradicts, in operational text every dev agent reads. The remedy is a one-line correction (name the missing TOOL, not an absent directory), plus a decision on whether the
cloudhalf of the same sentence has ever been measured.Refs:
.claude/agents/os-dev.md·.claude/skills/pm-dispatch/references/lanes/hotcrm.md(the sibling-repo patrol-carrier clause this was measured against) · PR #17243Filed by the
domain:skillsdev seat, sessionsession_01MoTv7pn338AZ71owsp19gQ.