qualia-framework 3.6.0 → 4.0.0
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/README.md +96 -51
- package/agents/builder.md +25 -14
- package/agents/plan-checker.md +29 -16
- package/agents/planner.md +33 -24
- package/agents/research-synthesizer.md +25 -12
- package/agents/roadmapper.md +89 -84
- package/agents/verifier.md +11 -2
- package/bin/qualia-ui.js +267 -1
- package/bin/state.js +90 -5
- package/guide.md +84 -21
- package/package.json +1 -1
- package/skills/qualia/SKILL.md +3 -1
- package/skills/qualia-build/SKILL.md +39 -4
- package/skills/qualia-handoff/SKILL.md +87 -12
- package/skills/qualia-idk/SKILL.md +160 -0
- package/skills/qualia-milestone/SKILL.md +122 -79
- package/skills/qualia-new/SKILL.md +151 -230
- package/skills/qualia-plan/SKILL.md +14 -9
- package/skills/qualia-report/SKILL.md +12 -0
- package/skills/qualia-verify/SKILL.md +57 -3
- package/templates/journey.md +113 -0
- package/templates/plan.md +56 -11
- package/templates/requirements.md +82 -22
- package/templates/roadmap.md +41 -14
- package/templates/tracking.json +2 -0
- package/tests/runner.js +169 -4
|
@@ -92,6 +92,9 @@ SUBMITTED_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
|
92
92
|
# Only upload if ERP is enabled
|
|
93
93
|
if [ "$ERP_ENABLED" = "true" ]; then
|
|
94
94
|
# Build structured JSON payload from tracking.json (matches ERP contract /api/v1/reports)
|
|
95
|
+
# v4: include milestone_name, milestones[], team_id, project_id, git_remote,
|
|
96
|
+
# session_started_at, last_pushed_at, build_count, deploy_count — the ERP
|
|
97
|
+
# uses these to render the project tree (milestone → phases → unphased) correctly.
|
|
95
98
|
PAYLOAD=$(node -e "
|
|
96
99
|
const fs = require('fs');
|
|
97
100
|
const t = JSON.parse(fs.readFileSync('.planning/tracking.json', 'utf8'));
|
|
@@ -104,8 +107,13 @@ if [ "$ERP_ENABLED" = "true" ]; then
|
|
|
104
107
|
} catch {}
|
|
105
108
|
console.log(JSON.stringify({
|
|
106
109
|
project: t.project || require('path').basename(process.cwd()),
|
|
110
|
+
project_id: t.project_id || '',
|
|
111
|
+
team_id: t.team_id || '',
|
|
112
|
+
git_remote: t.git_remote || '',
|
|
107
113
|
client: t.client || '',
|
|
108
114
|
milestone: t.milestone || 1,
|
|
115
|
+
milestone_name: t.milestone_name || '',
|
|
116
|
+
milestones: Array.isArray(t.milestones) ? t.milestones : [],
|
|
109
117
|
phase: t.phase,
|
|
110
118
|
phase_name: t.phase_name,
|
|
111
119
|
total_phases: t.total_phases,
|
|
@@ -114,7 +122,11 @@ if [ "$ERP_ENABLED" = "true" ]; then
|
|
|
114
122
|
tasks_total: t.tasks_total || 0,
|
|
115
123
|
verification: t.verification || 'pending',
|
|
116
124
|
gap_cycles: (t.gap_cycles || {})[String(t.phase)] || 0,
|
|
125
|
+
build_count: t.build_count || 0,
|
|
126
|
+
deploy_count: t.deploy_count || 0,
|
|
117
127
|
deployed_url: t.deployed_url || '',
|
|
128
|
+
session_started_at: t.session_started_at || '',
|
|
129
|
+
last_pushed_at: t.last_pushed_at || '',
|
|
118
130
|
lifetime: t.lifetime || {},
|
|
119
131
|
commits: commits,
|
|
120
132
|
notes: notes,
|
|
@@ -10,6 +10,7 @@ Spawn a verifier agent to check if the phase goal was achieved. Does NOT trust b
|
|
|
10
10
|
## Usage
|
|
11
11
|
`/qualia-verify` — verify the current built phase
|
|
12
12
|
`/qualia-verify {N}` — verify specific phase
|
|
13
|
+
`/qualia-verify {N} --auto` — verify + auto-chain: PASS → next phase (or milestone close); FAIL → gap closure; gap limit → halt with escalation
|
|
13
14
|
|
|
14
15
|
## Process
|
|
15
16
|
|
|
@@ -99,11 +100,64 @@ node ~/.claude/bin/qualia-ui.js end "PHASE {N} GAPS FOUND" "/qualia-plan {N} --g
|
|
|
99
100
|
```bash
|
|
100
101
|
node ~/.claude/bin/state.js transition --to verified --phase {N} --verification {pass|fail}
|
|
101
102
|
```
|
|
102
|
-
If PASS and more phases: state.js auto-advances to the next phase.
|
|
103
|
-
If FAIL and gap_cycles >=
|
|
104
|
-
If FAIL and gap_cycles <
|
|
103
|
+
If PASS and more phases in this milestone: state.js auto-advances to the next phase.
|
|
104
|
+
If FAIL and gap_cycles >= limit: state.js returns GAP_CYCLE_LIMIT — escalate.
|
|
105
|
+
If FAIL and gap_cycles < limit: proceed to `/qualia-plan {N} --gaps`.
|
|
105
106
|
Do NOT manually edit STATE.md or tracking.json — state.js handles both.
|
|
106
107
|
|
|
108
|
+
After state transition, capture the new state for auto-chain routing:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
NEW_STATE=$(node ~/.claude/bin/state.js check)
|
|
112
|
+
# Parse: .phase (new current phase), .total_phases, .status, .verification
|
|
113
|
+
# Also read .planning/JOURNEY.md to know if this was the last phase of a milestone
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 4b. Route (auto-chain aware)
|
|
117
|
+
|
|
118
|
+
**In `--auto` mode**, the router decides the next step based on verify result + journey position:
|
|
119
|
+
|
|
120
|
+
| Result | Journey position | Action |
|
|
121
|
+
|---|---|---|
|
|
122
|
+
| PASS | More phases remain in current milestone | Inline invoke `/qualia-plan {N+1} --auto` |
|
|
123
|
+
| PASS | Last phase of current milestone (not Handoff) | Inline invoke `/qualia-milestone --auto` |
|
|
124
|
+
| PASS | Last phase of Handoff milestone | Inline invoke `/qualia-ship`, then `/qualia-handoff`, then `/qualia-report` |
|
|
125
|
+
| FAIL | gap_cycles < limit | Inline invoke `/qualia-plan {N} --gaps --auto` |
|
|
126
|
+
| FAIL | gap_cycles >= limit | **HALT** — show escalation message, require human intervention |
|
|
127
|
+
|
|
128
|
+
Detect "last phase of current milestone":
|
|
129
|
+
```bash
|
|
130
|
+
# tracking.json.milestone gives current milestone number
|
|
131
|
+
# .planning/JOURNEY.md describes phases per milestone
|
|
132
|
+
# If the just-verified phase's number == total phases of current milestone → last phase
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Detect "last phase of Handoff milestone":
|
|
136
|
+
```bash
|
|
137
|
+
# If the current milestone's name in JOURNEY.md is "Handoff" AND this was its last phase
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Halt case (gap cycle limit)** — stop auto-chain and show:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
node ~/.claude/bin/qualia-ui.js fail "Phase {N} has failed verification {cycles} times — gap limit reached"
|
|
144
|
+
node ~/.claude/bin/qualia-ui.js warn "Human intervention required. Options:"
|
|
145
|
+
echo " 1. Re-plan this phase from scratch: /qualia-plan {N}"
|
|
146
|
+
echo " 2. Adjust the roadmap — phase scope may be wrong"
|
|
147
|
+
echo " 3. Escalate to Fawzi (for EMPLOYEE role)"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Default (guided mode)** behavior is unchanged — show the next command and stop:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# PASS
|
|
154
|
+
node ~/.claude/bin/qualia-ui.js end "PHASE {N} VERIFIED" "/qualia-plan {N+1}"
|
|
155
|
+
# (or "/qualia-milestone" if last phase of milestone, "/qualia-polish" if overall last phase)
|
|
156
|
+
|
|
157
|
+
# FAIL
|
|
158
|
+
node ~/.claude/bin/qualia-ui.js end "PHASE {N} GAPS FOUND" "/qualia-plan {N} --gaps"
|
|
159
|
+
```
|
|
160
|
+
|
|
107
161
|
### 5. Passive Knowledge Capture (on FAIL)
|
|
108
162
|
|
|
109
163
|
When verification fails, after showing the gaps, ask the user:
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
project: "{Project Name}"
|
|
3
|
+
total_milestones: {N}
|
|
4
|
+
current_milestone: 1
|
|
5
|
+
created: {date}
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# {Project Name} — Journey
|
|
9
|
+
|
|
10
|
+
The full arc from kickoff to client handoff. Every milestone. Every exit criterion.
|
|
11
|
+
This file is the **North Star** — all planning downstream must stay architecturally
|
|
12
|
+
consistent with it.
|
|
13
|
+
|
|
14
|
+
## Mission
|
|
15
|
+
|
|
16
|
+
{one-paragraph description of what this project delivers and for whom}
|
|
17
|
+
|
|
18
|
+
## The Path ({N} milestones to handoff)
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
M1 ─── M2 ─── M3 ─── ... ─── M{N} (Handoff)
|
|
22
|
+
│
|
|
23
|
+
└── [CURRENT]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Milestone 1 · {Name} [CURRENT]
|
|
29
|
+
|
|
30
|
+
**Why now:** {one-sentence reason this is the first release — what foundation it lays}
|
|
31
|
+
|
|
32
|
+
**Exit criteria** (what "shipped" means for M1):
|
|
33
|
+
- {observable outcome 1}
|
|
34
|
+
- {observable outcome 2}
|
|
35
|
+
- {observable outcome 3}
|
|
36
|
+
|
|
37
|
+
**Phases:**
|
|
38
|
+
1. **{Phase Name}** — {one-line goal}
|
|
39
|
+
2. **{Phase Name}** — {one-line goal}
|
|
40
|
+
3. **{Phase Name}** — {one-line goal}
|
|
41
|
+
|
|
42
|
+
**Requirements covered:** {REQ-IDs — e.g. AUTH-01, AUTH-02, CORE-01}
|
|
43
|
+
|
|
44
|
+
**Research flags:** {any phases that may need deeper research during planning}
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Milestone 2 · {Name}
|
|
49
|
+
|
|
50
|
+
**Why now:** {plain-language reason this follows M1}
|
|
51
|
+
|
|
52
|
+
**Exit criteria:**
|
|
53
|
+
- {observable outcome 1}
|
|
54
|
+
- {observable outcome 2}
|
|
55
|
+
|
|
56
|
+
**Phases:**
|
|
57
|
+
1. **{Phase Name}** — {one-line goal}
|
|
58
|
+
2. **{Phase Name}** — {one-line goal}
|
|
59
|
+
3. **{Phase Name}** — {one-line goal}
|
|
60
|
+
|
|
61
|
+
**Requirements covered:** {REQ-IDs}
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Milestone 3 · {Name}
|
|
66
|
+
|
|
67
|
+
**Why now:** {reason}
|
|
68
|
+
|
|
69
|
+
**Exit criteria:**
|
|
70
|
+
- {outcome}
|
|
71
|
+
- {outcome}
|
|
72
|
+
|
|
73
|
+
**Phases:**
|
|
74
|
+
1. **{Phase Name}** — {one-line goal}
|
|
75
|
+
2. **{Phase Name}** — {one-line goal}
|
|
76
|
+
|
|
77
|
+
**Requirements covered:** {REQ-IDs}
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Milestone {N} · Handoff [FINAL]
|
|
82
|
+
|
|
83
|
+
**Why now:** Production-ready for real users and client takeover.
|
|
84
|
+
|
|
85
|
+
**Exit criteria:**
|
|
86
|
+
- Deployed on production domain with HTTP 200 + auth flow verified
|
|
87
|
+
- Client has credentials, runbook, and recorded walkthrough
|
|
88
|
+
- `.planning/archive/` contains every milestone's verification reports
|
|
89
|
+
- ERP `lifetime.milestones_completed` reflects this milestone
|
|
90
|
+
|
|
91
|
+
**Phases (standard for every project):**
|
|
92
|
+
1. **Polish** — design pass, responsive, accessibility, empty/error states
|
|
93
|
+
2. **Content + SEO** — real copy, metadata, sitemap, robots, analytics
|
|
94
|
+
3. **Final QA** — full-flow test, cross-browser, edge cases, `/qualia-review`
|
|
95
|
+
4. **Handoff** — credentials doc, client walkthrough, domain transfer, support clause
|
|
96
|
+
|
|
97
|
+
**Requirements covered:** {REQ-IDs — typically ops/quality/handoff categories}
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Rules for This Journey
|
|
102
|
+
|
|
103
|
+
1. **Hard ceiling: 5 milestones.** If the project needs more, defer to a v2 release after handoff.
|
|
104
|
+
2. **Hard floor: 2 milestones.** Anything smaller should use `/qualia-new --quick` instead.
|
|
105
|
+
3. **The final milestone is always Handoff.** Same 4 phases every project. Never negotiable.
|
|
106
|
+
4. **Milestones ≥ 2 phases OR are a shipped release gate.** A 1-phase milestone is a phase, not a milestone.
|
|
107
|
+
5. **Numbering is contiguous.** No skipped milestone numbers.
|
|
108
|
+
6. **Progressive detail is OK.** M1 is fully detailed (ready for `/qualia-plan`). M2..M{N-1} have phase names + one-line goals. Full phase detail gets written by roadmapper when the milestone opens.
|
|
109
|
+
7. **Exit criteria are observable.** "User can do X" not "Feature Y works."
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
*Last updated: {date}*
|
package/templates/plan.md
CHANGED
|
@@ -7,36 +7,81 @@ waves: {count}
|
|
|
7
7
|
|
|
8
8
|
# Phase {N}: {Name}
|
|
9
9
|
|
|
10
|
-
Goal
|
|
10
|
+
**Goal:** {what must be TRUE when this phase is done}
|
|
11
|
+
|
|
12
|
+
**Why this phase:** {one sentence — what this unlocks for the user or the product}
|
|
13
|
+
|
|
14
|
+
---
|
|
11
15
|
|
|
12
16
|
## Task 1 — {title}
|
|
17
|
+
|
|
13
18
|
**Wave:** 1
|
|
14
|
-
**
|
|
15
|
-
**
|
|
19
|
+
**Persona:** {optional: security | architect | ux | frontend | backend | performance | none}
|
|
20
|
+
**Files:** {specific absolute paths — e.g. `src/lib/auth.ts`, `src/app/login/page.tsx`}
|
|
21
|
+
**Depends on:** {task numbers (e.g. "Task 0"), or "none"}
|
|
22
|
+
|
|
23
|
+
**Why:**
|
|
24
|
+
{one-sentence rationale — what problem this solves, what would break without it. Not "implement auth" but "Session persistence is the #1 abandonment trigger in onboarding — verification emails are wasted without it."}
|
|
25
|
+
|
|
26
|
+
**Acceptance Criteria:**
|
|
27
|
+
- {observable user-facing behavior 1}
|
|
28
|
+
- {observable user-facing behavior 2}
|
|
29
|
+
- {observable user-facing behavior 3}
|
|
30
|
+
|
|
31
|
+
**Action:**
|
|
32
|
+
{concrete steps the builder follows — specific function names, imports, patterns. Not "add auth" but "Add `signInWithPassword()` call in `handleSubmit`, validate email with Zod schema, redirect to `/dashboard` on success."}
|
|
33
|
+
|
|
34
|
+
**Validation:** (builder self-check before commit)
|
|
35
|
+
- `{exact command 1}` → expected output
|
|
36
|
+
- `{exact command 2}` → expected output
|
|
37
|
+
|
|
16
38
|
**Context:** Read @{file references}
|
|
17
|
-
|
|
39
|
+
|
|
40
|
+
---
|
|
18
41
|
|
|
19
42
|
## Task 2 — {title}
|
|
43
|
+
|
|
20
44
|
**Wave:** 1
|
|
45
|
+
**Persona:** {optional}
|
|
21
46
|
**Files:** {files}
|
|
22
|
-
**
|
|
23
|
-
|
|
47
|
+
**Depends on:** {none | Task N}
|
|
48
|
+
|
|
49
|
+
**Why:**
|
|
50
|
+
{one-sentence rationale}
|
|
51
|
+
|
|
52
|
+
**Acceptance Criteria:**
|
|
53
|
+
- {user-facing behavior}
|
|
54
|
+
|
|
55
|
+
**Action:**
|
|
56
|
+
{steps}
|
|
57
|
+
|
|
58
|
+
**Validation:**
|
|
59
|
+
- `{command}` → expected
|
|
60
|
+
|
|
61
|
+
**Context:** Read @{files}
|
|
62
|
+
|
|
63
|
+
---
|
|
24
64
|
|
|
25
65
|
## Success Criteria
|
|
66
|
+
|
|
67
|
+
Phase-level truths — what must be observable when this phase is done.
|
|
68
|
+
|
|
26
69
|
- [ ] {truth 1 — what the user can do}
|
|
27
70
|
- [ ] {truth 2}
|
|
28
71
|
- [ ] {truth 3}
|
|
29
72
|
|
|
30
73
|
## Verification Contract
|
|
31
74
|
|
|
75
|
+
Machine-executable checks the verifier runs verbatim. One per task minimum.
|
|
76
|
+
|
|
32
77
|
### Contract for Task 1 — {title}
|
|
33
78
|
**Check type:** {file-exists | grep-match | command-exit | behavioral}
|
|
34
|
-
**Command:** `{exact command
|
|
35
|
-
**Expected:** {
|
|
36
|
-
**Fail if:** {
|
|
79
|
+
**Command:** `{exact command}`
|
|
80
|
+
**Expected:** {output}
|
|
81
|
+
**Fail if:** {failure condition}
|
|
37
82
|
|
|
38
83
|
### Contract for Task 2 — {title}
|
|
39
|
-
**Check type:** {
|
|
84
|
+
**Check type:** {type}
|
|
40
85
|
**Command:** `{exact command}`
|
|
41
|
-
**Expected:** {
|
|
86
|
+
**Expected:** {output}
|
|
42
87
|
**Fail if:** {failure condition}
|
|
@@ -3,29 +3,85 @@
|
|
|
3
3
|
**Defined:** {date}
|
|
4
4
|
**Core Value:** {from PROJECT.md — the one thing that must work}
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
Requirements are grouped by the milestone that delivers them. Each requirement
|
|
7
|
+
has a stable REQ-ID and is atomic, testable, and user-centric.
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Milestone 1 · {Name}
|
|
9
12
|
|
|
10
|
-
|
|
13
|
+
Short description of what this milestone delivers for the user.
|
|
14
|
+
|
|
15
|
+
### {Category}
|
|
11
16
|
|
|
12
17
|
- [ ] **{CAT}-01**: {user-centric, testable, atomic capability}
|
|
13
18
|
- [ ] **{CAT}-02**: {capability}
|
|
14
|
-
- [ ] **{CAT}-03**: {capability}
|
|
15
19
|
|
|
16
|
-
### {Category
|
|
20
|
+
### {Category}
|
|
17
21
|
|
|
18
22
|
- [ ] **{CAT}-01**: {capability}
|
|
19
|
-
- [ ] **{CAT}-02**: {capability}
|
|
20
23
|
|
|
21
|
-
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Milestone 2 · {Name}
|
|
27
|
+
|
|
28
|
+
### {Category}
|
|
29
|
+
|
|
30
|
+
- [ ] **{CAT}-03**: {capability}
|
|
31
|
+
- [ ] **{CAT}-04**: {capability}
|
|
32
|
+
|
|
33
|
+
---
|
|
22
34
|
|
|
23
|
-
|
|
35
|
+
## Milestone 3 · {Name}
|
|
24
36
|
|
|
25
37
|
### {Category}
|
|
26
38
|
|
|
27
|
-
- **{CAT}-
|
|
28
|
-
|
|
39
|
+
- [ ] **{CAT}-05**: {capability}
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Handoff
|
|
44
|
+
|
|
45
|
+
Fixed scope for every project. Do not reassign these elsewhere.
|
|
46
|
+
|
|
47
|
+
### Polish
|
|
48
|
+
|
|
49
|
+
- [ ] **HAND-01**: Every user-facing page has all interactive states (hover, focus, loading, error, empty)
|
|
50
|
+
- [ ] **HAND-02**: Responsive verified at 375 / 768 / 1440 / 1920px
|
|
51
|
+
- [ ] **HAND-03**: WCAG AA contrast + keyboard navigation verified
|
|
52
|
+
|
|
53
|
+
### Content + SEO
|
|
54
|
+
|
|
55
|
+
- [ ] **HAND-04**: Real copy replaces all placeholder text
|
|
56
|
+
- [ ] **HAND-05**: Meta tags, OG images, sitemap.xml, robots.txt present
|
|
57
|
+
- [ ] **HAND-06**: Analytics wired (Plausible / PostHog / GA)
|
|
58
|
+
|
|
59
|
+
### Final QA
|
|
60
|
+
|
|
61
|
+
- [ ] **HAND-07**: Full-flow test of every primary user journey
|
|
62
|
+
- [ ] **HAND-08**: Cross-browser verified (Chrome + Safari + Firefox)
|
|
63
|
+
- [ ] **HAND-09**: `/qualia-review` scored diagnostics reviewed, blockers resolved
|
|
64
|
+
|
|
65
|
+
### Handoff
|
|
66
|
+
|
|
67
|
+
- [ ] **HAND-10**: Production URL verified (HTTP 200, auth flow works, latency < 500ms)
|
|
68
|
+
- [ ] **HAND-11**: README updated with architecture, setup, API documentation
|
|
69
|
+
- [ ] **HAND-12**: Credentials document delivered to client (deploy tokens, admin accounts, third-party keys)
|
|
70
|
+
- [ ] **HAND-13**: Recorded walkthrough (Loom or equivalent) delivered
|
|
71
|
+
- [ ] **HAND-14**: `.planning/archive/` contains every milestone's verification reports
|
|
72
|
+
- [ ] **HAND-15**: Final `/qualia-report` submitted, `lifetime.milestones_completed` incremented
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Post-Handoff (v2)
|
|
77
|
+
|
|
78
|
+
Features acknowledged but deferred past initial handoff. Not in current journey.
|
|
79
|
+
|
|
80
|
+
### {Category}
|
|
81
|
+
|
|
82
|
+
- **{CAT}-XX**: {capability}
|
|
83
|
+
|
|
84
|
+
---
|
|
29
85
|
|
|
30
86
|
## Out of Scope
|
|
31
87
|
|
|
@@ -35,35 +91,39 @@ Explicit exclusions with reasoning. Prevents scope creep.
|
|
|
35
91
|
|---------|--------|
|
|
36
92
|
| {feature} | {why excluded} |
|
|
37
93
|
|
|
94
|
+
---
|
|
95
|
+
|
|
38
96
|
## Traceability
|
|
39
97
|
|
|
40
|
-
|
|
98
|
+
Populated during roadmap creation. Every v1 requirement maps to exactly one milestone + phase.
|
|
41
99
|
|
|
42
|
-
| Requirement | Phase | Status |
|
|
43
|
-
|
|
44
|
-
| {CAT}-01 | Phase {N} | Pending |
|
|
100
|
+
| Requirement | Milestone | Phase | Status |
|
|
101
|
+
|-------------|-----------|-------|--------|
|
|
102
|
+
| {CAT}-01 | M1: {name} | Phase {N} | Pending |
|
|
45
103
|
|
|
46
104
|
**Coverage:**
|
|
47
|
-
- v1 requirements: {X} total
|
|
48
|
-
- Mapped to phases: {Y}
|
|
105
|
+
- v1 requirements (all feature milestones + Handoff): {X} total
|
|
106
|
+
- Mapped to milestones + phases: {Y}
|
|
49
107
|
- Unmapped: {Z}
|
|
50
108
|
|
|
51
109
|
---
|
|
52
110
|
|
|
53
111
|
## Requirement Quality Rules
|
|
54
112
|
|
|
55
|
-
1. **ID format:** `{CATEGORY}-{NUMBER}` —
|
|
113
|
+
1. **ID format:** `{CATEGORY}-{NUMBER}` — stable across the project's life
|
|
56
114
|
2. **User-centric:** "User can X" — not "System does Y"
|
|
57
|
-
3. **Atomic:**
|
|
58
|
-
4. **Testable:**
|
|
59
|
-
5. **Independent:**
|
|
115
|
+
3. **Atomic:** one capability per requirement
|
|
116
|
+
4. **Testable:** the observable behavior is nameable
|
|
117
|
+
5. **Independent:** minimal dependencies on other requirements
|
|
118
|
+
6. **Assigned to exactly one milestone:** no duplicates, no gaps
|
|
60
119
|
|
|
61
120
|
## Status Values
|
|
62
121
|
|
|
63
122
|
- **Pending** — not started
|
|
64
|
-
- **In Progress** —
|
|
65
|
-
- **Complete** —
|
|
123
|
+
- **In Progress** — milestone is active, phase in progress
|
|
124
|
+
- **Complete** — verified as passing
|
|
66
125
|
- **Blocked** — waiting on external factor
|
|
67
126
|
|
|
68
127
|
---
|
|
128
|
+
|
|
69
129
|
*Last updated: {date}*
|
package/templates/roadmap.md
CHANGED
|
@@ -1,8 +1,22 @@
|
|
|
1
|
-
# Roadmap
|
|
1
|
+
# Roadmap · Milestone {N} · {Milestone Name}
|
|
2
2
|
|
|
3
|
+
**Project:** {Project Name}
|
|
4
|
+
**Milestone:** {N} of {Total} ({"CURRENT" / shipped})
|
|
3
5
|
**Created:** {date}
|
|
4
|
-
**
|
|
5
|
-
**
|
|
6
|
+
**Phases:** {P}
|
|
7
|
+
**Requirements covered:** {REQ-IDs from this milestone's REQUIREMENTS.md section}
|
|
8
|
+
|
|
9
|
+
See `JOURNEY.md` for the full project arc. This file is ONLY the current milestone's phases.
|
|
10
|
+
|
|
11
|
+
## Exit Criteria
|
|
12
|
+
|
|
13
|
+
What "shipped" means for this milestone:
|
|
14
|
+
|
|
15
|
+
- {observable outcome 1}
|
|
16
|
+
- {observable outcome 2}
|
|
17
|
+
- {observable outcome 3}
|
|
18
|
+
|
|
19
|
+
---
|
|
6
20
|
|
|
7
21
|
## Phases
|
|
8
22
|
|
|
@@ -25,9 +39,8 @@
|
|
|
25
39
|
**Success criteria** (observable user behaviors):
|
|
26
40
|
1. {user can do X}
|
|
27
41
|
2. {user can do Y}
|
|
28
|
-
3. {user can do Z}
|
|
29
42
|
|
|
30
|
-
**Depends on:** none
|
|
43
|
+
**Depends on:** none
|
|
31
44
|
|
|
32
45
|
---
|
|
33
46
|
|
|
@@ -46,26 +59,40 @@
|
|
|
46
59
|
|
|
47
60
|
---
|
|
48
61
|
|
|
49
|
-
|
|
62
|
+
### Phase 3: {Name}
|
|
63
|
+
|
|
64
|
+
**Goal:** {goal}
|
|
65
|
+
|
|
66
|
+
**Requirements covered:**
|
|
67
|
+
- {REQ-ID}: {description}
|
|
68
|
+
|
|
69
|
+
**Success criteria:**
|
|
70
|
+
1. {criterion}
|
|
71
|
+
|
|
72
|
+
**Depends on:** Phase 2
|
|
73
|
+
|
|
74
|
+
---
|
|
50
75
|
|
|
51
76
|
## Coverage Verification
|
|
52
77
|
|
|
53
|
-
|
|
78
|
+
Every requirement in this milestone must map to exactly one phase.
|
|
54
79
|
|
|
55
80
|
| Requirement | Phase | Covered? |
|
|
56
81
|
|-------------|-------|----------|
|
|
57
82
|
| {REQ-ID} | Phase {N} | ✓ |
|
|
58
83
|
|
|
59
|
-
**Coverage:** {X}/{Y} v1 requirements mapped ({100% expected})
|
|
60
|
-
|
|
61
84
|
---
|
|
62
85
|
|
|
63
|
-
##
|
|
86
|
+
## When This Milestone Closes
|
|
64
87
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
88
|
+
Triggered by `/qualia-milestone` after `/qualia-verify` passes on the last phase:
|
|
89
|
+
|
|
90
|
+
1. All phase artifacts are archived to `.planning/archive/milestone-{N}-{slug}/`
|
|
91
|
+
2. `tracking.json` `milestones[]` gets a summary entry (num, name, phases_completed, shipped_url, closed_at)
|
|
92
|
+
3. REQUIREMENTS.md marks this milestone's requirements as **Complete**
|
|
93
|
+
4. Next milestone from JOURNEY.md opens — roadmapper regenerates this ROADMAP.md for Milestone {N+1}
|
|
94
|
+
5. `state.js init --force --milestone_name "{N+1 name}"` resets current-phase fields, preserves lifetime + milestones[] history
|
|
69
95
|
|
|
70
96
|
---
|
|
97
|
+
|
|
71
98
|
*Last updated: {date}*
|