docs(pm): the ui lane names the objectui label/assignee write channel - #18145
Conversation
An objectui seat reads references/lanes/ui.md, which said nothing about how a label or assignee write is made now that lock 1 denies MCP issue_write in that repository as well. The lane register gains one rule line naming the objectstack checkout's label-write.mjs --repo, the MCP prohibition, and the hand-off when a session's classifier refuses the write. Paid at the file's 38-line ceiling (headroom 0) by deleting the pointer-only line whose two rules live verbatim in pm-dispatch SKILL.md 多仓协调 at :198. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewHead: ① derived judgments (seat-measured on the fetched head
② semver: unchanged — nothing published. ③ boundary flags: the PR body stores two footers (the create channel appended its own after a rule-line-free footer) — platform-readings :331 / :338 each state half of that combination and no row states it whole; the dev's out-of-scope note names this seat as the carrier — one row when the register is next touched (the maintainer's Implemented-by: Verdict: PASS — references tier ⇒ this seat lands: ready through 维护者速读(终稿)
Generated by Claude Code |
Fixes #18120
Under lock 1 an objectui session cannot write a label or an assignee through MCP
issue_write(its.claude/settings.jsononorigin/maindenies the tool), and nothing an objectui seat reads said what to use instead:.claude/skills/pm-dispatch/references/lanes/ui.mdcarried nolabelline at all. The channel already exists and already takes the repository — the objectstack checkout'sscripts/pm/label-write.mjs --repo owner/name, with the four steps and the read-back built in — so this card is one rule line in the lane register, not a mechanism.The rule line —
lanes/ui.md:23, 118 bytes (cap 120)It sits next to :22 「
scripts/pm/**单写手恒在 objectstack 侧 ⇒ 本席的工具需求走上游卡带Blocked-by:回链。」 — the channel is that objectstack-side single writer. It deliberately does not restatereferences/rest-channel.md:38–:39, which already carry the four steps, the read-back and the prohibition for objectstack cards:What is new here is the cross-repository half —
--repo— plus the hand-off when a session's classifier refuses the write.Line budget — net 0, paid by a deletion, not by a re-wrap
lanes/ui.mdis pinned at 38 lines with zero headroom (check:pm-skill-ratchet). Payment is the deletion of :15 「症状位置不改流向,docs 随所记录的面走,两条同上节,⛔ 不在此另抄。」 — a pointer-only line that says as much itself.Where the deleted rule survives:
.claude/skills/pm-dispatch/SKILL.md:198, inside 〈多仓协调〉 (heading at :185) — 「其余(发布库与 apps)归domain:ui执行席;症状位置不改流向,docs 随所记录的面走。」 The lane file already points at that section from :3 and from :13, so the rule stays reachable for the seat that reads the lane. No ceiling raised, no line re-wrapped, no other file touched.Acceptance — both directions, measured on
bb9e97d3fgit grep -c label-write -- .claude/skills/pm-dispatch/references/lanes/ui.md→ 1 (0 before the edit); the literal control 「单写手」 still hits, now at :22.wc -l→ 38 lines, unchanged; the ratchet prints✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/lanes/ui.md is 38 lines (ceiling 38; headroom 0).LC_ALL=C awk 'length($0)>120'over the file prints nothing; the new line measures 118 bytes.git diff --name-only a90a9f267..HEADprints exactly one path — soreferences/rest-channel.mdis untouched, and nopermissions.allowtext is added anywhere.AGENTS.mdis untouched by construction: that file lives in the sibling repository and is not in this diff's repo at all.grep -naPcontrol-byte self-scan over the edited file: no hits (check:nul-bytesgreen over 8,652 files).Gates — derived, run in the foreground, reconciled
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 15 families from the working-tree change set; all 15 ran with the exit code captured before any pipe, and all exited 0:Named in the dispatch and green here:
check:pm-skill-ratchet,check:pm-skill-id-lint(27 files clean),check:nul-bytes,check:skill-frame-sync,check:pm-governed-merges, pluscheck:pm-governed-prose(not in the derived set — it scoressilentas an artifact roster — run anyway: 2 instruction surfaces name all 5 registered governed surfaces).Six of the fifteen first exited 3 PREREQUISITE NOT MET on a fresh worktree (
node_modulesabsent; one also needed@objectstack/formula+@objectstack/lintbuilt). That is not a verdict:pnpm install, then the build underscripts/pm/os-verify-lock.sh(VERDICT command-exit 0 · held the lock 2s · waited 0s), then a re-run — all 0.Changeset
skip-changesetlabel, applied through the additive endpoint and read back..claude/**publishes nothing: no packagefiles[]ships it, and the fast-track list names.claude/**directly.Deviation from the dispatch's suggested route
The suggested wording measured 171 bytes against the 120-byte cap, so it could not land as written; the shipped line is a compressed spelling of the same three clauses (channel +
--repo, ⛔ MCPissue_write, hand-off on refusal). The suggested payment (dropping :15) measured correct and is what was used.维护者速读(草稿)
改了什么 — objectui 车道岗位说明加一行:objectui 卡的标签/assignee 写,走 objectstack 检出里的
label-write.mjs --repo,不走 MCP;会话被拒就把卡交给有通道的席位。同一文件删掉一行纯指针句(它的两条规则逐字住在 SKILL.md 〈多仓协调〉:198),行数 38 不变。为什么改 — 锁 1 已在两仓落地,objectui 会话的 MCP 写标签能力被拒。通道是有的(objectstack 侧那一个脚本,已在 objectui 卡上实跑过),但 objectui 席位读的文件没有一处写着它。席位找不到通道时会把状态记在散文里,而不是记在标签上——这正是同一失败形态在第二个仓的复发。
风险与代价(含回滚) — 风险低:纯指令面一行,无代码、无发布物。代价是删掉的那行指针句;它的规则在 SKILL.md 仍在,车道文件 :3 与 :13 都指向该节。回滚 = revert 本 PR 一次提交,文件回到 38 行原样。
席位意见 — (待席位定稿)
你要做的 — 读一下新增那行的措辞是否符合你的口径(尤其「被拒转有通道席」这半句),然后人工合并:本 PR 触
.claude/**,属受管面,只能由你手工落地。另:objectui 会话真正键入的那条命令要不要进permissions.allow(前缀拼写在 objectui 会话里不一样),仍等你的裁决,本卡按 out of scope 处理。Generated by Claude Code
Generated by Claude Code