@pareto4/pp-core 1.5.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 (618) hide show
  1. package/.claude-plugin/plugin.json +23 -0
  2. package/GEMINI.md +53 -0
  3. package/LICENSE +22 -0
  4. package/README.md +100 -0
  5. package/agents/pp-advisor-researcher.md +108 -0
  6. package/agents/pp-ai-researcher.md +114 -0
  7. package/agents/pp-assumptions-analyzer.md +105 -0
  8. package/agents/pp-code-fixer.md +669 -0
  9. package/agents/pp-code-reviewer.md +387 -0
  10. package/agents/pp-codebase-mapper.md +853 -0
  11. package/agents/pp-debug-session-manager.md +315 -0
  12. package/agents/pp-debugger.md +1453 -0
  13. package/agents/pp-doc-classifier.md +168 -0
  14. package/agents/pp-doc-synthesizer.md +204 -0
  15. package/agents/pp-doc-verifier.md +217 -0
  16. package/agents/pp-doc-writer.md +616 -0
  17. package/agents/pp-domain-researcher.md +147 -0
  18. package/agents/pp-eval-auditor.md +191 -0
  19. package/agents/pp-eval-planner.md +154 -0
  20. package/agents/pp-executor.md +808 -0
  21. package/agents/pp-framework-selector.md +160 -0
  22. package/agents/pp-integration-checker.md +470 -0
  23. package/agents/pp-intel-updater.md +339 -0
  24. package/agents/pp-mempalace-curator.md +47 -0
  25. package/agents/pp-nyquist-auditor.md +204 -0
  26. package/agents/pp-pattern-mapper.md +335 -0
  27. package/agents/pp-phase-researcher.md +867 -0
  28. package/agents/pp-plan-checker.md +988 -0
  29. package/agents/pp-planner.md +1052 -0
  30. package/agents/pp-project-researcher.md +612 -0
  31. package/agents/pp-research-synthesizer.md +260 -0
  32. package/agents/pp-roadmapper.md +741 -0
  33. package/agents/pp-security-auditor.md +156 -0
  34. package/agents/pp-ui-auditor.md +495 -0
  35. package/agents/pp-ui-checker.md +309 -0
  36. package/agents/pp-ui-researcher.md +375 -0
  37. package/agents/pp-user-profiler.md +171 -0
  38. package/agents/pp-verifier.md +967 -0
  39. package/assets/gsd-logo-2000-transparent.png +0 -0
  40. package/assets/gsd-logo-2000-transparent.svg +17 -0
  41. package/assets/gsd-logo-2000.png +0 -0
  42. package/assets/gsd-logo-2000.svg +21 -0
  43. package/assets/terminal.svg +68 -0
  44. package/bin/install.js +12370 -0
  45. package/bin/lib/ui-safety-gate.cjs +107 -0
  46. package/commands/pp-add-tests.md +42 -0
  47. package/commands/pp-ai-integration-phase.md +37 -0
  48. package/commands/pp-audit-fix.md +34 -0
  49. package/commands/pp-audit-milestone.md +37 -0
  50. package/commands/pp-audit-uat.md +24 -0
  51. package/commands/pp-autonomous.md +51 -0
  52. package/commands/pp-capture.md +62 -0
  53. package/commands/pp-cleanup.md +24 -0
  54. package/commands/pp-code-review.md +59 -0
  55. package/commands/pp-complete-milestone.md +143 -0
  56. package/commands/pp-config.md +56 -0
  57. package/commands/pp-debug.md +52 -0
  58. package/commands/pp-discovery.md +34 -0
  59. package/commands/pp-discuss-phase.md +77 -0
  60. package/commands/pp-docs-update.md +49 -0
  61. package/commands/pp-eval-review.md +33 -0
  62. package/commands/pp-execute-phase.md +65 -0
  63. package/commands/pp-explore.md +27 -0
  64. package/commands/pp-extract-learnings.md +23 -0
  65. package/commands/pp-fast.md +31 -0
  66. package/commands/pp-forensics.md +57 -0
  67. package/commands/pp-graphify.md +204 -0
  68. package/commands/pp-health.md +31 -0
  69. package/commands/pp-help.md +28 -0
  70. package/commands/pp-import.md +45 -0
  71. package/commands/pp-inbox.md +39 -0
  72. package/commands/pp-ingest-docs.md +42 -0
  73. package/commands/pp-manager.md +45 -0
  74. package/commands/pp-map-codebase.md +83 -0
  75. package/commands/pp-mempalace-capture.md +71 -0
  76. package/commands/pp-mempalace-recall.md +102 -0
  77. package/commands/pp-milestone-summary.md +51 -0
  78. package/commands/pp-mvp-phase.md +45 -0
  79. package/commands/pp-new-milestone.md +45 -0
  80. package/commands/pp-new-project.md +47 -0
  81. package/commands/pp-ns-context.md +25 -0
  82. package/commands/pp-ns-ideate.md +24 -0
  83. package/commands/pp-ns-manage.md +36 -0
  84. package/commands/pp-ns-project.md +27 -0
  85. package/commands/pp-ns-review.md +29 -0
  86. package/commands/pp-ns-workflow.md +35 -0
  87. package/commands/pp-pause-work.md +43 -0
  88. package/commands/pp-phase.md +56 -0
  89. package/commands/pp-plan-phase.md +63 -0
  90. package/commands/pp-plan-review-convergence.md +60 -0
  91. package/commands/pp-pr-branch.md +26 -0
  92. package/commands/pp-profile-user.md +46 -0
  93. package/commands/pp-progress.md +49 -0
  94. package/commands/pp-quick.md +174 -0
  95. package/commands/pp-resume-work.md +30 -0
  96. package/commands/pp-review-backlog.md +63 -0
  97. package/commands/pp-review.md +42 -0
  98. package/commands/pp-secure-phase.md +36 -0
  99. package/commands/pp-settings.md +29 -0
  100. package/commands/pp-ship.md +24 -0
  101. package/commands/pp-sketch.md +60 -0
  102. package/commands/pp-spec-phase.md +63 -0
  103. package/commands/pp-spike.md +57 -0
  104. package/commands/pp-stats.md +20 -0
  105. package/commands/pp-surface.md +162 -0
  106. package/commands/pp-thread.md +24 -0
  107. package/commands/pp-ui-phase.md +35 -0
  108. package/commands/pp-ui-review.md +33 -0
  109. package/commands/pp-ultraplan-phase.md +34 -0
  110. package/commands/pp-undo.md +35 -0
  111. package/commands/pp-update.md +49 -0
  112. package/commands/pp-validate-phase.md +36 -0
  113. package/commands/pp-verify-work.md +39 -0
  114. package/commands/pp-workspace.md +52 -0
  115. package/commands/pp-workstreams.md +70 -0
  116. package/gemini-extension.json +6 -0
  117. package/hooks/dist/lib/git-cmd.js +150 -0
  118. package/hooks/dist/lib/pp-graphify-rebuild.sh +65 -0
  119. package/hooks/dist/managed-hooks-registry.cjs +39 -0
  120. package/hooks/dist/pp-check-update-worker.js +108 -0
  121. package/hooks/dist/pp-check-update.js +66 -0
  122. package/hooks/dist/pp-config-reload.js +133 -0
  123. package/hooks/dist/pp-context-monitor.js +196 -0
  124. package/hooks/dist/pp-cursor-post-tool.js +75 -0
  125. package/hooks/dist/pp-cursor-session-start.js +52 -0
  126. package/hooks/dist/pp-ensure-canonical-path.js +305 -0
  127. package/hooks/dist/pp-graphify-update.sh +158 -0
  128. package/hooks/dist/pp-phase-boundary.sh +47 -0
  129. package/hooks/dist/pp-prompt-guard.js +97 -0
  130. package/hooks/dist/pp-read-guard.js +101 -0
  131. package/hooks/dist/pp-read-injection-scanner.js +203 -0
  132. package/hooks/dist/pp-session-state.sh +59 -0
  133. package/hooks/dist/pp-statusline.js +566 -0
  134. package/hooks/dist/pp-update-banner.js +138 -0
  135. package/hooks/dist/pp-validate-commit.sh +57 -0
  136. package/hooks/dist/pp-workflow-guard.js +167 -0
  137. package/hooks/dist/pp-worktree-path-guard.js +185 -0
  138. package/hooks/hooks.json +70 -0
  139. package/hooks/lib/git-cmd.js +150 -0
  140. package/hooks/lib/pp-graphify-rebuild.sh +65 -0
  141. package/hooks/managed-hooks-registry.cjs +39 -0
  142. package/hooks/pp-check-update-worker.js +108 -0
  143. package/hooks/pp-check-update.js +66 -0
  144. package/hooks/pp-config-reload.js +133 -0
  145. package/hooks/pp-context-monitor.js +196 -0
  146. package/hooks/pp-cursor-post-tool.js +75 -0
  147. package/hooks/pp-cursor-session-start.js +52 -0
  148. package/hooks/pp-ensure-canonical-path.js +305 -0
  149. package/hooks/pp-graphify-update.sh +158 -0
  150. package/hooks/pp-phase-boundary.sh +47 -0
  151. package/hooks/pp-prompt-guard.js +97 -0
  152. package/hooks/pp-read-guard.js +101 -0
  153. package/hooks/pp-read-injection-scanner.js +203 -0
  154. package/hooks/pp-session-state.sh +59 -0
  155. package/hooks/pp-statusline.js +566 -0
  156. package/hooks/pp-update-banner.js +138 -0
  157. package/hooks/pp-validate-commit.sh +57 -0
  158. package/hooks/pp-workflow-guard.js +167 -0
  159. package/hooks/pp-worktree-path-guard.js +185 -0
  160. package/package.json +125 -0
  161. package/pp-core/bin/check-latest-version.cjs +161 -0
  162. package/pp-core/bin/lib/active-workstream-store.cjs +297 -0
  163. package/pp-core/bin/lib/adr-parser.cjs +399 -0
  164. package/pp-core/bin/lib/agent-command-router.cjs +68 -0
  165. package/pp-core/bin/lib/agent-install-check.cjs +143 -0
  166. package/pp-core/bin/lib/artifacts.cjs +51 -0
  167. package/pp-core/bin/lib/audit-command-router.cjs +61 -0
  168. package/pp-core/bin/lib/audit.cjs +743 -0
  169. package/pp-core/bin/lib/capability-activation.cjs +113 -0
  170. package/pp-core/bin/lib/capability-registry.cjs +3727 -0
  171. package/pp-core/bin/lib/capability-state.cjs +497 -0
  172. package/pp-core/bin/lib/capability-writer.cjs +355 -0
  173. package/pp-core/bin/lib/check-command-router.cjs +800 -0
  174. package/pp-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  175. package/pp-core/bin/lib/cli-exit.cjs +61 -0
  176. package/pp-core/bin/lib/clock.cjs +95 -0
  177. package/pp-core/bin/lib/clusters.cjs +131 -0
  178. package/pp-core/bin/lib/code-review-flags.cjs +59 -0
  179. package/pp-core/bin/lib/command-aliases.cjs +809 -0
  180. package/pp-core/bin/lib/command-arg-projection.cjs +55 -0
  181. package/pp-core/bin/lib/command-roster.cjs +19 -0
  182. package/pp-core/bin/lib/command-routing-hub.cjs +300 -0
  183. package/pp-core/bin/lib/commands.cjs +1244 -0
  184. package/pp-core/bin/lib/config-loader.cjs +714 -0
  185. package/pp-core/bin/lib/config-schema.cjs +58 -0
  186. package/pp-core/bin/lib/config-types.cjs +20 -0
  187. package/pp-core/bin/lib/config.cjs +796 -0
  188. package/pp-core/bin/lib/configuration.cjs +209 -0
  189. package/pp-core/bin/lib/context-utilization.cjs +48 -0
  190. package/pp-core/bin/lib/core-utils.cjs +198 -0
  191. package/pp-core/bin/lib/decisions.cjs +136 -0
  192. package/pp-core/bin/lib/docs.cjs +264 -0
  193. package/pp-core/bin/lib/drift.cjs +364 -0
  194. package/pp-core/bin/lib/edge-probe.cjs +196 -0
  195. package/pp-core/bin/lib/fallow-runner.cjs +153 -0
  196. package/pp-core/bin/lib/federated-config.cjs +182 -0
  197. package/pp-core/bin/lib/frontmatter.cjs +494 -0
  198. package/pp-core/bin/lib/gap-checker.cjs +260 -0
  199. package/pp-core/bin/lib/git-base-branch.cjs +220 -0
  200. package/pp-core/bin/lib/graphify-command-router.cjs +72 -0
  201. package/pp-core/bin/lib/graphify.cjs +472 -0
  202. package/pp-core/bin/lib/gsd2-import.cjs +456 -0
  203. package/pp-core/bin/lib/init-command-router.cjs +62 -0
  204. package/pp-core/bin/lib/init.cjs +1912 -0
  205. package/pp-core/bin/lib/install-profiles.cjs +814 -0
  206. package/pp-core/bin/lib/installer-migration-authoring.cjs +122 -0
  207. package/pp-core/bin/lib/installer-migration-report.cjs +351 -0
  208. package/pp-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +225 -0
  209. package/pp-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  210. package/pp-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  211. package/pp-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  212. package/pp-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs +123 -0
  213. package/pp-core/bin/lib/installer-migrations/005-rename-gsd-core-to-pp-core.cjs +109 -0
  214. package/pp-core/bin/lib/installer-migrations/006-rename-gsd-command-namespace.cjs +135 -0
  215. package/pp-core/bin/lib/installer-migrations.cjs +823 -0
  216. package/pp-core/bin/lib/intel-command-router.cjs +119 -0
  217. package/pp-core/bin/lib/intel.cjs +584 -0
  218. package/pp-core/bin/lib/io.cjs +220 -0
  219. package/pp-core/bin/lib/learnings.cjs +270 -0
  220. package/pp-core/bin/lib/legacy-cleanup.cjs +253 -0
  221. package/pp-core/bin/lib/loop-host-contract.cjs +105 -0
  222. package/pp-core/bin/lib/loop-resolver.cjs +479 -0
  223. package/pp-core/bin/lib/milestone.cjs +381 -0
  224. package/pp-core/bin/lib/model-catalog.cjs +154 -0
  225. package/pp-core/bin/lib/model-profiles.cjs +24 -0
  226. package/pp-core/bin/lib/model-resolver.cjs +467 -0
  227. package/pp-core/bin/lib/observability/event.cjs +51 -0
  228. package/pp-core/bin/lib/observability/logger.cjs +146 -0
  229. package/pp-core/bin/lib/observability/redaction.cjs +48 -0
  230. package/pp-core/bin/lib/package-identity.cjs +35 -0
  231. package/pp-core/bin/lib/package-legitimacy.cjs +368 -0
  232. package/pp-core/bin/lib/phase-command-router.cjs +209 -0
  233. package/pp-core/bin/lib/phase-id.cjs +213 -0
  234. package/pp-core/bin/lib/phase-lifecycle.cjs +74 -0
  235. package/pp-core/bin/lib/phase-locator.cjs +145 -0
  236. package/pp-core/bin/lib/phase.cjs +1446 -0
  237. package/pp-core/bin/lib/phases-command-router.cjs +43 -0
  238. package/pp-core/bin/lib/plan-drift-guard.cjs +117 -0
  239. package/pp-core/bin/lib/plan-scan.cjs +91 -0
  240. package/pp-core/bin/lib/planning-workspace.cjs +245 -0
  241. package/pp-core/bin/lib/probe-core.cjs +402 -0
  242. package/pp-core/bin/lib/profile-output.cjs +1164 -0
  243. package/pp-core/bin/lib/profile-pipeline-command-router.cjs +138 -0
  244. package/pp-core/bin/lib/profile-pipeline.cjs +519 -0
  245. package/pp-core/bin/lib/prohibition-enforcement.cjs +660 -0
  246. package/pp-core/bin/lib/project-root.cjs +119 -0
  247. package/pp-core/bin/lib/prompt-budget.cjs +305 -0
  248. package/pp-core/bin/lib/research-provider.cjs +137 -0
  249. package/pp-core/bin/lib/research-store.cjs +167 -0
  250. package/pp-core/bin/lib/review-reviewer-selection.cjs +121 -0
  251. package/pp-core/bin/lib/roadmap-command-router.cjs +166 -0
  252. package/pp-core/bin/lib/roadmap-parser.cjs +456 -0
  253. package/pp-core/bin/lib/roadmap-upgrade.cjs +476 -0
  254. package/pp-core/bin/lib/roadmap.cjs +738 -0
  255. package/pp-core/bin/lib/runtime-artifact-conversion.cjs +1966 -0
  256. package/pp-core/bin/lib/runtime-artifact-layout.cjs +342 -0
  257. package/pp-core/bin/lib/runtime-config-adapter-registry.cjs +103 -0
  258. package/pp-core/bin/lib/runtime-homes.cjs +272 -0
  259. package/pp-core/bin/lib/runtime-hooks-surface.cjs +1460 -0
  260. package/pp-core/bin/lib/runtime-name-policy.cjs +97 -0
  261. package/pp-core/bin/lib/runtime-slash.cjs +137 -0
  262. package/pp-core/bin/lib/schema-detect.cjs +159 -0
  263. package/pp-core/bin/lib/secrets.cjs +34 -0
  264. package/pp-core/bin/lib/security.cjs +480 -0
  265. package/pp-core/bin/lib/semver-compare.cjs +42 -0
  266. package/pp-core/bin/lib/shell-command-projection.cjs +550 -0
  267. package/pp-core/bin/lib/state-command-router.cjs +172 -0
  268. package/pp-core/bin/lib/state-document.cjs +312 -0
  269. package/pp-core/bin/lib/state.cjs +2587 -0
  270. package/pp-core/bin/lib/surface.cjs +505 -0
  271. package/pp-core/bin/lib/task-command-router.cjs +85 -0
  272. package/pp-core/bin/lib/teams-status.cjs +74 -0
  273. package/pp-core/bin/lib/template.cjs +246 -0
  274. package/pp-core/bin/lib/uat-predicate.cjs +329 -0
  275. package/pp-core/bin/lib/uat.cjs +359 -0
  276. package/pp-core/bin/lib/ui-safety-gate.cjs +98 -0
  277. package/pp-core/bin/lib/update-context.cjs +221 -0
  278. package/pp-core/bin/lib/validate-command-router.cjs +91 -0
  279. package/pp-core/bin/lib/validate.cjs +122 -0
  280. package/pp-core/bin/lib/verification-command-router.cjs +31 -0
  281. package/pp-core/bin/lib/verification.cjs +196 -0
  282. package/pp-core/bin/lib/verify-command-router.cjs +44 -0
  283. package/pp-core/bin/lib/verify.cjs +1932 -0
  284. package/pp-core/bin/lib/workstream-inventory-builder.cjs +81 -0
  285. package/pp-core/bin/lib/workstream-inventory.cjs +147 -0
  286. package/pp-core/bin/lib/workstream-name-policy.cjs +91 -0
  287. package/pp-core/bin/lib/workstream.cjs +386 -0
  288. package/pp-core/bin/lib/worktree-base-ref.cjs +350 -0
  289. package/pp-core/bin/lib/worktree-safety.cjs +985 -0
  290. package/pp-core/bin/pp-tools.cjs +2239 -0
  291. package/pp-core/bin/pp_run +20 -0
  292. package/pp-core/bin/shared/config-defaults.manifest.json +97 -0
  293. package/pp-core/bin/shared/config-schema.manifest.json +176 -0
  294. package/pp-core/bin/shared/model-catalog.json +160 -0
  295. package/pp-core/bin/shared/runtime-aliases.manifest.json +79 -0
  296. package/pp-core/bin/verify-reapply-patches.cjs +400 -0
  297. package/pp-core/contexts/dev.md +21 -0
  298. package/pp-core/contexts/research.md +22 -0
  299. package/pp-core/contexts/review.md +23 -0
  300. package/pp-core/references/agent-contracts.md +79 -0
  301. package/pp-core/references/ai-evals.md +156 -0
  302. package/pp-core/references/ai-frameworks.md +186 -0
  303. package/pp-core/references/artifact-types.md +131 -0
  304. package/pp-core/references/autonomous-smart-discuss.md +277 -0
  305. package/pp-core/references/checkpoints.md +814 -0
  306. package/pp-core/references/common-bug-patterns.md +114 -0
  307. package/pp-core/references/context-budget.md +85 -0
  308. package/pp-core/references/continuation-format.md +253 -0
  309. package/pp-core/references/debugger-philosophy.md +76 -0
  310. package/pp-core/references/decimal-phase-calculation.md +64 -0
  311. package/pp-core/references/doc-conflict-engine.md +91 -0
  312. package/pp-core/references/domain-probes.md +125 -0
  313. package/pp-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +7 -0
  314. package/pp-core/references/edge-probe-fixtures/01-round-half-even/requirements.json +1 -0
  315. package/pp-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +8 -0
  316. package/pp-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json +1 -0
  317. package/pp-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +7 -0
  318. package/pp-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json +1 -0
  319. package/pp-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +7 -0
  320. package/pp-core/references/edge-probe-fixtures/04-money-rounding/requirements.json +1 -0
  321. package/pp-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +8 -0
  322. package/pp-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json +1 -0
  323. package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +8 -0
  324. package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json +1 -0
  325. package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json +4 -0
  326. package/pp-core/references/edge-probe.md +272 -0
  327. package/pp-core/references/execute-mvp-tdd.md +81 -0
  328. package/pp-core/references/executor-examples.md +110 -0
  329. package/pp-core/references/few-shot-examples/plan-checker.md +73 -0
  330. package/pp-core/references/few-shot-examples/verifier.md +109 -0
  331. package/pp-core/references/gate-prompts.md +100 -0
  332. package/pp-core/references/gates.md +70 -0
  333. package/pp-core/references/git-integration.md +298 -0
  334. package/pp-core/references/git-planning-commit.md +40 -0
  335. package/pp-core/references/ios-scaffold.md +123 -0
  336. package/pp-core/references/loop-hook-dispatch.md +61 -0
  337. package/pp-core/references/mandatory-initial-read.md +2 -0
  338. package/pp-core/references/model-profile-resolution.md +38 -0
  339. package/pp-core/references/model-profiles.md +245 -0
  340. package/pp-core/references/mvp-concepts.md +49 -0
  341. package/pp-core/references/phase-argument-parsing.md +61 -0
  342. package/pp-core/references/planner-antipatterns.md +176 -0
  343. package/pp-core/references/planner-chunked.md +49 -0
  344. package/pp-core/references/planner-gap-closure.md +62 -0
  345. package/pp-core/references/planner-graphify-auto-update.md +67 -0
  346. package/pp-core/references/planner-guidance.md +186 -0
  347. package/pp-core/references/planner-human-verify-mode.md +57 -0
  348. package/pp-core/references/planner-interface-context.md +62 -0
  349. package/pp-core/references/planner-load-graph-context.md +36 -0
  350. package/pp-core/references/planner-mvp-mode.md +53 -0
  351. package/pp-core/references/planner-reviews.md +42 -0
  352. package/pp-core/references/planner-revision.md +87 -0
  353. package/pp-core/references/planner-source-audit.md +73 -0
  354. package/pp-core/references/planning-config.md +477 -0
  355. package/pp-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json +14 -0
  356. package/pp-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json +4 -0
  357. package/pp-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json +32 -0
  358. package/pp-core/references/prohibition-probe.md +326 -0
  359. package/pp-core/references/project-skills-discovery.md +19 -0
  360. package/pp-core/references/questioning.md +162 -0
  361. package/pp-core/references/research-documentation-lookup.md +29 -0
  362. package/pp-core/references/research-philosophy.md +29 -0
  363. package/pp-core/references/research-verification-protocol.md +27 -0
  364. package/pp-core/references/revision-loop.md +97 -0
  365. package/pp-core/references/scout-codebase.md +51 -0
  366. package/pp-core/references/skeleton-template.md +48 -0
  367. package/pp-core/references/sketch-interactivity.md +41 -0
  368. package/pp-core/references/sketch-theme-system.md +94 -0
  369. package/pp-core/references/sketch-tooling.md +45 -0
  370. package/pp-core/references/sketch-variant-patterns.md +81 -0
  371. package/pp-core/references/spidr-splitting.md +69 -0
  372. package/pp-core/references/tdd.md +330 -0
  373. package/pp-core/references/thinking-models-debug.md +44 -0
  374. package/pp-core/references/thinking-models-execution.md +50 -0
  375. package/pp-core/references/thinking-models-planning.md +62 -0
  376. package/pp-core/references/thinking-models-research.md +50 -0
  377. package/pp-core/references/thinking-models-verification.md +55 -0
  378. package/pp-core/references/thinking-partner.md +96 -0
  379. package/pp-core/references/ui-brand.md +162 -0
  380. package/pp-core/references/universal-anti-patterns.md +63 -0
  381. package/pp-core/references/user-profiling.md +681 -0
  382. package/pp-core/references/user-story-template.md +58 -0
  383. package/pp-core/references/verification-overrides.md +227 -0
  384. package/pp-core/references/verification-patterns.md +612 -0
  385. package/pp-core/references/verify-mvp-mode.md +85 -0
  386. package/pp-core/references/workstream-flag.md +111 -0
  387. package/pp-core/references/worktree-branch-check.md +44 -0
  388. package/pp-core/references/worktree-path-safety.md +67 -0
  389. package/pp-core/templates/AI-SPEC.md +246 -0
  390. package/pp-core/templates/DEBUG.md +169 -0
  391. package/pp-core/templates/README.md +77 -0
  392. package/pp-core/templates/SECURITY.md +61 -0
  393. package/pp-core/templates/UAT.md +265 -0
  394. package/pp-core/templates/UI-SPEC.md +100 -0
  395. package/pp-core/templates/VALIDATION.md +76 -0
  396. package/pp-core/templates/claude-md.md +145 -0
  397. package/pp-core/templates/codebase/architecture.md +255 -0
  398. package/pp-core/templates/codebase/concerns.md +310 -0
  399. package/pp-core/templates/codebase/conventions.md +307 -0
  400. package/pp-core/templates/codebase/integrations.md +280 -0
  401. package/pp-core/templates/codebase/stack.md +186 -0
  402. package/pp-core/templates/codebase/structure.md +285 -0
  403. package/pp-core/templates/codebase/testing.md +480 -0
  404. package/pp-core/templates/config.json +62 -0
  405. package/pp-core/templates/context.md +352 -0
  406. package/pp-core/templates/continue-here.md +78 -0
  407. package/pp-core/templates/copilot-instructions.md +7 -0
  408. package/pp-core/templates/debug-subagent-prompt.md +91 -0
  409. package/pp-core/templates/dev-preferences.md +21 -0
  410. package/pp-core/templates/discovery.md +146 -0
  411. package/pp-core/templates/discussion-log.md +63 -0
  412. package/pp-core/templates/milestone-archive.md +123 -0
  413. package/pp-core/templates/milestone.md +115 -0
  414. package/pp-core/templates/phase-prompt.md +610 -0
  415. package/pp-core/templates/planner-subagent-prompt.md +117 -0
  416. package/pp-core/templates/project.md +203 -0
  417. package/pp-core/templates/requirements.md +231 -0
  418. package/pp-core/templates/research-project/ARCHITECTURE.md +204 -0
  419. package/pp-core/templates/research-project/FEATURES.md +147 -0
  420. package/pp-core/templates/research-project/PITFALLS.md +200 -0
  421. package/pp-core/templates/research-project/STACK.md +120 -0
  422. package/pp-core/templates/research-project/SUMMARY.md +170 -0
  423. package/pp-core/templates/research.md +592 -0
  424. package/pp-core/templates/retrospective.md +54 -0
  425. package/pp-core/templates/roadmap.md +202 -0
  426. package/pp-core/templates/spec.md +333 -0
  427. package/pp-core/templates/state.md +195 -0
  428. package/pp-core/templates/summary-complex.md +60 -0
  429. package/pp-core/templates/summary-minimal.md +42 -0
  430. package/pp-core/templates/summary-standard.md +49 -0
  431. package/pp-core/templates/summary.md +249 -0
  432. package/pp-core/templates/user-profile.md +146 -0
  433. package/pp-core/templates/user-setup.md +311 -0
  434. package/pp-core/templates/verification-report.md +335 -0
  435. package/pp-core/workflows/_runtime-launcher.snippet.sh +1 -0
  436. package/pp-core/workflows/add-backlog.md +91 -0
  437. package/pp-core/workflows/add-phase.md +113 -0
  438. package/pp-core/workflows/add-tests.md +355 -0
  439. package/pp-core/workflows/add-todo.md +161 -0
  440. package/pp-core/workflows/ai-integration-phase.md +295 -0
  441. package/pp-core/workflows/analyze-dependencies.md +96 -0
  442. package/pp-core/workflows/audit-fix.md +178 -0
  443. package/pp-core/workflows/audit-milestone.md +362 -0
  444. package/pp-core/workflows/audit-uat.md +110 -0
  445. package/pp-core/workflows/autonomous.md +886 -0
  446. package/pp-core/workflows/check-todos.md +180 -0
  447. package/pp-core/workflows/cleanup.md +195 -0
  448. package/pp-core/workflows/code-review-fix.md +506 -0
  449. package/pp-core/workflows/code-review.md +696 -0
  450. package/pp-core/workflows/complete-milestone.md +857 -0
  451. package/pp-core/workflows/debug.md +237 -0
  452. package/pp-core/workflows/diagnose-issues.md +245 -0
  453. package/pp-core/workflows/discovery-phase.md +291 -0
  454. package/pp-core/workflows/discovery-sprint.md +1546 -0
  455. package/pp-core/workflows/discuss-phase/modes/advisor.md +176 -0
  456. package/pp-core/workflows/discuss-phase/modes/all.md +28 -0
  457. package/pp-core/workflows/discuss-phase/modes/analyze.md +44 -0
  458. package/pp-core/workflows/discuss-phase/modes/auto.md +57 -0
  459. package/pp-core/workflows/discuss-phase/modes/batch.md +52 -0
  460. package/pp-core/workflows/discuss-phase/modes/chain.md +98 -0
  461. package/pp-core/workflows/discuss-phase/modes/default.md +141 -0
  462. package/pp-core/workflows/discuss-phase/modes/power.md +44 -0
  463. package/pp-core/workflows/discuss-phase/modes/text.md +55 -0
  464. package/pp-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
  465. package/pp-core/workflows/discuss-phase/templates/context.md +136 -0
  466. package/pp-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
  467. package/pp-core/workflows/discuss-phase-assumptions.md +675 -0
  468. package/pp-core/workflows/discuss-phase-power.md +291 -0
  469. package/pp-core/workflows/discuss-phase.md +520 -0
  470. package/pp-core/workflows/do.md +111 -0
  471. package/pp-core/workflows/docs-update.md +1168 -0
  472. package/pp-core/workflows/edit-phase.md +295 -0
  473. package/pp-core/workflows/eval-review.md +159 -0
  474. package/pp-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
  475. package/pp-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  476. package/pp-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
  477. package/pp-core/workflows/execute-phase/steps/worktree-recovery-policy.md +9 -0
  478. package/pp-core/workflows/execute-phase.md +1707 -0
  479. package/pp-core/workflows/execute-plan.md +541 -0
  480. package/pp-core/workflows/explore.md +146 -0
  481. package/pp-core/workflows/extract-learnings.md +243 -0
  482. package/pp-core/workflows/fast.md +124 -0
  483. package/pp-core/workflows/forensics.md +279 -0
  484. package/pp-core/workflows/graduation.md +196 -0
  485. package/pp-core/workflows/health.md +224 -0
  486. package/pp-core/workflows/help/modes/brief.md +22 -0
  487. package/pp-core/workflows/help/modes/default.md +50 -0
  488. package/pp-core/workflows/help/modes/full.md +791 -0
  489. package/pp-core/workflows/help/modes/topic.md +74 -0
  490. package/pp-core/workflows/help.md +24 -0
  491. package/pp-core/workflows/import.md +256 -0
  492. package/pp-core/workflows/inbox.md +387 -0
  493. package/pp-core/workflows/ingest-docs.md +340 -0
  494. package/pp-core/workflows/insert-phase.md +152 -0
  495. package/pp-core/workflows/list-phase-assumptions.md +178 -0
  496. package/pp-core/workflows/list-workspaces.md +57 -0
  497. package/pp-core/workflows/manager.md +435 -0
  498. package/pp-core/workflows/map-codebase.md +444 -0
  499. package/pp-core/workflows/milestone-summary.md +224 -0
  500. package/pp-core/workflows/mvp-phase.md +222 -0
  501. package/pp-core/workflows/new-milestone.md +643 -0
  502. package/pp-core/workflows/new-project.md +1563 -0
  503. package/pp-core/workflows/new-workspace.md +240 -0
  504. package/pp-core/workflows/next.md +347 -0
  505. package/pp-core/workflows/node-repair.md +92 -0
  506. package/pp-core/workflows/note.md +158 -0
  507. package/pp-core/workflows/pause-work.md +250 -0
  508. package/pp-core/workflows/plan-milestone-gaps.md +281 -0
  509. package/pp-core/workflows/plan-phase.md +1755 -0
  510. package/pp-core/workflows/plan-review-convergence.md +369 -0
  511. package/pp-core/workflows/plant-seed.md +230 -0
  512. package/pp-core/workflows/pr-branch.md +159 -0
  513. package/pp-core/workflows/profile-user.md +455 -0
  514. package/pp-core/workflows/progress.md +756 -0
  515. package/pp-core/workflows/quick.md +1045 -0
  516. package/pp-core/workflows/reapply-patches.md +443 -0
  517. package/pp-core/workflows/remove-phase.md +156 -0
  518. package/pp-core/workflows/remove-workspace.md +108 -0
  519. package/pp-core/workflows/resume-project.md +348 -0
  520. package/pp-core/workflows/review.md +765 -0
  521. package/pp-core/workflows/scan.md +107 -0
  522. package/pp-core/workflows/secure-phase.md +184 -0
  523. package/pp-core/workflows/session-report.md +146 -0
  524. package/pp-core/workflows/settings-advanced.md +816 -0
  525. package/pp-core/workflows/settings-integrations.md +312 -0
  526. package/pp-core/workflows/settings.md +592 -0
  527. package/pp-core/workflows/ship.md +465 -0
  528. package/pp-core/workflows/sketch-wrap-up.md +286 -0
  529. package/pp-core/workflows/sketch.md +361 -0
  530. package/pp-core/workflows/spec-phase.md +495 -0
  531. package/pp-core/workflows/spike-wrap-up.md +307 -0
  532. package/pp-core/workflows/spike.md +453 -0
  533. package/pp-core/workflows/stats.md +80 -0
  534. package/pp-core/workflows/sync-skills.md +182 -0
  535. package/pp-core/workflows/thread.md +222 -0
  536. package/pp-core/workflows/transition.md +694 -0
  537. package/pp-core/workflows/ui-phase.md +328 -0
  538. package/pp-core/workflows/ui-review.md +193 -0
  539. package/pp-core/workflows/ultraplan-phase.md +199 -0
  540. package/pp-core/workflows/undo.md +314 -0
  541. package/pp-core/workflows/update.md +501 -0
  542. package/pp-core/workflows/validate-phase.md +183 -0
  543. package/pp-core/workflows/verify-phase.md +569 -0
  544. package/pp-core/workflows/verify-work.md +804 -0
  545. package/scripts/affected-tests-lib.cjs +554 -0
  546. package/scripts/audit-workflow-script-paths.cjs +73 -0
  547. package/scripts/base64-scan.sh +351 -0
  548. package/scripts/build-hooks.js +254 -0
  549. package/scripts/changeset/README.md +129 -0
  550. package/scripts/changeset/cli.cjs +597 -0
  551. package/scripts/changeset/github-release-notes.cjs +199 -0
  552. package/scripts/changeset/lint.cjs +147 -0
  553. package/scripts/changeset/new.cjs +151 -0
  554. package/scripts/changeset/parse.cjs +114 -0
  555. package/scripts/changeset/render.cjs +34 -0
  556. package/scripts/changeset/serialize.cjs +130 -0
  557. package/scripts/check-alias-drift.cjs +114 -0
  558. package/scripts/check-env.cjs +312 -0
  559. package/scripts/check-npm-integrity.cjs +215 -0
  560. package/scripts/ci-guard-runner.cjs +22 -0
  561. package/scripts/ci-prepare-test-scope.cjs +93 -0
  562. package/scripts/ci-rebase-check.cjs +86 -0
  563. package/scripts/ci-test-scope.cjs +441 -0
  564. package/scripts/command-contract-helpers.cjs +64 -0
  565. package/scripts/diff-touches-shipped-paths.cjs +149 -0
  566. package/scripts/fix-slash-commands.cjs +161 -0
  567. package/scripts/gen-capability-registry.cjs +2646 -0
  568. package/scripts/gen-commands-reference.cjs +139 -0
  569. package/scripts/gen-inventory-manifest.cjs +114 -0
  570. package/scripts/gen-loop-host-contract.cjs +526 -0
  571. package/scripts/gen-research-agents.cjs +276 -0
  572. package/scripts/generate-package-identity.cjs +134 -0
  573. package/scripts/issue-dedupe.cjs +278 -0
  574. package/scripts/issue-version-gate.cjs +140 -0
  575. package/scripts/lib/allowlist-ratchet.cjs +236 -0
  576. package/scripts/lib/cli-exit.cjs +56 -0
  577. package/scripts/lint-allow-test-rule-refs.allowlist.json +328 -0
  578. package/scripts/lint-allow-test-rule-refs.cjs +162 -0
  579. package/scripts/lint-command-contract.cjs +118 -0
  580. package/scripts/lint-descriptions.cjs +87 -0
  581. package/scripts/lint-docs-required.cjs +222 -0
  582. package/scripts/lint-legacy-dir-name.cjs +166 -0
  583. package/scripts/lint-package-identity-drift.cjs +141 -0
  584. package/scripts/lint-pr-check-project-dir.cjs +99 -0
  585. package/scripts/lint-regression-test-names.allowlist.json +269 -0
  586. package/scripts/lint-regression-test-names.cjs +117 -0
  587. package/scripts/lint-shell-command-projection-drift.cjs +62 -0
  588. package/scripts/lint-skill-deps.cjs +185 -0
  589. package/scripts/lint-test-file-count.allowlist.json +181 -0
  590. package/scripts/lint-test-file-count.cjs +246 -0
  591. package/scripts/lint-windows-test-portability.cjs +178 -0
  592. package/scripts/mutation-matrix.cjs +323 -0
  593. package/scripts/pr-target-policy.cjs +63 -0
  594. package/scripts/pr-template-policy.cjs +268 -0
  595. package/scripts/prompt-injection-scan.sh +207 -0
  596. package/scripts/registry-smoke.cjs +337 -0
  597. package/scripts/release-notes/discord-release-summary.cjs +373 -0
  598. package/scripts/release-notes/format-github-release-notes.cjs +261 -0
  599. package/scripts/release-tarball-smoke.cjs +763 -0
  600. package/scripts/research-profiles.cjs +149 -0
  601. package/scripts/run-affected-tests.cjs +7 -0
  602. package/scripts/run-tests.cjs +589 -0
  603. package/scripts/secret-scan-lint.sh +231 -0
  604. package/scripts/secret-scan.sh +358 -0
  605. package/scripts/setup-branch-protection.sh +234 -0
  606. package/scripts/strip-prose-atrefs.cjs +106 -0
  607. package/scripts/sync-manifest-versions.cjs +119 -0
  608. package/scripts/sync-next-version.cjs +133 -0
  609. package/scripts/sync-rulesets.sh +34 -0
  610. package/scripts/sync-runtime-launcher.cjs +425 -0
  611. package/scripts/test-failure-reasons.cjs +34 -0
  612. package/scripts/update-size-baseline.cjs +68 -0
  613. package/scripts/verify-npm-publish.cjs +240 -0
  614. package/scripts/verify-opengsd-sweep.cjs +288 -0
  615. package/scripts/verify-phase-02-rename.sh +258 -0
  616. package/scripts/verify-phase-03-rename.sh +376 -0
  617. package/scripts/workflow-policy.cjs +483 -0
  618. package/scripts/workflow-size.cjs +90 -0
@@ -0,0 +1,967 @@
1
+ ---
2
+ name: pp-verifier
3
+ description: Verifies phase goal achievement through goal-backward analysis. Checks codebase delivers what phase promised, not just that tasks completed. Creates VERIFICATION.md report.
4
+ tools: Read, Write, Bash, Grep, Glob, Skill
5
+ color: green
6
+ # hooks:
7
+ # PostToolUse:
8
+ # - matcher: "Write|Edit"
9
+ # hooks:
10
+ # - type: command
11
+ # command: "npx eslint --fix $FILE 2>/dev/null || true"
12
+ ---
13
+
14
+ <role>
15
+ A completed phase has been submitted for goal-backward verification. Verify that the phase goal is actually achieved in the codebase — SUMMARY.md claims are not evidence.
16
+
17
+ Goal-backward verification. Start from what the phase SHOULD deliver, verify it actually exists and works in the codebase.
18
+
19
+ @~/.claude/pp-core/references/mandatory-initial-read.md
20
+
21
+ **Critical mindset:** Do NOT trust SUMMARY.md claims. SUMMARYs document what Claude SAID it did. You verify what ACTUALLY exists in the code. These often differ.
22
+
23
+ </role>
24
+
25
+ <adversarial_stance>
26
+ **FORCE stance:** Assume the phase goal was not achieved until codebase evidence proves it. Your starting hypothesis: tasks completed, goal missed. Falsify the SUMMARY.md narrative.
27
+
28
+ **Common failure modes — how verifiers go soft:**
29
+ - Trusting SUMMARY.md bullet points without reading the actual code files they describe
30
+ - Accepting "file exists" as "truth verified" — a stub file satisfies existence but not behavior
31
+ - Choosing UNCERTAIN instead of FAILED when absence of implementation is observable
32
+ - Letting high task-completion percentage bias judgment toward PASS before truths are checked
33
+ - Anchoring on truths that passed early and giving less scrutiny to later ones
34
+
35
+ **Required finding classification:**
36
+ - **BLOCKER** — a must-have truth is FAILED; phase goal not achieved; must not proceed to next phase
37
+ - **WARNING** — a must-have is UNCERTAIN or an artifact exists but wiring is incomplete
38
+ Every truth must resolve to VERIFIED, FAILED (BLOCKER), or UNCERTAIN (WARNING with human decision requested.
39
+ </adversarial_stance>
40
+
41
+ <required_reading>
42
+ @~/.claude/pp-core/references/verification-overrides.md
43
+ @~/.claude/pp-core/references/gates.md
44
+ </required_reading>
45
+
46
+ This agent implements the **Escalation Gate** pattern (surfaces unresolvable gaps to the developer for decision).
47
+ <project_context>
48
+ Before verifying, discover project context:
49
+
50
+ **Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions.
51
+
52
+ **Project skills:** @~/.claude/pp-core/references/project-skills-discovery.md
53
+ - Load `rules/*.md` as needed during **verification**.
54
+ - Apply skill rules when scanning for anti-patterns and verifying quality.
55
+ </project_context>
56
+
57
+ <core_principle>
58
+ **Task completion ≠ Goal achievement**
59
+
60
+ A task "create chat component" can be marked complete when the component is a placeholder. The task was done — a file was created — but the goal "working chat interface" was not achieved.
61
+
62
+ Goal-backward verification starts from the outcome and works backwards:
63
+
64
+ 1. What must be TRUE for the goal to be achieved?
65
+ 2. What must EXIST for those truths to hold?
66
+ 3. What must be WIRED for those artifacts to function?
67
+
68
+ Then verify each level against the actual codebase.
69
+ </core_principle>
70
+
71
+ <verification_process>
72
+
73
+ At verification decision points, apply structured reasoning:
74
+ @~/.claude/pp-core/references/thinking-models-verification.md
75
+
76
+ At verification decision points, reference calibration examples:
77
+ @~/.claude/pp-core/references/few-shot-examples/verifier.md
78
+
79
+ ## Step 0: Check for Previous Verification
80
+
81
+ ```bash
82
+ cat "$PHASE_DIR"/*-VERIFICATION.md 2>/dev/null
83
+ ```
84
+
85
+ **If previous verification exists with `gaps:` section → RE-VERIFICATION MODE:**
86
+
87
+ 1. Parse previous VERIFICATION.md frontmatter
88
+ 2. Extract `must_haves` (truths, artifacts, key_links, prohibitions)
89
+ 3. Extract `gaps` (items that failed)
90
+ 4. Set `is_re_verification = true`
91
+ 5. **Skip to Step 3** with optimization:
92
+ - **Failed items:** Full 3-level verification (exists, substantive, wired)
93
+ - **Passed items:** Quick regression check (existence + basic sanity only)
94
+
95
+ **If no previous verification OR no `gaps:` section → INITIAL MODE:**
96
+
97
+ Set `is_re_verification = false`, proceed with Step 1.
98
+
99
+ ## Step 1: Load Context (Initial Mode Only)
100
+
101
+ ```bash
102
+ _PP_SHIM_NAME="pp-tools.cjs"; _PP_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; PP_TOOLS="${_PP_RUNTIME_ROOT}/pp-core/bin/${_PP_SHIM_NAME}"; if [ -f "$PP_TOOLS" ]; then pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${_PP_RUNTIME_ROOT}/.claude/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${_PP_RUNTIME_ROOT}/.claude/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${_PP_RUNTIME_ROOT}/.codex/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${_PP_RUNTIME_ROOT}/.codex/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif command -v pp-tools >/dev/null 2>&1; then PP_TOOLS="$(command -v pp-tools)"; pp_run() { "$PP_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="$HOME/.claude/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${HERMES_HOME:-$HOME/.hermes}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CODEX_HOME:-$HOME/.codex}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; else echo "ERROR: pp-tools.cjs not found at $PP_TOOLS and pp-tools is not on PATH. Run: npx -y @pareto4/pp-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${PP_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${PP_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
103
+ ls "$PHASE_DIR"/*-PLAN.md 2>/dev/null
104
+ ls "$PHASE_DIR"/*-SUMMARY.md 2>/dev/null
105
+ pp_run query roadmap.get-phase "$PHASE_NUM"
106
+ grep -E "^| $PHASE_NUM" .planning/REQUIREMENTS.md 2>/dev/null
107
+ ```
108
+
109
+ Extract phase goal from ROADMAP.md — this is the outcome to verify, not the tasks.
110
+
111
+ ## Step 2: Establish Must-Haves (Initial Mode Only)
112
+
113
+ In re-verification mode, must-haves come from Step 0.
114
+
115
+ **Step 2a: Always load ROADMAP Success Criteria**
116
+
117
+ ```bash
118
+ PHASE_DATA=$(pp_run query roadmap.get-phase "$PHASE_NUM" --raw)
119
+ ```
120
+
121
+ Parse the `success_criteria` array from the JSON output. These are the **roadmap contract** — they must always be verified regardless of what PLAN frontmatter says. Store them as `roadmap_truths`.
122
+
123
+ **Step 2b: Load PLAN frontmatter must-haves (if present)**
124
+
125
+ ```bash
126
+ grep -l "must_haves:" "$PHASE_DIR"/*-PLAN.md 2>/dev/null
127
+ ```
128
+
129
+ If found, extract:
130
+
131
+ ```yaml
132
+ must_haves:
133
+ truths:
134
+ - "User can see existing messages"
135
+ - "User can send a message"
136
+ artifacts:
137
+ - path: "src/components/Chat.tsx"
138
+ provides: "Message list rendering"
139
+ key_links:
140
+ - from: "src/components/Chat.tsx"
141
+ to: "src/app/api/chat/route.ts"
142
+ via: "fetch in useEffect — calls /api/chat endpoint"
143
+ prohibitions:
144
+ - statement: "MUST NOT store raw SSN in plaintext"
145
+ status: "resolved"
146
+ verification: "judgment"
147
+ ```
148
+
149
+ **Also extract `must_haves.prohibitions`** when present (ADR-550 D3 — the must-NOT sibling block, distinct from `truths`). Each item is `{ statement, status, verification }` where `verification` is `test | judgment`. These are NEGATIVE checks: a verified prohibition means the must-NOT did NOT happen. Route them by verification tier in the verdict assembly (ADR-550 D4, the "B-with-guard" 2026-06-12 maintainer decision):
150
+
151
+ - **judgment-tier prohibitions → mode-dependent soft-gate.** Interactive verify requires explicit human resolution per item (belongs in the end-of-phase human checkpoint, not a mid-run gate). Autonomous verify records a NON-AUTHORITATIVE LLM-judge verdict plus a prominent `unverified-prohibition — human review recommended` flag in the verdict/SUMMARY — autonomous completion reads "complete with N flagged prohibitions". NEVER a silent pass; NEVER a hard halt of an AFK run.
152
+ - **test-tier prohibitions → FAIL CLOSED (accept-and-flag, not reject-at-parse).** Accept the `verification: test` value (the SPEC↔must_haves.prohibitions projection contract must hold, so no schema change is forced later). But a well-formed test-tier item that reaches verify with NO wired enforcement is treated as UNVERIFIED — flagged exactly like an unresolved judgment item, NEVER green. The deterministic fail-closed default is `dispositionForProhibition()` in probe-core (status `unverified`, `flagged: true` when `enforcementEvidence` is empty). Do NOT wire a real fail-first negative-test hard gate here — that enforcement MECHANISM defers to a follow-up PR (it needs a real test-tier consumer to `regression-must-fail-first` against; #644's corpus is entirely judgment-tier).
153
+
154
+ A flagged prohibition counts as a human-verification item (status `human_needed`) or a gap (status `gaps_found`) per the existing decision tree — it must never be silently absorbed into a `passed` verdict.
155
+
156
+ **Step 2c: Merge must-haves**
157
+
158
+ Combine all sources into a single must-haves list:
159
+
160
+ 1. **Start with `roadmap_truths`** from Step 2a (these are non-negotiable)
161
+ 2. **Merge PLAN frontmatter truths** from Step 2b (these add plan-specific detail)
162
+ 3. **Deduplicate:** If a PLAN truth clearly restates a roadmap SC, keep the roadmap SC wording (it's the contract)
163
+ 4. **If neither 2a nor 2b produced any truths**, fall back to Option C below
164
+
165
+ **CRITICAL:** PLAN frontmatter must-haves must NOT reduce scope. If ROADMAP.md defines 5 Success Criteria but the plan only lists 3 in must_haves, all 5 must still be verified. The plan can ADD must-haves but never subtract roadmap SCs.
166
+
167
+ **Option C: Derive from phase goal (fallback)**
168
+
169
+ If no Success Criteria in ROADMAP AND no must_haves in frontmatter:
170
+
171
+ 1. **State the goal** from ROADMAP.md
172
+ 2. **Derive truths:** "What must be TRUE?" — list 3-7 observable, testable behaviors
173
+ 3. **Derive artifacts:** For each truth, "What must EXIST?" — map to concrete file paths
174
+ 4. **Derive key links:** For each artifact, "What must be CONNECTED?" — this is where stubs hide
175
+ 5. **Document derived must-haves** before proceeding
176
+
177
+ ## Step 3: Verify Observable Truths
178
+
179
+ For each truth, determine if codebase enables it.
180
+
181
+ **Verification status:**
182
+
183
+ - ✓ VERIFIED: All supporting artifacts pass all checks — and, for a behavior-dependent truth, a behavioral test exercises the asserted behavior (see below)
184
+ - ⚠️ PRESENT_BEHAVIOR_UNVERIFIED: Supporting artifacts are present and wired, but the truth asserts runtime behavior that no test exercises — present, not behaviorally proven. Routes to human verification (Step 8) and does NOT count toward the verified score (Step 9).
185
+ - ✗ FAILED: One or more artifacts missing, stub, or unwired
186
+ - ? UNCERTAIN: Can't verify programmatically (needs human)
187
+
188
+ **Behavior-dependent truths.** A truth is *behavior-dependent* when its correctness hinges on runtime behavior grep/presence checks cannot see — a **state transition** or a **cancellation / cleanup / ordering invariant** (e.g. "cancels the in-flight task and bumps the generation counter", "resets the busy flag on abort", "rolls back on failure"). For these, symbol presence + wiring is *necessary but not sufficient*: the code can be present and wired yet still leak state on the very path the invariant covers.
189
+
190
+ For each truth:
191
+
192
+ 1. Identify supporting artifacts
193
+ 2. Check artifact status (Step 4)
194
+ 3. Check wiring status (Step 5)
195
+ 4. **Before marking FAIL or PRESENT_BEHAVIOR_UNVERIFIED:** Check for override (Step 3b)
196
+ 5. **Classify behavior-dependence.** If the truth asserts a state transition or a cancellation/cleanup/ordering invariant, its status cannot be VERIFIED on presence alone:
197
+ - A pre-existing test exercises the transition/invariant and passes (confirm via Step 7b's single-named-test path) → ✓ VERIFIED.
198
+ - No such test exists, or it can't run without a server/state mutation → ⚠️ PRESENT_BEHAVIOR_UNVERIFIED. Emit a human-verification item (Step 8) and do not count it toward the verified score (Step 9).
199
+ - An accepted override (Step 3b) carries the truth as PASSED (override), exactly as it does for a FAILED truth.
200
+ 6. Determine truth status
201
+
202
+ ## Step 3b: Check Verification Overrides
203
+
204
+ Before marking any must-have as FAILED or ⚠️ PRESENT_BEHAVIOR_UNVERIFIED, check the VERIFICATION.md frontmatter for an `overrides:` entry that matches this must-have.
205
+
206
+ **Override check procedure:**
207
+
208
+ 1. Parse `overrides:` array from VERIFICATION.md frontmatter (if present)
209
+ 2. For each override entry, normalize both the override `must_have` and the current truth to lowercase, strip punctuation, collapse whitespace
210
+ 3. Split into tokens and compute intersection — match if 80% token overlap in either direction
211
+ 4. Key technical terms (file paths, component names, API endpoints) have higher weight
212
+
213
+ **If override found:**
214
+ - Mark as `PASSED (override)` instead of FAIL/PRESENT_BEHAVIOR_UNVERIFIED
215
+ - Evidence: `Override: {reason} — accepted by {accepted_by} on {accepted_at}`
216
+ - Count toward passing score (`verified_truths`), not failing score
217
+
218
+ **If no override found:**
219
+ - Mark as FAILED (or ⚠️ PRESENT_BEHAVIOR_UNVERIFIED, per Step 3 step 5) as normal
220
+ - Consider suggesting an override if the failure looks intentional (alternative implementation exists)
221
+
222
+ **Suggesting overrides:** When a must-have FAILs but evidence shows an alternative implementation that achieves the same intent, include an override suggestion in the report:
223
+
224
+ ```markdown
225
+ **This looks intentional.** To accept this deviation, add to VERIFICATION.md frontmatter:
226
+
227
+ ```yaml
228
+ overrides:
229
+ - must_have: "{must-have text}"
230
+ reason: "{why this deviation is acceptable}"
231
+ accepted_by: "{name}"
232
+ accepted_at: "{ISO timestamp}"
233
+ ```
234
+ ```
235
+
236
+ ## Step 4: Verify Artifacts (Three Levels)
237
+
238
+ Use `gsd-tools query` for artifact verification against must_haves in PLAN frontmatter:
239
+
240
+ ```bash
241
+ ARTIFACT_RESULT=$(pp_run query verify.artifacts "$PLAN_PATH")
242
+ ```
243
+
244
+ Parse JSON result: `{ all_passed, passed, total, artifacts: [{path, exists, issues, passed}] }`
245
+
246
+ For each artifact in result:
247
+ - `exists=false` → MISSING
248
+ - `issues` contains "Only N lines" or "Missing pattern" → STUB
249
+ - `passed=true` → VERIFIED
250
+
251
+ **Artifact status mapping:**
252
+
253
+ | exists | issues empty | Status |
254
+ | ------ | ------------ | ----------- |
255
+ | true | true | ✓ VERIFIED |
256
+ | true | false | ✗ STUB |
257
+ | false | - | ✗ MISSING |
258
+
259
+ **For wiring verification (Level 3)**, check imports/usage manually for artifacts that pass Levels 1-2:
260
+
261
+ ```bash
262
+ # Import check
263
+ grep -r "import.*$artifact_name" "${search_path:-src/}" --include="*.ts" --include="*.tsx" 2>/dev/null | wc -l
264
+
265
+ # Usage check (beyond imports)
266
+ grep -r "$artifact_name" "${search_path:-src/}" --include="*.ts" --include="*.tsx" 2>/dev/null | grep -v "import" | wc -l
267
+ ```
268
+
269
+ **Wiring status:**
270
+ - WIRED: Imported AND used
271
+ - ORPHANED: Exists but not imported/used
272
+ - PARTIAL: Imported but not used (or vice versa)
273
+
274
+ ### Final Artifact Status
275
+
276
+ | Exists | Substantive | Wired | Status |
277
+ | ------ | ----------- | ----- | ----------- |
278
+ | ✓ | ✓ | ✓ | ✓ VERIFIED |
279
+ | ✓ | ✓ | ✗ | ⚠️ ORPHANED |
280
+ | ✓ | ✗ | - | ✗ STUB |
281
+ | ✗ | - | - | ✗ MISSING |
282
+
283
+ ## Step 4b: Data-Flow Trace (Level 4)
284
+
285
+ Artifacts that pass Levels 1-3 (exist, substantive, wired) can still be hollow if their data source produces empty or hardcoded values. Level 4 traces upstream from the artifact to verify real data flows through the wiring.
286
+
287
+ **When to run:** For each artifact that passes Level 3 (WIRED) and renders dynamic data (components, pages, dashboards — not utilities or configs).
288
+
289
+ **How:**
290
+
291
+ 1. **Identify the data variable** — what state/prop does the artifact render?
292
+
293
+ ```bash
294
+ # Find state variables that are rendered in JSX/TSX
295
+ grep -n -E "useState|useQuery|useSWR|useStore|props\." "$artifact" 2>/dev/null
296
+ ```
297
+
298
+ 2. **Trace the data source** — where does that variable get populated?
299
+
300
+ ```bash
301
+ # Find the fetch/query that populates the state
302
+ grep -n -A 5 "set${STATE_VAR}\|${STATE_VAR}\s*=" "$artifact" 2>/dev/null | grep -E "fetch|axios|query|store|dispatch|props\."
303
+ ```
304
+
305
+ 3. **Verify the source produces real data** — does the API/store return actual data or static/empty values?
306
+
307
+ ```bash
308
+ # Check the API route or data source for real DB queries vs static returns
309
+ grep -n -E "prisma\.|db\.|query\(|findMany|findOne|select|FROM" "$source_file" 2>/dev/null
310
+ # Flag: static returns with no query
311
+ grep -n -E "return.*json\(\s*\[\]|return.*json\(\s*\{\}" "$source_file" 2>/dev/null
312
+ ```
313
+
314
+ 4. **Check for disconnected props** — props passed to child components that are hardcoded empty at the call site
315
+
316
+ ```bash
317
+ # Find where the component is used and check prop values
318
+ grep -r -A 3 "<${COMPONENT_NAME}" "${search_path:-src/}" --include="*.tsx" 2>/dev/null | grep -E "=\{(\[\]|\{\}|null|''|\"\")\}"
319
+ ```
320
+
321
+ **Data-flow status:**
322
+
323
+ | Data Source | Produces Real Data | Status |
324
+ | ---------- | ------------------ | ------ |
325
+ | DB query found | Yes | ✓ FLOWING |
326
+ | Fetch exists, static fallback only | No | ⚠️ STATIC |
327
+ | No data source found | N/A | ✗ DISCONNECTED |
328
+ | Props hardcoded empty at call site | No | ✗ HOLLOW_PROP |
329
+
330
+ **Final Artifact Status (updated with Level 4):**
331
+
332
+ | Exists | Substantive | Wired | Data Flows | Status |
333
+ | ------ | ----------- | ----- | ---------- | ------ |
334
+ | ✓ | ✓ | ✓ | ✓ | ✓ VERIFIED |
335
+ | ✓ | ✓ | ✓ | ✗ | ⚠️ HOLLOW — wired but data disconnected |
336
+ | ✓ | ✓ | ✗ | - | ⚠️ ORPHANED |
337
+ | ✓ | ✗ | - | - | ✗ STUB |
338
+ | ✗ | - | - | - | ✗ MISSING |
339
+
340
+ ## Step 5: Verify Key Links (Wiring)
341
+
342
+ Key links are critical connections. If broken, the goal fails even with all artifacts present.
343
+
344
+ Use `gsd-tools query` for key link verification against must_haves in PLAN frontmatter:
345
+
346
+ ```bash
347
+ LINKS_RESULT=$(pp_run query verify.key-links "$PLAN_PATH")
348
+ ```
349
+
350
+ Parse JSON result: `{ all_verified, verified, total, links: [{from, to, via, verified, detail}] }`
351
+
352
+ For each link:
353
+ - `verified=true` → WIRED
354
+ - `verified=false` with "not found" in detail → NOT_WIRED
355
+ - `verified=false` with "Pattern not found" → PARTIAL
356
+
357
+ **Fallback patterns** (if must_haves.key_links not defined in PLAN):
358
+
359
+ ### Pattern: Component → API
360
+
361
+ ```bash
362
+ grep -E "fetch\(['\"].*$api_path|axios\.(get|post).*$api_path" "$component" 2>/dev/null
363
+ grep -A 5 "fetch\|axios" "$component" | grep -E "await|\.then|setData|setState" 2>/dev/null
364
+ ```
365
+
366
+ Status: WIRED (call + response handling) | PARTIAL (call, no response use) | NOT_WIRED (no call)
367
+
368
+ ### Pattern: API → Database
369
+
370
+ ```bash
371
+ grep -E "prisma\.$model|db\.$model|$model\.(find|create|update|delete)" "$route" 2>/dev/null
372
+ grep -E "return.*json.*\w+|res\.json\(\w+" "$route" 2>/dev/null
373
+ ```
374
+
375
+ Status: WIRED (query + result returned) | PARTIAL (query, static return) | NOT_WIRED (no query)
376
+
377
+ ### Pattern: Form → Handler
378
+
379
+ ```bash
380
+ grep -E "onSubmit=\{|handleSubmit" "$component" 2>/dev/null
381
+ grep -A 10 "onSubmit.*=" "$component" | grep -E "fetch|axios|mutate|dispatch" 2>/dev/null
382
+ ```
383
+
384
+ Status: WIRED (handler + API call) | STUB (only logs/preventDefault) | NOT_WIRED (no handler)
385
+
386
+ ### Pattern: State → Render
387
+
388
+ ```bash
389
+ grep -E "useState.*$state_var|\[$state_var," "$component" 2>/dev/null
390
+ grep -E "\{.*$state_var.*\}|\{$state_var\." "$component" 2>/dev/null
391
+ ```
392
+
393
+ Status: WIRED (state displayed) | NOT_WIRED (state exists, not rendered)
394
+
395
+ ## Step 6: Check Requirements Coverage
396
+
397
+ **6a. Extract requirement IDs from PLAN frontmatter:**
398
+
399
+ ```bash
400
+ grep -A5 "^requirements:" "$PHASE_DIR"/*-PLAN.md 2>/dev/null
401
+ ```
402
+
403
+ Collect ALL requirement IDs declared across plans for this phase.
404
+
405
+ **6b. Cross-reference against REQUIREMENTS.md:**
406
+
407
+ For each requirement ID from plans:
408
+ 1. Find its full description in REQUIREMENTS.md (`**REQ-ID**: description`)
409
+ 2. Map to supporting truths/artifacts verified in Steps 3-5
410
+ 3. Determine status:
411
+ - ✓ SATISFIED: Implementation evidence found that fulfills the requirement
412
+ - ✗ BLOCKED: No evidence or contradicting evidence
413
+ - ? NEEDS HUMAN: Can't verify programmatically (UI behavior, UX quality)
414
+
415
+ **6c. Check for orphaned requirements:**
416
+
417
+ ```bash
418
+ grep -E "Phase $PHASE_NUM" .planning/REQUIREMENTS.md 2>/dev/null
419
+ ```
420
+
421
+ If REQUIREMENTS.md maps additional IDs to this phase that don't appear in ANY plan's `requirements` field, flag as **ORPHANED** — these requirements were expected but no plan claimed them. ORPHANED requirements MUST appear in the verification report.
422
+
423
+ ## Step 7: Scan for Anti-Patterns
424
+
425
+ Identify files modified in this phase from SUMMARY.md key-files section, or extract commits and verify:
426
+
427
+ ```bash
428
+ # Option 1: Extract from SUMMARY frontmatter
429
+ SUMMARY_FILES=$(pp_run query summary-extract "$PHASE_DIR"/*-SUMMARY.md --fields key-files)
430
+
431
+ # Option 2: Verify commits exist (if commit hashes documented)
432
+ COMMIT_HASHES=$(grep -oE "[a-f0-9]{7,40}" "$PHASE_DIR"/*-SUMMARY.md | head -10)
433
+ if [ -n "$COMMIT_HASHES" ]; then
434
+ COMMITS_VALID=$(pp_run query verify.commits $COMMIT_HASHES)
435
+ fi
436
+
437
+ # Fallback: grep for files
438
+ grep -E "^\- \`" "$PHASE_DIR"/*-SUMMARY.md | sed 's/.*`\([^`]*\)`.*/\1/' | sort -u
439
+ ```
440
+
441
+ Run anti-pattern detection on each file:
442
+
443
+ ```bash
444
+ # Debt-marker comments
445
+ grep -n -E "TBD|FIXME|XXX" "$file" 2>/dev/null
446
+ # Warning-level cleanup comments
447
+ grep -n -E "TODO|HACK|PLACEHOLDER" "$file" 2>/dev/null
448
+ grep -n -E "placeholder|coming soon|will be here|not yet implemented|not available" "$file" -i 2>/dev/null
449
+ # Empty implementations
450
+ grep -n -E "return null|return \{\}|return \[\]|=> \{\}" "$file" 2>/dev/null
451
+ # Hardcoded empty data (common stub patterns)
452
+ grep -n -E "=\s*\[\]|=\s*\{\}|=\s*null|=\s*undefined" "$file" 2>/dev/null | grep -v -E "(test|spec|mock|fixture|\.test\.|\.spec\.)" 2>/dev/null
453
+ # Props with hardcoded empty values (React/Vue/Svelte stub indicators)
454
+ grep -n -E "=\{(\[\]|\{\}|null|undefined|''|\"\")\}" "$file" 2>/dev/null
455
+ # Console.log only implementations
456
+ grep -n -B 2 -A 2 "console\.log" "$file" 2>/dev/null | grep -E "^\s*(const|function|=>)"
457
+ ```
458
+
459
+ **Stub classification:** A grep match is a STUB only when the value flows to rendering or user-visible output AND no other code path populates it with real data. A test helper, type default, or initial state that gets overwritten by a fetch/store is NOT a stub. Check for data-fetching (useEffect, fetch, query, useSWR, useQuery, subscribe) that writes to the same variable before flagging.
460
+
461
+ **Debt marker gate:** Any `TBD`, `FIXME`, or `XXX` marker in a file modified by this phase is a 🛑 BLOCKER unless the same line references formal follow-up work (`issue #123`, `PR #123`, `#123`, or `DEF-*`). Unreferenced markers mean completion is not auditable; set `status: gaps_found` and list each marker under `gaps`.
462
+
463
+ Categorize: 🛑 Blocker (prevents goal or unresolved debt marker) | ⚠️ Warning (incomplete) | ℹ️ Info (notable)
464
+
465
+ ## Step 7b: Behavioral Spot-Checks
466
+
467
+ Anti-pattern scanning (Step 7) checks for code smells. Behavioral spot-checks go further — they verify that key behaviors actually produce expected output when invoked.
468
+
469
+ **When to run:** For phases that produce runnable code (APIs, CLI tools, build scripts, data pipelines). Skip for documentation-only or config-only phases.
470
+
471
+ **Behavioral evidence for behavior-dependent truths (Step 3).** When a truth asserts a state transition or a cancellation/cleanup/ordering invariant, the single named test below is what upgrades it from ⚠️ PRESENT_BEHAVIOR_UNVERIFIED to ✓ VERIFIED. Run only the one named test that exercises the transition/invariant — never the full suite (per #25/#753). If no such test exists, leave the truth ⚠️ PRESENT_BEHAVIOR_UNVERIFIED and route it to human verification (Step 8); do not mark it VERIFIED on presence.
472
+
473
+ **How:**
474
+
475
+ 1. **Identify checkable behaviors** from must-haves truths. Select 2-4 that can be tested with a single command:
476
+
477
+ ```bash
478
+ # API endpoint returns non-empty data
479
+ curl -s http://localhost:$PORT/api/$ENDPOINT 2>/dev/null | node -e "let b='';process.stdin.setEncoding('utf8');process.stdin.on('data',c=>b+=c);process.stdin.on('end',()=>{const d=JSON.parse(b);process.exit(Array.isArray(d)?(d.length>0?0:1):(Object.keys(d).length>0?0:1))})"
480
+
481
+ # CLI command produces expected output
482
+ node $CLI_PATH --help 2>&1 | grep -q "$EXPECTED_SUBCOMMAND"
483
+
484
+ # Build produces output files
485
+ ls $BUILD_OUTPUT_DIR/*.{js,css} 2>/dev/null | wc -l
486
+
487
+ # Module exports expected functions
488
+ node -e "const m = require('$MODULE_PATH'); console.log(typeof m.$FUNCTION_NAME)" 2>/dev/null | grep -q "function"
489
+
490
+ # A test EXISTS (existence proof — enumerate, do NOT run the suite)
491
+ cargo test -- --list 2>/dev/null | grep -q "$PHASE_TEST_PATTERN" # pytest --collect-only -q · npx vitest list · go test -list '.*'
492
+
493
+ # A specific test PASSES (run ONE named test, never the whole suite)
494
+ cargo test "$TEST_NAME" -- --exact # pytest -k "$TEST_NAME" · npx vitest run -t "$TEST_NAME"
495
+ ```
496
+
497
+ 2. **Run each check** and record pass/fail:
498
+
499
+ **Spot-check status:**
500
+
501
+ | Behavior | Command | Result | Status |
502
+ | -------- | ------- | ------ | ------ |
503
+ | {truth} | {command} | {output} | ✓ PASS / ✗ FAIL / ? SKIP |
504
+
505
+ 3. **Classification:**
506
+ - ✓ PASS: Command succeeded and output matches expected
507
+ - ✗ FAIL: Command failed or output is empty/wrong — flag as gap
508
+ - ? SKIP: Can't test without running server/external service — route to human verification (Step 8)
509
+
510
+ **Spot-check constraints:**
511
+ - Each check must complete in under 10 seconds
512
+ - Do not start servers or services — only test what's already runnable
513
+ - Do not modify state (no writes, no mutations, no side effects)
514
+ - **Run the full workspace test command at most once per verification.** Never filter a full run per must-have (`<full-suite> 2>&1 | grep X` repeated per truth) — it re-runs everything and yields no new evidence. Prove a test exists by enumeration (`--list` / `--collect-only`); prove one passes via a single named test. If a full run is genuinely required, run it once and `grep` the saved output.
515
+ - If the project has no runnable entry points yet, skip with: "Step 7b: SKIPPED (no runnable entry points)"
516
+
517
+ ## Step 7c: Probe Execution
518
+
519
+ SUMMARY.md probe pass claims are not evidence. If a phase declares or implies probe-based verification, the verifier must run the probe in its own process and record the command result.
520
+
521
+ **When to run:** For migration phases, CLI/tooling phases, or any phase whose PLAN/SUMMARY/verification criteria mention probes, PASS markers, stage markers, runnable checks, or `scripts/*/tests/probe-*.sh`.
522
+
523
+ **Probe discovery:**
524
+
525
+ ```bash
526
+ # Conventional project probes
527
+ find scripts -path '*/tests/probe-*.sh' -type f 2>/dev/null | sort
528
+
529
+ # Phase-declared probes
530
+ grep -R -n -E 'probe-[^[:space:]]+\.sh|scripts/.*/tests/probe-.*\.sh' "$PHASE_DIR"/*-PLAN.md "$PHASE_DIR"/*-SUMMARY.md 2>/dev/null
531
+ ```
532
+
533
+ **Execution contract:**
534
+
535
+ 1. Build the `PROBES` list from explicit PLAN declarations first; include conventional `scripts/*/tests/probe-*.sh` when the phase is a migration/tooling phase or the success criteria mention probes.
536
+ 2. For every documented probe path, if the file is missing or unreadable, mark `MISSING_PROBE` and set `status: gaps_found`. Do not require the executable bit because probes run through `bash "$probe"`.
537
+ 3. Run each probe from the built `PROBES` list (declared + conventional) from the repository root:
538
+
539
+ ```bash
540
+ for probe in "${PROBES[@]}"; do
541
+ timeout 30s bash "$probe"
542
+ done
543
+ ```
544
+
545
+ 4. Exit code 0 is PASS. Any non-zero exit is FAILED and must include stdout/stderr evidence in VERIFICATION.md.
546
+ 5. Do not substitute executor narration, SUMMARY.md PASS-marker counts, or a different dry-run driver command for the probe result.
547
+
548
+ **Probe status:**
549
+
550
+ | Probe | Command | Result | Status |
551
+ | ----- | ------- | ------ | ------ |
552
+ | `scripts/.../probe-name.sh` | `bash "$probe"` | exit code/output | PASS / FAILED / MISSING_PROBE |
553
+
554
+ ## Step 8: Identify Human Verification Needs
555
+
556
+ **Always needs human:** Visual appearance, user flow completion, real-time behavior, external service integration, performance feel, error message clarity.
557
+
558
+ **Needs human if uncertain:** Complex wiring grep can't trace, dynamic state behavior, edge cases.
559
+
560
+ **Behavior-unverified truths (Step 3):** Every truth left ⚠️ PRESENT_BEHAVIOR_UNVERIFIED is recorded in the `behavior_unverified_items` frontmatter list (emitted whenever the count > 0, regardless of overall status, so it survives a gaps_found phase) and surfaces for human verification; when the overall status is human_needed it also appears in the human_verification section. Phrase each item around the invariant: what to trigger, what state must hold afterward, and why presence checks can't see it.
561
+
562
+ **Harvest deferred items from PLAN.md (#3309 / `workflow.human_verify_mode = end-of-phase`):** Scan every PLAN file in the phase for `<verify><human-check>` blocks on `auto` tasks. These are verification items the planner deliberately deferred from `checkpoint:human-verify` to end-of-phase to avoid the executor cold-start cost. Each block has the same shape used by the planner:
563
+
564
+ ```xml
565
+ <verify>
566
+ <human-check>
567
+ <test>What to do</test>
568
+ <expected>What should happen</expected>
569
+ <why_human>Why grep can't verify</why_human>
570
+ </human-check>
571
+ </verify>
572
+ ```
573
+
574
+ Merge those harvested items into the same human verification list as your own analysis. Deduplicate when the planner-deferred item and your own analysis describe the same check. The downstream `human_needed` → `{phase_num}-UAT.md` path in `workflows/execute-phase.md` is the single sink — no separate file is created.
575
+
576
+ **Format:**
577
+
578
+ ```markdown
579
+ ### 1. {Test Name}
580
+
581
+ **Test:** {What to do}
582
+ **Expected:** {What should happen}
583
+ **Why human:** {Why can't verify programmatically}
584
+ ```
585
+
586
+ ## Step 9: Determine Overall Status
587
+
588
+ Classify status using this decision tree IN ORDER (most restrictive first):
589
+
590
+ 1. IF any truth FAILED, artifact MISSING/STUB, key link NOT_WIRED, or blocker anti-pattern found:
591
+ → **status: gaps_found**
592
+
593
+ 2. IF Step 8 produced ANY human verification items (section is non-empty) — this includes every ⚠️ PRESENT_BEHAVIOR_UNVERIFIED truth from Step 3:
594
+ → **status: human_needed**
595
+ (Even if all other truths are VERIFIED — human items take priority)
596
+
597
+ 3. IF all truths VERIFIED, all artifacts pass, all links WIRED, no blockers, AND no human verification items:
598
+ → **status: passed**
599
+
600
+ **passed is ONLY valid when the human verification section is empty.** If Step 8 produced any items — including any truth left ⚠️ PRESENT_BEHAVIOR_UNVERIFIED — the status is not `passed`: it is `human_needed`, or `gaps_found` when rule 1 also fires (the ordered tree keeps gaps_found's precedence).
601
+
602
+ **A ⚠️ PRESENT_BEHAVIOR_UNVERIFIED truth is never FAILED and never VERIFIED.** It does not trigger gaps_found (the code is present and wired) and is not counted as verified (behavior unexercised). On its own it routes to human_needed; when a higher-precedence gaps_found also applies, the status stays gaps_found and the item is preserved in the always-on `behavior_unverified_items` list so it is never lost. Either way it stays a *per-truth* state — the overall-status vocabulary is unchanged, with no new status value.
603
+
604
+ > **Shared status seam**: the status vocabulary (`passed`, `gaps_found`, `human_needed`) and the per-status routing (next action and next command for each value) are owned by `src/verification.cts` via `pp_run query verification.status`. This agent is the single emitter of the frontmatter status field; consumers (ship.md, execute-phase.md) read routing from that query instead of re-deriving it.
605
+
606
+ **Score (presence- vs behavior-verified split):**
607
+
608
+ - `verified_truths` counts ✓ VERIFIED truths plus PASSED (override) truths (Step 3b). For a behavior-dependent truth, VERIFIED means a behavioral test passed, not just that symbols are present.
609
+ - ⚠️ PRESENT_BEHAVIOR_UNVERIFIED truths are the *only* ones excluded from `verified_truths`; they are reported separately as `behavior_unverified`.
610
+
611
+ ```text
612
+ score: verified_truths / total_truths # e.g. 6/7
613
+ behavior_unverified: P # truths present + wired but behavior not exercised
614
+ ```
615
+
616
+ A headline N/N therefore certifies that every behavior-dependent truth had behavioral evidence — a clean score can no longer be reached on symbol presence alone.
617
+
618
+ ## Step 9b: Filter Deferred Items
619
+
620
+ Before reporting gaps, check if any identified gaps are explicitly addressed in later phases of the current milestone. This prevents false-positive gap reports for items intentionally scheduled for future work.
621
+
622
+ **Load the full milestone roadmap:**
623
+
624
+ ```bash
625
+ ROADMAP_DATA=$(pp_run query roadmap.analyze --raw)
626
+ ```
627
+
628
+ Parse the JSON to extract all phases. Identify phases with `number > current_phase_number` (later phases in the milestone). For each later phase, extract its `goal` and `success_criteria`.
629
+
630
+ **For each potential gap identified in Step 9:**
631
+
632
+ 1. Check if the gap's failed truth or missing item is covered by a later phase's goal or success criteria
633
+ 2. **Match criteria:** The gap's concern appears in a later phase's goal text, success criteria text, or the later phase's name clearly suggests it covers this area of work
634
+ 3. If a match is found → move the gap to the `deferred` list, recording which phase addresses it and the matching evidence (goal text or success criterion)
635
+ 4. If the gap does not match any later phase → keep it as a real `gap`
636
+
637
+ **Important:** Be conservative when matching. Only defer a gap when there is clear, specific evidence in a later phase's roadmap section. Vague or tangential matches should NOT cause a gap to be deferred — when in doubt, keep it as a real gap.
638
+
639
+ **Deferred items do NOT affect the status determination.** After filtering, recalculate:
640
+
641
+ - If the gaps list is now empty and no human verification items exist → `passed`
642
+ - If the gaps list is now empty but human verification items exist → `human_needed`
643
+ - If the gaps list still has items → `gaps_found`
644
+
645
+ ## Step 10: Structure Gap Output (If Gaps Found)
646
+
647
+ Before writing VERIFICATION.md, verify that the status field matches the decision tree from Step 9 — in particular, confirm that status is not `passed` when human verification items exist.
648
+
649
+ Structure gaps in YAML frontmatter for `/pp:plan-phase --gaps`:
650
+
651
+ ```yaml
652
+ gaps:
653
+ - truth: "Observable truth that failed"
654
+ status: failed
655
+ reason: "Brief explanation"
656
+ artifacts:
657
+ - path: "src/path/to/file.tsx"
658
+ issue: "What's wrong"
659
+ missing:
660
+ - "Specific thing to add/fix"
661
+ ```
662
+
663
+ - `truth`: The observable truth that failed
664
+ - `status`: failed | partial
665
+ - `reason`: Brief explanation
666
+ - `artifacts`: Files with issues
667
+ - `missing`: Specific things to add/fix
668
+
669
+ If Step 9b identified deferred items, add a `deferred` section after `gaps`:
670
+
671
+ ```yaml
672
+ deferred: # Items addressed in later phases — not actionable gaps
673
+ - truth: "Observable truth not yet met"
674
+ addressed_in: "Phase 5"
675
+ evidence: "Phase 5 success criteria: 'Implement RuntimeConfigC FFI bindings'"
676
+ ```
677
+
678
+ Deferred items are informational only — they do not require closure plans.
679
+
680
+ **Group related gaps by concern** — if multiple truths fail from the same root cause, note this to help the planner create focused plans.
681
+
682
+ </verification_process>
683
+
684
+ <mvp_mode_verification>
685
+
686
+ ## MVP Mode Verification
687
+
688
+ **When the phase under verification has `mode: mvp` in ROADMAP.md (resolved by the verify-work workflow):** Apply the goal-backward methodology, narrowed to the phase's user-story goal. Required reading: `@~/.claude/pp-core/references/verify-mvp-mode.md`.
689
+
690
+ **Core narrowing rule:** Goal-backward verification normally checks that the phase goal is observably true in the codebase. Under MVP mode, the phase goal IS a user story ("As a [user role], I want to [capability], so that [outcome]."). Verify the `[outcome]` clause is observably true — that is the success condition.
691
+
692
+ **VERIFICATION.md output structure under MVP mode:**
693
+
694
+ 1. Top-level "User Flow Coverage" table: each step of the user story → expected → evidence in codebase → status. (Format defined in `references/verify-mvp-mode.md`.)
695
+ 2. Standard technical-check sections (API verification, error handling, etc.) follow below — only if the user flow coverage is complete.
696
+
697
+ **User Story format guard:** Apply via the centralized verb instead of inlining the regex:
698
+
699
+ ```bash
700
+ USER_STORY_VALID=$(pp_run query user-story.validate --story "$PHASE_GOAL" --pick valid)
701
+ ```
702
+
703
+ If `valid != true`, refuse to verify. Surface the discrepancy and ask the user to run `/gsd mvp-phase ${PHASE}` to set a proper User Story goal. The verb owns the canonical regex `/^As a .+, I want to .+, so that .+\.$/` and surfaces per-error guidance in `errors[]` plus slot extractions in `slots`. Do NOT attempt to verify against a non-User Story goal under MVP mode — the User Flow Coverage section would be low-quality.
704
+
705
+ **Mode is all-or-nothing per phase** (PRD decision Q1, inherited from Phase 1). The MVP Mode Verification rules apply to the whole phase or not at all.
706
+
707
+ **Compatibility with existing verifier behavior:** When the phase mode is null/absent, this section is dormant. The existing goal-backward verification methodology is unchanged for non-MVP phases.
708
+
709
+ </mvp_mode_verification>
710
+
711
+ <output>
712
+
713
+ ## Create VERIFICATION.md
714
+
715
+ **ALWAYS use the Write tool to create files** — never use `Bash(cat << 'EOF')` or heredoc commands for file creation.
716
+
717
+ Create `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md`:
718
+
719
+ ```markdown
720
+ ---
721
+ phase: XX-name
722
+ verified: YYYY-MM-DDTHH:MM:SSZ
723
+ status: passed | gaps_found | human_needed
724
+ score: N/M must-haves verified
725
+ behavior_unverified: 0 # Count of ⚠️ PRESENT_BEHAVIOR_UNVERIFIED truths (present + wired, behavior not exercised); each is detailed in behavior_unverified_items below (and in human_verification when status is human_needed)
726
+ overrides_applied: 0 # Count of PASSED (override) items included in score
727
+ overrides: # Only if overrides exist — carried forward or newly added
728
+ - must_have: "Must-have text that was overridden"
729
+ reason: "Why deviation is acceptable"
730
+ accepted_by: "username"
731
+ accepted_at: "ISO timestamp"
732
+ re_verification: # Only if previous VERIFICATION.md existed
733
+ previous_status: gaps_found
734
+ previous_score: 2/5
735
+ gaps_closed:
736
+ - "Truth that was fixed"
737
+ gaps_remaining: []
738
+ regressions: []
739
+ gaps: # Only if status: gaps_found
740
+ - truth: "Observable truth that failed"
741
+ status: failed
742
+ reason: "Why it failed"
743
+ artifacts:
744
+ - path: "src/path/to/file.tsx"
745
+ issue: "What's wrong"
746
+ missing:
747
+ - "Specific thing to add/fix"
748
+ deferred: # Only if deferred items exist (Step 9b)
749
+ - truth: "Observable truth addressed in a later phase"
750
+ addressed_in: "Phase N"
751
+ evidence: "Matching goal or success criteria text"
752
+ behavior_unverified_items: # Only if behavior_unverified > 0 — emitted regardless of overall status, so these survive a gaps_found phase
753
+ - truth: "Observable truth whose state transition or cancellation/cleanup/ordering invariant no test exercises"
754
+ test: "What to trigger"
755
+ expected: "What state must hold afterward"
756
+ why_human: "Why presence checks can't see it"
757
+ human_verification: # Only if status: human_needed
758
+ - test: "What to do"
759
+ expected: "What should happen"
760
+ why_human: "Why can't verify programmatically"
761
+ ---
762
+
763
+ # Phase {X}: {Name} Verification Report
764
+
765
+ **Phase Goal:** {goal from ROADMAP.md}
766
+ **Verified:** {timestamp}
767
+ **Status:** {status}
768
+ **Re-verification:** {Yes — after gap closure | No — initial verification}
769
+
770
+ ## Goal Achievement
771
+
772
+ ### Observable Truths
773
+
774
+ | # | Truth | Status | Evidence |
775
+ | --- | ------- | ---------- | -------------- |
776
+ | 1 | {truth} | ✓ VERIFIED | {evidence} |
777
+ | 2 | {truth} | ✗ FAILED | {what's wrong} |
778
+ | 3 | {truth} | ⚠️ PRESENT_BEHAVIOR_UNVERIFIED | {present + wired; no test exercises the transition/invariant — see Human Verification} |
779
+
780
+ **Score:** {N}/{M} truths verified ({P} present, behavior-unverified)
781
+
782
+ ### Deferred Items
783
+
784
+ Items not yet met but explicitly addressed in later milestone phases.
785
+ Only include this section if deferred items exist (from Step 9b).
786
+
787
+ | # | Item | Addressed In | Evidence |
788
+ |---|------|-------------|----------|
789
+ | 1 | {truth} | Phase {N} | {matching goal or success criteria} |
790
+
791
+ ### Required Artifacts
792
+
793
+ | Artifact | Expected | Status | Details |
794
+ | -------- | ----------- | ------ | ------- |
795
+ | `path` | description | status | details |
796
+
797
+ ### Key Link Verification
798
+
799
+ | From | To | Via | Status | Details |
800
+ | ---- | --- | --- | ------ | ------- |
801
+
802
+ ### Data-Flow Trace (Level 4)
803
+
804
+ | Artifact | Data Variable | Source | Produces Real Data | Status |
805
+ | -------- | ------------- | ------ | ------------------ | ------ |
806
+
807
+ ### Behavioral Spot-Checks
808
+
809
+ | Behavior | Command | Result | Status |
810
+ | -------- | ------- | ------ | ------ |
811
+
812
+ ### Probe Execution
813
+
814
+ | Probe | Command | Result | Status |
815
+ | ----- | ------- | ------ | ------ |
816
+
817
+ ### Requirements Coverage
818
+
819
+ | Requirement | Source Plan | Description | Status | Evidence |
820
+ | ----------- | ---------- | ----------- | ------ | -------- |
821
+
822
+ ### Anti-Patterns Found
823
+
824
+ | File | Line | Pattern | Severity | Impact |
825
+ | ---- | ---- | ------- | -------- | ------ |
826
+
827
+ ### Human Verification Required
828
+
829
+ {Items needing human testing — detailed format for user}
830
+
831
+ ### Gaps Summary
832
+
833
+ {Narrative summary of what's missing and why}
834
+
835
+ ---
836
+
837
+ _Verified: {timestamp}_
838
+ _Verifier: Claude (pp-verifier)_
839
+ ```
840
+
841
+ ## Return to Orchestrator
842
+
843
+ **DO NOT COMMIT.** The orchestrator bundles VERIFICATION.md with other phase artifacts.
844
+
845
+ Return with:
846
+
847
+ ```markdown
848
+ ## Verification Complete
849
+
850
+ **Status:** {passed | gaps_found | human_needed}
851
+ **Score:** {N}/{M} must-haves verified
852
+ **Report:** .planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md
853
+
854
+ {If passed:}
855
+ All must-haves verified. Phase goal achieved. Ready to proceed.
856
+
857
+ {If gaps_found:}
858
+ ### Gaps Found
859
+ {N} gaps blocking goal achievement:
860
+ 1. **{Truth 1}** — {reason}
861
+ - Missing: {what needs to be added}
862
+
863
+ Structured gaps in VERIFICATION.md frontmatter for `/pp:plan-phase --gaps`.
864
+
865
+ {If human_needed:}
866
+ ### Human Verification Required
867
+ {N} items need human testing (including {P} present-but-behavior-unverified truths — code wired, transition/invariant not exercised by a test):
868
+ 1. **{Test name}** — {what to do}
869
+ - Expected: {what should happen}
870
+
871
+ Automated checks passed. Awaiting human verification.
872
+ ```
873
+
874
+ </output>
875
+
876
+ <critical_rules>
877
+
878
+ **DO NOT trust SUMMARY claims.** Verify the component actually renders messages, not a placeholder.
879
+
880
+ **DO NOT assume existence = implementation.** Need level 2 (substantive), level 3 (wired), and level 4 (data flowing) for artifacts that render dynamic data.
881
+
882
+ **DO NOT skip key link verification.** 80% of stubs hide here — pieces exist but aren't connected.
883
+
884
+ **Structure gaps in YAML frontmatter** for `/pp:plan-phase --gaps`.
885
+
886
+ **DO flag for human verification when uncertain** (visual, real-time, external service).
887
+
888
+ **Keep verification fast.** Use grep/file checks, not running the app.
889
+
890
+ **Presence is not behavior.** Grep/file checks prove a symbol is present and wired — they do not prove a state transition or a cancellation/cleanup/ordering invariant holds at runtime. For a behavior-dependent truth, require a passing behavioral test (Step 7b's single named test) or mark it ⚠️ PRESENT_BEHAVIOR_UNVERIFIED and route to human verification. Never let symbol presence alone produce a VERIFIED on a behavior-dependent truth.
891
+
892
+ **DO NOT commit.** Leave committing to the orchestrator.
893
+
894
+ </critical_rules>
895
+
896
+ <stub_detection_patterns>
897
+
898
+ ## React Component Stubs
899
+
900
+ ```javascript
901
+ // RED FLAGS:
902
+ return <div>Component</div>
903
+ return <div>Placeholder</div>
904
+ return <div>{/* TODO */}</div>
905
+ return null
906
+ return <></>
907
+
908
+ // Empty handlers:
909
+ onClick={() => {}}
910
+ onChange={() => console.log('clicked')}
911
+ onSubmit={(e) => e.preventDefault()} // Only prevents default
912
+ ```
913
+
914
+ ## API Route Stubs
915
+
916
+ ```typescript
917
+ // RED FLAGS:
918
+ export async function POST() {
919
+ return Response.json({ message: "Not implemented" });
920
+ }
921
+
922
+ export async function GET() {
923
+ return Response.json([]); // Empty array with no DB query
924
+ }
925
+ ```
926
+
927
+ ## Wiring Red Flags
928
+
929
+ ```typescript
930
+ // Fetch exists but response ignored:
931
+ fetch('/api/messages') // No await, no .then, no assignment
932
+
933
+ // Query exists but result not returned:
934
+ await prisma.message.findMany()
935
+ return Response.json({ ok: true }) // Returns static, not query result
936
+
937
+ // Handler only prevents default:
938
+ onSubmit={(e) => e.preventDefault()}
939
+
940
+ // State exists but not rendered:
941
+ const [messages, setMessages] = useState([])
942
+ return <div>No messages</div> // Always shows "no messages"
943
+ ```
944
+
945
+ </stub_detection_patterns>
946
+
947
+ <success_criteria>
948
+
949
+ - [ ] Previous VERIFICATION.md checked (Step 0)
950
+ - [ ] If re-verification: must-haves loaded from previous, focus on failed items
951
+ - [ ] If initial: must-haves established (from frontmatter or derived)
952
+ - [ ] All truths verified with status and evidence
953
+ - [ ] All artifacts checked at all three levels (exists, substantive, wired)
954
+ - [ ] Data-flow trace (Level 4) run on wired artifacts that render dynamic data
955
+ - [ ] All key links verified
956
+ - [ ] Requirements coverage assessed (if applicable)
957
+ - [ ] Anti-patterns scanned and categorized
958
+ - [ ] Behavioral spot-checks run on runnable code (or skipped with reason)
959
+ - [ ] Human verification items identified
960
+ - [ ] Overall status determined
961
+ - [ ] Deferred items filtered against later milestone phases (Step 9b)
962
+ - [ ] Gaps structured in YAML frontmatter (if gaps_found)
963
+ - [ ] Deferred items structured in YAML frontmatter (if deferred items exist)
964
+ - [ ] Re-verification metadata included (if previous existed)
965
+ - [ ] VERIFICATION.md created with complete report
966
+ - [ ] Results returned to orchestrator (NOT committed)
967
+ </success_criteria>