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.
@@ -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 >= 2: state.js returns GAP_CYCLE_LIMIT — tell the employee to escalate.
104
- If FAIL and gap_cycles < 2: proceed to `/qualia-plan {N} --gaps`.
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: {what must be true when done}
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
- **Files:** {files to create or modify}
15
- **Action:** {exactly what to build}
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
- **Done when:** {observable, testable criterion}
39
+
40
+ ---
18
41
 
19
42
  ## Task 2 — {title}
43
+
20
44
  **Wave:** 1
45
+ **Persona:** {optional}
21
46
  **Files:** {files}
22
- **Action:** {what to build}
23
- **Done when:** {criterion}
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 the verifier will run}`
35
- **Expected:** {what the output should be}
36
- **Fail if:** {what constitutes failure}
79
+ **Command:** `{exact command}`
80
+ **Expected:** {output}
81
+ **Fail if:** {failure condition}
37
82
 
38
83
  ### Contract for Task 2 — {title}
39
- **Check type:** {file-exists | grep-match | command-exit | behavioral}
84
+ **Check type:** {type}
40
85
  **Command:** `{exact command}`
41
- **Expected:** {expected output}
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
- ## v1 Requirements
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
- Initial release scope. Each maps to one roadmap phase.
9
+ ---
10
+
11
+ ## Milestone 1 · {Name}
9
12
 
10
- ### {Category 1}
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 2}
20
+ ### {Category}
17
21
 
18
22
  - [ ] **{CAT}-01**: {capability}
19
- - [ ] **{CAT}-02**: {capability}
20
23
 
21
- ## v2 Requirements
24
+ ---
25
+
26
+ ## Milestone 2 · {Name}
27
+
28
+ ### {Category}
29
+
30
+ - [ ] **{CAT}-03**: {capability}
31
+ - [ ] **{CAT}-04**: {capability}
32
+
33
+ ---
22
34
 
23
- Acknowledged but deferred to a future release. Not in current roadmap.
35
+ ## Milestone 3 · {Name}
24
36
 
25
37
  ### {Category}
26
38
 
27
- - **{CAT}-01**: {capability}
28
- - **{CAT}-02**: {capability}
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
- Which phases cover which requirements. Populated during roadmap creation.
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}` — `AUTH-01`, `CONT-02`, `SOCIAL-03`
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:** One capability per requirement — not "User can login and manage profile"
58
- 4. **Testable:** "User can reset password via email link" — not "handle password reset"
59
- 5. **Independent:** Minimal dependencies on other requirements
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** — phase is active
65
- - **Complete** — requirement verified
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}*
@@ -1,8 +1,22 @@
1
- # Roadmap: {Project Name}
1
+ # Roadmap · Milestone {N} · {Milestone Name}
2
2
 
3
+ **Project:** {Project Name}
4
+ **Milestone:** {N} of {Total} ({"CURRENT" / shipped})
3
5
  **Created:** {date}
4
- **Total phases:** {N}
5
- **v1 requirements:** {X} covered
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 (or: Phase {N})
43
+ **Depends on:** none
31
44
 
32
45
  ---
33
46
 
@@ -46,26 +59,40 @@
46
59
 
47
60
  ---
48
61
 
49
- {... continue for all phases ...}
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
- All v1 requirements must map to exactly one phase. Unmapped requirements = roadmap gap.
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
- ## Rules
86
+ ## When This Milestone Closes
64
87
 
65
- 1. **Feature phases only.** No "review" / "deploy" / "handoff" phases — those are driven by `/qualia-polish` `/qualia-ship` `/qualia-handoff` after all feature phases verify.
66
- 2. **Each requirement maps to exactly one phase.** If a requirement spans phases, it's too big — split it.
67
- 3. **Phases are independently verifiable.** A phase completes when its success criteria are observable in a running app.
68
- 4. **Order by dependency, not priority.** Phase 2 should depend on Phase 1's outputs.
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}*
@@ -7,6 +7,8 @@
7
7
  "project_id": "",
8
8
  "git_remote": "",
9
9
  "milestone": 1,
10
+ "milestone_name": "",
11
+ "milestones": [],
10
12
  "phase": 0,
11
13
  "phase_name": "",
12
14
  "total_phases": 0,