@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,400 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * Deterministic verifier for the /gsd-reapply-patches Step 5 "Hunk Verification
6
+ * Gate". For each backed-up patch file, asserts that the user's added lines
7
+ * (computed from a real diff against the pristine baseline, not from the
8
+ * LLM's prose summary) survive into the merged output.
9
+ *
10
+ * Usage:
11
+ * node scripts/verify-reapply-patches.cjs \
12
+ * --patches-dir <path> \ # gsd-local-patches/
13
+ * --config-dir <path> \ # ~/.claude (or runtime equivalent)
14
+ * [--pristine-dir <path>] # gsd-pristine/; if absent, falls back to
15
+ * # treating every significant backup line as
16
+ * # required (over-broad but safe for #2969:
17
+ * # false-positive halts beat silent successes
18
+ * # on lost content)
19
+ * [--json] # emit JSON report instead of human text
20
+ *
21
+ * Exit codes:
22
+ * 0 — every user-added line is present in the merged file (gate passes)
23
+ * 1 — at least one missing line in at least one file (gate fails)
24
+ * 2 — usage / structural error (e.g. patches dir missing)
25
+ *
26
+ * Bug #2969: the Step 5 gate previously trusted Claude's free-text "verified:
27
+ * yes/no" reporting per hunk. The LLM was filling in `yes` even when content
28
+ * had been silently dropped. Moving the check to a deterministic script is the
29
+ * durability fix.
30
+ */
31
+
32
+ const fs = require('node:fs');
33
+ const path = require('node:path');
34
+ const crypto = require('node:crypto');
35
+ const { ExitError, runMain } = require('./lib/cli-exit.cjs');
36
+
37
+ const SIGNIFICANT_MIN_CHARS = 12;
38
+ const GSD_HOOK_VERSION_LINE_RE = /^(?:\/\/|#)\s*(?:gsd|pp)-hook-version:\s*\S+\s*$/i;
39
+
40
+ function parseArgs(argv) {
41
+ const opts = { patchesDir: null, configDir: null, pristineDir: null, json: false };
42
+ for (let i = 0; i < argv.length; i++) {
43
+ const arg = argv[i];
44
+ if (arg === '--patches-dir') opts.patchesDir = argv[++i];
45
+ else if (arg === '--config-dir') opts.configDir = argv[++i];
46
+ else if (arg === '--pristine-dir') opts.pristineDir = argv[++i];
47
+ else if (arg === '--json') opts.json = true;
48
+ else if (arg === '--help' || arg === '-h') {
49
+ process.stdout.write(
50
+ 'usage: verify-reapply-patches.cjs --patches-dir <path> --config-dir <path> [--pristine-dir <path>] [--json]\n',
51
+ );
52
+ throw new ExitError(0);
53
+ } else {
54
+ throw new ExitError(2, `unknown argument: ${arg}`);
55
+ }
56
+ }
57
+ return opts;
58
+ }
59
+
60
+ function isSignificantLine(line) {
61
+ const trimmed = line.trim();
62
+ if (trimmed.length < SIGNIFICANT_MIN_CHARS) return false;
63
+ // Pure punctuation / closing brackets carry too little structural info to
64
+ // reliably distinguish a survived hunk from incidental similarity.
65
+ if (/^[\s})\];,]+$/.test(trimmed)) return false;
66
+ // Generic decorative comments like `// ----` similarly fail the test.
67
+ if (/^[\s\-=#*/]+$/.test(trimmed)) return false;
68
+ return true;
69
+ }
70
+
71
+ function normalizeUpstreamOwnedLine(line) {
72
+ const trimmed = line.trim();
73
+ if (!trimmed) return line;
74
+ if (GSD_HOOK_VERSION_LINE_RE.test(trimmed)) {
75
+ const prefix = trimmed.startsWith('#') ? '#' : '//';
76
+ const marker = trimmed.includes('pp-hook-version') ? 'pp-hook-version' : 'gsd-hook-version';
77
+ return `${prefix} ${marker}: __VERSION_TOKEN__`;
78
+ }
79
+ return line;
80
+ }
81
+
82
+ /**
83
+ * Compute the SHA-256 hex digest of a string (UTF-8 encoded).
84
+ */
85
+ function sha256(content) {
86
+ return crypto.createHash('sha256').update(content, 'utf8').digest('hex');
87
+ }
88
+
89
+ /**
90
+ * Read the `pristine_hashes` map from backup-meta.json in the patches dir.
91
+ * Returns an empty object if backup-meta.json is absent, unreadable, or has no
92
+ * `pristine_hashes` field — callers must treat an empty map as "no recorded
93
+ * hash for any file" (no hash-validation possible, not an error).
94
+ */
95
+ function readPristineHashes(patchesDir) {
96
+ const metaPath = path.join(patchesDir, 'backup-meta.json');
97
+ try {
98
+ const raw = fs.readFileSync(metaPath, 'utf8');
99
+ const parsed = JSON.parse(raw);
100
+ if (parsed && typeof parsed.pristine_hashes === 'object' && parsed.pristine_hashes !== null) {
101
+ return parsed.pristine_hashes;
102
+ }
103
+ } catch {
104
+ // absent or unreadable — not an error, just no recorded hashes
105
+ }
106
+ return {};
107
+ }
108
+
109
+ /**
110
+ * Walk a directory, returning every file's path relative to the root.
111
+ */
112
+ function walk(rootDir, relPrefix = '') {
113
+ const out = [];
114
+ if (!fs.existsSync(rootDir)) return out;
115
+ for (const entry of fs.readdirSync(rootDir, { withFileTypes: true })) {
116
+ const rel = relPrefix ? path.join(relPrefix, entry.name) : entry.name;
117
+ const abs = path.join(rootDir, entry.name);
118
+ if (entry.isDirectory()) {
119
+ out.push(...walk(abs, rel));
120
+ } else if (entry.isFile()) {
121
+ out.push(rel);
122
+ }
123
+ }
124
+ return out;
125
+ }
126
+
127
+ /**
128
+ * Compute the set of "user-added" lines: lines present in the backup but
129
+ * absent from the pristine baseline. If no pristine is provided, falls back
130
+ * to using every significant line in the backup (over-broad but safe — favours
131
+ * false-positive failures over silent successes, which is the right side to
132
+ * err on for #2969).
133
+ */
134
+ function computeUserAddedLines(backupContent, pristineContent) {
135
+ const backupLines = backupContent.split(/\r?\n/);
136
+ if (!pristineContent) {
137
+ return backupLines.filter(isSignificantLine);
138
+ }
139
+ const pristineSet = new Set(
140
+ pristineContent.split(/\r?\n/).map(normalizeUpstreamOwnedLine),
141
+ );
142
+ return backupLines.filter((line) => {
143
+ if (!isSignificantLine(line)) return false;
144
+ return !pristineSet.has(normalizeUpstreamOwnedLine(line));
145
+ });
146
+ }
147
+
148
+ /**
149
+ * Stable reason codes for the per-file result. Tests assert via
150
+ * `assert.equal(result.reason, REASON.X)` rather than regex-matching prose,
151
+ * so the diagnostic surface is a typed enum, not free text.
152
+ *
153
+ * Adding a new reason requires updating the REASON map AND the tests'
154
+ * shape assertion that locks the documented set of codes.
155
+ */
156
+ const REASON = Object.freeze({
157
+ OK_NO_USER_LINES_VS_PRISTINE: 'ok_no_user_lines_vs_pristine',
158
+ OK_NO_SIGNIFICANT_BACKUP_LINES: 'ok_no_significant_backup_lines',
159
+ // Bug #3657: the on-disk gsd-pristine/ file's SHA-256 does not match the
160
+ // hash recorded in backup-meta.json.pristine_hashes. This means the
161
+ // pristine snapshot was refreshed to a newer GSD version after the backup
162
+ // was captured. Using the wrong-version pristine as the diff baseline would
163
+ // invert the delta (upstream removals appear as "missing user lines").
164
+ // The verifier skips this file rather than false-failing it. A separate
165
+ // re-anchor step (or the git-aware fallback in the workflow) is needed to
166
+ // resolve this file; the guard here ensures the gate does not report spurious
167
+ // failures in the meantime.
168
+ OK_PRISTINE_DRIFT_DETECTED: 'ok_pristine_drift_detected',
169
+ // Bug #934: backup-meta.json records a pristine_hash for this file but the
170
+ // gsd-pristine/ file is absent from disk. This happens on post-#604-rename
171
+ // installs where saveLocalPatches discarded the only pristine candidate
172
+ // because its hash did not match the old-release hash (the file changed
173
+ // upstream between releases). Without a baseline the verifier cannot
174
+ // distinguish user-added lines from upstream-changed lines, so falling to
175
+ // over-broad mode would produce FAIL_USER_LINES_MISSING false positives for
176
+ // every upstream-removed line. The correct posture is advisory/non-blocking:
177
+ // report OK_NO_BASELINE so the caller can log a warning without halting the
178
+ // gate on a spurious failure. This is a bounded "cannot reason → do not
179
+ // block" rather than "ignore everything" — it only applies when the hash was
180
+ // recorded (modern installer) but the file is absent (specific gap).
181
+ OK_NO_BASELINE: 'ok_no_baseline',
182
+ FAIL_INSTALLED_MISSING: 'fail_installed_missing',
183
+ FAIL_INSTALLED_NOT_REGULAR_FILE: 'fail_installed_not_regular_file',
184
+ FAIL_READ_ERROR: 'fail_read_error',
185
+ FAIL_USER_LINES_MISSING: 'fail_user_lines_missing',
186
+ });
187
+
188
+ function verifyFile({ relPath, patchesDir, configDir, pristineDir, pristineHashes }) {
189
+ const backupPath = path.join(patchesDir, relPath);
190
+ const installedPath = path.join(configDir, relPath);
191
+ const result = { file: relPath, status: 'ok', missing: [], reason: null };
192
+
193
+ if (!fs.existsSync(backupPath) || !fs.statSync(backupPath).isFile()) {
194
+ return result; // walked entry no longer exists — non-fatal
195
+ }
196
+
197
+ // Installed path checks: must exist, must be a regular file, must be
198
+ // readable. Anything else is a fail-with-diagnostic, not a crash that
199
+ // aborts the whole gate run and drops structured output.
200
+ let installedStat;
201
+ try {
202
+ installedStat = fs.statSync(installedPath);
203
+ } catch {
204
+ result.status = 'fail';
205
+ result.reason = REASON.FAIL_INSTALLED_MISSING;
206
+ return result;
207
+ }
208
+ if (!installedStat.isFile()) {
209
+ result.status = 'fail';
210
+ result.reason = REASON.FAIL_INSTALLED_NOT_REGULAR_FILE;
211
+ return result;
212
+ }
213
+
214
+ let backupContent;
215
+ let installedContent;
216
+ try {
217
+ backupContent = fs.readFileSync(backupPath, 'utf8');
218
+ installedContent = fs.readFileSync(installedPath, 'utf8');
219
+ } catch {
220
+ result.status = 'fail';
221
+ result.reason = REASON.FAIL_READ_ERROR;
222
+ return result;
223
+ }
224
+
225
+ // Normalize to forward slashes so the key lookup matches on Windows
226
+ // where path.join produces backslash-separated relPath values but
227
+ // backup-meta.json stores keys written with forward slashes.
228
+ const hashKey = relPath.replace(/\\/g, '/');
229
+ const recordedHash = pristineHashes && pristineHashes[hashKey];
230
+
231
+ let pristineContent = null;
232
+ if (pristineDir) {
233
+ const pristinePath = path.join(pristineDir, relPath);
234
+ // Bug #934: track whether the pristine path EXISTS on disk (stat did not
235
+ // throw ENOENT). A regular file that fails to read, or a non-file path
236
+ // (e.g. a directory accidentally placed at the pristine path), is treated
237
+ // as "present but unusable" — we fall to over-broad mode (safe side).
238
+ // OK_NO_BASELINE is reserved for the strictly absent case: stat throws,
239
+ // meaning the file was never written (the gap the bug describes).
240
+ let pristinePathExists = false;
241
+ try {
242
+ const stat = fs.statSync(pristinePath);
243
+ pristinePathExists = true; // path exists (any type)
244
+ if (stat.isFile()) {
245
+ const candidate = fs.readFileSync(pristinePath, 'utf8');
246
+ // Bug #3657: if backup-meta.json recorded a pristine_hash for this
247
+ // file, validate that the on-disk pristine matches it. A mismatch
248
+ // means the installer refreshed gsd-pristine/ to a newer GSD version
249
+ // after the backup was captured. Using the wrong-version pristine as
250
+ // the diff baseline inverts the delta: upstream removals appear as
251
+ // "user-added lines that must survive", causing FAIL_USER_LINES_MISSING
252
+ // false positives. When the hash is stale, skip the pristine and fall
253
+ // through to over-broad mode (every significant backup line is checked).
254
+ // Over-broad mode never false-fails for a different reason because all
255
+ // backup lines that are genuinely user-added will still be present in a
256
+ // correctly merged install.
257
+ if (recordedHash) {
258
+ if (sha256(candidate) === recordedHash) {
259
+ // Hash matches: the on-disk pristine is the correct baseline.
260
+ pristineContent = candidate;
261
+ } else {
262
+ // Hash mismatch: the on-disk gsd-pristine/ was refreshed to a newer
263
+ // GSD version after the backup was captured. Using it as the diff
264
+ // baseline would invert the delta and produce false FAIL_USER_LINES_MISSING
265
+ // reports (Bug #3657). Report the file as ok with a diagnostic code
266
+ // so the gate does not false-fail; a re-anchor or git-aware baseline
267
+ // step is required to verify this file correctly.
268
+ result.reason = REASON.OK_PRISTINE_DRIFT_DETECTED;
269
+ return result;
270
+ }
271
+ } else {
272
+ // No recorded hash for this file (older installer or absent
273
+ // backup-meta) — use the on-disk pristine as-is (pre-fix behaviour).
274
+ pristineContent = candidate;
275
+ }
276
+ }
277
+ // Non-file at pristinePath (e.g. a directory): stat succeeded so
278
+ // pristinePathExists is true; we fall through to over-broad mode below,
279
+ // which is safe and conservative.
280
+ } catch {
281
+ // Pristine stat threw — path is absent (ENOENT) or inaccessible.
282
+ // pristinePathExists stays false.
283
+ }
284
+
285
+ // Bug #934: recordedHash is present (modern installer) but the pristine
286
+ // path does not exist on disk at all (stat threw above). This means
287
+ // saveLocalPatches recorded a hash but could not write the corresponding
288
+ // gsd-pristine/ file (the only candidate was discarded because it was from
289
+ // a newer release). Falling to over-broad mode here would treat every
290
+ // upstream-changed line as a "user-added line that must survive", producing
291
+ // false FAIL_USER_LINES_MISSING for each upstream removal. Since we
292
+ // cannot reason correctly without a baseline, the safe answer is advisory/
293
+ // non-blocking: return OK_NO_BASELINE and let the caller decide.
294
+ // NOTE: this guard fires ONLY when stat threw (path absent), not when the
295
+ // path is present but non-file — in that case over-broad mode is safer.
296
+ if (!pristinePathExists && recordedHash) {
297
+ result.reason = REASON.OK_NO_BASELINE;
298
+ return result;
299
+ }
300
+ }
301
+
302
+ const userAdded = computeUserAddedLines(backupContent, pristineContent);
303
+ if (userAdded.length === 0) {
304
+ // Backup and pristine match exactly (or no significant content) — nothing
305
+ // to verify but also nothing to lose. Report as ok with diagnostic code.
306
+ result.reason = pristineContent
307
+ ? REASON.OK_NO_USER_LINES_VS_PRISTINE
308
+ : REASON.OK_NO_SIGNIFICANT_BACKUP_LINES;
309
+ return result;
310
+ }
311
+
312
+ for (const line of userAdded) {
313
+ if (!installedContent.includes(line)) {
314
+ result.missing.push(line.trim());
315
+ }
316
+ }
317
+ if (result.missing.length > 0) {
318
+ result.status = 'fail';
319
+ result.reason = REASON.FAIL_USER_LINES_MISSING;
320
+ }
321
+ return result;
322
+ }
323
+
324
+ function main() {
325
+ const opts = parseArgs(process.argv.slice(2));
326
+ if (!opts.patchesDir || !opts.configDir) {
327
+ throw new ExitError(2, '--patches-dir and --config-dir are required');
328
+ }
329
+ if (!fs.existsSync(opts.patchesDir)) {
330
+ throw new ExitError(2, `patches dir not found: ${opts.patchesDir}`);
331
+ }
332
+ if (!fs.existsSync(opts.configDir)) {
333
+ throw new ExitError(2, `config dir not found: ${opts.configDir}`);
334
+ }
335
+
336
+ const files = walk(opts.patchesDir).filter((f) => !f.endsWith('backup-meta.json'));
337
+ // Bug #3657: read pristine_hashes from backup-meta.json once and share
338
+ // across all per-file verifications so each can detect drift independently.
339
+ const pristineHashes = readPristineHashes(opts.patchesDir);
340
+ const results = files.map((relPath) =>
341
+ verifyFile({
342
+ relPath,
343
+ patchesDir: opts.patchesDir,
344
+ configDir: opts.configDir,
345
+ pristineDir: opts.pristineDir,
346
+ pristineHashes,
347
+ }),
348
+ );
349
+
350
+ const failures = results.filter((r) => r.status === 'fail');
351
+
352
+ // Bug #3657 (Finding 1): aggregate drifted files into top-level report fields
353
+ // so workflow Step 5a can gate on drift distinctly from failures. Drift is
354
+ // NOT a failure (exit code stays 0) but the workflow now has structured data
355
+ // to decide whether to proceed. Per-file shape is unchanged: each drifted
356
+ // result still has status:'ok' + reason:OK_PRISTINE_DRIFT_DETECTED for
357
+ // backward compat. The new top-level fields are purely additive.
358
+ const driftedResults = results.filter((r) => r.reason === REASON.OK_PRISTINE_DRIFT_DETECTED);
359
+ const drifted = driftedResults.length;
360
+ const drifted_files = driftedResults.map((r) => r.file);
361
+
362
+ // Bug #934: aggregate no-baseline files into top-level report fields so the
363
+ // workflow can log a warning about files that could not be verified. Like
364
+ // drift, this is NOT a failure (exit code stays 0) but gives the caller
365
+ // structured data to surface the advisory condition.
366
+ const noBaselineResults = results.filter((r) => r.reason === REASON.OK_NO_BASELINE);
367
+ const no_baseline = noBaselineResults.length;
368
+ const no_baseline_files = noBaselineResults.map((r) => r.file);
369
+
370
+ if (opts.json) {
371
+ process.stdout.write(
372
+ JSON.stringify({ checked: results.length, failures: failures.length, drifted, drifted_files, no_baseline, no_baseline_files, results }, null, 2) + '\n',
373
+ );
374
+ } else {
375
+ process.stdout.write(`# Hunk Verification Gate (#2969)\n\n`);
376
+ process.stdout.write(`Checked: ${results.length} file(s)\n`);
377
+ process.stdout.write(`Failures: ${failures.length}\n\n`);
378
+ if (failures.length > 0) {
379
+ process.stdout.write(`## Files with missing user-added content\n\n`);
380
+ for (const r of failures) {
381
+ process.stdout.write(`- ${r.file}\n`);
382
+ if (r.reason) process.stdout.write(` reason: ${r.reason}\n`);
383
+ for (const line of r.missing.slice(0, 5)) {
384
+ process.stdout.write(` missing: ${line}\n`);
385
+ }
386
+ if (r.missing.length > 5) {
387
+ process.stdout.write(` …and ${r.missing.length - 5} more line(s)\n`);
388
+ }
389
+ }
390
+ }
391
+ }
392
+
393
+ return failures.length > 0 ? 1 : 0;
394
+ }
395
+
396
+ if (require.main === module) {
397
+ runMain(main);
398
+ }
399
+
400
+ module.exports = { computeUserAddedLines, isSignificantLine, verifyFile, walk, REASON, readPristineHashes, sha256 };
@@ -0,0 +1,21 @@
1
+ # Dev Context Profile
2
+
3
+ Agent output guidance for dev mode. Loaded when `context: dev` is set in config.json.
4
+
5
+ ## Output Style
6
+
7
+ - Concise, action-oriented responses
8
+ - Lead with the code change or command, follow with brief rationale
9
+ - Skip preamble — assume the developer has full context
10
+ - Use inline code references (`file:line`) over prose descriptions
11
+
12
+ ## Focus Areas
13
+
14
+ - Working code that compiles and passes tests
15
+ - Minimal diff — change only what is necessary
16
+ - Flag side effects or breaking changes immediately
17
+ - Surface the next actionable step at the end of every response
18
+
19
+ ## Verbosity
20
+
21
+ Low. One-liner explanations unless the change is non-obvious. Omit background theory, alternative approaches, and caveats that do not affect the current task.
@@ -0,0 +1,22 @@
1
+ # Research Context Profile
2
+
3
+ Agent output guidance for research mode. Loaded when `context: research` is set in config.json.
4
+
5
+ ## Output Style
6
+
7
+ - Verbose, exploratory responses that surface trade-offs and alternatives
8
+ - Present multiple approaches with pros and cons before recommending one
9
+ - Include links, references, and citations where available
10
+ - Use structured headings and bullet lists for scan-ability
11
+
12
+ ## Focus Areas
13
+
14
+ - Breadth of options — enumerate before narrowing
15
+ - Prior art and ecosystem conventions
16
+ - Risks, edge cases, and failure modes
17
+ - Dependencies and compatibility implications
18
+ - Long-term maintainability of each approach
19
+
20
+ ## Verbosity
21
+
22
+ High. Explain reasoning, show evidence, and document assumptions. Include background context even if the developer likely knows it — research artifacts are read by future contributors who may not.
@@ -0,0 +1,23 @@
1
+ # Review Context Profile
2
+
3
+ Agent output guidance for review mode. Loaded when `context: review` is set in config.json.
4
+
5
+ ## Output Style
6
+
7
+ - Critical, detail-focused responses that prioritize correctness
8
+ - Organize findings by severity: blocking, important, nit
9
+ - Reference specific lines and files for every finding
10
+ - State what is correct as well as what needs change — confirm the good parts
11
+
12
+ ## Focus Areas
13
+
14
+ - Correctness — logic errors, off-by-ones, missing edge cases
15
+ - Security — input validation, injection vectors, secret exposure
16
+ - Performance — unnecessary allocations, O(n^2) patterns, missing caching
17
+ - Style and consistency — naming, formatting, import order
18
+ - Test coverage — untested branches, missing assertions, flaky patterns
19
+ - Structural Findings (fallow) — machine-derived cross-module facts injected as `<structural_findings>{ findings: [...], summary: { total, unusedExports, duplicates, circularDependencies } }</structural_findings>`. Render in REVIEW.md under `## Structural Findings (fallow)` as a separate section from narrative findings. Treat as ground truth for cross-module facts; do not re-derive.
20
+
21
+ ## Verbosity
22
+
23
+ Medium. Be thorough on findings but terse in explanation. Each issue should be one to three sentences: what is wrong, why it matters, and how to fix it.
@@ -0,0 +1,79 @@
1
+ # Agent Contracts
2
+
3
+ Completion markers and handoff schemas for all GSD agents. Workflows use these markers to detect agent completion and route accordingly.
4
+
5
+ This doc describes what IS, not what should be. Casing inconsistencies are documented as they appear in agent source files.
6
+
7
+ ---
8
+
9
+ ## Agent Registry
10
+
11
+ | Agent | Role | Completion Markers |
12
+ |-------|------|--------------------|
13
+ | pp-planner | Plan creation | `## PLANNING COMPLETE` |
14
+ | pp-executor | Plan execution | `## PLAN COMPLETE`, `## CHECKPOINT REACHED` |
15
+ | pp-phase-researcher | Phase-scoped research | `## RESEARCH COMPLETE`, `## RESEARCH BLOCKED` |
16
+ | pp-project-researcher | Project-wide research | `## RESEARCH COMPLETE`, `## RESEARCH BLOCKED` |
17
+ | pp-plan-checker | Plan validation | `## VERIFICATION PASSED`, `## ISSUES FOUND` |
18
+ | pp-research-synthesizer | Multi-research synthesis | `## SYNTHESIS COMPLETE`, `## SYNTHESIS BLOCKED` |
19
+ | pp-debugger | Debug investigation | `## DEBUG COMPLETE`, `## ROOT CAUSE FOUND`, `## CHECKPOINT REACHED` |
20
+ | pp-roadmapper | Roadmap creation/revision | `## ROADMAP CREATED`, `## ROADMAP REVISED`, `## ROADMAP BLOCKED` |
21
+ | pp-ui-auditor | UI review | `## UI REVIEW COMPLETE` |
22
+ | pp-ui-checker | UI validation | `## ISSUES FOUND` |
23
+ | pp-ui-researcher | UI spec creation | `## UI-SPEC COMPLETE`, `## UI-SPEC BLOCKED` |
24
+ | pp-verifier | Post-execution verification | `## Verification Complete` (title case) |
25
+ | pp-integration-checker | Cross-phase integration check | `## Integration Check Complete` (title case) |
26
+ | pp-nyquist-auditor | Sampling audit | `## PARTIAL`, `## ESCALATE` (non-standard) |
27
+ | pp-security-auditor | Security audit | `## OPEN_THREATS`, `## ESCALATE` (non-standard) |
28
+ | pp-codebase-mapper | Codebase analysis | No marker (writes docs directly) |
29
+ | pp-assumptions-analyzer | Assumption extraction | No marker (returns `## Assumptions` sections) |
30
+ | pp-doc-verifier | Doc validation | No marker (writes JSON to `.planning/tmp/`) |
31
+ | pp-doc-writer | Doc generation | No marker (writes docs directly) |
32
+ | pp-advisor-researcher | Advisory research | No marker (utility agent) |
33
+ | pp-user-profiler | User profiling | No marker (returns JSON in analysis tags) |
34
+ | pp-intel-updater | Codebase intelligence analysis | `## INTEL UPDATE COMPLETE`, `## INTEL UPDATE FAILED` |
35
+
36
+ ## Marker Rules
37
+
38
+ 1. **ALL-CAPS markers** (e.g., `## PLANNING COMPLETE`) are the standard convention
39
+ 2. **Title-case markers** (e.g., `## Verification Complete`) exist in pp-verifier and pp-integration-checker -- these are intentional as-is, not bugs
40
+ 3. **Non-standard markers** (e.g., `## PARTIAL`, `## ESCALATE`) in audit agents indicate partial results requiring orchestrator judgment
41
+ 4. **Agents without markers** either write artifacts directly to disk or return structured data (JSON/sections) that the caller parses
42
+ 5. Markers must appear as H2 headings (`## `) at the start of a line in the agent's final output
43
+
44
+ ## Key Handoff Contracts
45
+
46
+ ### Planner -> Executor (via PLAN.md)
47
+
48
+ | Field | Required | Description |
49
+ |-------|----------|-------------|
50
+ | Frontmatter | Yes | phase, plan, type, wave, depends_on, files_modified, autonomous, requirements |
51
+ | `<objective>` | Yes | What the plan achieves |
52
+ | `<tasks>` | Yes | Ordered task list with type, files, action, verify, acceptance_criteria |
53
+ | `<verification>` | Yes | Overall verification steps |
54
+ | `<success_criteria>` | Yes | Measurable completion criteria |
55
+
56
+ ### Executor -> Verifier (via SUMMARY.md)
57
+
58
+ | Field | Required | Description |
59
+ |-------|----------|-------------|
60
+ | Frontmatter | Yes | phase, plan, subsystem, tags, key-files, metrics |
61
+ | Commits table | Yes | Per-task commit hashes and descriptions |
62
+ | Deviations section | Yes | Auto-fixed issues or "None" |
63
+ | Self-Check | Yes | PASSED or FAILED with details |
64
+
65
+ ## Workflow Regex Patterns
66
+
67
+ Workflows match these markers to detect agent completion:
68
+
69
+ **plan-phase.md matches:**
70
+ - `## RESEARCH COMPLETE` / `## RESEARCH BLOCKED` (researcher output)
71
+ - `## PLANNING COMPLETE` (planner output)
72
+ - `## CHECKPOINT REACHED` (planner/executor pause)
73
+ - `## VERIFICATION PASSED` / `## ISSUES FOUND` (plan-checker output)
74
+
75
+ **execute-phase.md matches:**
76
+ - `## PHASE COMPLETE` (all plans in phase done)
77
+ - `## Self-Check: FAILED` (summary self-check)
78
+
79
+ > **NOTE:** `## PLAN COMPLETE` is the pp-executor's completion marker but execute-phase.md does not regex-match it. Instead, it detects executor completion via spot-checks (SUMMARY.md existence, git commit state). This is intentional behavior, not a mismatch.