@sienklogic/plan-build-run 2.0.0 → 2.0.1

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 (225) hide show
  1. package/CHANGELOG.md +56 -56
  2. package/CLAUDE.md +149 -149
  3. package/LICENSE +21 -21
  4. package/README.md +247 -247
  5. package/dashboard/bin/cli.js +25 -25
  6. package/dashboard/package.json +34 -34
  7. package/dashboard/public/css/layout.css +406 -406
  8. package/dashboard/public/css/status-colors.css +98 -98
  9. package/dashboard/public/js/htmx-title.js +5 -5
  10. package/dashboard/public/js/sidebar-toggle.js +20 -20
  11. package/dashboard/src/app.js +78 -78
  12. package/dashboard/src/middleware/errorHandler.js +52 -52
  13. package/dashboard/src/middleware/notFoundHandler.js +9 -9
  14. package/dashboard/src/repositories/planning.repository.js +128 -128
  15. package/dashboard/src/routes/events.routes.js +40 -40
  16. package/dashboard/src/routes/index.routes.js +31 -31
  17. package/dashboard/src/routes/pages.routes.js +245 -195
  18. package/dashboard/src/server.js +42 -42
  19. package/dashboard/src/services/dashboard.service.js +222 -222
  20. package/dashboard/src/services/phase.service.js +220 -167
  21. package/dashboard/src/services/project.service.js +57 -57
  22. package/dashboard/src/services/roadmap.service.js +171 -171
  23. package/dashboard/src/services/sse.service.js +58 -58
  24. package/dashboard/src/services/todo.service.js +254 -254
  25. package/dashboard/src/services/watcher.service.js +48 -48
  26. package/dashboard/src/views/coming-soon.ejs +11 -11
  27. package/dashboard/src/views/error.ejs +13 -13
  28. package/dashboard/src/views/index.ejs +5 -5
  29. package/dashboard/src/views/layout.ejs +1 -1
  30. package/dashboard/src/views/partials/dashboard-content.ejs +77 -77
  31. package/dashboard/src/views/partials/footer.ejs +3 -3
  32. package/dashboard/src/views/partials/head.ejs +21 -21
  33. package/dashboard/src/views/partials/header.ejs +12 -12
  34. package/dashboard/src/views/partials/layout-bottom.ejs +15 -15
  35. package/dashboard/src/views/partials/layout-top.ejs +8 -8
  36. package/dashboard/src/views/partials/phase-content.ejs +188 -181
  37. package/dashboard/src/views/partials/phase-doc-content.ejs +38 -0
  38. package/dashboard/src/views/partials/phases-content.ejs +117 -117
  39. package/dashboard/src/views/partials/roadmap-content.ejs +142 -142
  40. package/dashboard/src/views/partials/sidebar.ejs +38 -38
  41. package/dashboard/src/views/partials/todo-create-content.ejs +53 -53
  42. package/dashboard/src/views/partials/todo-detail-content.ejs +38 -38
  43. package/dashboard/src/views/partials/todos-content.ejs +53 -53
  44. package/dashboard/src/views/phase-detail.ejs +5 -5
  45. package/dashboard/src/views/phase-doc.ejs +5 -0
  46. package/dashboard/src/views/phases.ejs +5 -5
  47. package/dashboard/src/views/roadmap.ejs +5 -5
  48. package/dashboard/src/views/todo-create.ejs +5 -5
  49. package/dashboard/src/views/todo-detail.ejs +5 -5
  50. package/dashboard/src/views/todos.ejs +5 -5
  51. package/package.json +57 -57
  52. package/plugins/pbr/.claude-plugin/plugin.json +13 -13
  53. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +61 -61
  54. package/plugins/pbr/agents/codebase-mapper.md +279 -271
  55. package/plugins/pbr/agents/debugger.md +281 -281
  56. package/plugins/pbr/agents/executor.md +428 -407
  57. package/plugins/pbr/agents/general.md +164 -164
  58. package/plugins/pbr/agents/integration-checker.md +169 -141
  59. package/plugins/pbr/agents/plan-checker.md +296 -280
  60. package/plugins/pbr/agents/planner.md +358 -358
  61. package/plugins/pbr/agents/researcher.md +363 -363
  62. package/plugins/pbr/agents/synthesizer.md +230 -230
  63. package/plugins/pbr/agents/verifier.md +489 -454
  64. package/plugins/pbr/commands/begin.md +5 -5
  65. package/plugins/pbr/commands/build.md +5 -5
  66. package/plugins/pbr/commands/config.md +5 -5
  67. package/plugins/pbr/commands/continue.md +5 -5
  68. package/plugins/pbr/commands/debug.md +5 -5
  69. package/plugins/pbr/commands/discuss.md +5 -5
  70. package/plugins/pbr/commands/explore.md +5 -5
  71. package/plugins/pbr/commands/health.md +5 -5
  72. package/plugins/pbr/commands/help.md +5 -5
  73. package/plugins/pbr/commands/import.md +5 -5
  74. package/plugins/pbr/commands/milestone.md +5 -5
  75. package/plugins/pbr/commands/note.md +5 -5
  76. package/plugins/pbr/commands/pause.md +5 -5
  77. package/plugins/pbr/commands/plan.md +5 -5
  78. package/plugins/pbr/commands/quick.md +5 -5
  79. package/plugins/pbr/commands/resume.md +5 -5
  80. package/plugins/pbr/commands/review.md +5 -5
  81. package/plugins/pbr/commands/scan.md +5 -5
  82. package/plugins/pbr/commands/setup.md +5 -5
  83. package/plugins/pbr/commands/status.md +5 -5
  84. package/plugins/pbr/commands/todo.md +5 -5
  85. package/plugins/pbr/contexts/dev.md +27 -27
  86. package/plugins/pbr/contexts/research.md +28 -28
  87. package/plugins/pbr/contexts/review.md +36 -36
  88. package/plugins/pbr/hooks/hooks.json +183 -183
  89. package/plugins/pbr/references/agent-anti-patterns.md +24 -24
  90. package/plugins/pbr/references/agent-interactions.md +134 -134
  91. package/plugins/pbr/references/agent-teams.md +54 -54
  92. package/plugins/pbr/references/checkpoints.md +157 -157
  93. package/plugins/pbr/references/common-bug-patterns.md +13 -13
  94. package/plugins/pbr/references/config-reference.md +441 -0
  95. package/plugins/pbr/references/continuation-format.md +212 -212
  96. package/plugins/pbr/references/deviation-rules.md +112 -112
  97. package/plugins/pbr/references/git-integration.md +226 -226
  98. package/plugins/pbr/references/integration-patterns.md +117 -117
  99. package/plugins/pbr/references/model-profiles.md +99 -99
  100. package/plugins/pbr/references/model-selection.md +31 -31
  101. package/plugins/pbr/references/pbr-rules.md +193 -193
  102. package/plugins/pbr/references/plan-authoring.md +181 -181
  103. package/plugins/pbr/references/plan-format.md +287 -283
  104. package/plugins/pbr/references/planning-config.md +213 -213
  105. package/plugins/pbr/references/questioning.md +214 -214
  106. package/plugins/pbr/references/reading-verification.md +127 -127
  107. package/plugins/pbr/references/stub-patterns.md +160 -160
  108. package/plugins/pbr/references/subagent-coordination.md +119 -119
  109. package/plugins/pbr/references/ui-formatting.md +461 -399
  110. package/plugins/pbr/references/verification-patterns.md +198 -198
  111. package/plugins/pbr/references/wave-execution.md +95 -95
  112. package/plugins/pbr/scripts/auto-continue.js +80 -80
  113. package/plugins/pbr/scripts/check-dangerous-commands.js +136 -136
  114. package/plugins/pbr/scripts/check-doc-sprawl.js +102 -102
  115. package/plugins/pbr/scripts/check-phase-boundary.js +196 -196
  116. package/plugins/pbr/scripts/check-plan-format.js +270 -270
  117. package/plugins/pbr/scripts/check-roadmap-sync.js +322 -252
  118. package/plugins/pbr/scripts/check-skill-workflow.js +262 -262
  119. package/plugins/pbr/scripts/check-state-sync.js +476 -476
  120. package/plugins/pbr/scripts/check-subagent-output.js +144 -144
  121. package/plugins/pbr/scripts/config-schema.json +251 -251
  122. package/plugins/pbr/scripts/context-budget-check.js +287 -287
  123. package/plugins/pbr/scripts/event-handler.js +151 -151
  124. package/plugins/pbr/scripts/event-logger.js +92 -92
  125. package/plugins/pbr/scripts/hook-logger.js +80 -76
  126. package/plugins/pbr/scripts/hooks-schema.json +79 -79
  127. package/plugins/pbr/scripts/log-subagent.js +164 -152
  128. package/plugins/pbr/scripts/log-tool-failure.js +88 -88
  129. package/plugins/pbr/scripts/pbr-tools.js +1378 -1301
  130. package/plugins/pbr/scripts/post-write-dispatch.js +66 -66
  131. package/plugins/pbr/scripts/post-write-quality.js +207 -207
  132. package/plugins/pbr/scripts/pre-bash-dispatch.js +86 -56
  133. package/plugins/pbr/scripts/pre-write-dispatch.js +97 -62
  134. package/plugins/pbr/scripts/progress-tracker.js +281 -228
  135. package/plugins/pbr/scripts/run-hook.js +92 -0
  136. package/plugins/pbr/scripts/session-cleanup.js +254 -254
  137. package/plugins/pbr/scripts/status-line.js +288 -285
  138. package/plugins/pbr/scripts/suggest-compact.js +119 -119
  139. package/plugins/pbr/scripts/task-completed.js +45 -45
  140. package/plugins/pbr/scripts/track-context-budget.js +149 -119
  141. package/plugins/pbr/scripts/validate-commit.js +200 -200
  142. package/plugins/pbr/scripts/validate-plugin-structure.js +183 -172
  143. package/plugins/pbr/scripts/validate-task.js +106 -0
  144. package/plugins/pbr/skills/begin/SKILL.md +594 -545
  145. package/plugins/pbr/skills/begin/templates/PROJECT.md.tmpl +33 -33
  146. package/plugins/pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +18 -18
  147. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +49 -49
  148. package/plugins/pbr/skills/begin/templates/config.json.tmpl +64 -63
  149. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +19 -19
  150. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +30 -30
  151. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +16 -16
  152. package/plugins/pbr/skills/build/SKILL.md +943 -962
  153. package/plugins/pbr/skills/config/SKILL.md +256 -241
  154. package/plugins/pbr/skills/continue/SKILL.md +164 -127
  155. package/plugins/pbr/skills/debug/SKILL.md +515 -489
  156. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +16 -16
  157. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +27 -27
  158. package/plugins/pbr/skills/discuss/SKILL.md +347 -338
  159. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +61 -61
  160. package/plugins/pbr/skills/discuss/templates/decision-categories.md +9 -9
  161. package/plugins/pbr/skills/explore/SKILL.md +378 -362
  162. package/plugins/pbr/skills/health/SKILL.md +221 -186
  163. package/plugins/pbr/skills/health/templates/check-pattern.md.tmpl +30 -30
  164. package/plugins/pbr/skills/health/templates/output-format.md.tmpl +63 -63
  165. package/plugins/pbr/skills/help/SKILL.md +155 -140
  166. package/plugins/pbr/skills/import/SKILL.md +504 -490
  167. package/plugins/pbr/skills/milestone/SKILL.md +704 -673
  168. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +48 -48
  169. package/plugins/pbr/skills/milestone/templates/stats-file.md.tmpl +30 -30
  170. package/plugins/pbr/skills/note/SKILL.md +231 -212
  171. package/plugins/pbr/skills/pause/SKILL.md +249 -235
  172. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +71 -71
  173. package/plugins/pbr/skills/plan/SKILL.md +685 -628
  174. package/plugins/pbr/skills/plan/decimal-phase-calc.md +98 -98
  175. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +21 -21
  176. package/plugins/pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +32 -32
  177. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +38 -38
  178. package/plugins/pbr/skills/plan/templates/researcher-prompt.md.tmpl +19 -19
  179. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +23 -23
  180. package/plugins/pbr/skills/quick/SKILL.md +354 -335
  181. package/plugins/pbr/skills/resume/SKILL.md +402 -388
  182. package/plugins/pbr/skills/review/SKILL.md +686 -652
  183. package/plugins/pbr/skills/review/templates/debugger-prompt.md.tmpl +60 -60
  184. package/plugins/pbr/skills/review/templates/gap-planner-prompt.md.tmpl +40 -40
  185. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +115 -115
  186. package/plugins/pbr/skills/scan/SKILL.md +304 -269
  187. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +201 -201
  188. package/plugins/pbr/skills/setup/SKILL.md +253 -227
  189. package/plugins/pbr/skills/shared/commit-planning-docs.md +35 -35
  190. package/plugins/pbr/skills/shared/config-loading.md +102 -102
  191. package/plugins/pbr/skills/shared/context-budget.md +40 -40
  192. package/plugins/pbr/skills/shared/context-loader-task.md +86 -86
  193. package/plugins/pbr/skills/shared/digest-select.md +79 -79
  194. package/plugins/pbr/skills/shared/domain-probes.md +125 -125
  195. package/plugins/pbr/skills/shared/error-reporting.md +79 -79
  196. package/plugins/pbr/skills/shared/gate-prompts.md +388 -388
  197. package/plugins/pbr/skills/shared/phase-argument-parsing.md +45 -45
  198. package/plugins/pbr/skills/shared/progress-display.md +53 -53
  199. package/plugins/pbr/skills/shared/revision-loop.md +81 -81
  200. package/plugins/pbr/skills/shared/state-loading.md +62 -62
  201. package/plugins/pbr/skills/shared/state-update.md +161 -161
  202. package/plugins/pbr/skills/shared/universal-anti-patterns.md +33 -33
  203. package/plugins/pbr/skills/status/SKILL.md +367 -353
  204. package/plugins/pbr/skills/todo/SKILL.md +198 -181
  205. package/plugins/pbr/templates/CONTEXT.md.tmpl +52 -52
  206. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +151 -151
  207. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +97 -97
  208. package/plugins/pbr/templates/ROADMAP.md.tmpl +40 -40
  209. package/plugins/pbr/templates/SUMMARY.md.tmpl +81 -81
  210. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +116 -116
  211. package/plugins/pbr/templates/codebase/ARCHITECTURE.md.tmpl +98 -98
  212. package/plugins/pbr/templates/codebase/CONCERNS.md.tmpl +93 -93
  213. package/plugins/pbr/templates/codebase/CONVENTIONS.md.tmpl +104 -104
  214. package/plugins/pbr/templates/codebase/INTEGRATIONS.md.tmpl +78 -78
  215. package/plugins/pbr/templates/codebase/STACK.md.tmpl +78 -78
  216. package/plugins/pbr/templates/codebase/STRUCTURE.md.tmpl +80 -80
  217. package/plugins/pbr/templates/codebase/TESTING.md.tmpl +107 -107
  218. package/plugins/pbr/templates/continue-here.md.tmpl +73 -73
  219. package/plugins/pbr/templates/prompt-partials/phase-project-context.md.tmpl +37 -37
  220. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +124 -124
  221. package/plugins/pbr/templates/research/STACK.md.tmpl +71 -71
  222. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +112 -112
  223. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +81 -81
  224. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +99 -99
  225. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +36 -36
@@ -1,127 +1,127 @@
1
- # Reading Verification Reports
2
-
3
- A user-friendly guide to understanding verification results. For agent-facing patterns, see `verification-patterns.md`.
4
-
5
- ---
6
-
7
- ## What Verification Checks
8
-
9
- After building a phase, Plan-Build-Run runs automated verification to check whether the code actually delivers what was planned. It checks every "must-have" from the plan through three layers:
10
-
11
- ### Layer 1: Existence
12
-
13
- **Question**: Does the file/function/route exist at all?
14
-
15
- This is the most basic check. If the plan said "create `src/auth.ts`" — does that file exist on disk? If it said "add a `/login` route" — can we find it in the codebase?
16
-
17
- **Common failures**: File was planned but never created, renamed to a different path, or deleted by a later task.
18
-
19
- ### Layer 2: Substantiveness
20
-
21
- **Question**: Is the code real, or just a stub/placeholder?
22
-
23
- A file can exist but contain nothing useful — an empty function, a `throw new Error('Not implemented')`, or a component that just renders its own name. This layer catches those cases.
24
-
25
- **Common failures**: Function body is empty, returns hardcoded test data, or only has a TODO comment.
26
-
27
- ### Layer 3: Wiring
28
-
29
- **Question**: Are the pieces connected to each other?
30
-
31
- Code can exist and be real, but if nothing imports it or calls it, it's dead code. This layer checks that modules are imported where needed, middleware is applied to routes, and components are rendered in the right places.
32
-
33
- **Common failures**: Module created but never imported, route handler exists but not registered in the router, component built but not used in any page.
34
-
35
- ---
36
-
37
- ## Reading the Verification Report
38
-
39
- A `VERIFICATION.md` file looks like this:
40
-
41
- ```
42
- Status: passed (or gaps_found)
43
- Must-haves checked: 8
44
- Passed: 7
45
- Gaps: 1
46
- ```
47
-
48
- ### When status is "passed"
49
-
50
- All must-haves passed all three layers. The phase is complete and you can move on.
51
-
52
- ### When status is "gaps_found"
53
-
54
- One or more must-haves failed verification. Each gap includes:
55
-
56
- - **Must-have**: What was expected (from the plan)
57
- - **Failed layer**: Which check failed (existence, substantiveness, or wiring)
58
- - **Evidence**: The specific command output or file content that shows the failure
59
- - **Suggested fix**: What to do about it
60
-
61
- ---
62
-
63
- ## Common Gap Types and What They Mean
64
-
65
- ### "File not found"
66
- **Layer**: Existence
67
- **Meaning**: A planned file was never created or was created at a different path.
68
- **Fix**: Usually a simple oversight — the executor may have created it with a slightly different name. Check the phase directory for similar files.
69
-
70
- ### "Function is a stub"
71
- **Layer**: Substantiveness
72
- **Meaning**: The file exists but the implementation is incomplete. Common indicators: empty function bodies, `TODO` comments, placeholder return values.
73
- **Fix**: The executor may have run out of context before finishing. Re-running the build usually resolves this.
74
-
75
- ### "Module not imported"
76
- **Layer**: Wiring
77
- **Meaning**: The code was written correctly but nothing uses it. The import statement is missing from the consuming file.
78
- **Fix**: Usually a one-line fix — add the import statement to the right file.
79
-
80
- ### "Test has no assertions"
81
- **Layer**: Substantiveness
82
- **Meaning**: A test file exists but doesn't actually test anything — empty `it()` blocks or `expect(true).toBe(true)`.
83
- **Fix**: Real test assertions need to be written. This usually happens when TDD mode is off and the executor generates placeholder tests.
84
-
85
- ### "Route not registered"
86
- **Layer**: Wiring
87
- **Meaning**: A route handler function was created but never mounted on the Express/Fastify/etc. router.
88
- **Fix**: Add the route registration (usually `app.use()` or `router.get()`) to the main app file.
89
-
90
- ---
91
-
92
- ## How to Close Gaps
93
-
94
- You have several options:
95
-
96
- ### Option 1: Re-run the build (most common)
97
- ```
98
- /pbr:build <N>
99
- ```
100
- The executor will detect what's already complete and only fix what's missing.
101
-
102
- ### Option 2: Create a gap-closure plan
103
- ```
104
- /pbr:plan <N> --gaps
105
- ```
106
- This creates a focused plan that targets only the specific gaps found during verification.
107
-
108
- ### Option 3: Manual fix
109
- For small gaps (like a missing import), you can fix the code yourself and then re-run verification:
110
- ```
111
- /pbr:review <N>
112
- ```
113
-
114
- ### Option 4: Override (for false positives)
115
- If verification flagged something that's actually correct (e.g., a function intentionally returns an empty array), you can override the gap during review. The override is recorded in the verification report.
116
-
117
- ---
118
-
119
- ## Understanding Verification Attempts
120
-
121
- The verification report tracks `attempt` count. If a phase has been verified multiple times:
122
-
123
- - **Attempt 1**: Normal first verification
124
- - **Attempt 2**: Gaps were found and fixed, re-verifying
125
- - **Attempt 3+**: Escalation — Plan-Build-Run will offer additional options like accepting with gaps, switching to debug mode, or re-planning the phase
126
-
127
- Multiple attempts don't mean something is wrong — complex phases often need a round of gap-closure before passing.
1
+ # Reading Verification Reports
2
+
3
+ A user-friendly guide to understanding verification results. For agent-facing patterns, see `verification-patterns.md`.
4
+
5
+ ---
6
+
7
+ ## What Verification Checks
8
+
9
+ After building a phase, Plan-Build-Run runs automated verification to check whether the code actually delivers what was planned. It checks every "must-have" from the plan through three layers:
10
+
11
+ ### Layer 1: Existence
12
+
13
+ **Question**: Does the file/function/route exist at all?
14
+
15
+ This is the most basic check. If the plan said "create `src/auth.ts`" — does that file exist on disk? If it said "add a `/login` route" — can we find it in the codebase?
16
+
17
+ **Common failures**: File was planned but never created, renamed to a different path, or deleted by a later task.
18
+
19
+ ### Layer 2: Substantiveness
20
+
21
+ **Question**: Is the code real, or just a stub/placeholder?
22
+
23
+ A file can exist but contain nothing useful — an empty function, a `throw new Error('Not implemented')`, or a component that just renders its own name. This layer catches those cases.
24
+
25
+ **Common failures**: Function body is empty, returns hardcoded test data, or only has a TODO comment.
26
+
27
+ ### Layer 3: Wiring
28
+
29
+ **Question**: Are the pieces connected to each other?
30
+
31
+ Code can exist and be real, but if nothing imports it or calls it, it's dead code. This layer checks that modules are imported where needed, middleware is applied to routes, and components are rendered in the right places.
32
+
33
+ **Common failures**: Module created but never imported, route handler exists but not registered in the router, component built but not used in any page.
34
+
35
+ ---
36
+
37
+ ## Reading the Verification Report
38
+
39
+ A `VERIFICATION.md` file looks like this:
40
+
41
+ ```
42
+ Status: passed (or gaps_found)
43
+ Must-haves checked: 8
44
+ Passed: 7
45
+ Gaps: 1
46
+ ```
47
+
48
+ ### When status is "passed"
49
+
50
+ All must-haves passed all three layers. The phase is complete and you can move on.
51
+
52
+ ### When status is "gaps_found"
53
+
54
+ One or more must-haves failed verification. Each gap includes:
55
+
56
+ - **Must-have**: What was expected (from the plan)
57
+ - **Failed layer**: Which check failed (existence, substantiveness, or wiring)
58
+ - **Evidence**: The specific command output or file content that shows the failure
59
+ - **Suggested fix**: What to do about it
60
+
61
+ ---
62
+
63
+ ## Common Gap Types and What They Mean
64
+
65
+ ### "File not found"
66
+ **Layer**: Existence
67
+ **Meaning**: A planned file was never created or was created at a different path.
68
+ **Fix**: Usually a simple oversight — the executor may have created it with a slightly different name. Check the phase directory for similar files.
69
+
70
+ ### "Function is a stub"
71
+ **Layer**: Substantiveness
72
+ **Meaning**: The file exists but the implementation is incomplete. Common indicators: empty function bodies, `TODO` comments, placeholder return values.
73
+ **Fix**: The executor may have run out of context before finishing. Re-running the build usually resolves this.
74
+
75
+ ### "Module not imported"
76
+ **Layer**: Wiring
77
+ **Meaning**: The code was written correctly but nothing uses it. The import statement is missing from the consuming file.
78
+ **Fix**: Usually a one-line fix — add the import statement to the right file.
79
+
80
+ ### "Test has no assertions"
81
+ **Layer**: Substantiveness
82
+ **Meaning**: A test file exists but doesn't actually test anything — empty `it()` blocks or `expect(true).toBe(true)`.
83
+ **Fix**: Real test assertions need to be written. This usually happens when TDD mode is off and the executor generates placeholder tests.
84
+
85
+ ### "Route not registered"
86
+ **Layer**: Wiring
87
+ **Meaning**: A route handler function was created but never mounted on the Express/Fastify/etc. router.
88
+ **Fix**: Add the route registration (usually `app.use()` or `router.get()`) to the main app file.
89
+
90
+ ---
91
+
92
+ ## How to Close Gaps
93
+
94
+ You have several options:
95
+
96
+ ### Option 1: Re-run the build (most common)
97
+ ```
98
+ /pbr:build <N>
99
+ ```
100
+ The executor will detect what's already complete and only fix what's missing.
101
+
102
+ ### Option 2: Create a gap-closure plan
103
+ ```
104
+ /pbr:plan <N> --gaps
105
+ ```
106
+ This creates a focused plan that targets only the specific gaps found during verification.
107
+
108
+ ### Option 3: Manual fix
109
+ For small gaps (like a missing import), you can fix the code yourself and then re-run verification:
110
+ ```
111
+ /pbr:review <N>
112
+ ```
113
+
114
+ ### Option 4: Override (for false positives)
115
+ If verification flagged something that's actually correct (e.g., a function intentionally returns an empty array), you can override the gap during review. The override is recorded in the verification report.
116
+
117
+ ---
118
+
119
+ ## Understanding Verification Attempts
120
+
121
+ The verification report tracks `attempt` count. If a phase has been verified multiple times:
122
+
123
+ - **Attempt 1**: Normal first verification
124
+ - **Attempt 2**: Gaps were found and fixed, re-verifying
125
+ - **Attempt 3+**: Escalation — Plan-Build-Run will offer additional options like accepting with gaps, switching to debug mode, or re-planning the phase
126
+
127
+ Multiple attempts don't mean something is wrong — complex phases often need a round of gap-closure before passing.
@@ -1,160 +1,160 @@
1
- # Stub Detection Patterns
2
-
3
- Technology-aware patterns for detecting incomplete implementations. Used by the verifier during Layer 2 (Substantiveness) checks.
4
-
5
- Read the project's stack from `.planning/codebase/STACK.md` or `.planning/research/STACK.md` to determine which technology-specific patterns to apply. If no stack file exists, use universal patterns only.
6
-
7
- ---
8
-
9
- ## Universal Patterns (always check)
10
-
11
- - TODO, FIXME, HACK, PLACEHOLDER, "not implemented"
12
- - `return null`, `return {}`, `return []`, `return undefined`
13
- - Empty function bodies, functions that only console.log
14
- - `throw new Error('Not implemented')` or similar
15
- - Placeholder strings ("lorem ipsum", "sample data", "example")
16
-
17
- ## React/Next.js Patterns (when stack includes React/Next)
18
-
19
- - `<div>ComponentName</div>` — component returning only its name
20
- - `onClick={() => {}}` — empty event handlers
21
- - `fetch()` without error handling or response processing
22
- - `useState` with no state updates
23
- - Components returning `null`, `<></>`, or single placeholder div
24
-
25
- ## API/Express Patterns (when stack includes Express/Fastify/Koa)
26
-
27
- - `res.json({ message: "Not implemented" })`
28
- - Empty middleware: `(req, res, next) => next()`
29
- - Routes returning hardcoded test data
30
- - `res.status(501)` responses
31
-
32
- ## Database Patterns (when stack includes any ORM/database)
33
-
34
- - Empty migration files
35
- - Models/schemas with no fields beyond id
36
- - Repository methods that return empty arrays
37
-
38
- ## Python Patterns (when stack includes Python)
39
-
40
- - `pass` in function bodies
41
- - `raise NotImplementedError`
42
- - Functions returning `None` without logic
43
- - `# TODO` in function bodies
44
-
45
- ## Go Patterns (when stack includes Go)
46
-
47
- - Functions returning zero values without logic
48
- - `panic("not implemented")`
49
- - Empty interface implementations
50
-
51
- ---
52
-
53
- ## Detailed Examples
54
-
55
- ### TypeScript/JavaScript Stubs
56
-
57
- ```typescript
58
- // STUB PATTERN: Empty function body
59
- export function processData() { }
60
- export function processData() { return; }
61
- export function processData() { return null; }
62
- export const processData = () => {};
63
-
64
- // STUB PATTERN: Placeholder implementation
65
- export function processData() {
66
- throw new Error('Not implemented');
67
- }
68
- export function processData() {
69
- throw new Error('TODO');
70
- }
71
-
72
- // STUB PATTERN: Hardcoded return value
73
- export function getUsers(): User[] {
74
- return [];
75
- }
76
- export function getConfig(): Config {
77
- return {} as Config;
78
- }
79
-
80
- // STUB PATTERN: Console.log instead of implementation
81
- export function saveUser(user: User): void {
82
- console.log('TODO: implement saveUser', user);
83
- }
84
-
85
- // STUB PATTERN: Pass-through without logic
86
- export function validateInput(input: unknown): boolean {
87
- return true; // Always passes - no real validation
88
- }
89
- ```
90
-
91
- ### React Component Stubs
92
-
93
- ```tsx
94
- // STUB: Null return
95
- export function Dashboard() { return null; }
96
-
97
- // STUB: Empty fragment
98
- export function Dashboard() { return <></>; }
99
-
100
- // STUB: Placeholder text
101
- export function Dashboard() { return <div>Dashboard</div>; }
102
- export function Dashboard() { return <div>Coming soon</div>; }
103
-
104
- // STUB: Div with just the name
105
- export function UserProfile() { return <div>UserProfile</div>; }
106
-
107
- // REAL (NOT a stub): Has actual JSX structure with data binding
108
- export function Dashboard({ data }: Props) {
109
- return (
110
- <div className="dashboard">
111
- <h1>{data.title}</h1>
112
- <MetricsGrid metrics={data.metrics} />
113
- </div>
114
- );
115
- }
116
- ```
117
-
118
- ### API Route/Handler Stubs
119
-
120
- ```typescript
121
- // STUB: Empty response
122
- app.get('/api/users', (req, res) => { res.json({}); });
123
-
124
- // STUB: Not implemented status
125
- app.get('/api/users', (req, res) => { res.status(501).json({ error: 'Not implemented' }); });
126
-
127
- // STUB: Hardcoded test data
128
- app.get('/api/users', (req, res) => {
129
- res.json([{ id: 1, name: 'Test User' }]);
130
- });
131
-
132
- // REAL: Database query, error handling, response
133
- app.get('/api/users', async (req, res) => {
134
- const { page = 1, limit = 20 } = req.query;
135
- const users = await db.users.findMany({ skip: (page - 1) * limit, take: limit });
136
- res.json({ data: users, page, limit });
137
- });
138
- ```
139
-
140
- ### Test Stubs
141
-
142
- ```typescript
143
- // STUB: No assertions
144
- it('should process data', () => {});
145
-
146
- // STUB: Trivial assertion
147
- it('should process data', () => { expect(true).toBe(true); });
148
-
149
- // STUB: Skipped
150
- it.skip('should process data', () => { /* ... */ });
151
- xit('should process data', () => { /* ... */ });
152
-
153
- // REAL: Actual test with meaningful assertions
154
- it('should process data and return transformed result', () => {
155
- const input = createTestData();
156
- const result = processData(input);
157
- expect(result.items).toHaveLength(3);
158
- expect(result.total).toBe(150);
159
- });
160
- ```
1
+ # Stub Detection Patterns
2
+
3
+ Technology-aware patterns for detecting incomplete implementations. Used by the verifier during Layer 2 (Substantiveness) checks.
4
+
5
+ Read the project's stack from `.planning/codebase/STACK.md` or `.planning/research/STACK.md` to determine which technology-specific patterns to apply. If no stack file exists, use universal patterns only.
6
+
7
+ ---
8
+
9
+ ## Universal Patterns (always check)
10
+
11
+ - TODO, FIXME, HACK, PLACEHOLDER, "not implemented"
12
+ - `return null`, `return {}`, `return []`, `return undefined`
13
+ - Empty function bodies, functions that only console.log
14
+ - `throw new Error('Not implemented')` or similar
15
+ - Placeholder strings ("lorem ipsum", "sample data", "example")
16
+
17
+ ## React/Next.js Patterns (when stack includes React/Next)
18
+
19
+ - `<div>ComponentName</div>` — component returning only its name
20
+ - `onClick={() => {}}` — empty event handlers
21
+ - `fetch()` without error handling or response processing
22
+ - `useState` with no state updates
23
+ - Components returning `null`, `<></>`, or single placeholder div
24
+
25
+ ## API/Express Patterns (when stack includes Express/Fastify/Koa)
26
+
27
+ - `res.json({ message: "Not implemented" })`
28
+ - Empty middleware: `(req, res, next) => next()`
29
+ - Routes returning hardcoded test data
30
+ - `res.status(501)` responses
31
+
32
+ ## Database Patterns (when stack includes any ORM/database)
33
+
34
+ - Empty migration files
35
+ - Models/schemas with no fields beyond id
36
+ - Repository methods that return empty arrays
37
+
38
+ ## Python Patterns (when stack includes Python)
39
+
40
+ - `pass` in function bodies
41
+ - `raise NotImplementedError`
42
+ - Functions returning `None` without logic
43
+ - `# TODO` in function bodies
44
+
45
+ ## Go Patterns (when stack includes Go)
46
+
47
+ - Functions returning zero values without logic
48
+ - `panic("not implemented")`
49
+ - Empty interface implementations
50
+
51
+ ---
52
+
53
+ ## Detailed Examples
54
+
55
+ ### TypeScript/JavaScript Stubs
56
+
57
+ ```typescript
58
+ // STUB PATTERN: Empty function body
59
+ export function processData() { }
60
+ export function processData() { return; }
61
+ export function processData() { return null; }
62
+ export const processData = () => {};
63
+
64
+ // STUB PATTERN: Placeholder implementation
65
+ export function processData() {
66
+ throw new Error('Not implemented');
67
+ }
68
+ export function processData() {
69
+ throw new Error('TODO');
70
+ }
71
+
72
+ // STUB PATTERN: Hardcoded return value
73
+ export function getUsers(): User[] {
74
+ return [];
75
+ }
76
+ export function getConfig(): Config {
77
+ return {} as Config;
78
+ }
79
+
80
+ // STUB PATTERN: Console.log instead of implementation
81
+ export function saveUser(user: User): void {
82
+ console.log('TODO: implement saveUser', user);
83
+ }
84
+
85
+ // STUB PATTERN: Pass-through without logic
86
+ export function validateInput(input: unknown): boolean {
87
+ return true; // Always passes - no real validation
88
+ }
89
+ ```
90
+
91
+ ### React Component Stubs
92
+
93
+ ```tsx
94
+ // STUB: Null return
95
+ export function Dashboard() { return null; }
96
+
97
+ // STUB: Empty fragment
98
+ export function Dashboard() { return <></>; }
99
+
100
+ // STUB: Placeholder text
101
+ export function Dashboard() { return <div>Dashboard</div>; }
102
+ export function Dashboard() { return <div>Coming soon</div>; }
103
+
104
+ // STUB: Div with just the name
105
+ export function UserProfile() { return <div>UserProfile</div>; }
106
+
107
+ // REAL (NOT a stub): Has actual JSX structure with data binding
108
+ export function Dashboard({ data }: Props) {
109
+ return (
110
+ <div className="dashboard">
111
+ <h1>{data.title}</h1>
112
+ <MetricsGrid metrics={data.metrics} />
113
+ </div>
114
+ );
115
+ }
116
+ ```
117
+
118
+ ### API Route/Handler Stubs
119
+
120
+ ```typescript
121
+ // STUB: Empty response
122
+ app.get('/api/users', (req, res) => { res.json({}); });
123
+
124
+ // STUB: Not implemented status
125
+ app.get('/api/users', (req, res) => { res.status(501).json({ error: 'Not implemented' }); });
126
+
127
+ // STUB: Hardcoded test data
128
+ app.get('/api/users', (req, res) => {
129
+ res.json([{ id: 1, name: 'Test User' }]);
130
+ });
131
+
132
+ // REAL: Database query, error handling, response
133
+ app.get('/api/users', async (req, res) => {
134
+ const { page = 1, limit = 20 } = req.query;
135
+ const users = await db.users.findMany({ skip: (page - 1) * limit, take: limit });
136
+ res.json({ data: users, page, limit });
137
+ });
138
+ ```
139
+
140
+ ### Test Stubs
141
+
142
+ ```typescript
143
+ // STUB: No assertions
144
+ it('should process data', () => {});
145
+
146
+ // STUB: Trivial assertion
147
+ it('should process data', () => { expect(true).toBe(true); });
148
+
149
+ // STUB: Skipped
150
+ it.skip('should process data', () => { /* ... */ });
151
+ xit('should process data', () => { /* ... */ });
152
+
153
+ // REAL: Actual test with meaningful assertions
154
+ it('should process data and return transformed result', () => {
155
+ const input = createTestData();
156
+ const result = processData(input);
157
+ expect(result.items).toHaveLength(3);
158
+ expect(result.total).toBe(150);
159
+ });
160
+ ```