Skip to content

Commit bd4276a

Browse files
docs(pm-dispatch): a chat message that lists options and waits is the popup 「卡先于弹窗」 forbids; card first (#23969)
Fixes #23934 Clause-②: no ## What changed One line of `.claude/skills/pm-dispatch/SKILL.md` (L268, the 「卡先于弹窗」 rule) is reworded in place. No line is added or removed, no code, no gate, no changeset (`.claude/**` is not published). Before (118 bytes): ```text - 卡先于弹窗:需裁决先落 `needs-user-decision` 卡;收件箱由维护者定期消化,⛔ 不 assign 推送。 ``` After (118 bytes): ```text - 卡先于弹窗:需裁决先落 `needs-user-decision` 卡;列选项等答的聊天即弹窗;⛔ 不 assign 推送。 ``` The new middle clause names chat prose that lists options and waits for the maintainer's choice as the same channel as the `AskUserQuestion` widget: in both shapes the `needs-user-decision` card comes first (card acceptance 1). The ruling behind it is the maintainer's word quoted on the card: 「需要我决策的开决策卡」 and 「这种决策问题就是应该开决策卡,是skills 没写清楚嘛?skills也需要更新」. ## Clause survival audit (every dropped clause must live elsewhere) | Clause of the old line | Disposition | Evidence at head `04e2341e1` | |:---|:---|:---| | 「卡先于弹窗」 (title) | kept verbatim | L268 | | 「需裁决先落 `needs-user-decision` 卡」 | kept verbatim | L268 | | 「收件箱由维护者定期消化」 | dropped: it describes the maintainer's own cadence, not a seat duty | the inbox itself is named at L106 (`needs-user-decision` row: 「维护者的收件箱」); the seat-side duty is L38 (「⛔ 永不整席等维护者答复;需裁事项落卡进决策箱」); `grep -n 收件箱 SKILL.md` → L106, L112 remain | | 「⛔ 不 assign 推送」 | kept verbatim: it has no other home | `grep -rn "assign 推送" .claude/ AGENTS.md` → L268 only, before and after | ## Measurements (PM assumptions re-measured on the base) - Base: `origin/main` `6d1660dc3` (moved from the order's `161aee10` while the worktree was created; `SKILL.md` last touched on `main` by `f7e836da1`, unchanged between the two). - `SKILL.md`: 319 lines before, 319 after (`CEILINGS` 319, headroom 0). L268: 118 bytes before, 118 after (`MAX_LINE_BYTES` 120). L270 (`AskUserQuestion` accelerator) untouched at 113 bytes. - Four-axis frame block L241–261: md5 `abff5f852c8fd09b79ec0623439aa4f0` before and after (L268 is outside it). - `references/decision-analysis.md` (50/50) untouched: the in-place reword held every surviving clause within 120 bytes, so the fallback route was not needed. - Control-byte scan over the edited file: 0 hits. ## Verification at head `04e2341e1` (`git rev-parse --short HEAD` of the run) Local subset, each exit code captured before any pipe (output redirected to a log, `$?` read next): | Command | Exit | Judgement line | |:---|:---|:---| | `pnpm check:pm-skill-ratchet` | 0 | `✓ check-skill-line-ratchet: declared cross-file moves: 2, total ceilings down 486 lines.` | | `pnpm check:pm-skill-id-lint` | 0 | `✓ check-skill-id-lint: 87 file(s) clean (pattern /#[0-9]{3,}/g).` | | `pnpm check:pm-governed-prose` | 0 | `✓ check-governed-prose: 2 instruction surface(s) name all 7 registered governed surfaces …` | | `pnpm check:skill-frame-sync` | 0 | `✓ check-skill-frame-sync: the one declared copy of the decision frame is internally coherent` | | `pnpm check:skill-frame-freshness` (local-only) | 0 | `✓ check-skill-frame-freshness: the decision frame in this tree is current with origin/main (fetched just now).` | | `pnpm check:nul-bytes` | 0 | `check-nul-bytes: OK (scanned 11841 text file(s) …; no raw ASCII control bytes).` | Derivation: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; change set from the merge base `6d1660dc3`): 20 commands. All 20 were run with the tool's own capture idiom (`eval "$cmd" > log 2>&1; status=$?`, recorded as `cmd :: exit N`): the four above plus `check:nul-bytes`, and `node scripts/check-closing-keyword-parity.mjs` (+ `--self-test`), `node scripts/check-comment-mask-corpus.mjs`, `node scripts/pm/check-governed-queue-guard.mjs --self-test`, `node scripts/pm/check-harness-current.mjs --self-test`, `pnpm --filter @objectstack/lint run check:doc-formula-expressions`, `pnpm check:agent-test-spelling`, `pnpm check:cross-package-test-inputs`, `pnpm check:doc-authoring`, `pnpm check:driver-memory-census`, `pnpm check:gitlink-declared`, `pnpm check:pm-expected-skips`, `pnpm check:pm-governed-merges`, `pnpm check:refd-timer-probe`, `pnpm check:watch-hint-literal` — every one exit 0. `check:doc-formula-expressions` first answered exit 3 (PREREQUISITE NOT MET: `@objectstack/formula` and `@objectstack/lint` not built); after `turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under `os-verify-lock.sh` (VERDICT command-exit 0, held 119 s) it was re-run and exited 0. Reconciliation: `dispatch-gates --ran` → `✓ 20 derived famil(ies) accounted for — 20 run, 0 NOT-MEASURED`; `check:skill-frame-freshness` is listed as outside the derivation (local-only, by design). The artifact-roster families, the type-check lanes and the always-runs tail are CI's: the seat reads them from this PR's check-runs. No package source was touched, so there is no ① build closure and no ② package test. No ablation: the diff changes instruction text, not tested behaviour. ## Acceptance notes - Nothing out of scope was found. The only observation is the moved base (`161aee10` → `6d1660dc3`), which did not touch the edited file. - `.claude/**` is unpublished: `skip-changeset` applies (requested through `scripts/pm/label-write.mjs`; the report says whether it landed). - Governed surface, Tier S (`.claude/**`): this PR stays draft; the owning seat's contract-tier review record lands it. Draft is no barrier by itself — the directive is. ## 维护者速读(草稿) **改了什么**:pm-dispatch 技能的「卡先于弹窗」那一行原地改写:把「收件箱由维护者定期消化」换成「列选项等答的聊天即弹窗」。行数 319 不变,该行 118 字节不变,不加任何新门禁,不动代码。 **为什么改**:今天有执行席把两件产品决策以「聊天里列 A/B/C 等你选」的方式提给你,没有先开 `needs-user-decision` 卡。你的原话是「需要我决策的开决策卡」「这种决策问题就是应该开决策卡,是skills 没写清楚嘛?skills也需要更新」。原规则只写了「弹窗」,席位把它读成仅指 `AskUserQuestion` 控件,所以聊天列选项等答成了漏洞。现在这行把两种形态点明为同一通道:先落卡,聊天只递卡链。 **风险与代价(含回滚)**:只改一行协议文字,无运行时影响、无发布面。被删掉的「收件箱由维护者定期消化」只描述你自己的消化节奏,席位侧的「不等答复、落卡进决策箱」(L38)与「维护者的收件箱」(L106)仍在;「⛔ 不 assign 推送」原样保留。回滚 = revert 这一个 commit。四项验收门禁本地全部退出 0。 **席位意见**:(席位填写) **你要做的**:无需你点击。这是 Tier S(`.claude/**`)受管面,由席位做达档复核并落地;若你不同意「列选项等答的聊天即弹窗」这一措辞,在本 PR 评论一句即可。 --- _Generated by [Claude Code](https://claude.ai/code/session_012PxNHU3dfov2hbpg9ycZ8q)_ Co-authored-by: objectstack-dev <noreply@anthropic.com>
1 parent 6973014 commit bd4276a

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
265265
- 长远合理性权重恒 ≥50%:推荐以长远的读数领起,四轴冲突时其余各轴合起来投不翻它。
266266
- 权重只排推荐不授权:读缩小特例与契约增生,⛔ 不背书投机扩张、不放行人工地板事。
267267
- 四维分析从业务角度写;四棱是四轴的卡面序列化,一一对应,也是分诊代裁置信门的输入。
268-
- 卡先于弹窗:需裁决先落 `needs-user-decision` 卡;收件箱由维护者定期消化,⛔ 不 assign 推送。
268+
- 卡先于弹窗:需裁决先落 `needs-user-decision` 卡;列选项等答的聊天即弹窗;⛔ 不 assign 推送。
269269
- 决策卡带选项、推荐、证据、四棱块与工作量列;受阻执行卡同笔挂 `pm:blocked`+`Blocked-by:`。
270270
- `AskUserQuestion` 只是在场加速器:仅当维护者在本会话 ~30 分钟内有过人类输入才可发。
271271
- 每问必带推荐项,被 Skip 或长挂即转卡通道,⛔ 不重弹。

0 commit comments

Comments
 (0)