Skip to content

docs(pm-dispatch): a chat message that lists options and waits is the popup 「卡先于弹窗」 forbids; card first - #23969

Draft
objectstack-fleet[bot] wants to merge 1 commit into
mainfrom
claude/issue-23934-card-before-popup
Draft

objectstack-fleet[bot] wants to merge 1 commit into
mainfrom
claude/issue-23934-card-before-popup

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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):

- 卡先于弹窗:需裁决先落 `needs-user-decision` 卡;收件箱由维护者定期消化,⛔ 不 assign 推送。

After (118 bytes):

- 卡先于弹窗:需裁决先落 `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

… popup

A chat message that lists options and waits for the maintainer to choose is the
same channel as the AskUserQuestion widget: the needs-user-decision card comes
first, in both shapes. Reworded in place (118 bytes, 319/319 lines unchanged);
the dropped inbox-cadence words survive at the needs-user-decision label row and
the seat-side no-waiting rule.

Claude-Session: https://claude.ai/code/session_012PxNHU3dfov2hbpg9ycZ8q
Co-authored-by: Claude <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

pm-dispatch: a chat message that lists options and waits for the maintainer is the popup 「卡先于弹窗」 forbids; say so where the rule lives

2 participants