Skip to content

Commit a6fb317

Browse files
garrytanclaude
andauthored
v1.48.0.0 feat: AskUserQuestion split rule + runtime AUTO_DECIDE carve-out (garrytan#1740)
* feat(preamble): add "Handling 5+ options — split, never drop" rule Agents repeatedly hit Conductor's 4-option AskUserQuestion cap and silently drop one option to fit, shrinking the user's decision space. This rule names the bug and gives two compliant shapes: batch into ≤4-groups (for coherent alternatives) or split into N sequential per-option calls (for independent scope items, default). Inline preamble subsection is ~15 lines (rule + buckets + pointer). Full reference with worked examples, Hold/dependency semantics, and final-summary validation lives in docs/askuserquestion-split.md. The agent loads the docs file on demand when N>4. Per-option call shape: D<N>.k header, ELI10, Recommendation, kind-note (no completeness score — decision actions, not coverage), Include / Defer / Cut / Hold buckets. Hold stops the chain immediately; the final D<N>.final call validates dependencies and confirms the assembled scope. question_ids: <skill>-split-<option-slug> (kebab-case ASCII, ≤64 chars). Also fixes orphan "12. " prefix on the existing CJK rule. Tier-2+ skills inherit via the existing resolver. SKILL.md regenerated for all 41 affected skills + 3 golden fixtures. Net diff per SKILL.md: ~34 lines (vs ~110 for the full inline version). 6 tests pin the inline contract (4-option cap, buckets, D-numbering, docs pointer, runtime AUTO_DECIDE gate reference, orphan 12 regression). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(question-pref): runtime AUTO_DECIDE carve-out for *-split-* ids Split chains (per-option AskUserQuestion calls emitted by the new "Handling 5+ options" rule) must never be silently auto-approved via /plan-tune preferences. The user's option set is sacred. Layer 1 (mechanism): unique <skill>-split-<option-slug> ids prevent cross-option preference leakage. Layer 2 (this commit): the runtime checker `gstack-question-preference --check` detects any id matching *-split-* and forces ASK_NORMALLY even when never-ask or ask-only-for-one-way preferences exist for that exact id. An explanatory note tells the user their preference was bypassed and why. 7 tests pin the carve-out: no-pref baseline, never-ask override, explanatory note text, ask-only-for-one-way override, always-ask (no note), non-split id containing "split" word (negative case for regex specificity), multi-skill split id formats. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * test(e2e): split-overflow regression for /plan-ceo-review Periodic-tier E2E test that catches the original failure mode the user complained about: 5+ options for ONE decision must split into N sequential AskUserQuestion calls, not drop one to fit Conductor's 4-option cap. Fixture: 5 independent chat-platform integration candidates (Slack/Discord/Teams/Telegram/Mattermost), each carrying its own include/defer/cut decision. Floor = 4 review-phase AUQs (standard [N-1] tolerance band). Pre-fix "drop to 4 + 1 dropped" fails this floor. Wired into test/helpers/touchfiles.ts: tier periodic, depends on plan-ceo-review/**, the new preamble subsection, the question-pref binary (for the carve-out), and the runner helper. touchfiles.test.ts expected count bumped 21 → 22 to account for the new entry. Cost: ~$0.30/run when EVALS_TIER=periodic. Skips silently otherwise. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: post-merge regen + rebase size-budget baseline to v1.47.0.0 After merging origin/main (v1.45 → v1.47), three things needed cleanup: 1. spec/SKILL.md (main's new skill) regenerated to include our split-vs-drop preamble subsection — same mechanical regen as the other 41 tier-2+ skills. 2. Three golden ship fixtures refreshed to capture main's GSTACK_PLAN_MODE block + /spec routing entry + jargon-list.json refactor. 3. docs/skills.md — added /spec table row that main's PR (garrytan#1698/garrytan#1733) shipped without. Pre-existing failure on main; this PR catches and fixes. Also rebased test/skill-size-budget.test.ts from v1.44.1 → v1.47.0.0 baseline. Main's v1.46 (catalog tokens trim) + v1.47 (/spec skill) pushed the v1.44.1 anchor past the 5% ratchet to ×1.059 — pre-existing failure on main. This PR captures a fresh parity-baseline-v1.47.0.0.json and re-anchors the test there. Historical v1.44.1.json and v1.46.0.0.json retained in test/fixtures/ for reference. Our subsection contributes ~0.1% of the post-rebase corpus. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: bump version and changelog (v1.48.0.0) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent f8bb590 commit a6fb317

60 files changed

Lines changed: 2902 additions & 62 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,59 @@
11
# Changelog
22

3+
## [1.48.0.0] - 2026-05-26
4+
5+
## **Agents stop dropping AskUserQuestion options when there are 5+.** A new canonical preamble rule + runtime gate makes Conductor's 4-option cap a split-or-batch decision, not a silent trim.
6+
7+
The failure mode looked like this in real transcripts:
8+
9+
> "I'm hitting Conductor's limit of 4 options in the AUQ, so I need to cut one. E4 is the biggest lift and probably beyond scope for v0.42 anyway. Trimming: E4. Moving to TODOs without asking. Re-firing with 4."
10+
11+
The agent unilaterally cut an option from the user's decision set. This release names that as a bug and gives the agent two compliant shapes for any 5+ option scenario: batch into ≤4-groups when the options are coherent alternatives (version bumps, layout variants), or split into N sequential per-option calls when the options are independent scope items (which platforms to ship, which TODOs to land). Default-to-split when unsure. The inline preamble subsection is intentionally compressed; full reference with worked examples, Hold/dependency semantics, and final-summary validation lives in `docs/askuserquestion-split.md` — loaded on demand when N>4.
12+
13+
A two-layer defense protects the option set from being silently auto-approved: per-option `question_id`s of shape `<skill>-split-<option-slug>` are unique per option (preferences can't leak across the chain), and the runtime checker `bin/gstack-question-preference --check` refuses `never-ask` on any `*-split-*` id with an explanatory note. The user's option set is sacred — the whole point of splitting is restoring user sovereignty over the decision space.
14+
15+
### The numbers that matter
16+
17+
Source: this branch's 4 commits + the post-merge regen against `main` at v1.47.0.0. Net diff: 57 files, ~2800 lines (most of it mechanical SKILL.md regen across all 41 tier-2+ skills, ~34 lines added per skill from the inline subsection injection).
18+
19+
| Capability | Before this PR | After this PR |
20+
|---|---|---|
21+
| 5+ options for ONE decision | drop one to fit cap, hope user doesn't notice | split into N per-option calls OR batch into ≤4-groups, name the rule in the preamble |
22+
| Per-option call shape | n/a (couldn't reliably produce one) | `D<N>.k` header, Include / Defer / Cut / Hold buckets, kind-note (no completeness score), recommendation per option |
23+
| Hold semantics | undefined (chain might queue, might stop, agent-dependent) | stop chain immediately, resume on user "continue" |
24+
| Final summary | n/a | `D<N>.final` validates dependencies, reprompts conflicts, confirms assembled scope |
25+
| `D<N>.0` meta-question (N>6) | n/a | tool-call meta-question first: proceed / narrow / batch |
26+
| AUTO_DECIDE on split per-option calls | possible if user tuned the pattern via /plan-tune | runtime checker forces `ASK_NORMALLY` on any `*-split-*` id, with explanatory note |
27+
| Regression coverage | n/a | 6 inline-contract tests + 7 runtime-gate tests + 1 periodic-tier E2E behavior test (5-option scope fixture) |
28+
| Inline preamble bytes per SKILL.md | n/a | ~1.6 KB (vs ~4 KB if the full rule were inlined; deeper reference loaded on demand) |
29+
30+
### What this means for builders
31+
32+
Next time you give an agent a scope question with 5+ candidates, you'll see one of three shapes: a single batched AskUserQuestion with ≤4 buckets (if the options are coherent alternatives), N sequential per-option calls each with Include/Defer/Cut/Hold (if they're independent), or a `D<N>.0` meta-question first asking whether to proceed/narrow/batch (if N>6). You'll never see a silent trim. If you've ever wired up a /plan-tune `never-ask` preference, it now refuses to apply to split chains — the runtime check forces ASK_NORMALLY with a note explaining why.
33+
34+
### Itemized changes
35+
36+
#### Added
37+
- New canonical preamble subsection in `scripts/resolvers/preamble/generate-ask-user-format.ts`: "Handling 5+ options — split, never drop". Inline-compressed (~1.6 KB per tier-2+ skill); full reference at `docs/askuserquestion-split.md`.
38+
- `docs/askuserquestion-split.md`: ~200-line deep reference covering both compliant shapes (batched / split), per-option call mechanics with `D<N>.k` numbering, Hold-means-stop semantics, final-summary dependency validation with conflict reprompt, `D<N>.0` meta-question for N>6, `<skill>-split-<option-slug>` question_id format, and the two-layer AUTO_DECIDE defense.
39+
- Runtime AUTO_DECIDE gate in `bin/gstack-question-preference --check`: detects any `question_id` matching `*-split-*` and forces `ASK_NORMALLY` regardless of stored `never-ask` or `ask-only-for-one-way` preferences. Emits an explanatory note so the user knows their preference was bypassed and why.
40+
- `test/skill-e2e-plan-ceo-split-overflow.test.ts`: periodic-tier regression test using a 5-option chat-platform integration fixture. Floor 4 review-phase AUQs (N-1 tolerance). Catches the original drop-to-fit-4 failure mode.
41+
42+
#### Changed
43+
- Test baseline anchor rebased v1.44.1 → v1.47.0.0 in `test/skill-size-budget.test.ts`. Main's v1.46 (catalog tokens) + v1.47 (/spec) growth pushed the v1.44.1 anchor past the 5% ratchet; rebasing absorbs that growth at HEAD. Historical `parity-baseline-v1.44.1.json` and `parity-baseline-v1.46.0.0.json` retained in `test/fixtures/` for reference.
44+
- 3 self-check items added to the AskUserQuestion preamble checklist (split-not-drop, dependency-check-before-chain, Hold-stops-immediately).
45+
- 41 tier-2+ skills regenerated to inherit the new subsection (~34 lines each via the preamble resolver).
46+
- 3 golden ship fixtures refreshed for the new preamble.
47+
48+
#### Fixed
49+
- Orphan `12.` numbered-list prefix on the existing CJK rule in `generate-ask-user-format.ts` — refactoring artifact, no items 1-11 above it. Removed.
50+
- `docs/skills.md` missing `/spec` table row (pre-existing miss from PR #1698/#1733 that landed `/spec` to main without updating the doc inventory). Added.
51+
52+
#### For contributors
53+
- 6 resolver tests pin the inline-subsection contract (4-option cap text, Include/Defer/Cut/Hold buckets, D-numbering shape, AUTO_DECIDE runtime gate reference, docs pointer, orphan-12 regression).
54+
- 7 runtime-gate tests in `test/gstack-question-preference.test.ts` cover the carve-out: no-pref baseline, never-ask override, explanatory note text, ask-only-for-one-way override, always-ask (no note), non-split id containing "split" word (negative regex specificity), multi-skill split id formats.
55+
- `parity-baseline-v1.47.0.0.json` captured via `bun run scripts/capture-baseline.ts --tag v1.47.0.0`.
56+
357
## [1.47.0.0] - 2026-05-26
458

559
## **`/spec` ships: turn vague intent into a precise, executable spec in five phases.** Pipe the spec into a spawned Claude Code agent, dedupe against existing issues, archive locally for the team corpus, and let `/ship` close the source issue on merge.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.47.0.0
1+
1.48.0.0

autoplan/SKILL.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,36 @@ Effort both-scales: when an option involves effort, label both human-team and CC
342342

343343
Net line closes the tradeoff. Per-skill instructions may add stricter rules.
344344

345-
12. **Non-ASCII characters — write directly, never \u-escape.** When any
345+
### Handling 5+ options — split, never drop
346+
347+
AskUserQuestion caps every call at **4 options**. With 5+ real options, NEVER
348+
drop, merge, or silently defer one to fit. Pick a compliant shape:
349+
350+
- **Batch into ≤4-groups** — for coherent alternatives (e.g. version bumps,
351+
layout variants). One call, 5th surfaced only if first 4 don't fit.
352+
- **Split per-option** — for independent scope items (e.g. "ship E1..E6?").
353+
Fire N sequential calls, one per option. Default to this when unsure.
354+
355+
Per-option call shape: `D<N>.k` header (e.g. D3.1..D3.5), ELI10 per option,
356+
Recommendation, kind-note (no completeness score — Include/Defer/Cut/Hold are
357+
decision actions), and 4 buckets:
358+
**A) Include**, **B) Defer**, **C) Cut**, **D) Hold** (stop chain, discuss).
359+
360+
After the chain, fire `D<N>.final` to validate the assembled set (reprompt
361+
dependency conflicts) and confirm shipping it. Use `D<N>.revise-<k>` to
362+
revise one option without re-running the chain.
363+
364+
For N>6, fire a `D<N>.0` meta-AskUserQuestion first (proceed / narrow / batch).
365+
366+
question_ids for split chains: `<skill>-split-<option-slug>` (kebab-case ASCII,
367+
≤64 chars, `-2`/`-3` suffix on collision). The runtime checker
368+
(`bin/gstack-question-preference`) refuses `never-ask` on any `*-split-*` id,
369+
so split chains are never AUTO_DECIDE-eligible — the user's option set is sacred.
370+
371+
**Full rule + worked examples + Hold/dependency semantics:** see
372+
`docs/askuserquestion-split.md` in the gstack repo. Read on demand when N>4.
373+
374+
**Non-ASCII characters — write directly, never \u-escape.** When any
346375
string field (question, option label, option description) contains
347376
Chinese (繁體/簡體), Japanese, Korean, or other non-ASCII text, emit
348377
the literal UTF-8 characters in the JSON string. **Never escape them
@@ -375,6 +404,9 @@ Before calling AskUserQuestion, verify:
375404
- [ ] Net line closes the decision
376405
- [ ] You are calling the tool, not writing prose
377406
- [ ] Non-ASCII characters (CJK / accents) written directly, NOT \u-escaped
407+
- [ ] If you had 5+ options, you split (or batched into ≤4-groups) — did NOT drop any
408+
- [ ] If you split, you checked dependencies between options before firing the chain
409+
- [ ] If a per-option Hold fires, you stopped the chain immediately (didn't queue)
378410

379411

380412
## Artifacts Sync (skill start)

bin/gstack-question-preference

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,21 @@ do_check() {
6868
return;
6969
}
7070
71+
// Split-chain carve-out: per-option calls in N-option splits emit
72+
// question_ids of the form <skill>-split-<option-slug>. These are
73+
// NEVER AUTO_DECIDE-eligible regardless of stored preferences — the
74+
// whole point of splitting is restoring user sovereignty over the
75+
// option set. See scripts/resolvers/preamble/generate-ask-user-format.ts
76+
// \"Handling 5+ options — split, never drop\" for the surrounding
77+
// mechanism that generates these ids.
78+
if (/-split-/.test(qid)) {
79+
console.log('ASK_NORMALLY');
80+
if (pref === 'never-ask' || pref === 'ask-only-for-one-way') {
81+
console.log('NOTE: split-chain per-option calls always ASK_NORMALLY; your ' + pref + ' preference does not apply to options inside a sequential split.');
82+
}
83+
return;
84+
}
85+
7186
switch (pref) {
7287
case 'never-ask':
7388
console.log('AUTO_DECIDE');

canary/SKILL.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,36 @@ Effort both-scales: when an option involves effort, label both human-team and CC
334334

335335
Net line closes the tradeoff. Per-skill instructions may add stricter rules.
336336

337-
12. **Non-ASCII characters — write directly, never \u-escape.** When any
337+
### Handling 5+ options — split, never drop
338+
339+
AskUserQuestion caps every call at **4 options**. With 5+ real options, NEVER
340+
drop, merge, or silently defer one to fit. Pick a compliant shape:
341+
342+
- **Batch into ≤4-groups** — for coherent alternatives (e.g. version bumps,
343+
layout variants). One call, 5th surfaced only if first 4 don't fit.
344+
- **Split per-option** — for independent scope items (e.g. "ship E1..E6?").
345+
Fire N sequential calls, one per option. Default to this when unsure.
346+
347+
Per-option call shape: `D<N>.k` header (e.g. D3.1..D3.5), ELI10 per option,
348+
Recommendation, kind-note (no completeness score — Include/Defer/Cut/Hold are
349+
decision actions), and 4 buckets:
350+
**A) Include**, **B) Defer**, **C) Cut**, **D) Hold** (stop chain, discuss).
351+
352+
After the chain, fire `D<N>.final` to validate the assembled set (reprompt
353+
dependency conflicts) and confirm shipping it. Use `D<N>.revise-<k>` to
354+
revise one option without re-running the chain.
355+
356+
For N>6, fire a `D<N>.0` meta-AskUserQuestion first (proceed / narrow / batch).
357+
358+
question_ids for split chains: `<skill>-split-<option-slug>` (kebab-case ASCII,
359+
≤64 chars, `-2`/`-3` suffix on collision). The runtime checker
360+
(`bin/gstack-question-preference`) refuses `never-ask` on any `*-split-*` id,
361+
so split chains are never AUTO_DECIDE-eligible — the user's option set is sacred.
362+
363+
**Full rule + worked examples + Hold/dependency semantics:** see
364+
`docs/askuserquestion-split.md` in the gstack repo. Read on demand when N>4.
365+
366+
**Non-ASCII characters — write directly, never \u-escape.** When any
338367
string field (question, option label, option description) contains
339368
Chinese (繁體/簡體), Japanese, Korean, or other non-ASCII text, emit
340369
the literal UTF-8 characters in the JSON string. **Never escape them
@@ -367,6 +396,9 @@ Before calling AskUserQuestion, verify:
367396
- [ ] Net line closes the decision
368397
- [ ] You are calling the tool, not writing prose
369398
- [ ] Non-ASCII characters (CJK / accents) written directly, NOT \u-escaped
399+
- [ ] If you had 5+ options, you split (or batched into ≤4-groups) — did NOT drop any
400+
- [ ] If you split, you checked dependencies between options before firing the chain
401+
- [ ] If a per-option Hold fires, you stopped the chain immediately (didn't queue)
370402

371403

372404
## Artifacts Sync (skill start)

codex/SKILL.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,36 @@ Effort both-scales: when an option involves effort, label both human-team and CC
337337

338338
Net line closes the tradeoff. Per-skill instructions may add stricter rules.
339339

340-
12. **Non-ASCII characters — write directly, never \u-escape.** When any
340+
### Handling 5+ options — split, never drop
341+
342+
AskUserQuestion caps every call at **4 options**. With 5+ real options, NEVER
343+
drop, merge, or silently defer one to fit. Pick a compliant shape:
344+
345+
- **Batch into ≤4-groups** — for coherent alternatives (e.g. version bumps,
346+
layout variants). One call, 5th surfaced only if first 4 don't fit.
347+
- **Split per-option** — for independent scope items (e.g. "ship E1..E6?").
348+
Fire N sequential calls, one per option. Default to this when unsure.
349+
350+
Per-option call shape: `D<N>.k` header (e.g. D3.1..D3.5), ELI10 per option,
351+
Recommendation, kind-note (no completeness score — Include/Defer/Cut/Hold are
352+
decision actions), and 4 buckets:
353+
**A) Include**, **B) Defer**, **C) Cut**, **D) Hold** (stop chain, discuss).
354+
355+
After the chain, fire `D<N>.final` to validate the assembled set (reprompt
356+
dependency conflicts) and confirm shipping it. Use `D<N>.revise-<k>` to
357+
revise one option without re-running the chain.
358+
359+
For N>6, fire a `D<N>.0` meta-AskUserQuestion first (proceed / narrow / batch).
360+
361+
question_ids for split chains: `<skill>-split-<option-slug>` (kebab-case ASCII,
362+
≤64 chars, `-2`/`-3` suffix on collision). The runtime checker
363+
(`bin/gstack-question-preference`) refuses `never-ask` on any `*-split-*` id,
364+
so split chains are never AUTO_DECIDE-eligible — the user's option set is sacred.
365+
366+
**Full rule + worked examples + Hold/dependency semantics:** see
367+
`docs/askuserquestion-split.md` in the gstack repo. Read on demand when N>4.
368+
369+
**Non-ASCII characters — write directly, never \u-escape.** When any
341370
string field (question, option label, option description) contains
342371
Chinese (繁體/簡體), Japanese, Korean, or other non-ASCII text, emit
343372
the literal UTF-8 characters in the JSON string. **Never escape them
@@ -370,6 +399,9 @@ Before calling AskUserQuestion, verify:
370399
- [ ] Net line closes the decision
371400
- [ ] You are calling the tool, not writing prose
372401
- [ ] Non-ASCII characters (CJK / accents) written directly, NOT \u-escaped
402+
- [ ] If you had 5+ options, you split (or batched into ≤4-groups) — did NOT drop any
403+
- [ ] If you split, you checked dependencies between options before firing the chain
404+
- [ ] If a per-option Hold fires, you stopped the chain immediately (didn't queue)
373405

374406

375407
## Artifacts Sync (skill start)

context-restore/SKILL.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,36 @@ Effort both-scales: when an option involves effort, label both human-team and CC
338338

339339
Net line closes the tradeoff. Per-skill instructions may add stricter rules.
340340

341-
12. **Non-ASCII characters — write directly, never \u-escape.** When any
341+
### Handling 5+ options — split, never drop
342+
343+
AskUserQuestion caps every call at **4 options**. With 5+ real options, NEVER
344+
drop, merge, or silently defer one to fit. Pick a compliant shape:
345+
346+
- **Batch into ≤4-groups** — for coherent alternatives (e.g. version bumps,
347+
layout variants). One call, 5th surfaced only if first 4 don't fit.
348+
- **Split per-option** — for independent scope items (e.g. "ship E1..E6?").
349+
Fire N sequential calls, one per option. Default to this when unsure.
350+
351+
Per-option call shape: `D<N>.k` header (e.g. D3.1..D3.5), ELI10 per option,
352+
Recommendation, kind-note (no completeness score — Include/Defer/Cut/Hold are
353+
decision actions), and 4 buckets:
354+
**A) Include**, **B) Defer**, **C) Cut**, **D) Hold** (stop chain, discuss).
355+
356+
After the chain, fire `D<N>.final` to validate the assembled set (reprompt
357+
dependency conflicts) and confirm shipping it. Use `D<N>.revise-<k>` to
358+
revise one option without re-running the chain.
359+
360+
For N>6, fire a `D<N>.0` meta-AskUserQuestion first (proceed / narrow / batch).
361+
362+
question_ids for split chains: `<skill>-split-<option-slug>` (kebab-case ASCII,
363+
≤64 chars, `-2`/`-3` suffix on collision). The runtime checker
364+
(`bin/gstack-question-preference`) refuses `never-ask` on any `*-split-*` id,
365+
so split chains are never AUTO_DECIDE-eligible — the user's option set is sacred.
366+
367+
**Full rule + worked examples + Hold/dependency semantics:** see
368+
`docs/askuserquestion-split.md` in the gstack repo. Read on demand when N>4.
369+
370+
**Non-ASCII characters — write directly, never \u-escape.** When any
342371
string field (question, option label, option description) contains
343372
Chinese (繁體/簡體), Japanese, Korean, or other non-ASCII text, emit
344373
the literal UTF-8 characters in the JSON string. **Never escape them
@@ -371,6 +400,9 @@ Before calling AskUserQuestion, verify:
371400
- [ ] Net line closes the decision
372401
- [ ] You are calling the tool, not writing prose
373402
- [ ] Non-ASCII characters (CJK / accents) written directly, NOT \u-escaped
403+
- [ ] If you had 5+ options, you split (or batched into ≤4-groups) — did NOT drop any
404+
- [ ] If you split, you checked dependencies between options before firing the chain
405+
- [ ] If a per-option Hold fires, you stopped the chain immediately (didn't queue)
374406

375407

376408
## Artifacts Sync (skill start)

0 commit comments

Comments
 (0)