@pareto4/pp-core 1.19.0 → 1.21.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.
Files changed (126) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/agents/pp-nyquist-auditor.md +19 -14
  3. package/agents/pp-phase-researcher.md +10 -0
  4. package/agents/pp-plan-checker.md +59 -36
  5. package/agents/pp-planner.md +49 -53
  6. package/agents/pp-vault-reviewer.md +2 -0
  7. package/agents/pp-verifier.md +15 -60
  8. package/commands/pp-autonomous.md +2 -1
  9. package/commands/pp-discovery.md +3 -2
  10. package/commands/pp-plan-phase.md +2 -1
  11. package/commands/pp-plan-review-convergence.md +2 -1
  12. package/gemini-extension.json +1 -1
  13. package/package.json +6 -3
  14. package/pareto-skills/_shared/pp-claude-md-protocol.md +1 -1
  15. package/pareto-skills/pp-project-setup/SKILL.md +18 -343
  16. package/pp-core/bin/lib/capability-activation.cjs +77 -0
  17. package/pp-core/bin/lib/capability-registry.cjs +15 -15
  18. package/pp-core/bin/lib/capability-state.cjs +8 -18
  19. package/pp-core/bin/lib/ceremony.cjs +1342 -0
  20. package/pp-core/bin/lib/check-command-router.cjs +62 -1
  21. package/pp-core/bin/lib/commands.cjs +29 -3
  22. package/pp-core/bin/lib/config.cjs +5 -0
  23. package/pp-core/bin/lib/discovery-access.cjs +276 -0
  24. package/pp-core/bin/lib/discovery-charter.cjs +664 -0
  25. package/pp-core/bin/lib/discovery-deviations.cjs +264 -0
  26. package/pp-core/bin/lib/discovery-entities.cjs +323 -0
  27. package/pp-core/bin/lib/discovery-for-phase.cjs +628 -0
  28. package/pp-core/bin/lib/discovery-integrations.cjs +286 -0
  29. package/pp-core/bin/lib/discovery-migration.cjs +246 -0
  30. package/pp-core/bin/lib/discovery-phases.cjs +233 -0
  31. package/pp-core/bin/lib/discovery-processes.cjs +355 -0
  32. package/pp-core/bin/lib/discovery-research-track.cjs +5 -4
  33. package/pp-core/bin/lib/discovery-rollup.cjs +8 -7
  34. package/pp-core/bin/lib/discovery-rules.cjs +216 -0
  35. package/pp-core/bin/lib/discovery-screens.cjs +1 -1
  36. package/pp-core/bin/lib/discovery-session-check.cjs +264 -0
  37. package/pp-core/bin/lib/discovery-stories.cjs +273 -0
  38. package/pp-core/bin/lib/discovery-sweep.cjs +1 -1
  39. package/pp-core/bin/lib/discovery-table.cjs +55 -0
  40. package/pp-core/bin/lib/init.cjs +50 -1
  41. package/pp-core/bin/lib/io.cjs +24 -0
  42. package/pp-core/bin/lib/loop-resolver.cjs +26 -12
  43. package/pp-core/bin/lib/phase.cjs +39 -3
  44. package/pp-core/bin/lib/plan-sizing.cjs +346 -0
  45. package/pp-core/bin/lib/test-substance.cjs +3190 -0
  46. package/pp-core/bin/lib/timeline.cjs +605 -0
  47. package/pp-core/bin/lib/vault-standards-review.cjs +50 -2
  48. package/pp-core/bin/pp-tools.cjs +214 -5
  49. package/pp-core/bin/shared/ceremony-gates.json +17 -0
  50. package/pp-core/bin/shared/config-schema.manifest.json +1 -0
  51. package/pp-core/references/ceremony.md +81 -0
  52. package/pp-core/references/discovery-access.md +112 -0
  53. package/pp-core/references/discovery-build-consumption.md +256 -0
  54. package/pp-core/references/discovery-charter.md +127 -0
  55. package/pp-core/references/discovery-data-model.md +145 -0
  56. package/pp-core/references/discovery-id-conventions.md +50 -14
  57. package/pp-core/references/discovery-integrations.md +151 -0
  58. package/pp-core/references/discovery-processes.md +190 -0
  59. package/pp-core/references/discovery-rebaseline.md +2 -2
  60. package/pp-core/references/discovery-research-track.md +5 -6
  61. package/pp-core/references/discovery-session-output.md +70 -0
  62. package/pp-core/references/discovery-standards.md +107 -0
  63. package/pp-core/references/discovery-traceability.md +2 -2
  64. package/pp-core/references/few-shot-examples/plan-checker.md +8 -8
  65. package/pp-core/references/phase-timeline.md +107 -0
  66. package/pp-core/references/planner-antipatterns.md +32 -0
  67. package/pp-core/references/planner-discovery-extract.md +35 -0
  68. package/pp-core/references/planner-guidance.md +17 -14
  69. package/pp-core/references/planner-revision.md +1 -1
  70. package/pp-core/references/planning-config.md +3 -2
  71. package/pp-core/references/test-substance.md +324 -0
  72. package/pp-core/references/verifier-discovery-conformance.md +36 -0
  73. package/pp-core/references/verifier-stub-patterns.md +51 -0
  74. package/pp-core/templates/VALIDATION.md +1 -0
  75. package/pp-core/templates/phase-prompt.md +19 -7
  76. package/pp-core/templates/project-charter.md +161 -100
  77. package/pp-core/templates/project.md +3 -3
  78. package/pp-core/templates/requirements.md +18 -0
  79. package/pp-core/templates/roadmap.md +1 -1
  80. package/pp-core/templates/verification-report.md +17 -1
  81. package/pp-core/workflows/audit-milestone.md +4 -1
  82. package/pp-core/workflows/autonomous.md +11 -8
  83. package/pp-core/workflows/code-review.md +15 -6
  84. package/pp-core/workflows/discovery-sprint/charter.md +114 -0
  85. package/pp-core/workflows/discovery-sprint/prefill.md +1 -1
  86. package/pp-core/workflows/discovery-sprint/prototype.md +4 -4
  87. package/pp-core/workflows/discovery-sprint/session-13-gates.md +10 -0
  88. package/pp-core/workflows/discovery-sprint/sessions/01-kick-off.md +5 -2
  89. package/pp-core/workflows/discovery-sprint/sessions/02-as-is.md +27 -5
  90. package/pp-core/workflows/discovery-sprint/sessions/03-to-be.md +56 -31
  91. package/pp-core/workflows/discovery-sprint/sessions/04-ux-design.md +1 -1
  92. package/pp-core/workflows/discovery-sprint/sessions/05-architecture.md +42 -19
  93. package/pp-core/workflows/discovery-sprint/sessions/06-security.md +27 -12
  94. package/pp-core/workflows/discovery-sprint/sessions/07-identity.md +41 -23
  95. package/pp-core/workflows/discovery-sprint/sessions/08-integration.md +50 -23
  96. package/pp-core/workflows/discovery-sprint/sessions/09-qa.md +26 -11
  97. package/pp-core/workflows/discovery-sprint/sessions/10-infrastructure.md +28 -9
  98. package/pp-core/workflows/discovery-sprint/sessions/11-roadmap.md +21 -0
  99. package/pp-core/workflows/discovery-sprint/sessions/13-wrap-up.md +24 -9
  100. package/pp-core/workflows/discovery-sprint.md +12 -15
  101. package/pp-core/workflows/discovery-to-build/steps/architecture-deliverables.md +80 -29
  102. package/pp-core/workflows/discovery-to-build/steps/{screen-inventory-gate.md → handoff-gates.md} +111 -3
  103. package/pp-core/workflows/discovery-to-build/templates/discovery-references.md +12 -9
  104. package/pp-core/workflows/discovery-to-build/templates/pp-handoff.md +27 -26
  105. package/pp-core/workflows/discovery-to-build.md +70 -34
  106. package/pp-core/workflows/discuss-phase/discovery.md +83 -0
  107. package/pp-core/workflows/discuss-phase/templates/context.md +4 -0
  108. package/pp-core/workflows/discuss-phase.md +10 -7
  109. package/pp-core/workflows/execute-phase/steps/check-query-gate.md +7 -7
  110. package/pp-core/workflows/execute-phase/steps/codebase-drift-gate.md +3 -2
  111. package/pp-core/workflows/execute-phase.md +14 -3
  112. package/pp-core/workflows/new-project.md +3 -3
  113. package/pp-core/workflows/plan-phase/steps/chunked-planning.md +7 -3
  114. package/pp-core/workflows/plan-phase/steps/discovery-extract.md +41 -0
  115. package/pp-core/workflows/plan-phase/steps/prd-express.md +104 -0
  116. package/pp-core/workflows/plan-phase.md +62 -124
  117. package/pp-core/workflows/plan-review-convergence.md +6 -3
  118. package/pp-core/workflows/ship.md +2 -2
  119. package/pp-core/workflows/stats.md +19 -4
  120. package/pp-core/workflows/validate-phase.md +19 -4
  121. package/pp-core/workflows/vault-review.md +5 -0
  122. package/pp-core/workflows/verify-phase.md +1 -1
  123. package/pp-core/workflows/verify-work.md +1 -1
  124. package/scripts/gen-capability-registry.cjs +43 -45
  125. package/scripts/run-tests.cjs +54 -30
  126. package/pp-core/workflows/discovery-sprint/templates/context-template.md +0 -272
@@ -1,32 +1,51 @@
1
1
  # Project Charter Template
2
2
 
3
- Template for `.planning/discovery/PROJECT-CHARTER.md`, the document every stakeholder signs at the end
4
- of a Discovery Sprint.
3
+ Template for `docs/discovery/PROJECT-CHARTER.md`, the document every stakeholder signs at the end of a
4
+ Discovery Sprint. It lives under `docs/` because it is client-visible, like `docs/architecture/`;
5
+ `.planning/discovery/` holds the facilitation record it condenses.
5
6
 
6
7
  **Purpose:** one short, fixed-shape document that states what will be built, why, for whom, how it will
7
- be delivered and on what conditions, so that sign-off is a decision on the same questions in the same
8
- order for every engagement. It summarises the thirteen session files; it does not replace them.
9
-
10
- **When:** after Session 13 (wrap-up and Go / No-Go), before `/pp-discovery-to-build`.
11
-
12
- **Shape is fixed.** Every charter has the same 14 numbered sections in the same order, with the same
13
- headings and the same table columns. A section with nothing to report stays in place and says so; it is
14
- never dropped, merged or renumbered. That is what lets a reader compare two charters side by side.
8
+ be delivered, where it departs from the standards and on what conditions, so that sign-off is a decision
9
+ on the same questions in the same order for every engagement. It summarises the thirteen session files
10
+ and the discovery registers; it does not replace them.
11
+
12
+ **When:** drafted in Session 13 Step 0.5 (after the cross-reference, before the wrap-up topics), reviewed
13
+ in topics 2–3, set to `For sign-off` at the Closing Step, and required `Signed` or `Signed with
14
+ conditions` by `/pp-discovery-to-build`. The drafting procedure is
15
+ `workflows/discovery-sprint/charter.md`; the parser contract and the heading translations are in
16
+ `references/discovery-charter.md`.
17
+
18
+ **Shape is fixed.** Every charter has the same 20 numbered sections in the same order, with the same
19
+ table columns. A section with nothing to report stays in place and says so; it is never dropped, merged
20
+ or renumbered. That is what lets a reader compare two charters side by side, and what lets
21
+ `pp_run query discovery.charter-check` verify one.
22
+
23
+ **Language.** The charter is written in the sprint language — the `Charter language` row of Session 1's
24
+ Sprint Logistics, else `discovery.language` in `.planning/config.json`, else the language the sprint
25
+ was facilitated in. Headings, labels and prose are translated; the `<!-- charter:<key> -->` heading
26
+ keys, the frontmatter fields and every enum cell (`status`, `go_no_go`, `Green / Amber / Red`,
27
+ `Approve / Approve with conditions / Reject`, `Yes / No`) stay in English, because the check reads them.
28
+ Column order is fixed; column headings may be translated.
15
29
 
16
30
  ---
17
31
 
18
32
  ## File Template
19
33
 
20
- ```markdown
34
+ Copy verbatim, then fill. Tables carry no example rows: a row is written only when a session table
35
+ supplies it. The frontmatter placeholders `0000-00-00`, `0/13` and `und` are valid to the check and are
36
+ replaced by the drafting step.
37
+
38
+ ````markdown
21
39
  ---
22
40
  document: project-charter
23
41
  project: [Project name]
24
42
  client: [Client name]
25
- version: [1.0]
26
- status: [Draft | For sign-off | Signed | Signed with conditions | Rejected]
27
- date: [YYYY-MM-DD]
28
- discovery_sessions_completed: [N]/13
29
- go_no_go: [Go | Go with conditions | No-Go]
43
+ version: 1.0
44
+ status: Draft
45
+ date: 0000-00-00
46
+ language: und
47
+ discovery_sessions_completed: 0/13
48
+ go_no_go: Pending
30
49
  ---
31
50
 
32
51
  # [Project name] — Project Charter
@@ -36,61 +55,68 @@ go_no_go: [Go | Go with conditions | No-Go]
36
55
  | Document control | |
37
56
  |---|---|
38
57
  | Client | [Client name] |
39
- | Version / status | [1.0] · [Draft] |
40
- | Date | [YYYY-MM-DD] |
58
+ | Version / status | 1.0 · Draft |
59
+ | Date | 0000-00-00 |
41
60
  | Prepared by | [Name, role] |
42
- | Based on | Discovery Sprint sessions 1–13, completed [YYYY-MM-DD] |
61
+ | Based on | Discovery Sprint sessions 1–13, completed 0000-00-00 |
43
62
 
44
63
  ---
45
64
 
46
- ## 1. Purpose and background
65
+ ## 1. Purpose and background <!-- charter:purpose -->
47
66
 
48
67
  [Two to four sentences: the business problem and why it matters now.]
49
68
 
50
69
  **Top pain points today**
51
70
 
52
- | # | Pain point | Who is affected | Impact |
53
- |---|---|---|---|
54
- | 1 | | | |
71
+ | # | Pain point | Who is affected | Impact | Source |
72
+ |---|---|---|---|---|
55
73
 
56
- ## 2. Objectives and success measures
74
+ ## 2. Objectives and success measures <!-- charter:objectives -->
57
75
 
58
- | # | Objective | KPI | Baseline | Target | Measured by |
76
+ | ID | Objective | KPI | Baseline | Target | Measured by |
59
77
  |---|---|---|---|---|---|
60
- | O-1 | | | | | |
61
78
 
62
- ## 3. Scope
79
+ ## 3. Scope <!-- charter:scope -->
63
80
 
64
81
  **In scope (MVP)**
65
82
 
66
- | EPIC | Title | Priority |
67
- |---|---|---|
68
- | | | |
83
+ | EPIC | Title | Priority | Requirements |
84
+ |---|---|---|---|
69
85
 
70
86
  **Out of scope**
71
87
 
72
- - [Item] — [reason or later release]
88
+ | Item | Reason | Decision |
89
+ |---|---|---|
73
90
 
74
- **Requirements:** [N] functional, [N] non-functional, [N] business rules, as registered in
75
- `_requirements.md`.
91
+ **Requirements:** [one count per registered prefix, then the dropped count — `K- 12 · N- 4 · T- 3 · Dropped 1`] <!-- charter:counts -->
76
92
 
77
- ## 4. Stakeholders and users
93
+ ## 4. Stakeholders and users <!-- charter:stakeholders -->
78
94
 
79
95
  | Stakeholder | Role | Decision authority | Involvement |
80
96
  |---|---|---|---|
81
- | | | | |
82
97
 
83
98
  | Persona | Description | Main goal |
84
99
  |---|---|---|
85
- | | | |
86
100
 
87
- ## 5. Solution overview
101
+ ## 5. Approvals and role holders <!-- charter:approvals -->
102
+
103
+ | Approval | Approver | Consulted | Source |
104
+ |---|---|---|---|
105
+
106
+ | Role | Holder | Source |
107
+ |---|---|---|
108
+ | Privacy owner | | |
109
+ | Security owner | | |
110
+ | Incident contact | | |
111
+ | Architect (signs deviations) | | |
112
+
113
+ ## 6. Solution overview <!-- charter:solution -->
88
114
 
89
115
  [Two to four sentences: the shape of the solution.]
90
116
 
91
117
  | Layer | Choice | Decision |
92
118
  |---|---|---|
93
- | Frontend | | [D-05-n] |
119
+ | Frontend | | |
94
120
  | Backend | | |
95
121
  | Data | | |
96
122
  | Hosting | | |
@@ -98,129 +124,164 @@ go_no_go: [Go | Go with conditions | No-Go]
98
124
 
99
125
  **Integrations**
100
126
 
101
- | System | Direction | Purpose |
127
+ | ID | System | Direction | Purpose |
128
+ |---|---|---|---|
129
+
130
+ ## 7. Deviations from standards <!-- charter:deviations -->
131
+
132
+ | ID | Standard | Choice | Reason | Reversible | Approver | Decision | Status |
133
+ |---|---|---|---|---|---|---|---|
134
+
135
+ ## 8. Data <!-- charter:data -->
136
+
137
+ | Aspect | Statement | Source |
102
138
  |---|---|---|
103
- | | | |
139
+ | Highest data classification | | |
140
+ | Personal data processed | | |
141
+ | Controller / processor role | | |
142
+ | Retention headline | | |
143
+ | Availability target (RTO / RPO) | | |
104
144
 
105
- **Security and compliance:** [data classification, applicable regulations, availability target, in two to
106
- four lines.]
145
+ ## 9. Quality and acceptance <!-- charter:quality -->
107
146
 
108
- ## 6. Quality and acceptance
147
+ | Gate | Criterion | Approved by |
148
+ |---|---|---|
149
+ | UAT sign-off | | |
150
+ | Go-live readiness | | |
109
151
 
110
- | Gate | Criterion |
111
- |---|---|
112
- | UAT sign-off | [criteria] — approved by [role] |
113
- | Go-live readiness | [criteria] |
152
+ ## 10. What was validated <!-- charter:validated -->
114
153
 
115
- ## 7. Delivery plan
154
+ | Round | Prototype version | Flows validated | Verdicts (change / keep / drop / question) | Closed? |
155
+ |---|---|---|---|---|
156
+
157
+ **Screens:** [n] required, [n] deferred, [n] MVP requirements in the no-screen bucket with a reason, 0 uncovered — as `_screens.md` records them.
116
158
 
117
- | Milestone | Target date | Included EPICs | Exit criteria |
159
+ ## 11. Delivery plan <!-- charter:delivery -->
160
+
161
+ | Milestone | Target | Included EPICs | Exit criteria |
118
162
  |---|---|---|---|
119
- | [v1.0 — MVP] | | | |
120
163
 
121
164
  **Build order:** [EPIC order and why.]
122
165
 
123
- ## 8. Team and governance
166
+ ## 12. Team and governance <!-- charter:team -->
124
167
 
125
168
  | Role | Name / party | Responsibility |
126
169
  |---|---|---|
127
- | | | |
128
170
 
129
171
  **Scope changes are approved by:** [role]. **Progress is reported:** [cadence, format].
130
172
 
131
- ## 9. Budget, constraints and assumptions
173
+ ## 13. Budget, constraints and assumptions <!-- charter:budget -->
132
174
 
133
175
  | Type | Item | Source |
134
176
  |---|---|---|
135
- | Budget | [amount or "Not decided in Discovery — OI-n"] | |
136
- | Constraint | | |
137
- | Assumption | | |
138
177
 
139
- ## 10. Risks
178
+ ## 14. Risks <!-- charter:risks -->
140
179
 
141
- | # | Risk | Likelihood | Impact | Mitigation | Owner |
180
+ | ID | Risk | Likelihood | Impact | Mitigation | Owner |
142
181
  |---|---|---|---|---|---|
143
- | R-1 | | | | | |
144
182
 
145
- ## 11. Open items
183
+ ## 15. Open items <!-- charter:open-items -->
146
184
 
147
- | ID | Item | Must resolve before build? | Owner | Target date |
148
- |---|---|---|---|---|
149
- | OI-1 | | | | |
185
+ | ID | Item | Must resolve before build? | Owner | Target date | Status |
186
+ |---|---|---|---|---|---|
187
+
188
+ ## 16. Conditions <!-- charter:conditions -->
189
+
190
+ | Kind | ID | Statement | Resolution |
191
+ |---|---|---|---|
150
192
 
151
- ## 12. Go / No-Go recommendation
193
+ ## 17. Go / No-Go recommendation <!-- charter:go-no-go -->
152
194
 
153
195
  | Criterion | Status | Note |
154
196
  |---|---|---|
155
- | Business requirements clarity | [Green / Amber / Red] | |
197
+ | Business requirements clarity | | |
156
198
  | Technical architecture feasibility | | |
157
199
  | Security and compliance readiness | | |
158
200
  | Integration dependencies resolved | | |
159
201
  | Team and budget availability | | |
160
202
  | Timeline confidence | | |
161
203
  | Stakeholder alignment | | |
162
- | **Overall recommendation** | **[Go / Go with conditions / No-Go]** | |
204
+ | **Overall recommendation** | | |
163
205
 
164
- **Conditions:** [each condition attached to a Go, or "None".]
165
-
166
- ## 13. Key decisions
206
+ ## 18. Key decisions <!-- charter:decisions -->
167
207
 
168
208
  | ID | Decision | Rationale | Owner |
169
209
  |---|---|---|---|
170
- | D-01-1 | | | |
171
210
 
172
- ## 14. Sign-off
211
+ ## 19. Sign-off <!-- charter:sign-off -->
173
212
 
174
- By signing, each party agrees that sections 1–13 describe the project to be built, subject to the
175
- conditions stated.
213
+ By signing, each party agrees that sections 1–18 describe the project to be built, subject to the
214
+ conditions in § 16.
176
215
 
177
216
  | Role | Name | Decision | Conditions | Date | Signature |
178
217
  |---|---|---|---|---|---|
179
- | [Sponsor] | | [Approve / Approve with conditions / Reject] | | | |
218
+ | [Sponsor] | | | | | |
180
219
  | [Product owner] | | | | | |
181
220
  | [Delivery lead] | | | | | |
182
221
 
222
+ ## 20. Version history <!-- charter:history -->
223
+
224
+ | Version | Date | Status | Change | Decision |
225
+ |---|---|---|---|---|
226
+ | 1.0 | 0000-00-00 | Draft | Initial draft from Sessions 1–13 | — |
227
+
183
228
  ---
184
229
 
185
- **Source files:** `.planning/discovery/session-01.md` … `session-13.md`, `_requirements.md`.
186
- ```
230
+ **Source files:** `.planning/discovery/session-01.md` … `session-13.md`, `_requirements.md`, `_screens.md`,
231
+ `_feedback.md`, `_research.md`, `_deviations.md`.
232
+ ````
187
233
 
188
234
  ---
189
235
 
190
236
  ## Where each section comes from
191
237
 
192
- Fill every section from the session tables below and nothing else. The session files are the source of
193
- truth; the charter only condenses them.
238
+ Fill every section from the tables below and nothing else. The session files and the registers are the
239
+ source of truth; the charter only condenses them.
194
240
 
195
241
  | § | Section | Source (file § table) |
196
242
  |---|---|---|
197
- | — | Front matter, document control | `_progress.md` (completion dates); Session 1 § Stakeholder Register (client) |
198
- | 1 | Purpose and background | Session 1 § Business Vision Summary; Session 2 § Pain Points Register (top 3–5 by impact) |
199
- | 2 | Objectives and success measures | Session 3 § Business Objectives |
200
- | 3 | Scope | Session 3 § MVP Scope Boundary and § EPIC Register; counts from the roll-up block in `_requirements.md` |
243
+ | — | Front matter, document control | `_progress.md` (completion dates); Session 1 § Stakeholder Register (client); language per the rule above |
244
+ | 1 | Purpose and background | Session 1 § Business Vision Summary; Session 2 § Pain Points Register (top 3–5 by impact, `PP-` IDs in Source) |
245
+ | 2 | Objectives and success measures | Session 3 § Business Objectives (`BO-` IDs); a column the source table does not have (Baseline, say) reads `—` |
246
+ | 3 | Scope | Session 3 § MVP Scope Boundary and § EPIC Register (`E-` IDs, each with the requirement IDs it groups — from the register's requirement column when it has one, else from the Step Matrices' Requirements cells grouped by EPIC); out-of-scope items with their `D-` decision; counts from the roll-up block of `_requirements.md` |
201
247
  | 4 | Stakeholders and users | Session 1 § Stakeholder Register; Session 4 § Refined Personas (else Session 2 § User Personas) |
202
- | 5 | Solution overview | Session 5 § Technology Stack Decisions and § Architecture Decision Records; Session 8 § Integration Design Register; Session 6 § Data Classification Matrix, § Compliance Requirements Register, § Availability and DR Targets; Session 7 § IdP Integration Design |
203
- | 6 | Quality and acceptance | Session 9 § UAT Process and § Quality Gates; Session 10 § Go-Live Readiness Checklist |
204
- | 7 | Delivery plan | Session 11 § Milestone Plan, § Project Timeline, § EPIC Build Order |
205
- | 8 | Team and governance | Session 12 § Team Structure and § Governance Structure; reporting cadence from Session 12 topic "Communication and reporting" |
206
- | 9 | Budget, constraints and assumptions | Session 1 § Constraints and Risks Register; any `[needs-business-input]` item still parked |
207
- | 10 | Risks | Session 11 § Risk Register, plus open risks from Session 1 § Constraints and Risks Register |
208
- | 11 | Open items | Session 13 § Open Items Register |
209
- | 12 | Go / No-Go recommendation | Session 13 § Go / No-Go Assessment (copied as recorded, not re-scored) |
210
- | 13 | Key decisions | § Key Decisions of every session — only decisions that change scope, architecture, cost or timeline |
211
- | 14 | Sign-off | Session 1 § Stakeholder Register — every stakeholder with approval authority gets a row |
248
+ | 5 | Approvals and role holders | Session 1 § Approval Matrix (one row each, Source `[vault: <path>]` or `room`); a Session 1 that predates the matrix gives the Stakeholder Register's decision-authority column instead. Role holders (privacy owner, security owner, incident contact, architect) from the Key Decision of any session that names one — `Not decided in Discovery — OI-n` when none does |
249
+ | 6 | Solution overview | Session 5 § Technology Stack Decisions (`D-05-n`) and § Architecture Decision Records; Session 8 § Integration Design Register (`IF-` IDs); Session 7 § IdP Integration Design |
250
+ | 7 | Deviations from standards | `_deviations.md` (`DEV-` IDs, every row — `charter-check` reports a row left out) when it exists; until then every **Deviation Record** table a session carries (Sessions 5–10, `ADR-` IDs, Status as signed or superseded) plus every Sessions 4–10 **Standards Applied** row whose Deviation is not `none`, each with its `D-ss-n` |
251
+ | 8 | Data | Session 6 § Data Classification Matrix, § Compliance Requirements Register, § Availability and DR Targets; Session 2 § Data Entity Map for personal data |
252
+ | 9 | Quality and acceptance | Session 9 § UAT Process and § Quality Gates; Session 10 § Go-Live Readiness Checklist |
253
+ | 10 | What was validated | `_feedback.md` (one row per round: verdict counts, whether every `Processing` cell is closed); `_screens.md` (required / deferred counts, and the number of MVP requirements in the no-screen bucket — uncovered requirements are always 0 once `screen-check` passes); `prototype/README.md` (flows, version) |
254
+ | 11 | Delivery plan | Session 11 § Milestone Plan, § Project Timeline, § EPIC Build Order |
255
+ | 12 | Team and governance | Session 12 § Team Structure and § Governance Structure; reporting cadence from Session 12 topic "Communication and reporting" |
256
+ | 13 | Budget, constraints and assumptions | Session 1 § Constraints and Risks Register (`CON-` IDs); any `[needs-business-input]` item still parked. IDs are copied as minted — an engagement that minted `C1`/`R1` without a hyphen keeps them, and those rows are then outside the families `charter-check` resolves |
257
+ | 14 | Risks | Session 11 § Risk Register plus open risks from Session 1 § Constraints and Risks Register (`R-` IDs, as minted) |
258
+ | 15 | Open items | Session 13 § Open Items Register, row for row, in the charter's six columns — `Source Session` and `Priority` stay in the register (`OI-` IDs) |
259
+ | 16 | Conditions | every condition attached to a `Go with conditions` (an Amber row under a plain `Go` is not a condition; it stays an open item); every section carrying `⚠️ CONDITIONAL — <RS-nn\|DG-nn>` (from the sessions' `conditional:` frontmatter); every open `Gates-MVP` row of `_research.md`; every `Dropped (D-ss-n)` row of `_requirements.md`; every Session 13 open item that must resolve before build and is still open |
260
+ | 17 | Go / No-Go recommendation | Session 13 § Go / No-Go Assessment, copied as recorded — the eight rows in order, status cells verbatim |
261
+ | 18 | Key decisions | § Key Decisions of every session — only decisions that change scope, architecture, cost or timeline |
262
+ | 19 | Sign-off | Session 1 § Stakeholder Register and § Approval Matrix — every party with approval authority gets a row |
263
+ | 20 | Version history | one row per version of this document; the last row's version equals the frontmatter `version` |
212
264
 
213
265
  ## Fill rules
214
266
 
215
267
  - **Never invent.** Every statement traces to a session table above. A value Discovery did not settle is
216
- written as `Not decided in Discovery — OI-n`, and that item appears in § 11 Open items.
217
- - **Keep the IDs.** Requirement, EPIC, decision (`D-<ss>-<n>`), risk and open-item IDs are copied
218
- exactly as the session files write them, so every line can be traced back.
268
+ written as `Not decided in Discovery — OI-n`, and that item appears in § 15 Open items.
269
+ - **Keep the IDs.** Requirement, EPIC, decision (`D-<ss>-<n>`), risk, open-item, screen and deviation IDs
270
+ are copied exactly as the session files and registers write them. `charter-check` resolves every ID a
271
+ table cell cites; an ID nothing minted is a fault.
219
272
  - **Condense, don't copy.** Tables carry the headline rows; the full detail stays in the session files.
220
273
  Aim for a charter that reads in about fifteen minutes.
221
- - **Fixed shape.** Keep all 14 sections, their numbers, headings and table columns. An empty section
222
- says `None identified in Discovery.`
223
- - **Go / No-Go is recorded, not re-judged.** § 12 copies Session 13's assessment and conditions verbatim.
274
+ - **Fixed shape.** Keep all 20 sections, their keys, their order and their table columns. An empty table
275
+ stays in place with no rows, and the section's prose says `None identified in Discovery.` (in the
276
+ sprint language). The **Source files** footer names only the files that exist in this engagement.
277
+ - **Go / No-Go is recorded, not re-judged.** § 17 copies Session 13's assessment verbatim and the
278
+ frontmatter `go_no_go` equals its overall recommendation; `Pending` is allowed only while `status`
279
+ is `Draft`.
280
+ - **Conditions are the honest qualifiers of the sign-off.** A Session 13 open item marked
281
+ `Yes` under *Must resolve before build?* is either closed in Session 13 or listed in § 16.
224
282
  - **Status follows the signatures.** `Draft` while being written, `For sign-off` once circulated,
225
- `Signed` when every § 14 row says Approve, `Signed with conditions` when any row approves with
226
- conditions, `Rejected` when any row rejects. A new version resets the status to `Draft`.
283
+ `Signed` when every § 19 row says `Approve`, `Signed with conditions` when any row approves with
284
+ conditions, `Rejected` when any row rejects.
285
+ - **A change is a new version.** Any edit after `For sign-off` adds a § 20 row, bumps `version`,
286
+ resets `status` to `Draft` and regenerates the exports (`workflows/discovery-sprint/charter.md`
287
+ § Redraft). The markdown is the source; `PROJECT-CHARTER.docx` and `.pdf` next to it are renderings.
@@ -68,9 +68,9 @@ Common types: Tech stack, Timeline, Budget, Dependencies, Compatibility, Perform
68
68
 
69
69
  <!-- Decisions that constrain future work. Add throughout project lifecycle. -->
70
70
 
71
- | Decision | Rationale | Outcome |
72
- |----------|-----------|---------|
73
- | [Choice] | [Why] | [✓ Good / ⚠️ Revisit / — Pending] |
71
+ | ID | Decision | Rationale | Outcome |
72
+ |----|----------|-----------|---------|
73
+ | [D-<ss>-<n> from Discovery, or —] | [Choice] | [Why] | [✓ Good / ⚠️ Revisit / — Pending] |
74
74
 
75
75
  ---
76
76
  *Last updated: [date] after [trigger]*
@@ -107,6 +107,24 @@ Which phases cover which requirements. Updated during roadmap creation.
107
107
  - Complete: Requirement verified
108
108
  - Blocked: Waiting on external factor
109
109
 
110
+ **Discovery variant (projects handed over by `/pp-discovery-to-build`):**
111
+ - Every line is one `_requirements.md` row with its minted ID; nothing is renumbered
112
+ - The description is followed by ` — <MoSCoW> · <Disposition> · <Provenance>` copied from the row
113
+ (`Must · MVP · [03 §2.1]`), and the acceptance criteria follow on an indented `- AC:` line, verbatim
114
+ - `MVP` rows are v1, `Later` rows are v2, `Dropped (D-ss-n)` rows are Out of Scope with the decision
115
+ as the reason; the `**ID**` lead keeps every existing parser working
116
+
117
+ ```markdown
118
+ ### Order Intake (E-01)
119
+
120
+ - [ ] **K-01**: User can create a task — Must · MVP · [03 §2.1]
121
+ - AC: A task appears in the list within one second of saving
122
+ ```
123
+
124
+ The planner and verifier read the same rows through `pp_run query discovery.for-phase <N>`
125
+ (`references/discovery-build-consumption.md`); this file is the roadmap-side mirror, not a second
126
+ source.
127
+
110
128
  </guidelines>
111
129
 
112
130
  <evolution>
@@ -107,7 +107,7 @@ Phases execute in numeric order: 2 → 2.1 → 2.2 → 3 → 3.1 → 4
107
107
  **Initial planning (v1.0):**
108
108
  - Phase count depends on granularity setting (coarse: 3-5, standard: 5-8, fine: 8-12)
109
109
  - Each phase delivers something coherent
110
- - Phases can have 1+ plans (split if >3 tasks or multiple subsystems)
110
+ - Phases can have 1+ plans (split only for parallelism across independent subsystems or when the work exceeds the per-plan context budget; up to 6 tasks per plan)
111
111
  - Plans use naming: {phase}-{plan}-PLAN.md (e.g., 01-02-PLAN.md)
112
112
  - No time estimates (this isn't enterprise PM)
113
113
  - Progress table updated by execute workflow
@@ -69,6 +69,22 @@ behavior_unverified_items: # Only if behavior_unverified > 0 — the truths abov
69
69
 
70
70
  **Coverage:** {N}/{M} requirements satisfied
71
71
 
72
+ ## Discovery conformance
73
+
74
+ {Only on a project that ran the Discovery Sprint — omit the whole section otherwise. The block is
75
+ rendered by `pp_run query discovery.for-phase {X} --conformance-template`, one row per Discovery
76
+ register row citing this phase's requirement IDs; the verifier fills Status and Evidence and checks
77
+ it with `--verify`. Status is exactly `honoured`, `amended (D-P<nn>-<n>)` or `missed`; a `missed`
78
+ row is a gap. Contract: `references/discovery-build-consumption.md`.}
79
+
80
+ <!-- discovery:conformance -->
81
+ | Artifact | Row | Status | Evidence |
82
+ |---|---|---|---|
83
+ | `_requirements.md` | {K-01} | honoured | {file:line or test that realises the acceptance criteria} |
84
+ | `_processes.md` | {MP-01 #3} | amended (D-P{XX}-{n}) | {the amended cell the build matches} |
85
+ | `_rules.md` | {BR-02} | missed | {what contradicts or is absent} |
86
+ <!-- /discovery:conformance -->
87
+
72
88
  ## Anti-Patterns Found
73
89
 
74
90
  | File | Line | Pattern | Severity | Impact |
@@ -193,7 +209,7 @@ None — all verifiable items checked programmatically.
193
209
  **Fix plan generation:**
194
210
  - Only generate if gaps_found
195
211
  - Group related fixes into single plans
196
- - Keep to 2-3 tasks per plan
212
+ - Size each fix plan by estimated context cost (up to 6 tasks per plan)
197
213
  - Include verification task in each plan
198
214
 
199
215
  ---
@@ -163,8 +163,11 @@ Classify per phase:
163
163
  | COMPLIANT | `nyquist_compliant: true` and all tasks green |
164
164
  | PARTIAL | VALIDATION.md exists, `nyquist_compliant: false` or red/pending |
165
165
  | MISSING | No VALIDATION.md |
166
+ | SKIPPED | No VALIDATION.md and the phase verdict skipped the Nyquist audit — report `skipped (ceremony: <reason>)`, never MISSING |
166
167
 
167
- Add to audit YAML: `nyquist: { compliant_phases, partial_phases, missing_phases, overall }`
168
+ Before marking a phase MISSING, read `pp_run ceremony get "<phase number>" --pick gates.nyquist.report`; when it starts with `skipped (ceremony:` the status is SKIPPED. A failed read leaves the phase MISSING. A SKIPPED phase does not lower `overall`.
169
+
170
+ Add to audit YAML: `nyquist: { compliant_phases, partial_phases, missing_phases, skipped_phases, overall }`
168
171
 
169
172
  Discovery only — never auto-calls `/pp:validate-phase`.
170
173
 
@@ -16,7 +16,7 @@ Read all files referenced by the invoking prompt's execution_context before star
16
16
 
17
17
  ## 1. Initialize
18
18
 
19
- Parse `$ARGUMENTS` for `--from N`, `--to N`, `--only N`, `--interactive`, `--supervised`, `--converge`/`--cross-ai`, reviewer selector flags, and `--max-cycles N`:
19
+ Parse `$ARGUMENTS` for `--from N`, `--to N`, `--only N`, `--interactive`, `--supervised`, `--converge`/`--cross-ai`, `--full`, reviewer selector flags, and `--max-cycles N`:
20
20
 
21
21
  ```bash
22
22
  FROM_PHASE=""
@@ -44,6 +44,8 @@ SUPERVISED=""
44
44
  if echo "$ARGUMENTS" | grep -q '\-\-supervised'; then SUPERVISED="true"; fi
45
45
  UNATTENDED_ARG=""
46
46
  if [ -z "$SUPERVISED" ]; then UNATTENDED_ARG=" --unattended"; fi
47
+ FULL_ARG=""
48
+ if echo "$ARGUMENTS" | grep -qE '(^|[[:space:]])--full([[:space:]]|$)'; then FULL_ARG=" --full"; fi
47
49
 
48
50
  PLAN_STRATEGY="local"
49
51
  if echo "$ARGUMENTS" | grep -qE '(^|[[:space:]])\-\-(converge|cross-ai)([[:space:]]|$)'; then
@@ -62,11 +64,12 @@ if echo "$ARGUMENTS" | grep -qE '\-\-max-cycles\s+[0-9]+'; then
62
64
  MAX_CYCLES_ARG=$(echo "$ARGUMENTS" | grep -oE '\-\-max-cycles\s+[0-9]+' | awk '{print $2}')
63
65
  CONVERGENCE_ARGS="${CONVERGENCE_ARGS} --max-cycles ${MAX_CYCLES_ARG}"
64
66
  fi
67
+ CONVERGENCE_ARGS="${CONVERGENCE_ARGS}${FULL_ARG}"
65
68
  ```
66
69
 
67
70
  When `--interactive` is set, discuss runs inline with questions (not auto-answered). On runtimes where a backgrounded agent can spawn subagents, plan and execute are dispatched as background agents — keeping the main context lean (only discuss conversations accumulate) and enabling overlap. On Claude Code, where a backgrounded agent cannot nest subagents, plan and execute run inline to preserve worktree isolation and independent verification, so they run sequentially and their work accumulates in the main context. Either way, user input is preserved on all design decisions.
68
71
 
69
- When `PLAN_STRATEGY=converge`, the planning step MUST invoke the plan-review convergence workflow instead of `pp-plan-phase`. `--cross-ai` is an alias for `--converge`. Forward `CONVERGENCE_ARGS` exactly as parsed so reviewer flags and `--max-cycles N` retain the same meaning as they have on `/pp:plan-review-convergence`.
72
+ When `PLAN_STRATEGY=converge`, the planning step MUST invoke the plan-review convergence workflow instead of `pp-plan-phase`. `--cross-ai` is an alias for `--converge`. Forward `CONVERGENCE_ARGS` exactly as parsed so reviewer flags and `--max-cycles N` retain the same meaning as they have on `/pp:plan-review-convergence`. `--full` is forwarded the same way and reaches every plan-phase call the convergence loop makes; it is never passed to execute-phase.
70
73
 
71
74
  With `--supervised` every prompt appears as before; otherwise each decision is best-effort and recorded (reference § Rules). `--interactive` only moves discuss inline.
72
75
 
@@ -286,7 +289,7 @@ Resolve active `plan:pre` hooks:
286
289
  ```bash
287
290
  [ -z "${ZSH_VERSION:-}" ] || emulate -R sh
288
291
  UI_SPEC_FILE=$(ls "${PHASE_DIR}"/*-UI-SPEC.md 2>/dev/null | head -1)
289
- HOOKS_JSON=$(pp_run loop render-hooks plan:pre --raw)
292
+ HOOKS_JSON=$(pp_run loop render-hooks plan:pre --raw --phase "${PHASE_NUM}")
290
293
  printf '%s' "$HOOKS_JSON" | node -e "let h=[];try{h=JSON.parse(require('fs').readFileSync(0,'utf-8')).activeHooks||[]}catch{}console.log('HOOKS_JSON='+JSON.stringify({activeHooks:h}))"
291
294
  ```
292
295
 
@@ -404,7 +407,7 @@ RUNTIME=$(pp_run query config-get runtime --default claude --raw 2>/dev/null ||
404
407
  - Otherwise (local planning):
405
408
 
406
409
  ```
407
- Skill(skill="pp-plan-phase", args="${PHASE_NUM}${UNATTENDED_ARG}")
410
+ Skill(skill="pp-plan-phase", args="${PHASE_NUM}${UNATTENDED_ARG}${FULL_ARG}")
408
411
  ```
409
412
 
410
413
  - **On other runtimes:** Dispatch plan as a background agent to keep the main context lean. While plan runs, the workflow can immediately start discussing the next phase (see step 4).
@@ -425,7 +428,7 @@ RUNTIME=$(pp_run query config-get runtime --default claude --raw 2>/dev/null ||
425
428
  Agent(
426
429
  description="Plan phase ${PHASE_NUM}: ${PHASE_NAME}",
427
430
  run_in_background=true,
428
- prompt="Run plan-phase for phase ${PHASE_NUM}: Skill(skill=\"pp-plan-phase\", args=\"${PHASE_NUM}${UNATTENDED_ARG}\")"
431
+ prompt="Run plan-phase for phase ${PHASE_NUM}: Skill(skill=\"pp-plan-phase\", args=\"${PHASE_NUM}${UNATTENDED_ARG}${FULL_ARG}\")"
429
432
  )
430
433
  ```
431
434
 
@@ -442,7 +445,7 @@ Skill(skill="pp-plan-review-convergence", args="${PHASE_NUM} ${CONVERGENCE_ARGS}
442
445
  If `PLAN_STRATEGY=local`, run the regular planner:
443
446
 
444
447
  ```
445
- Skill(skill="pp-plan-phase", args="${PHASE_NUM}${UNATTENDED_ARG}")
448
+ Skill(skill="pp-plan-phase", args="${PHASE_NUM}${UNATTENDED_ARG}${FULL_ARG}")
446
449
  ```
447
450
 
448
451
  Verify plan produced output — re-run `init phase-op` and check `has_plans`. If false → go to handle_blocker: "Plan phase ${PHASE_NUM} did not produce any plans."
@@ -535,7 +538,7 @@ Phase ${PHASE_NUM} ✅ ${PHASE_NAME} — Verification passed
535
538
  **If `gaps_found`:** rule A-3 — one closure attempt:
536
539
 
537
540
  ```
538
- Skill(skill="pp-plan-phase", args="${PHASE_NUM} --gaps${UNATTENDED_ARG}")
541
+ Skill(skill="pp-plan-phase", args="${PHASE_NUM} --gaps${UNATTENDED_ARG}${FULL_ARG}")
539
542
  ```
540
543
 
541
544
  Verify gap plans were created — re-run `init phase-op ${PHASE_NUM}` and check `has_plans`. If no new gap plans → go to handle_blocker: "Gap closure planning for phase ${PHASE_NUM} did not produce plans."
@@ -561,7 +564,7 @@ Resolve the active post-verification hooks and the UI-SPEC gate:
561
564
  ```bash
562
565
  [ -z "${ZSH_VERSION:-}" ] || emulate -R sh
563
566
  UI_SPEC_FILE=$(ls "${PHASE_DIR}"/*-UI-SPEC.md 2>/dev/null | head -1)
564
- HOOKS_JSON=$(pp_run loop render-hooks verify:post --raw)
567
+ HOOKS_JSON=$(pp_run loop render-hooks verify:post --raw --phase "${PHASE_NUM}")
565
568
  ```
566
569
 
567
570
  Read the `activeHooks` array directly from the `HOOKS_JSON` value already in context (do not invoke a shell `jq` pipeline — parse as the JSON object it is). **If `activeHooks` is empty or absent:** skip silently to the iterate step.
@@ -106,15 +106,19 @@ Default is active through the Capability Registry schema — only skip when the
106
106
  Determine review depth with priority order:
107
107
 
108
108
  1. DEPTH_OVERRIDE from --depth flag (highest priority)
109
- 2. Config value: `pp-tools.cjs query config-get workflow.code_review_depth 2>/dev/null`
110
- 3. Default: "standard"
109
+ 2. Phase verdict: `pp_run ceremony get "${PHASE_ARG}" --pick code_review_depth` (the configured depth when no verdict is recorded)
110
+ 3. Config value: `pp-tools.cjs query config-get workflow.code_review_depth 2>/dev/null`
111
+ 4. Default: "standard"
111
112
 
112
113
  ```bash
113
114
  if [ -n "$DEPTH_OVERRIDE" ]; then
114
115
  REVIEW_DEPTH="$DEPTH_OVERRIDE"
115
116
  else
116
- CONFIG_DEPTH=$(pp_run query config-get workflow.code_review_depth --raw 2>/dev/null || echo "")
117
- REVIEW_DEPTH="${CONFIG_DEPTH:-standard}"
117
+ REVIEW_DEPTH=$(pp_run ceremony get "${PHASE_ARG}" --pick code_review_depth 2>/dev/null || echo "")
118
+ if [ -z "$REVIEW_DEPTH" ]; then
119
+ CONFIG_DEPTH=$(pp_run query config-get workflow.code_review_depth --raw 2>/dev/null || echo "")
120
+ REVIEW_DEPTH="${CONFIG_DEPTH:-standard}"
121
+ fi
118
122
  fi
119
123
  ```
120
124
 
@@ -514,6 +518,8 @@ Spawn the pp-code-reviewer agent:
514
518
 
515
519
  Print: `◆ Spawning code reviewer... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)`
516
520
 
521
+ `pp_run timeline start code-reviewer "${PHASE_ARG}" --model inherit || true` — rules: `pp-core/references/phase-timeline.md`
522
+
517
523
  ```
518
524
  Agent(subagent_type="pp-code-reviewer", prompt="
519
525
  <files_to_read>
@@ -540,7 +546,7 @@ ${AGENT_SKILLS_REVIEWER}")
540
546
 
541
547
  **Agent failure handling:**
542
548
 
543
- If the Agent() call fails (agent error, timeout, or exception):
549
+ If the Agent() call fails (agent error, timeout, or exception): first run `pp_run timeline end code-reviewer "${PHASE_ARG}" failed || true`, then show:
544
550
  ```
545
551
  Error: Code review agent failed: ${error_message}
546
552
 
@@ -555,6 +561,7 @@ After agent completes successfully, verify REVIEW.md was created and has valid s
555
561
 
556
562
  ```bash
557
563
  [ -z "${ZSH_VERSION:-}" ] || emulate -R sh
564
+ TL_OUTCOME=failed
558
565
  if [ -f "${REVIEW_PATH}" ]; then
559
566
  # Validate REVIEW.md has valid YAML frontmatter with status field
560
567
  HAS_STATUS=$(REVIEW_PATH="${REVIEW_PATH}" node -e "
@@ -565,12 +572,13 @@ if [ -f "${REVIEW_PATH}" ]; then
565
572
  " 2>/dev/null)
566
573
 
567
574
  if [ "$HAS_STATUS" = "valid" ]; then
575
+ TL_OUTCOME=complete
568
576
  echo "REVIEW.md created at ${REVIEW_PATH}"
569
577
 
570
578
  if [ "$COMMIT_DOCS" = "true" ]; then
571
579
  pp_run query commit \
572
580
  "docs(planning): add code review report" --phase "${PADDED_PHASE}" \
573
- --files "${REVIEW_PATH}"
581
+ --files "${REVIEW_PATH}" "${PHASE_DIR}"/*-TIMELINE.jsonl
574
582
  fi
575
583
  else
576
584
  echo "Warning: REVIEW.md exists but has invalid or missing frontmatter (no status field)."
@@ -580,6 +588,7 @@ else
580
588
  echo "Warning: Agent completed but REVIEW.md not found at ${REVIEW_PATH}. This may indicate an agent issue."
581
589
  echo "No REVIEW.md to commit. Please retry with /pp:code-review ${PHASE_ARG}"
582
590
  fi
591
+ pp_run timeline end code-reviewer "${PHASE_ARG}" "${TL_OUTCOME}" || true
583
592
  ```
584
593
  </step>
585
594