learnship 2.3.3 → 2.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/README.md +17 -6
- package/agents/learnship-plan-checker.md +6 -1
- package/agents/learnship-planner.md +21 -11
- package/bin/install.js +1 -1
- package/cursor-rules/learnship.mdc +3 -1
- package/gemini-extension.json +1 -1
- package/learnship/agents/plan-checker.md +5 -0
- package/learnship/agents/planner.md +14 -1
- package/learnship/references/planning-config.md +1 -1
- package/learnship/templates/plan.md +8 -0
- package/learnship/workflows/discuss-phase.md +38 -3
- package/learnship/workflows/new-project.md +129 -9
- package/learnship/workflows/plan-phase.md +43 -13
- package/learnship/workflows/research-phase.md +11 -1
- package/learnship/workflows/settings.md +1 -1
- package/package.json +1 -1
- package/templates/plan.md +8 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
3
|
"description": "Agentic engineering done right — 57 structured workflows, 17 specialist agent personas, persistent memory across sessions, integrated learning partner, and impeccable UI design system. Works with Claude Code, Windsurf, Cursor, Gemini CLI, OpenCode, and Codex.",
|
|
4
|
-
"version": "2.3.
|
|
4
|
+
"version": "2.3.5",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Favio Vazquez",
|
|
7
7
|
"email": "favio.vazquezp@gmail.com"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "learnship",
|
|
3
3
|
"displayName": "learnship",
|
|
4
4
|
"description": "Agentic engineering done right — 57 structured workflows, 17 specialist agent personas, persistent memory across sessions, integrated learning partner, and impeccable UI design system.",
|
|
5
|
-
"version": "2.3.
|
|
5
|
+
"version": "2.3.5",
|
|
6
6
|
"logo": "assets/logo.png",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Favio Vazquez",
|
package/README.md
CHANGED
|
@@ -121,7 +121,7 @@ Every feature ships through a 7-step loop:
|
|
|
121
121
|
```mermaid
|
|
122
122
|
flowchart LR
|
|
123
123
|
DP["/discuss-phase N<br/>Capture decisions"]
|
|
124
|
-
PP["/plan-phase N<br/>
|
|
124
|
+
PP["/plan-phase N<br/>Vertical slice plans"]
|
|
125
125
|
EP["/execute-phase N<br/>Build + commit"]
|
|
126
126
|
VW["/verify-work N<br/>UAT + diagnose"]
|
|
127
127
|
RV["/review<br/>Multi-persona review"]
|
|
@@ -136,8 +136,8 @@ flowchart LR
|
|
|
136
136
|
|
|
137
137
|
| Step | Command | What happens |
|
|
138
138
|
|------|---------|-------------|
|
|
139
|
-
| **1. Discuss** | `/discuss-phase N` | You and the agent align on implementation decisions before any code |
|
|
140
|
-
| **2. Plan** | `/plan-phase N` | Agent researches the domain, creates
|
|
139
|
+
| **1. Discuss** | `/discuss-phase N` | You and the agent align on implementation decisions before any code. Add `--deep` for extended deep questioning that walks every branch (v2.3.4) |
|
|
140
|
+
| **2. Plan** | `/plan-phase N` | Agent researches the domain, creates vertical slice plans (tracer bullets), verifies them — including horizontal slice detection (v2.3.4) |
|
|
141
141
|
| **3. Execute** | `/execute-phase N` | Plans run in dependency order, one atomic commit per task |
|
|
142
142
|
| **4. Verify** | `/verify-work N` | You do UAT; agent diagnoses any gaps and creates fix plans |
|
|
143
143
|
| **5. Review** | `/review` | Multi-persona code review through 6 lenses (v2.0) |
|
|
@@ -252,6 +252,14 @@ It's probably overkill for one-off scripts. Use `/quick` for that.
|
|
|
252
252
|
|
|
253
253
|
## 🆕 What's New
|
|
254
254
|
|
|
255
|
+
### What's new in v2.3.4
|
|
256
|
+
|
|
257
|
+
v2.3.4 adds two planning quality features:
|
|
258
|
+
|
|
259
|
+
**Deep questioning mode** (`--deep` flag or `workflow.discuss_mode: "deep"` in config): Both `/discuss-phase` and `/new-project` now support extended questioning that walks every decision branch until shared understanding is reached. Each question includes a recommended answer. Standard mode (4 focused exchanges) remains the default.
|
|
260
|
+
|
|
261
|
+
**Vertical slice planning** (enforced in `plan-phase`): Plans are now required to be tracer bullets — thin vertical slices through all integration layers (data → logic → API → UI → test) for one demoable user-facing behavior. The plan-checker flags any plan that covers only one architectural layer across all features. Single-layer phases (migrations, style passes) use `single_layer_justified: true` in the plan frontmatter.
|
|
262
|
+
|
|
255
263
|
### What's new in v2.3
|
|
256
264
|
|
|
257
265
|
v2.3 adds 5 new agent personas, Windsurf-native persona adoption via `model_decision` rules, and inline `<persona_context>` blocks across all 18 persona-aware workflows:
|
|
@@ -294,7 +302,7 @@ v2.1 adds 8 new workflows, 5 new references, 3 new templates, and 2 new agents:
|
|
|
294
302
|
| **Session** | `/note` — zero-friction capture · `/session-report` — stakeholder summaries |
|
|
295
303
|
| **Learning** | `/extract-learnings` — decisions, lessons, patterns, surprises · `/milestone-summary` — team onboarding |
|
|
296
304
|
|
|
297
|
-
Enhanced: `/discuss-phase` (scope guardrails + domain probes), `/execute-phase` (`--wave` flag + context scaling), `/quick` (`--research --validate --full` composable flags), `/ideate` (`--explore` Socratic mode).
|
|
305
|
+
Enhanced: `/discuss-phase` (scope guardrails + domain probes + `--deep` extended questioning v2.3.4), `/new-project` (`--deep` extended questioning v2.3.4), `/plan-phase` (vertical slice tracer bullets + horizontal slice detection v2.3.4), `/execute-phase` (`--wave` flag + context scaling), `/quick` (`--research --validate --full` composable flags), `/ideate` (`--explore` Socratic mode).
|
|
298
306
|
|
|
299
307
|
**Optional per-phase:** `/secure-phase N` (STRIDE security), `/extract-learnings N` (meta-knowledge).
|
|
300
308
|
**Recovery:** `/forensics` (post-mortem), `/undo` (safe revert).
|
|
@@ -533,13 +541,16 @@ Project settings live in `.planning/config.json`. Set during `/new-project` or e
|
|
|
533
541
|
### Workflow Toggles
|
|
534
542
|
|
|
535
543
|
| Setting | Default | What it controls |
|
|
536
|
-
|
|
544
|
+
|---------|---------|------------------|
|
|
537
545
|
| `workflow.research` | `true` | Domain research before planning each phase |
|
|
538
|
-
| `workflow.plan_check` | `true` | Plan verification loop (up to 3 iterations) |
|
|
546
|
+
| `workflow.plan_check` | `true` | Plan verification loop (up to 3 iterations), including vertical slice integrity check |
|
|
539
547
|
| `workflow.verifier` | `true` | Post-execution verification against phase goals |
|
|
540
548
|
| `workflow.validation` | `true` | Test coverage mapping during plan-phase |
|
|
541
549
|
| `workflow.review` | `true` | Enable `/review` suggestions after `/verify-work` (v2.0) |
|
|
542
550
|
| `workflow.solutions_search` | `true` | Search `.planning/solutions/` during `/plan-phase` (v2.0) |
|
|
551
|
+
| `workflow.security_enforcement` | `true` | Per-phase STRIDE security verification via `/secure-phase` |
|
|
552
|
+
| `workflow.discuss_mode` | `"discuss"` | Questioning depth: `"discuss"` (4 exchanges) or `"deep"` (extended, walks every branch) (v2.3.4) |
|
|
553
|
+
| `workflow.tdd_mode` | `false` | Instruct planner to apply TDD task ordering to eligible tasks |
|
|
543
554
|
|
|
544
555
|
### Review & Ship Settings
|
|
545
556
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: learnship-plan-checker
|
|
3
|
-
description: Verifies PLAN.md files for a phase — checks goal coverage, requirement IDs, CONTEXT.md decisions, task completeness, and
|
|
3
|
+
description: Verifies PLAN.md files for a phase — checks goal coverage, requirement IDs, CONTEXT.md decisions, task completeness, wave correctness, and vertical slice integrity (each plan must be a demoable tracer bullet). Spawned by plan-phase on platforms with subagent support.
|
|
4
4
|
tools: Read, Bash, Glob, Grep
|
|
5
5
|
color: cyan
|
|
6
6
|
---
|
|
@@ -48,6 +48,11 @@ For every task in every plan, check:
|
|
|
48
48
|
- Is each plan achievable in a single context window? (~200k tokens, 2-3 tasks)
|
|
49
49
|
- Are there any tasks that are too vague to implement without guessing?
|
|
50
50
|
|
|
51
|
+
### 7. Vertical Slice (tracer bullet)
|
|
52
|
+
- Does each plan's `objective` describe a **demoable user-facing behavior** delivered end-to-end?
|
|
53
|
+
- Does any plan cover only a single layer (all schema, all API routes, all UI components across the feature)? If yes, flag as **horizontal slice** unless `single_layer_justified: true` is in the frontmatter.
|
|
54
|
+
- The test: "Can someone demo what this plan delivers after it completes, without completing other plans?" If no and `single_layer_justified` is not set → flag it.
|
|
55
|
+
|
|
51
56
|
## What NOT to check
|
|
52
57
|
- Code style or implementation approach preferences (that's the planner's job)
|
|
53
58
|
- Research quality (that's already done)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: learnship-planner
|
|
3
|
-
description: Creates executable PLAN.md files for a phase — decomposes goals into
|
|
3
|
+
description: Creates executable PLAN.md files for a phase — decomposes goals into vertical slice (tracer bullet) tasks with wave-ordered dependency analysis. Each plan delivers one demoable user-facing behavior end-to-end. Spawned by plan-phase on platforms with subagent support.
|
|
4
4
|
tools: Read, Write, Bash, Glob, Grep
|
|
5
5
|
color: green
|
|
6
6
|
---
|
|
@@ -28,11 +28,18 @@ Before planning, load project context:
|
|
|
28
28
|
|
|
29
29
|
## Core Rules
|
|
30
30
|
|
|
31
|
-
1. **
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
1. **Vertical slices, not horizontal layers** — Each PLAN.md is a **tracer bullet**: a thin vertical slice through all integration layers for one user-facing behavior. A completed plan is demoable without completing other plans. DO NOT create all-schema, all-API, or all-UI plans.
|
|
32
|
+
```
|
|
33
|
+
WRONG: Plan 01 = DB schema Plan 02 = API routes Plan 03 = UI
|
|
34
|
+
RIGHT: Plan 01 = user can log in (schema + route + form + test)
|
|
35
|
+
Plan 02 = user can reset password (schema + route + form + test)
|
|
36
|
+
```
|
|
37
|
+
Exception: add `single_layer_justified: true` to frontmatter if the phase is legitimately single-layer (migration, style pass).
|
|
38
|
+
2. **Honor CONTEXT.md first** — locked decisions are non-negotiable. Plans implement decisions, not the other way around.
|
|
39
|
+
3. **Goal-backward** — start from the phase goal, derive the minimum set of must-haves, then build tasks backward from those
|
|
40
|
+
4. **One context window per plan** — each plan must be executable in a single agent session (~200k tokens)
|
|
41
|
+
5. **2-3 tasks per plan** — enough to be a meaningful unit, small enough to verify cleanly
|
|
42
|
+
6. **Observable must-haves** — every must-have must be checkable by reading a file or running a command
|
|
36
43
|
|
|
37
44
|
## Wave Assignment
|
|
38
45
|
|
|
@@ -52,7 +59,8 @@ files_modified:
|
|
|
52
59
|
- src/feature.ts
|
|
53
60
|
- tests/feature.test.ts
|
|
54
61
|
autonomous: true
|
|
55
|
-
|
|
62
|
+
single_layer_justified: false # true only for legitimately single-layer phases
|
|
63
|
+
objective: "One sentence describing the demoable user-facing behavior this plan delivers end-to-end"
|
|
56
64
|
must_haves:
|
|
57
65
|
- "src/feature.ts exists and exports FeatureClass"
|
|
58
66
|
- "tests/feature.test.ts has at least 3 test cases"
|
|
@@ -113,10 +121,12 @@ Load everything before writing a single plan:
|
|
|
113
121
|
## Step 2: Decompose Phase Goal
|
|
114
122
|
|
|
115
123
|
From the phase goal and requirements:
|
|
116
|
-
1. List all
|
|
117
|
-
2.
|
|
118
|
-
3. Find dependencies between
|
|
119
|
-
4. Group into 2-4 plans, assign waves
|
|
124
|
+
1. List all user-facing behaviors the phase must deliver (not layers — behaviors)
|
|
125
|
+
2. Each behavior becomes one plan: data schema + logic + API + UI + test
|
|
126
|
+
3. Find dependencies between plans
|
|
127
|
+
4. Group into 2-4 vertical slice plans, assign waves
|
|
128
|
+
|
|
129
|
+
**Self-check before writing:** For each draft plan, ask: "Can someone demo this plan's deliverable after it completes, without completing other plans?" If no → restructure.
|
|
120
130
|
|
|
121
131
|
## Step 3: Write Plans
|
|
122
132
|
|
package/bin/install.js
CHANGED
|
@@ -1438,7 +1438,7 @@ function install(platform, isGlobal) {
|
|
|
1438
1438
|
console.log(` ${yellow}Option 2 (manual):${reset} Copy the rule file into your project:`);
|
|
1439
1439
|
console.log(` ${dim}mkdir -p .cursor/rules${reset}`);
|
|
1440
1440
|
console.log(` ${dim}cp node_modules/learnship/cursor-rules/learnship.mdc .cursor/rules/${reset}\n`);
|
|
1441
|
-
console.log(` ${dim}The .mdc rule activates all
|
|
1441
|
+
console.log(` ${dim}The .mdc rule activates all 57 learnship workflows automatically in every Cursor session.${reset}\n`);
|
|
1442
1442
|
return;
|
|
1443
1443
|
}
|
|
1444
1444
|
|
|
@@ -160,7 +160,7 @@ Set `"parallelization": { "enabled": true|false }` in `.planning/config.json` ba
|
|
|
160
160
|
|
|
161
161
|
## Structured Questions
|
|
162
162
|
|
|
163
|
-
When workflows include `AskUserQuestion()` blocks, **Cursor has no native structured question tool**. Present each question as a numbered text list with descriptions and ask the user to reply with their choice number or label. Present questions in rounds (Round 1: core settings, Round 2: workflow agents
|
|
163
|
+
When workflows include `AskUserQuestion()` blocks, **Cursor has no native structured question tool**. Present each question as a numbered text list with descriptions and ask the user to reply with their choice number or label. Present questions in rounds (Round 1: core settings — working style, granularity, learning partner, AI models, questioning depth, output profile; Round 2: workflow agents; Round 3: pipeline & git; Round 4: parallelization). **Wait for the user's reply after EACH round before showing the next.** Do NOT present all questions at once.
|
|
164
164
|
|
|
165
165
|
Example:
|
|
166
166
|
```
|
|
@@ -178,6 +178,8 @@ After all configuration rounds are answered, write `.planning/config.json` with
|
|
|
178
178
|
- Granularity → `"granularity"`: `"coarse"`, `"standard"`, or `"fine"`
|
|
179
179
|
- Learning Partner → `"learning_mode"`: `"auto"` or `"manual"`
|
|
180
180
|
- AI Models → `"model_profile"`: `"balanced"`, `"quality"`, or `"budget"`
|
|
181
|
+
- Questioning Depth → `"workflow.discuss_mode"`: `"discuss"` (Standard) or `"deep"` (Deep)
|
|
182
|
+
- Output Profile → `"context"`: `"dev"` (Dev), `"research"` (Research), or `"review"` (Review)
|
|
181
183
|
- Research → `"workflow.research"`: `true` or `false`
|
|
182
184
|
- Plan Check → `"workflow.plan_check"`: `true` or `false`
|
|
183
185
|
- Verifier → `"workflow.verifier"`: `true` or `false`
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.5",
|
|
4
4
|
"description": "Agentic engineering done right — 57 structured workflows, 17 specialist agent personas, persistent memory across sessions, integrated learning partner, and impeccable UI design system.",
|
|
5
5
|
"author": "Favio Vazquez",
|
|
6
6
|
"homepage": "https://faviovazquez.github.io/learnship/",
|
|
@@ -34,6 +34,11 @@ For every task in every plan, check:
|
|
|
34
34
|
- Is each plan achievable in a single context window? (~200k tokens, 2-3 tasks)
|
|
35
35
|
- Are there any tasks that are too vague to implement without guessing?
|
|
36
36
|
|
|
37
|
+
### 7. Vertical Slice (tracer bullet)
|
|
38
|
+
- Does each plan's `objective` describe a **demoable user-facing behavior** delivered end-to-end?
|
|
39
|
+
- Does any plan cover only a single layer across the whole feature (all schema, all API endpoints, all UI components)? If yes, flag it as a **horizontal slice** unless `single_layer_justified: true` is set in the frontmatter.
|
|
40
|
+
- The test: "Can someone demo what this plan delivers after it completes, without completing other plans?" If no and `single_layer_justified` is not set → flag it.
|
|
41
|
+
|
|
37
42
|
## What NOT to check
|
|
38
43
|
- Code style or implementation approach preferences (that's the planner's job)
|
|
39
44
|
- Research quality (that's already done)
|
|
@@ -6,6 +6,18 @@ Plans are precise prompts for an executor — not documents that become prompts.
|
|
|
6
6
|
|
|
7
7
|
## Planning Principles
|
|
8
8
|
|
|
9
|
+
**Vertical slices, not horizontal layers** — Each PLAN.md is a **tracer bullet**: a thin vertical slice that cuts through all integration layers end-to-end for one user-facing behavior. A completed plan is demoable or verifiable on its own. Do NOT create plans that implement a single layer across the whole feature.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
WRONG (horizontal): Plan 01 = all DB schema Plan 02 = all API Plan 03 = all UI
|
|
13
|
+
RIGHT (vertical): Plan 01 = user can log in (schema + API endpoint + UI form + test)
|
|
14
|
+
Plan 02 = user can reset password (schema + API + UI + test)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Anti-pattern to avoid:** If someone cannot demo what a completed plan delivers without also completing other plans, the plan is too horizontal. Restructure.
|
|
18
|
+
|
|
19
|
+
**Exception — single-layer phases:** Some phases are legitimately single-layer (e.g., "migrate all DB tables to new schema", "style all existing components"). In this case, add `single_layer_justified: true` to the plan's YAML frontmatter and note the reason in the objective.
|
|
20
|
+
|
|
9
21
|
**Atomic tasks** — each task should be completable in one logical unit of work and committed independently.
|
|
10
22
|
|
|
11
23
|
**Observable done criteria** — every task must have a `<done>` field that describes something you can check (file exists, test passes, import resolves) — not "task is complete".
|
|
@@ -36,7 +48,8 @@ files_modified:
|
|
|
36
48
|
- path/to/file.ts
|
|
37
49
|
- path/to/other.ts
|
|
38
50
|
autonomous: true
|
|
39
|
-
|
|
51
|
+
single_layer_justified: false # set true only if this phase is legitimately single-layer (e.g., DB migration, style pass)
|
|
52
|
+
objective: "[One sentence describing the demoable user-facing behavior this plan delivers end-to-end]"
|
|
40
53
|
must_haves:
|
|
41
54
|
truths:
|
|
42
55
|
- "File src/auth/token.ts exists and exports `validateToken`"
|
|
@@ -210,7 +210,7 @@ New sections and fields added in v2.1.0 for security, parallelization control, g
|
|
|
210
210
|
| Option | Default | Description |
|
|
211
211
|
|--------|---------|-------------|
|
|
212
212
|
| `workflow.security_enforcement` | `true` | Enable per-phase security verification via `/secure-phase` |
|
|
213
|
-
| `workflow.discuss_mode` | `"discuss"` | Discussion
|
|
213
|
+
| `workflow.discuss_mode` | `"discuss"` | Discussion depth for `discuss-phase` and `new-project` questioning. `"discuss"` = standard (4 focused exchanges). `"deep"` = extended questioning, walks every decision branch until shared understanding — equivalent to passing `--deep` flag |
|
|
214
214
|
| `workflow.tdd_mode` | `false` | Instruct planner to apply `type: tdd` to eligible tasks |
|
|
215
215
|
|
|
216
216
|
### Parallelization Section (replaces flat boolean)
|
|
@@ -113,6 +113,14 @@ Phases execute in numeric order: 2 → 2.1 → 2.2 → 3 → 3.1 → 4
|
|
|
113
113
|
- Progress table updated by execute workflow
|
|
114
114
|
- Plan count can be "TBD" initially, refined during planning
|
|
115
115
|
|
|
116
|
+
**Vertical slice planning (enforced by plan-phase and plan-checker):**
|
|
117
|
+
- Each PLAN.md is a tracer bullet — one user-facing behavior, all layers (data → logic → API → UI → test)
|
|
118
|
+
- A completed plan is demoable without completing other plans
|
|
119
|
+
- Plan descriptions in this roadmap should reflect what users experience, not which layer is being built
|
|
120
|
+
- ✗ "01-01: Create database schema" — horizontal, not demoable alone
|
|
121
|
+
- ✓ "01-01: User can register and receive confirmation email" — vertical, demoable
|
|
122
|
+
- Exception: `single_layer_justified: true` in PLAN.md frontmatter for legitimately single-layer phases
|
|
123
|
+
|
|
116
124
|
**Success criteria:**
|
|
117
125
|
- 2-5 observable behaviors per phase (from user's perspective)
|
|
118
126
|
- Cross-checked against requirements during roadmap creation
|
|
@@ -7,6 +7,7 @@ description: Capture implementation decisions for a phase before planning starts
|
|
|
7
7
|
Extract implementation decisions that downstream planning needs. Analyze the phase to identify gray areas, let the user choose what to discuss, then deep-dive each selected area until satisfied.
|
|
8
8
|
|
|
9
9
|
**Usage:** Run `discuss-phase [N]` before `plan-phase [N]`.
|
|
10
|
+
**Usage:** Run `discuss-phase [N] --deep` for extended deep questioning — walks every decision branch until shared understanding is reached, with a recommended answer for each question.
|
|
10
11
|
|
|
11
12
|
**You are a thinking partner, not an interviewer.** The user is the visionary — you are the builder. Your job is to capture decisions that will guide research and planning, not to figure out implementation yourself.
|
|
12
13
|
|
|
@@ -28,6 +29,12 @@ Extract implementation decisions that downstream planning needs. Analyze the pha
|
|
|
28
29
|
|
|
29
30
|
## Step 1: Load Phase
|
|
30
31
|
|
|
32
|
+
**Detect mode:** Check for `--deep` flag in the command. If not present, check `workflow.discuss_mode` in `.planning/config.json` — if it is `"deep"`, activate deep mode. Otherwise, use standard mode.
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
DEEP_MODE = "--deep" flag present OR config.workflow.discuss_mode == "deep"
|
|
36
|
+
```
|
|
37
|
+
|
|
31
38
|
Read `.planning/ROADMAP.md` and find the requested phase number. If not found, stop and show available phases.
|
|
32
39
|
|
|
33
40
|
Read prior context to avoid re-asking decided questions:
|
|
@@ -175,7 +182,7 @@ If "All clear" → skip to Step 6.
|
|
|
175
182
|
**For each selected area, discuss:**
|
|
176
183
|
|
|
177
184
|
1. Announce: "Let's talk about [Area]."
|
|
178
|
-
2. Ask focused questions with concrete options using structured questions where possible:
|
|
185
|
+
2. Ask focused questions with concrete options using structured questions where possible. **Always include a recommended answer** — state which option you'd pick and why:
|
|
179
186
|
|
|
180
187
|
```
|
|
181
188
|
AskUserQuestion([
|
|
@@ -184,7 +191,7 @@ AskUserQuestion([
|
|
|
184
191
|
question: "[Specific implementation question]",
|
|
185
192
|
multiSelect: false,
|
|
186
193
|
options: [
|
|
187
|
-
{ label: "[Option A] (Recommended)", description: "[Why, with code context if relevant]" },
|
|
194
|
+
{ label: "[Option A] (Recommended)", description: "[Why this is recommended, with code context if relevant]" },
|
|
188
195
|
{ label: "[Option B]", description: "[Why]" },
|
|
189
196
|
{ label: "[Option C]", description: "[Why]" }
|
|
190
197
|
]
|
|
@@ -194,13 +201,23 @@ AskUserQuestion([
|
|
|
194
201
|
|
|
195
202
|
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
196
203
|
|
|
197
|
-
|
|
204
|
+
**Standard mode** (default):
|
|
205
|
+
3. After 4 questions per area, ask: "More questions about [area], or move to next?"
|
|
198
206
|
4. If more → ask 4 more, then check again
|
|
199
207
|
|
|
208
|
+
**Deep mode** (`--deep` or `discuss_mode: "deep"`):
|
|
209
|
+
3. After each answer, analyze: what is the single biggest remaining unknown in this area that could change how it's implemented? Ask that next. Provide your recommended answer.
|
|
210
|
+
4. Continue drilling down each decision branch — if an answer opens a sub-branch, follow it. Do NOT move on until the branch is fully resolved.
|
|
211
|
+
5. Only move to the next area when you judge that the current area has no remaining decision branches that would change the implementation.
|
|
212
|
+
6. If you can explore the codebase to answer a question yourself, do so instead of asking the user.
|
|
213
|
+
|
|
214
|
+
> **Deep mode intent:** Walk the full decision tree. Resolve every fork. The CONTEXT.md produced should leave no ambiguity that downstream agents would need to guess about.
|
|
215
|
+
|
|
200
216
|
After all selected areas:
|
|
201
217
|
- Summarize decisions captured
|
|
202
218
|
- Present final check:
|
|
203
219
|
|
|
220
|
+
**Standard mode:**
|
|
204
221
|
```
|
|
205
222
|
AskUserQuestion([
|
|
206
223
|
{
|
|
@@ -215,6 +232,22 @@ AskUserQuestion([
|
|
|
215
232
|
])
|
|
216
233
|
```
|
|
217
234
|
|
|
235
|
+
**Deep mode:**
|
|
236
|
+
```
|
|
237
|
+
AskUserQuestion([
|
|
238
|
+
{
|
|
239
|
+
header: "Shared Understanding Check",
|
|
240
|
+
question: "I've walked through every decision branch I can identify. Do you feel we've reached shared understanding on how to implement this phase?",
|
|
241
|
+
multiSelect: false,
|
|
242
|
+
options: [
|
|
243
|
+
{ label: "Yes — write CONTEXT.md", description: "All key decisions are captured" },
|
|
244
|
+
{ label: "There's still [area] to discuss", description: "Keep going on a specific area" },
|
|
245
|
+
{ label: "Let me add something", description: "I have context to add before you write" }
|
|
246
|
+
]
|
|
247
|
+
}
|
|
248
|
+
])
|
|
249
|
+
```
|
|
250
|
+
|
|
218
251
|
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
219
252
|
|
|
220
253
|
<scope_guardrail>
|
|
@@ -256,6 +289,7 @@ Write `.planning/phases/[padded_phase]-[phase_slug]/[padded_phase]-CONTEXT.md`:
|
|
|
256
289
|
# Phase [X]: [Name] - Context
|
|
257
290
|
|
|
258
291
|
**Gathered:** [date]
|
|
292
|
+
**Mode:** [standard | deep]
|
|
259
293
|
**Status:** Ready for planning
|
|
260
294
|
|
|
261
295
|
<domain>
|
|
@@ -368,6 +402,7 @@ Created: .planning/phases/[padded_phase]-[slug]/[padded_phase]-CONTEXT.md
|
|
|
368
402
|
|
|
369
403
|
💡 Ambitious scope? `/challenge` — stress-test the approach before planning
|
|
370
404
|
💡 Made important decisions? `/compound` — capture them while context is fresh
|
|
405
|
+
💡 Want to go deeper? Re-run `discuss-phase [X] --deep` for relentless branch-walking until full shared understanding
|
|
371
406
|
```
|
|
372
407
|
|
|
373
408
|
---
|
|
@@ -125,9 +125,9 @@ Note the tech stack, key directories, and any README content internally. Use thi
|
|
|
125
125
|
>
|
|
126
126
|
> **🛑 FORBIDDEN:** Do NOT present all questions at once as a text wall. Do NOT skip any question. Do NOT invent answers. Do NOT proceed to the config.json write step until ALL 4 rounds have been answered by the user.
|
|
127
127
|
|
|
128
|
-
**Round 1 — Core settings (
|
|
128
|
+
**Round 1 — Core settings (6 questions):**
|
|
129
129
|
|
|
130
|
-
> Present these
|
|
130
|
+
> Present these 6 questions as a SINGLE blocking `AskUserQuestion` call. STOP and wait for the user's reply before proceeding to Round 2.
|
|
131
131
|
|
|
132
132
|
```
|
|
133
133
|
AskUserQuestion([
|
|
@@ -168,6 +168,25 @@ AskUserQuestion([
|
|
|
168
168
|
{ label: "Quality", description: "Large-tier models for all agents (highest cost, best results)" },
|
|
169
169
|
{ label: "Budget", description: "Medium for code, small for research/verification (lowest cost)" }
|
|
170
170
|
]
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
header: "Questioning Depth",
|
|
174
|
+
question: "How deep should discuss-phase and new-project question you?",
|
|
175
|
+
multiSelect: false,
|
|
176
|
+
options: [
|
|
177
|
+
{ label: "Standard (Recommended)", description: "4 focused exchanges per area — fast and sufficient for most projects" },
|
|
178
|
+
{ label: "Deep", description: "Extended questioning: walks every decision branch until shared understanding is reached. Produces richer CONTEXT.md and PROJECT.md. Good for complex or unfamiliar domains." }
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
header: "Output Profile",
|
|
183
|
+
question: "How verbose should agent responses be?",
|
|
184
|
+
multiSelect: false,
|
|
185
|
+
options: [
|
|
186
|
+
{ label: "Dev (Recommended)", description: "Concise, action-oriented — code first, brief rationale. Low verbosity." },
|
|
187
|
+
{ label: "Research", description: "Detailed explanations, alternatives, and context. High verbosity." },
|
|
188
|
+
{ label: "Review", description: "Audit-focused — findings, severity, recommendations. Medium verbosity." }
|
|
189
|
+
]
|
|
171
190
|
}
|
|
172
191
|
])
|
|
173
192
|
```
|
|
@@ -289,6 +308,8 @@ AskUserQuestion([
|
|
|
289
308
|
- Granularity → `"granularity"`: `"coarse"`, `"standard"`, or `"fine"`
|
|
290
309
|
- Learning Partner → `"learning_mode"`: `"auto"` or `"manual"`
|
|
291
310
|
- AI Models → `"model_profile"`: `"balanced"`, `"quality"`, or `"budget"`
|
|
311
|
+
- Questioning Depth → `"workflow.discuss_mode"`: `"discuss"` (Standard) or `"deep"` (Deep)
|
|
312
|
+
- Output Profile → `"context"`: `"dev"` (Dev), `"research"` (Research), or `"review"` (Review)
|
|
292
313
|
- Research → `"workflow.research"`: `true` or `false`
|
|
293
314
|
- Plan Check → `"workflow.plan_check"`: `true` or `false`
|
|
294
315
|
- Verifier → `"workflow.verifier"`: `true` or `false`
|
|
@@ -308,6 +329,7 @@ Create `.planning/config.json` with all settings:
|
|
|
308
329
|
"granularity": "coarse|standard|fine",
|
|
309
330
|
"model_profile": "quality|balanced|budget",
|
|
310
331
|
"learning_mode": "auto|manual",
|
|
332
|
+
"context": "dev|research|review",
|
|
311
333
|
"test_first": false|true,
|
|
312
334
|
"planning": {
|
|
313
335
|
"commit_docs": true|false,
|
|
@@ -322,7 +344,7 @@ Create `.planning/config.json` with all settings:
|
|
|
322
344
|
"review": true|false,
|
|
323
345
|
"solutions_search": true|false,
|
|
324
346
|
"security_enforcement": true|false,
|
|
325
|
-
"discuss_mode": "discuss",
|
|
347
|
+
"discuss_mode": "discuss|deep",
|
|
326
348
|
"tdd_mode": false|true
|
|
327
349
|
},
|
|
328
350
|
"parallelization": {
|
|
@@ -380,6 +402,8 @@ try{
|
|
|
380
402
|
if(!['auto','manual'].includes(c.learning_mode)) errs.push('learning_mode must be auto|manual');
|
|
381
403
|
if(typeof c.test_first!=='boolean') errs.push('test_first must be boolean');
|
|
382
404
|
if(!c.planning||!['auto','manual'].includes(c.planning.commit_mode)) errs.push('planning.commit_mode must be auto|manual');
|
|
405
|
+
if(c.context&&!['dev','research','review'].includes(c.context)) errs.push('context must be dev|research|review');
|
|
406
|
+
if(c.workflow&&c.workflow.discuss_mode&&!['discuss','deep'].includes(c.workflow.discuss_mode)) errs.push('workflow.discuss_mode must be discuss|deep');
|
|
383
407
|
if(!c.workflow||typeof c.workflow.research!=='boolean') errs.push('workflow.research must be boolean');
|
|
384
408
|
if(!c.workflow||typeof c.workflow.plan_check!=='boolean') errs.push('workflow.plan_check must be boolean');
|
|
385
409
|
if(!c.workflow||typeof c.workflow.verifier!=='boolean') errs.push('workflow.verifier must be boolean');
|
|
@@ -424,7 +448,25 @@ Display:
|
|
|
424
448
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
425
449
|
```
|
|
426
450
|
|
|
427
|
-
|
|
451
|
+
**Detect questioning mode:** Check for `--deep` flag in the `/new-project` command. If not present, ask the user:
|
|
452
|
+
|
|
453
|
+
```
|
|
454
|
+
AskUserQuestion([
|
|
455
|
+
{
|
|
456
|
+
header: "Questioning Depth",
|
|
457
|
+
question: "How deep do you want me to go with questions before writing PROJECT.md?",
|
|
458
|
+
multiSelect: false,
|
|
459
|
+
options: [
|
|
460
|
+
{ label: "Standard (Recommended)", description: "4 focused exchanges — enough for a sharp PROJECT.md" },
|
|
461
|
+
{ label: "Deep", description: "Grill-me style — I walk every open branch until we reach shared understanding. Takes longer, produces a richer PROJECT.md" }
|
|
462
|
+
]
|
|
463
|
+
}
|
|
464
|
+
])
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
> 🛑 STOP. Wait for the user's reply. Record mode as `QUESTIONING_MODE = standard | deep`.
|
|
468
|
+
|
|
469
|
+
This step is **strictly sequential**. You must complete each numbered exchange fully before moving to the next. Do not batch questions. Do not skip exchanges. Do not proceed to Step 4 until the gate check passes.
|
|
428
470
|
|
|
429
471
|
**Exchange 1 — Opening question:**
|
|
430
472
|
|
|
@@ -465,6 +507,8 @@ Based on all previous answers, ask a third follow-up that clarifies scope, edge
|
|
|
465
507
|
>
|
|
466
508
|
> If any count is wrong, go back and complete the missing exchanges. Do NOT proceed with fewer than 4 exchanges under any circumstances — even if the user's first answer was extremely detailed.
|
|
467
509
|
|
|
510
|
+
**If `QUESTIONING_MODE = standard`:**
|
|
511
|
+
|
|
468
512
|
Verify internally: do you have `ANSWER_1`, `ANSWER_2`, `ANSWER_3`, and `ANSWER_4` recorded? If any is missing, go back and ask it. Only after all four answers are in hand may you ask:
|
|
469
513
|
|
|
470
514
|
"I think I have a solid picture of what you're building. Ready for me to write PROJECT.md, or is there more you want to cover first?"
|
|
@@ -472,6 +516,31 @@ Verify internally: do you have `ANSWER_1`, `ANSWER_2`, `ANSWER_3`, and `ANSWER_4
|
|
|
472
516
|
- **Write PROJECT.md** → proceed to Step 4
|
|
473
517
|
- **More to cover** → continue asking follow-ups, then re-ask this gate question
|
|
474
518
|
|
|
519
|
+
**If `QUESTIONING_MODE = deep`:**
|
|
520
|
+
|
|
521
|
+
After Exchange 4, continue with the extended deep questioning loop:
|
|
522
|
+
- Identify the single biggest remaining unknown that would change the direction, scope, or architecture of PROJECT.md. Ask it. Provide your recommended answer with each question.
|
|
523
|
+
- If an answer opens a new branch (a sub-decision), follow that branch before moving on.
|
|
524
|
+
- If you can explore the codebase to resolve a question yourself, do so instead of asking.
|
|
525
|
+
- Continue until you judge that all major branches are resolved. Then ask:
|
|
526
|
+
|
|
527
|
+
```
|
|
528
|
+
AskUserQuestion([
|
|
529
|
+
{
|
|
530
|
+
header: "Shared Understanding Check",
|
|
531
|
+
question: "I've walked through every major open question I can identify. Do you feel we have a complete shared picture of what you want to build?",
|
|
532
|
+
multiSelect: false,
|
|
533
|
+
options: [
|
|
534
|
+
{ label: "Yes — write PROJECT.md", description: "All key decisions and scope are clear" },
|
|
535
|
+
{ label: "There's still something open", description: "Keep going on a specific area" },
|
|
536
|
+
{ label: "Let me add context", description: "I have something to add before you write" }
|
|
537
|
+
]
|
|
538
|
+
}
|
|
539
|
+
])
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
> 🛑 STOP. Wait for user reply. If "Yes" → proceed to Step 4. Otherwise continue drilling.
|
|
543
|
+
|
|
475
544
|
Use the questioning techniques from `@./references/questioning.md` and domain-aware probes from `@./references/domain-probes.md` to shape the follow-up questions. When the user mentions a known domain (auth, real-time, dashboard, API, database, search, file uploads, caching, testing, deployment, AI/ML), use the relevant probes to ask sharper questions.
|
|
476
545
|
|
|
477
546
|
## Step 4: Write PROJECT.md
|
|
@@ -627,9 +696,19 @@ Task(
|
|
|
627
696
|
</quality_gate>
|
|
628
697
|
|
|
629
698
|
<output>
|
|
630
|
-
Write to: .planning/research/STACK.md
|
|
631
699
|
Required sections: ## Recommended Stack, ## Alternatives Considered, ## What NOT to Use, ## Versions
|
|
632
700
|
</output>
|
|
701
|
+
|
|
702
|
+
**WRITE ACTION REQUIRED — You MUST use your file-write tool to write STACK.md to disk. Do NOT output the content to the conversation. Do NOT treat this as done until the file physically exists on disk.**
|
|
703
|
+
|
|
704
|
+
Write the research content to `.planning/research/STACK.md` using your write tool now.
|
|
705
|
+
|
|
706
|
+
Then verify:
|
|
707
|
+
```
|
|
708
|
+
node -e "const fs=require('fs');const f='.planning/research/STACK.md';if(!fs.existsSync(f)){console.log('STACK_MISSING');process.exit(1);}console.log('STACK_OK — '+fs.readFileSync(f,'utf8').length+' chars');"
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
If `STACK_MISSING`: write the file and re-run until `STACK_OK`.
|
|
633
712
|
"
|
|
634
713
|
)
|
|
635
714
|
|
|
@@ -675,9 +754,19 @@ Task(
|
|
|
675
754
|
</quality_gate>
|
|
676
755
|
|
|
677
756
|
<output>
|
|
678
|
-
Write to: .planning/research/FEATURES.md
|
|
679
757
|
Required sections: ## Table Stakes, ## Differentiators, ## Anti-Features
|
|
680
758
|
</output>
|
|
759
|
+
|
|
760
|
+
**WRITE ACTION REQUIRED — You MUST use your file-write tool to write FEATURES.md to disk. Do NOT output the content to the conversation. Do NOT treat this as done until the file physically exists on disk.**
|
|
761
|
+
|
|
762
|
+
Write the research content to `.planning/research/FEATURES.md` using your write tool now.
|
|
763
|
+
|
|
764
|
+
Then verify:
|
|
765
|
+
```
|
|
766
|
+
node -e "const fs=require('fs');const f='.planning/research/FEATURES.md';if(!fs.existsSync(f)){console.log('FEATURES_MISSING');process.exit(1);}console.log('FEATURES_OK — '+fs.readFileSync(f,'utf8').length+' chars');"
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
If `FEATURES_MISSING`: write the file and re-run until `FEATURES_OK`.
|
|
681
770
|
"
|
|
682
771
|
)
|
|
683
772
|
|
|
@@ -723,9 +812,19 @@ Task(
|
|
|
723
812
|
</quality_gate>
|
|
724
813
|
|
|
725
814
|
<output>
|
|
726
|
-
Write to: .planning/research/ARCHITECTURE.md
|
|
727
815
|
Required sections: ## Component Boundaries, ## Data Flow, ## Build Order, ## Integration Points
|
|
728
816
|
</output>
|
|
817
|
+
|
|
818
|
+
**WRITE ACTION REQUIRED — You MUST use your file-write tool to write ARCHITECTURE.md to disk. Do NOT output the content to the conversation. Do NOT treat this as done until the file physically exists on disk.**
|
|
819
|
+
|
|
820
|
+
Write the research content to `.planning/research/ARCHITECTURE.md` using your write tool now.
|
|
821
|
+
|
|
822
|
+
Then verify:
|
|
823
|
+
```
|
|
824
|
+
node -e "const fs=require('fs');const f='.planning/research/ARCHITECTURE.md';if(!fs.existsSync(f)){console.log('ARCH_MISSING');process.exit(1);}console.log('ARCH_OK — '+fs.readFileSync(f,'utf8').length+' chars');"
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
If `ARCH_MISSING`: write the file and re-run until `ARCH_OK`.
|
|
729
828
|
"
|
|
730
829
|
)
|
|
731
830
|
|
|
@@ -771,9 +870,19 @@ Task(
|
|
|
771
870
|
</quality_gate>
|
|
772
871
|
|
|
773
872
|
<output>
|
|
774
|
-
Write to: .planning/research/PITFALLS.md
|
|
775
873
|
Required sections: ## Common Mistakes, ## Warning Signs, ## Prevention Strategies
|
|
776
874
|
</output>
|
|
875
|
+
|
|
876
|
+
**WRITE ACTION REQUIRED — You MUST use your file-write tool to write PITFALLS.md to disk. Do NOT output the content to the conversation. Do NOT treat this as done until the file physically exists on disk.**
|
|
877
|
+
|
|
878
|
+
Write the research content to `.planning/research/PITFALLS.md` using your write tool now.
|
|
879
|
+
|
|
880
|
+
Then verify:
|
|
881
|
+
```
|
|
882
|
+
node -e "const fs=require('fs');const f='.planning/research/PITFALLS.md';if(!fs.existsSync(f)){console.log('PITFALLS_MISSING');process.exit(1);}console.log('PITFALLS_OK — '+fs.readFileSync(f,'utf8').length+' chars');"
|
|
883
|
+
```
|
|
884
|
+
|
|
885
|
+
If `PITFALLS_MISSING`: write the file and re-run until `PITFALLS_OK`.
|
|
777
886
|
"
|
|
778
887
|
)
|
|
779
888
|
```
|
|
@@ -811,11 +920,22 @@ Task(
|
|
|
811
920
|
</downstream_consumer>
|
|
812
921
|
|
|
813
922
|
<output>
|
|
814
|
-
Write to: .planning/research/SUMMARY.md
|
|
815
923
|
Required sections: ## Executive Summary, ## Recommended Stack, ## Table Stakes Features, ## Key Architecture Decisions, ## Top Pitfalls, ## Implications for Roadmap, ## Confidence Assessment, ## Gaps
|
|
816
924
|
</output>
|
|
817
925
|
|
|
926
|
+
**WRITE ACTION REQUIRED — You MUST use your file-write tool to write SUMMARY.md to disk. Do NOT output the content to the conversation. Do NOT treat this as done until the file physically exists on disk.**
|
|
927
|
+
|
|
928
|
+
Write the synthesized content to `.planning/research/SUMMARY.md` using your write tool now.
|
|
929
|
+
|
|
930
|
+
Then verify it was written:
|
|
931
|
+
```
|
|
932
|
+
node -e "const fs=require('fs');const f='.planning/research/SUMMARY.md';if(!fs.existsSync(f)){console.log('SUMMARY_MISSING');process.exit(1);}const c=fs.readFileSync(f,'utf8');const secs=['Executive Summary','Recommended Stack','Top Pitfalls','Implications for Roadmap'];const missing=secs.filter(s=>!c.includes(s));if(missing.length){console.log('SUMMARY_INCOMPLETE — missing: '+missing.join(', '));process.exit(1);}console.log('SUMMARY_OK — '+c.length+' chars');"
|
|
933
|
+
```
|
|
934
|
+
|
|
935
|
+
If `SUMMARY_MISSING` or `SUMMARY_INCOMPLETE`: write the file and re-run until `SUMMARY_OK`.
|
|
936
|
+
|
|
818
937
|
<quality_gate>
|
|
938
|
+
- [ ] File physically written to .planning/research/SUMMARY.md (verified by node -e above)
|
|
819
939
|
- [ ] Synthesized, not concatenated — findings are integrated
|
|
820
940
|
- [ ] Opinionated — clear recommendations emerge
|
|
821
941
|
- [ ] Actionable — roadmapper can structure phases from implications
|
|
@@ -139,9 +139,19 @@ Task(
|
|
|
139
139
|
</files_to_read>
|
|
140
140
|
|
|
141
141
|
<output>
|
|
142
|
-
Write to: .planning/phases/[padded_phase]-[phase_slug]/[padded_phase]-RESEARCH.md
|
|
143
142
|
Required sections: ## Don't Hand-Roll, ## Common Pitfalls, ## Existing Patterns in This Codebase, ## Recommended Approach
|
|
144
143
|
</output>
|
|
144
|
+
|
|
145
|
+
**WRITE ACTION REQUIRED — You MUST use your file-write tool to write [padded_phase]-RESEARCH.md to disk. Do NOT output the content to the conversation. Do NOT treat this as done until the file physically exists on disk.**
|
|
146
|
+
|
|
147
|
+
Write the research content to `.planning/phases/[padded_phase]-[phase_slug]/[padded_phase]-RESEARCH.md` using your write tool now.
|
|
148
|
+
|
|
149
|
+
Then verify:
|
|
150
|
+
```
|
|
151
|
+
node -e "const fs=require('fs');const files=fs.readdirSync('.planning/phases/').flatMap(d=>fs.readdirSync('.planning/phases/'+d).filter(f=>f.endsWith('-RESEARCH.md')).map(f=>'.planning/phases/'+d+'/'+f));if(!files.length){console.log('RESEARCH_MISSING');process.exit(1);}console.log('RESEARCH_OK — '+files[files.length-1]);"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
If `RESEARCH_MISSING`: write the file and re-run until `RESEARCH_OK`.
|
|
145
155
|
"
|
|
146
156
|
)
|
|
147
157
|
```
|
|
@@ -203,14 +213,16 @@ Task(
|
|
|
203
213
|
prompt="
|
|
204
214
|
<agent_definition>
|
|
205
215
|
You are a learnship planner. Create executable PLAN.md files that an AI agent can follow step-by-step.
|
|
206
|
-
Each plan
|
|
207
|
-
|
|
216
|
+
Each plan is a VERTICAL SLICE (tracer bullet) — a thin end-to-end path through all layers for one user-facing behavior. A completed plan must be demoable or verifiable on its own.
|
|
217
|
+
DO NOT create plans that cover a single layer across the whole feature (all-schema plan, all-API plan, all-UI plan). Each plan delivers one complete behavior: data + logic + API + UI + test.
|
|
218
|
+
Exception: add `single_layer_justified: true` to frontmatter only if the phase is legitimately single-layer (e.g., DB migration, style pass).
|
|
219
|
+
Tasks use XML format with file, action, verify, done fields. Plans have YAML frontmatter: wave, depends_on, files_modified, autonomous, single_layer_justified, objective.
|
|
208
220
|
Be specific — task actions should be concrete instructions, not vague guidance.
|
|
209
221
|
</agent_definition>
|
|
210
222
|
|
|
211
223
|
<objective>
|
|
212
224
|
Create 2-4 executable PLAN.md files for Phase [phase_number]: [phase_name].
|
|
213
|
-
Write plans to [phase_dir]/[padded_phase]-NN-PLAN.md.
|
|
225
|
+
Each plan = one tracer bullet (demoable end-to-end slice). Write plans to [phase_dir]/[padded_phase]-NN-PLAN.md.
|
|
214
226
|
</objective>
|
|
215
227
|
|
|
216
228
|
<files_to_read>
|
|
@@ -223,9 +235,19 @@ Task(
|
|
|
223
235
|
</files_to_read>
|
|
224
236
|
|
|
225
237
|
<output>
|
|
226
|
-
Write to: [phase_dir]/[padded_phase]-01-PLAN.md, [padded_phase]-02-PLAN.md, etc.
|
|
227
238
|
Each plan must have: YAML frontmatter (wave, depends_on, files_modified) + tasks in XML + must_haves section
|
|
228
239
|
</output>
|
|
240
|
+
|
|
241
|
+
**WRITE ACTION REQUIRED — You MUST use your file-write tool to write each PLAN.md to disk. Do NOT output plans to the conversation. Do NOT treat this as done until files physically exist on disk.**
|
|
242
|
+
|
|
243
|
+
Write each plan to `[phase_dir]/[padded_phase]-NN-PLAN.md` using your write tool now. Write all plans before reporting done.
|
|
244
|
+
|
|
245
|
+
Then verify:
|
|
246
|
+
```
|
|
247
|
+
node -e "const fs=require('fs');const plans=fs.readdirSync('.').filter(f=>f.endsWith('-PLAN.md'));if(!plans.length){console.log('PLANS_MISSING');process.exit(1);}console.log('PLANS_OK — '+plans.length+' plan(s): '+plans.join(', '));"
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Run that command from inside [phase_dir]. If `PLANS_MISSING`: write the files and re-run until `PLANS_OK`.
|
|
229
251
|
"
|
|
230
252
|
)
|
|
231
253
|
```
|
|
@@ -236,7 +258,10 @@ Wait for agent to complete, then verify PLAN.md files were written.
|
|
|
236
258
|
|
|
237
259
|
<persona_context>
|
|
238
260
|
You are now the **learnship planner**. Create implementation plans that are executable in a single context window.
|
|
239
|
-
Each plan
|
|
261
|
+
Each plan is a VERTICAL SLICE (tracer bullet) — a thin end-to-end path through all layers for one user-facing behavior. A completed plan must be demoable or verifiable on its own.
|
|
262
|
+
DO NOT create plans that cover a single layer across the whole feature (all-schema plan, all-API plan, all-UI plan). Each plan delivers one complete behavior: data + logic + API + UI + test.
|
|
263
|
+
Exception: add `single_layer_justified: true` to frontmatter only if the phase is legitimately single-layer (e.g., DB migration, style pass).
|
|
264
|
+
Tasks use XML format. Include YAML frontmatter with wave, depends_on, files_modified, autonomous, single_layer_justified, objective.
|
|
240
265
|
Right-size plans: too small = overhead, too large = risk. Aim for plans completable in one focused session.
|
|
241
266
|
</persona_context>
|
|
242
267
|
|
|
@@ -253,11 +278,13 @@ Read `@./agents/planner.md` for the full persona definition. Read all available
|
|
|
253
278
|
- RESEARCH.md (if exists)
|
|
254
279
|
|
|
255
280
|
Create 2-4 PLAN.md files in the phase directory. Each plan:
|
|
256
|
-
-
|
|
257
|
-
- Has YAML frontmatter: `wave`, `depends_on`, `files_modified`, `autonomous`
|
|
281
|
+
- Is a **vertical slice (tracer bullet)** — delivers one demoable user-facing behavior end-to-end (data → logic → API → UI → test). NOT a horizontal layer.
|
|
282
|
+
- Has YAML frontmatter: `wave`, `depends_on`, `files_modified`, `autonomous`, `single_layer_justified`, `objective`
|
|
258
283
|
- Contains tasks in XML format (see `$LEARNSHIP_DIR/templates/plan.md`)
|
|
259
284
|
- Has `must_haves` section with observable verification criteria
|
|
260
285
|
|
|
286
|
+
**Vertical slice check before writing:** For each plan you draft, ask: "Can someone demo this plan's deliverable after it completes, without completing other plans?" If the answer is no, restructure into proper vertical slices.
|
|
287
|
+
|
|
261
288
|
**Wave assignment:**
|
|
262
289
|
- Plans with no dependencies → Wave 1 (independent, execute in any order)
|
|
263
290
|
- Plans depending on Wave 1 → Wave 2
|
|
@@ -286,13 +313,14 @@ Task(
|
|
|
286
313
|
prompt="
|
|
287
314
|
<agent_definition>
|
|
288
315
|
You are a learnship plan checker. Verify plans are complete, correct, and executable.
|
|
289
|
-
Check: phase goal coverage, requirement IDs, CONTEXT.md decisions honored, task completeness, wave/dependency correctness.
|
|
290
|
-
|
|
316
|
+
Check: phase goal coverage, requirement IDs, CONTEXT.md decisions honored, task completeness, wave/dependency correctness, AND vertical slice integrity.
|
|
317
|
+
Vertical slice check: each plan's objective must describe a demoable user-facing behavior delivered end-to-end. Flag any plan that covers only a single layer (all schema, all API, all UI) unless single_layer_justified: true is set in its frontmatter.
|
|
318
|
+
Be strict — flag missing requirement IDs, vague task actions, incorrect wave assignments, and horizontal slices.
|
|
291
319
|
</agent_definition>
|
|
292
320
|
|
|
293
321
|
<objective>
|
|
294
322
|
Verify all PLAN.md files in [phase_dir] for Phase [phase_number]: [phase_name].
|
|
295
|
-
Check: phase goal coverage, requirement IDs, CONTEXT.md decisions, task completeness, wave correctness.
|
|
323
|
+
Check: phase goal coverage, requirement IDs, CONTEXT.md decisions, task completeness, wave correctness, vertical slice integrity.
|
|
296
324
|
Return: PASS or list of specific issues per plan.
|
|
297
325
|
</objective>
|
|
298
326
|
|
|
@@ -314,8 +342,9 @@ If still failing after 3 iterations: present issues and ask — **Force proceed*
|
|
|
314
342
|
<persona_context>
|
|
315
343
|
You are now the **learnship plan checker**. Verify plans are complete, correct, and executable.
|
|
316
344
|
Every v1 requirement must map to at least one plan task. Success criteria must be observable and testable.
|
|
317
|
-
Flag gaps, missing coverage, unrealistic estimates,
|
|
318
|
-
|
|
345
|
+
Flag gaps, missing coverage, unrealistic estimates, circular dependencies, AND horizontal slices.
|
|
346
|
+
Vertical slice check: each plan's objective must describe a demoable user-facing behavior delivered end-to-end. Flag any plan that covers only a single layer (all schema, all API, all UI) unless `single_layer_justified: true` is in the frontmatter.
|
|
347
|
+
Check: phase goal coverage, requirement IDs, CONTEXT.md decisions honored, task completeness, wave/dependency correctness, vertical slice integrity.
|
|
319
348
|
</persona_context>
|
|
320
349
|
|
|
321
350
|
> **Announce persona** — print this before proceeding:
|
|
@@ -329,6 +358,7 @@ Read `@./agents/plan-checker.md` for the full persona definition. Check the plan
|
|
|
329
358
|
- CONTEXT.md decisions (are they honored?)
|
|
330
359
|
- Task completeness (files, action, verify, done fields)
|
|
331
360
|
- Wave/dependency correctness
|
|
361
|
+
- Vertical slice integrity (is each plan's objective a demoable user-facing behavior? flag horizontal-only plans)
|
|
332
362
|
|
|
333
363
|
**Verification loop (max 3 iterations):**
|
|
334
364
|
|
|
@@ -109,9 +109,19 @@ Task(
|
|
|
109
109
|
</files_to_read>
|
|
110
110
|
|
|
111
111
|
<output>
|
|
112
|
-
Write to: .planning/phases/[padded_phase]-[slug]/[padded_phase]-RESEARCH.md
|
|
113
112
|
Required sections: ## Don't Hand-Roll, ## Common Pitfalls, ## Existing Patterns in This Codebase, ## Recommended Approach
|
|
114
113
|
</output>
|
|
114
|
+
|
|
115
|
+
**WRITE ACTION REQUIRED — You MUST use your file-write tool to write [padded_phase]-RESEARCH.md to disk. Do NOT output the content to the conversation. Do NOT treat this as done until the file physically exists on disk.**
|
|
116
|
+
|
|
117
|
+
Write the research content to `.planning/phases/[padded_phase]-[slug]/[padded_phase]-RESEARCH.md` using your write tool now.
|
|
118
|
+
|
|
119
|
+
Then verify:
|
|
120
|
+
```
|
|
121
|
+
node -e "const fs=require('fs');const files=fs.readdirSync('.planning/phases/').flatMap(d=>fs.readdirSync('.planning/phases/'+d).filter(f=>f.endsWith('-RESEARCH.md')).map(f=>'.planning/phases/'+d+'/'+f));if(!files.length){console.log('RESEARCH_MISSING');process.exit(1);}console.log('RESEARCH_OK — '+files[files.length-1]);"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
If `RESEARCH_MISSING`: write the file and re-run until `RESEARCH_OK`.
|
|
115
125
|
"
|
|
116
126
|
)
|
|
117
127
|
```
|
|
@@ -36,7 +36,7 @@ cp templates/config.json .planning/config.json 2>/dev/null || cat > .planning/co
|
|
|
36
36
|
"review": true,
|
|
37
37
|
"solutions_search": true,
|
|
38
38
|
"security_enforcement": true,
|
|
39
|
-
"discuss_mode": "discuss",
|
|
39
|
+
"discuss_mode": "discuss", // "discuss" (standard 4-exchange) or "deep" (extended questioning, walks every branch until shared understanding)
|
|
40
40
|
"tdd_mode": false
|
|
41
41
|
},
|
|
42
42
|
"parallelization": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.5",
|
|
4
4
|
"description": "Learn as you build. Build with intent. — A multi-platform agentic engineering system for Windsurf, Claude Code, Cursor, OpenCode, Gemini CLI, and Codex: 57 spec-driven workflows, 17 specialist agent personas, integrated learning, and production-grade design.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentic",
|
package/templates/plan.md
CHANGED
|
@@ -113,6 +113,14 @@ Phases execute in numeric order: 2 → 2.1 → 2.2 → 3 → 3.1 → 4
|
|
|
113
113
|
- Progress table updated by execute workflow
|
|
114
114
|
- Plan count can be "TBD" initially, refined during planning
|
|
115
115
|
|
|
116
|
+
**Vertical slice planning (enforced by plan-phase and plan-checker):**
|
|
117
|
+
- Each PLAN.md is a tracer bullet — one user-facing behavior, all layers (data → logic → API → UI → test)
|
|
118
|
+
- A completed plan is demoable without completing other plans
|
|
119
|
+
- Plan descriptions in this roadmap should reflect what users experience, not which layer is being built
|
|
120
|
+
- ✗ "01-01: Create database schema" — horizontal, not demoable alone
|
|
121
|
+
- ✓ "01-01: User can register and receive confirmation email" — vertical, demoable
|
|
122
|
+
- Exception: `single_layer_justified: true` in PLAN.md frontmatter for legitimately single-layer phases
|
|
123
|
+
|
|
116
124
|
**Success criteria:**
|
|
117
125
|
- 2-5 observable behaviors per phase (from user's perspective)
|
|
118
126
|
- Cross-checked against requirements during roadmap creation
|