Repository navigation
Commit bd4276a
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
265 | 265 | | |
266 | 266 | | |
267 | 267 | | |
268 | | - | |
| 268 | + | |
269 | 269 | | |
270 | 270 | | |
271 | 271 | | |
| |||
0 commit comments