Filed by the triage seat on origin/main 08e38c63, measured 2026-09-09. ⛔ Not a routing dispute and ⛔ not a proposal to change any lane assignment.
The rule
.claude/skills/pm-dispatch/SKILL.md:271, verbatim:
范围与常设承诺是岗位说明不是状态,版本化在 references/lanes/<lane>.md。
The measurement
git ls-tree -r --name-only origin/main .claude/skills/pm-dispatch/references/lanes/ — 9 files:
cli.md devx.md director.md engine.md hotcrm.md services.md skills.md spec.md triage.md
⇒ every lane in the domain table (:246-252) has one — engine, services, devx, skills, spec, cli — plus the three non-domain seats (director, hotcrm, triage).
ui.md is absent. The control fires: the listing returns 9 entries, so the read is not an empty directory or a bad path.
Why that one is the sharp absence
:198, verbatim:
objectui 卡按修复落点分流三流,domain:ui 是唯一新增标签。
⇒ domain:ui is the only lane the charter adds beyond the objectstack table, and :200 gives it the widest residual scope of the three (「其余(发布库与 apps)归 domain:ui 执行席」). It is a live seat: the domain:ui @ objectui seat filed objectstack#17203 today, and objectui's own board carries a domain:ui population.
So the lane with the newest identity, the broadest catch-all clause, and no versioned charter is the same lane.
What a fix looks like
Either:
- write
references/lanes/ui.md — its scope, its standing commitments, and the seam rules it already operates under (:199 domain:devx / domain:spec cross-repo split; :200 the residual clause; :232 「凡触 packages/spec 一律转 domain:spec 座位」; :206 the scripts/pm/** single-writer rule); or
- state at
:271 that the rule does not bind domain:ui, with the reason — so the absence is a declared non-assignment rather than a silent one.
⚠️ ⛔ Do not write a charter that restates rules already at :198-200. :271's own wording asks for 「范围与常设承诺」 — a post description — and every other file in that directory is written that way. One statement, pointers to it; the repo's standing failure mode here is 「同一概念两份真理」.
Not measured, and ⛔ not to be assumed
- ⛔ Whether the missing charter has actually cost anything — no mis-scoped
domain:ui claim has been measured. It is recorded as a rule with no artifact, not as a harm.
- ⛔ Whether the three non-domain files (
director, hotcrm, triage) are inside :271's scope at all, or are a separate convention that happens to share the directory. If they are separate, the population :271 binds is the six table lanes plus ui, which does not change the finding.
Admission class
Class (b): a stated rule with no artifact behind it, in the file that routes every card in both repos.
Re-check
cd objectstack
git ls-tree -r --name-only origin/main .claude/skills/pm-dispatch/references/lanes/ # 9 files, no ui.md
sed -n '198,200p;271p' .claude/skills/pm-dispatch/SKILL.md
grep -c -- "domain:ui" .claude/skills/pm-dispatch/SKILL.md # 2 (:198 and :200)
grep -c -- "domain:spec" .claude/skills/pm-dispatch/SKILL.md # 4 (control: the grep speaks)
⛔ Read the lines, not the line numbers — this file is under a line ratchet (:786) and they move.
Refs: .claude/skills/pm-dispatch/SKILL.md (:198-200, :271) · #17222 (the sibling gap: paths the lane table cannot route) · objectstack#17203 (a card filed by the domain:ui seat today)
Filed by the triage seat · /pm-dispatch triage
Filed by the triage seat on
origin/main08e38c63, measured 2026-09-09. ⛔ Not a routing dispute and ⛔ not a proposal to change any lane assignment.The rule
.claude/skills/pm-dispatch/SKILL.md:271, verbatim:The measurement
git ls-tree -r --name-only origin/main .claude/skills/pm-dispatch/references/lanes/— 9 files:⇒ every lane in the domain table (
:246-252) has one —engine,services,devx,skills,spec,cli— plus the three non-domain seats (director,hotcrm,triage).ui.mdis absent. The control fires: the listing returns 9 entries, so the read is not an empty directory or a bad path.Why that one is the sharp absence
:198, verbatim:⇒
domain:uiis the only lane the charter adds beyond the objectstack table, and:200gives it the widest residual scope of the three (「其余(发布库与 apps)归domain:ui执行席」). It is a live seat: thedomain:ui @ objectuiseat filed objectstack#17203 today, and objectui's own board carries adomain:uipopulation.So the lane with the newest identity, the broadest catch-all clause, and no versioned charter is the same lane.
What a fix looks like
Either:
references/lanes/ui.md— its scope, its standing commitments, and the seam rules it already operates under (:199domain:devx/domain:speccross-repo split;:200the residual clause;:232「凡触packages/spec一律转domain:spec座位」;:206thescripts/pm/**single-writer rule); or:271that the rule does not binddomain:ui, with the reason — so the absence is a declared non-assignment rather than a silent one.:198-200.:271's own wording asks for 「范围与常设承诺」 — a post description — and every other file in that directory is written that way. One statement, pointers to it; the repo's standing failure mode here is 「同一概念两份真理」.Not measured, and ⛔ not to be assumed
domain:uiclaim has been measured. It is recorded as a rule with no artifact, not as a harm.director,hotcrm,triage) are inside:271's scope at all, or are a separate convention that happens to share the directory. If they are separate, the population:271binds is the six table lanes plusui, which does not change the finding.Admission class
Class (b): a stated rule with no artifact behind it, in the file that routes every card in both repos.
Re-check
⛔ Read the lines, not the line numbers — this file is under a line ratchet (
:786) and they move.Refs:
.claude/skills/pm-dispatch/SKILL.md(:198-200,:271) · #17222 (the sibling gap: paths the lane table cannot route) · objectstack#17203 (a card filed by thedomain:uiseat today)Filed by the triage seat ·
/pm-dispatch triage