diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4923bd115b..3c26b60b08 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,9 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [Unreleased]
+### Added
+- **`/gsd:quick --research` flag** — Spawns focused research agent before planning, composable with `--discuss` and `--full`. Addresses the middle-ground gap between quick and full milestone workflows (#317)
+
## [1.22.4] - 2026-03-03
### Added
diff --git a/README.md b/README.md
index 1a2096f7f1..3972bc97c5 100644
--- a/README.md
+++ b/README.md
@@ -363,10 +363,16 @@ Then `/gsd:new-milestone` starts the next version — same flow as `new-project`
Quick mode gives you GSD guarantees (atomic commits, state tracking) with a faster path:
- **Same agents** — Planner + executor, same quality
-- **Skips optional steps** — No research, no plan checker, no verifier
+- **Skips optional steps** — No research, no plan checker, no verifier by default
- **Separate tracking** — Lives in `.planning/quick/`, not phases
-Use for: bug fixes, small features, config changes, one-off tasks.
+**`--discuss` flag:** Lightweight discussion to surface gray areas before planning.
+
+**`--research` flag:** Spawns a focused researcher before planning. Investigates implementation approaches, library options, and pitfalls. Use when you're unsure how to approach a task.
+
+**`--full` flag:** Enables plan-checking (max 2 iterations) and post-execution verification.
+
+Flags are composable: `--discuss --research --full` gives discussion + research + plan-checking + verification.
```
/gsd:quick
@@ -516,7 +522,7 @@ You're never locked in. The system adapts.
| `/gsd:add-todo [desc]` | Capture idea for later |
| `/gsd:check-todos` | List pending todos |
| `/gsd:debug [desc]` | Systematic debugging with persistent state |
-| `/gsd:quick [--full] [--discuss]` | Execute ad-hoc task with GSD guarantees (`--full` adds plan-checking and verification, `--discuss` gathers context first) |
+| `/gsd:quick [--full] [--discuss] [--research]` | Execute ad-hoc task with GSD guarantees (`--full` adds plan-checking and verification, `--discuss` gathers context first, `--research` investigates approaches before planning) |
| `/gsd:health [--repair]` | Validate `.planning/` directory integrity, auto-repair with `--repair` |
¹ Contributed by reddit user OracleGreyBeard
diff --git a/commands/gsd/quick.md b/commands/gsd/quick.md
index 2432e4872b..468d527459 100644
--- a/commands/gsd/quick.md
+++ b/commands/gsd/quick.md
@@ -1,7 +1,7 @@
---
name: gsd:quick
description: Execute a quick task with GSD guarantees (atomic commits, state tracking) but skip optional agents
-argument-hint: "[--full] [--discuss]"
+argument-hint: "[--full] [--discuss] [--research]"
allowed-tools:
- Read
- Write
@@ -26,7 +26,9 @@ Quick mode is the same system with a shorter path:
**`--full` flag:** Enables plan-checking (max 2 iterations) and post-execution verification. Use when you want quality guarantees without full milestone ceremony.
-Flags are composable: `--discuss --full` gives discussion + plan-checking + verification.
+**`--research` flag:** Spawns a focused research agent before planning. Investigates implementation approaches, library options, and pitfalls for the task. Use when you're unsure of the best approach.
+
+Flags are composable: `--discuss --research --full` gives discussion + research + plan-checking + verification.
diff --git a/get-shit-done/workflows/help.md b/get-shit-done/workflows/help.md
index 2991aa18eb..831b4bc467 100644
--- a/get-shit-done/workflows/help.md
+++ b/get-shit-done/workflows/help.md
@@ -115,17 +115,23 @@ Usage: `/gsd:execute-phase 5`
### Quick Mode
-**`/gsd:quick`**
+**`/gsd:quick [--full] [--discuss] [--research]`**
Execute small, ad-hoc tasks with GSD guarantees but skip optional agents.
Quick mode uses the same system with a shorter path:
-- Spawns planner + executor (skips researcher, checker, verifier)
+- Spawns planner + executor (skips researcher, checker, verifier by default)
- Quick tasks live in `.planning/quick/` separate from planned phases
- Updates STATE.md tracking (not ROADMAP.md)
-Use when you know exactly what to do and the task is small enough to not need research or verification.
+Flags enable additional quality steps:
+- `--discuss` — Lightweight discussion to surface gray areas before planning
+- `--research` — Focused research agent investigates approaches before planning
+- `--full` — Adds plan-checking (max 2 iterations) and post-execution verification
+
+Flags are composable: `--discuss --research --full` gives the complete quality pipeline for a single task.
Usage: `/gsd:quick`
+Usage: `/gsd:quick --research --full`
Result: Creates `.planning/quick/NNN-slug/PLAN.md`, `.planning/quick/NNN-slug/SUMMARY.md`
### Roadmap Management
diff --git a/get-shit-done/workflows/quick.md b/get-shit-done/workflows/quick.md
index 259e244569..2da225a1f9 100644
--- a/get-shit-done/workflows/quick.md
+++ b/get-shit-done/workflows/quick.md
@@ -5,7 +5,9 @@ With `--discuss` flag: lightweight discussion phase before planning. Surfaces as
With `--full` flag: enables plan-checking (max 2 iterations) and post-execution verification for quality guarantees without full milestone ceremony.
-Flags are composable: `--discuss --full` gives discussion + plan-checking + verification.
+With `--research` flag: spawns a focused research agent before planning. Investigates implementation approaches, library options, and pitfalls. Use when you're unsure how to approach a task.
+
+Flags are composable: `--discuss --research --full` gives discussion + research + plan-checking + verification.
@@ -18,6 +20,7 @@ Read all files referenced by the invoking prompt's execution_context before star
Parse `$ARGUMENTS` for:
- `--full` flag → store as `$FULL_MODE` (true/false)
- `--discuss` flag → store as `$DISCUSS_MODE` (true/false)
+- `--research` flag → store as `$RESEARCH_MODE` (true/false)
- Remaining text → use as `$DESCRIPTION` if non-empty
If `$DESCRIPTION` is empty after parsing, prompt user interactively:
@@ -36,7 +39,16 @@ If still empty, re-prompt: "Please provide a task description."
Display banner based on active flags:
-If `$DISCUSS_MODE` and `$FULL_MODE`:
+If `$DISCUSS_MODE` and `$RESEARCH_MODE` and `$FULL_MODE`:
+```
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ GSD ► QUICK TASK (DISCUSS + RESEARCH + FULL)
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+◆ Discussion + research + plan checking + verification enabled
+```
+
+If `$DISCUSS_MODE` and `$FULL_MODE` (no research):
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GSD ► QUICK TASK (DISCUSS + FULL)
@@ -45,6 +57,24 @@ If `$DISCUSS_MODE` and `$FULL_MODE`:
◆ Discussion + plan checking + verification enabled
```
+If `$DISCUSS_MODE` and `$RESEARCH_MODE` (no full):
+```
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ GSD ► QUICK TASK (DISCUSS + RESEARCH)
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+◆ Discussion + research enabled
+```
+
+If `$RESEARCH_MODE` and `$FULL_MODE` (no discuss):
+```
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ GSD ► QUICK TASK (RESEARCH + FULL)
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+◆ Research + plan checking + verification enabled
+```
+
If `$DISCUSS_MODE` only:
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -54,6 +84,15 @@ If `$DISCUSS_MODE` only:
◆ Discussion phase enabled — surfacing gray areas before planning
```
+If `$RESEARCH_MODE` only:
+```
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ GSD ► QUICK TASK (RESEARCH)
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+◆ Research phase enabled — investigating approaches before planning
+```
+
If `$FULL_MODE` only:
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -225,6 +264,69 @@ Report: `Context captured: ${QUICK_DIR}/${next_num}-CONTEXT.md`
---
+**Step 4.75: Research phase (only when `$RESEARCH_MODE`)**
+
+Skip this step entirely if NOT `$RESEARCH_MODE`.
+
+Display banner:
+```
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ GSD ► RESEARCHING QUICK TASK
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+◆ Investigating approaches for: ${DESCRIPTION}
+```
+
+Spawn a single focused researcher (not 4 parallel researchers like full phases — quick tasks need targeted research, not broad domain surveys):
+
+```
+Task(
+ prompt="
+
+
+**Mode:** quick-task
+**Task:** ${DESCRIPTION}
+**Output:** ${QUICK_DIR}/${next_num}-RESEARCH.md
+
+
+- .planning/STATE.md (Project state — what's already built)
+- .planning/PROJECT.md (Project context)
+- ./CLAUDE.md (if exists — project-specific guidelines)
+${DISCUSS_MODE ? '- ' + QUICK_DIR + '/' + next_num + '-CONTEXT.md (User decisions — research should align with these)' : ''}
+
+
+
+
+
+This is a quick task, not a full phase. Research should be concise and targeted:
+1. Best libraries/patterns for this specific task
+2. Common pitfalls and how to avoid them
+3. Integration points with existing codebase
+4. Any constraints or gotchas worth knowing before planning
+
+Do NOT produce a full domain survey. Target 1-2 pages of actionable findings.
+
+
+
+",
+ subagent_type="gsd-phase-researcher",
+ model="{planner_model}",
+ description="Research: ${DESCRIPTION}"
+)
+```
+
+After researcher returns:
+1. Verify research exists at `${QUICK_DIR}/${next_num}-RESEARCH.md`
+2. Report: "Research complete: ${QUICK_DIR}/${next_num}-RESEARCH.md"
+
+If research file not found, warn but continue: "Research agent did not produce output — proceeding to planning without research."
+
+---
+
**Step 5: Spawn planner (quick mode)**
**If `$FULL_MODE`:** Use `quick-full` mode with stricter constraints.
@@ -244,6 +346,7 @@ Task(
- .planning/STATE.md (Project State)
- ./CLAUDE.md (if exists — follow project-specific guidelines)
${DISCUSS_MODE ? '- ' + QUICK_DIR + '/' + next_num + '-CONTEXT.md (User decisions — locked, do not revisit)' : ''}
+${RESEARCH_MODE ? '- ' + QUICK_DIR + '/' + next_num + '-RESEARCH.md (Research findings — use to inform implementation choices)' : ''}
**Project skills:** Check .claude/skills/ or .agents/skills/ directory (if either exists) — read SKILL.md files, plans should account for project skill rules
@@ -253,7 +356,7 @@ ${DISCUSS_MODE ? '- ' + QUICK_DIR + '/' + next_num + '-CONTEXT.md (User decision
- Create a SINGLE plan with 1-3 focused tasks
- Quick tasks should be atomic and self-contained
-- No research phase
+${RESEARCH_MODE ? '- Research findings are available — use them to inform library/pattern choices' : '- No research phase'}
${FULL_MODE ? '- Target ~40% context usage (structured for verification)' : '- Target ~30% context usage (simple, focused)'}
${FULL_MODE ? '- MUST generate `must_haves` in plan frontmatter (truths, artifacts, key_links)' : ''}
${FULL_MODE ? '- Each task MUST have `files`, `action`, `verify`, `done` fields' : ''}
@@ -536,6 +639,7 @@ Build file list:
- `${QUICK_DIR}/${next_num}-SUMMARY.md`
- `.planning/STATE.md`
- If `$DISCUSS_MODE` and context file exists: `${QUICK_DIR}/${next_num}-CONTEXT.md`
+- If `$RESEARCH_MODE` and research file exists: `${QUICK_DIR}/${next_num}-RESEARCH.md`
- If `$FULL_MODE` and verification file exists: `${QUICK_DIR}/${next_num}-VERIFICATION.md`
```bash
@@ -557,6 +661,7 @@ GSD > QUICK TASK COMPLETE (FULL MODE)
Quick Task ${next_num}: ${DESCRIPTION}
+${RESEARCH_MODE ? 'Research: ' + QUICK_DIR + '/' + next_num + '-RESEARCH.md' : ''}
Summary: ${QUICK_DIR}/${next_num}-SUMMARY.md
Verification: ${QUICK_DIR}/${next_num}-VERIFICATION.md (${VERIFICATION_STATUS})
Commit: ${commit_hash}
@@ -574,6 +679,7 @@ GSD > QUICK TASK COMPLETE
Quick Task ${next_num}: ${DESCRIPTION}
+${RESEARCH_MODE ? 'Research: ' + QUICK_DIR + '/' + next_num + '-RESEARCH.md' : ''}
Summary: ${QUICK_DIR}/${next_num}-SUMMARY.md
Commit: ${commit_hash}
@@ -587,12 +693,13 @@ Ready for next task: /gsd:quick
- [ ] ROADMAP.md validation passes
- [ ] User provides task description
-- [ ] `--full` and `--discuss` flags parsed from arguments when present
+- [ ] `--full`, `--discuss`, and `--research` flags parsed from arguments when present
- [ ] Slug generated (lowercase, hyphens, max 40 chars)
- [ ] Next number calculated (001, 002, 003...)
- [ ] Directory created at `.planning/quick/NNN-slug/`
- [ ] (--discuss) Gray areas identified and presented, decisions captured in `${next_num}-CONTEXT.md`
-- [ ] `${next_num}-PLAN.md` created by planner (honors CONTEXT.md decisions when --discuss)
+- [ ] (--research) Research agent spawned, `${next_num}-RESEARCH.md` created
+- [ ] `${next_num}-PLAN.md` created by planner (honors CONTEXT.md decisions when --discuss, uses RESEARCH.md findings when --research)
- [ ] (--full) Plan checker validates plan, revision loop capped at 2
- [ ] `${next_num}-SUMMARY.md` created by executor
- [ ] (--full) `${next_num}-VERIFICATION.md` created by verifier
diff --git a/tests/quick-research.test.cjs b/tests/quick-research.test.cjs
new file mode 100644
index 0000000000..c85e65cc05
--- /dev/null
+++ b/tests/quick-research.test.cjs
@@ -0,0 +1,297 @@
+/**
+ * GSD Quick Research Flag Tests
+ *
+ * Validates the --research flag for /gsd:quick:
+ * - Command frontmatter advertises --research
+ * - Workflow includes research step (Step 4.75)
+ * - Research artifacts work within quick task directories
+ * - Workflow spawns gsd-phase-researcher for research
+ */
+
+const { test, describe, beforeEach, afterEach } = require('node:test');
+const assert = require('node:assert');
+const fs = require('fs');
+const path = require('path');
+const { runGsdTools, createTempProject, cleanup } = require('./helpers.cjs');
+
+const COMMANDS_DIR = path.join(__dirname, '..', 'commands', 'gsd');
+const WORKFLOWS_DIR = path.join(__dirname, '..', 'get-shit-done', 'workflows');
+
+// ─────────────────────────────────────────────────────────────────────────────
+// Command frontmatter: --research flag advertised
+// ─────────────────────────────────────────────────────────────────────────────
+
+describe('quick command: --research in frontmatter', () => {
+ const commandPath = path.join(COMMANDS_DIR, 'quick.md');
+ let content;
+
+ test('quick.md exists', () => {
+ assert.ok(fs.existsSync(commandPath), 'commands/gsd/quick.md should exist');
+ });
+
+ test('argument-hint includes --research', () => {
+ content = fs.readFileSync(commandPath, 'utf-8');
+ assert.ok(
+ content.includes('--research'),
+ 'quick.md argument-hint should mention --research'
+ );
+ });
+
+ test('argument-hint includes all three flags', () => {
+ content = fs.readFileSync(commandPath, 'utf-8');
+ const hintLine = content.split('\n').find(l => l.includes('argument-hint'));
+ assert.ok(hintLine, 'should have argument-hint line');
+ assert.ok(hintLine.includes('--full'), 'argument-hint should include --full');
+ assert.ok(hintLine.includes('--discuss'), 'argument-hint should include --discuss');
+ assert.ok(hintLine.includes('--research'), 'argument-hint should include --research');
+ });
+
+ test('objective section describes --research flag', () => {
+ content = fs.readFileSync(commandPath, 'utf-8');
+ const objectiveMatch = content.match(/([\s\S]*?)<\/objective>/);
+ assert.ok(objectiveMatch, 'should have section');
+ assert.ok(
+ objectiveMatch[1].includes('--research'),
+ 'objective should describe --research flag'
+ );
+ });
+});
+
+// ─────────────────────────────────────────────────────────────────────────────
+// Workflow: research step present and correct
+// ─────────────────────────────────────────────────────────────────────────────
+
+describe('quick workflow: research step', () => {
+ const workflowPath = path.join(WORKFLOWS_DIR, 'quick.md');
+ let content;
+
+ test('workflow file exists', () => {
+ assert.ok(fs.existsSync(workflowPath), 'workflows/quick.md should exist');
+ content = fs.readFileSync(workflowPath, 'utf-8');
+ });
+
+ test('purpose mentions --research flag', () => {
+ content = fs.readFileSync(workflowPath, 'utf-8');
+ const purposeMatch = content.match(/([\s\S]*?)<\/purpose>/);
+ assert.ok(purposeMatch, 'should have section');
+ assert.ok(
+ purposeMatch[1].includes('--research'),
+ 'purpose should mention --research flag'
+ );
+ });
+
+ test('step 1 parses --research flag', () => {
+ content = fs.readFileSync(workflowPath, 'utf-8');
+ assert.ok(
+ content.includes('$RESEARCH_MODE'),
+ 'workflow should reference $RESEARCH_MODE variable'
+ );
+ });
+
+ test('step 4.75 research phase exists', () => {
+ content = fs.readFileSync(workflowPath, 'utf-8');
+ assert.ok(
+ content.includes('Step 4.75'),
+ 'workflow should contain Step 4.75 (research phase)'
+ );
+ });
+
+ test('research step spawns gsd-phase-researcher', () => {
+ content = fs.readFileSync(workflowPath, 'utf-8');
+ const researchSection = content.substring(
+ content.indexOf('Step 4.75'),
+ content.indexOf('Step 5:')
+ );
+ assert.ok(
+ researchSection.includes('subagent_type="gsd-phase-researcher"'),
+ 'research step should spawn gsd-phase-researcher agent'
+ );
+ });
+
+ test('research step writes RESEARCH.md', () => {
+ content = fs.readFileSync(workflowPath, 'utf-8');
+ const researchSection = content.substring(
+ content.indexOf('Step 4.75'),
+ content.indexOf('Step 5:')
+ );
+ assert.ok(
+ researchSection.includes('RESEARCH.md'),
+ 'research step should reference RESEARCH.md output file'
+ );
+ });
+
+ test('planner context includes RESEARCH.md when research mode', () => {
+ content = fs.readFileSync(workflowPath, 'utf-8');
+ const plannerSection = content.substring(
+ content.indexOf('Step 5: Spawn planner'),
+ content.indexOf('Step 5.5')
+ );
+ assert.ok(
+ plannerSection.includes('RESEARCH_MODE') && plannerSection.includes('RESEARCH.md'),
+ 'planner should read RESEARCH.md when $RESEARCH_MODE is true'
+ );
+ });
+
+ test('file commit list includes RESEARCH.md', () => {
+ content = fs.readFileSync(workflowPath, 'utf-8');
+ const commitSection = content.substring(
+ content.indexOf('Step 8:'),
+ content.indexOf('')
+ );
+ assert.ok(
+ commitSection.includes('RESEARCH_MODE') && commitSection.includes('RESEARCH.md'),
+ 'commit step should include RESEARCH.md when research mode is active'
+ );
+ });
+
+ test('success criteria includes research items', () => {
+ content = fs.readFileSync(workflowPath, 'utf-8');
+ const criteriaMatch = content.match(/([\s\S]*?)<\/success_criteria>/);
+ assert.ok(criteriaMatch, 'should have section');
+ assert.ok(
+ criteriaMatch[1].includes('--research'),
+ 'success criteria should mention --research flag'
+ );
+ });
+});
+
+// ─────────────────────────────────────────────────────────────────────────────
+// Quick task directory: RESEARCH.md file management
+// ─────────────────────────────────────────────────────────────────────────────
+
+describe('quick task: research file in task directory', () => {
+ let tmpDir;
+
+ beforeEach(() => {
+ tmpDir = createTempProject();
+ });
+
+ afterEach(() => {
+ cleanup(tmpDir);
+ });
+
+ test('init quick returns valid task_dir for research file placement', () => {
+ const result = runGsdTools('init quick "Add caching layer"', tmpDir);
+ assert.ok(result.success, `Command failed: ${result.error}`);
+
+ const output = JSON.parse(result.output);
+ assert.ok(output.task_dir, 'task_dir should be non-null');
+ assert.ok(
+ output.task_dir.startsWith('.planning/quick/'),
+ 'task_dir should be under .planning/quick/'
+ );
+
+ const expectedResearchPath = path.join(
+ output.task_dir,
+ `${output.next_num}-RESEARCH.md`
+ );
+ assert.ok(
+ expectedResearchPath.endsWith('-RESEARCH.md'),
+ 'research path should end with -RESEARCH.md'
+ );
+ });
+
+ test('verify-path-exists detects RESEARCH.md in quick task directory', () => {
+ const quickTaskDir = path.join(tmpDir, '.planning', 'quick', '1-test-task');
+ fs.mkdirSync(quickTaskDir, { recursive: true });
+ fs.writeFileSync(
+ path.join(quickTaskDir, '1-RESEARCH.md'),
+ '# Research\n\nFindings for test task.\n'
+ );
+
+ const result = runGsdTools(
+ 'verify-path-exists .planning/quick/1-test-task/1-RESEARCH.md',
+ tmpDir
+ );
+ assert.ok(result.success, `Command failed: ${result.error}`);
+
+ const output = JSON.parse(result.output);
+ assert.strictEqual(output.exists, true, 'RESEARCH.md should be detected');
+ assert.strictEqual(output.type, 'file', 'should be detected as file');
+ });
+
+ test('verify-path-exists returns false for missing RESEARCH.md', () => {
+ const quickTaskDir = path.join(tmpDir, '.planning', 'quick', '1-test-task');
+ fs.mkdirSync(quickTaskDir, { recursive: true });
+
+ const result = runGsdTools(
+ 'verify-path-exists .planning/quick/1-test-task/1-RESEARCH.md',
+ tmpDir
+ );
+ assert.ok(result.success, `Command failed: ${result.error}`);
+
+ const output = JSON.parse(result.output);
+ assert.strictEqual(output.exists, false, 'missing RESEARCH.md should return false');
+ });
+
+ test('quick task directory supports all research workflow artifacts', () => {
+ const quickTaskDir = path.join(tmpDir, '.planning', 'quick', '1-add-caching');
+ fs.mkdirSync(quickTaskDir, { recursive: true });
+
+ const artifacts = [
+ '1-CONTEXT.md',
+ '1-RESEARCH.md',
+ '1-PLAN.md',
+ '1-SUMMARY.md',
+ '1-VERIFICATION.md',
+ ];
+
+ for (const artifact of artifacts) {
+ fs.writeFileSync(path.join(quickTaskDir, artifact), `# ${artifact}\n`);
+ }
+
+ for (const artifact of artifacts) {
+ const result = runGsdTools(
+ `verify-path-exists .planning/quick/1-add-caching/${artifact}`,
+ tmpDir
+ );
+ assert.ok(result.success, `Command failed for ${artifact}: ${result.error}`);
+ const output = JSON.parse(result.output);
+ assert.strictEqual(
+ output.exists,
+ true,
+ `${artifact} should exist in quick task directory`
+ );
+ }
+ });
+});
+
+// ─────────────────────────────────────────────────────────────────────────────
+// Flag composability: banner variants in workflow
+// ─────────────────────────────────────────────────────────────────────────────
+
+describe('quick workflow: banner variants for flag combinations', () => {
+ let content;
+
+ test('has banner for research-only mode', () => {
+ content = fs.readFileSync(path.join(WORKFLOWS_DIR, 'quick.md'), 'utf-8');
+ assert.ok(
+ content.includes('QUICK TASK (RESEARCH)'),
+ 'should have banner for --research only'
+ );
+ });
+
+ test('has banner for discuss + research mode', () => {
+ content = fs.readFileSync(path.join(WORKFLOWS_DIR, 'quick.md'), 'utf-8');
+ assert.ok(
+ content.includes('DISCUSS + RESEARCH)'),
+ 'should have banner for --discuss --research'
+ );
+ });
+
+ test('has banner for research + full mode', () => {
+ content = fs.readFileSync(path.join(WORKFLOWS_DIR, 'quick.md'), 'utf-8');
+ assert.ok(
+ content.includes('RESEARCH + FULL)'),
+ 'should have banner for --research --full'
+ );
+ });
+
+ test('has banner for all three flags', () => {
+ content = fs.readFileSync(path.join(WORKFLOWS_DIR, 'quick.md'), 'utf-8');
+ assert.ok(
+ content.includes('DISCUSS + RESEARCH + FULL)'),
+ 'should have banner for --discuss --research --full'
+ );
+ });
+});