@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,495 @@
1
+ <purpose>
2
+ Clarify WHAT a phase delivers through a Socratic interview loop with quantitative ambiguity scoring.
3
+ Produces a SPEC.md with falsifiable requirements that discuss-phase treats as locked decisions.
4
+
5
+ This workflow handles "what" and "why" — discuss-phase handles "how".
6
+ </purpose>
7
+
8
+ <ambiguity_model>
9
+ Score each dimension 0.0 (completely unclear) to 1.0 (crystal clear):
10
+
11
+ | Dimension | Weight | Minimum | What it measures |
12
+ |-------------------|--------|---------|---------------------------------------------------|
13
+ | Goal Clarity | 35% | 0.75 | Is the outcome specific and measurable? |
14
+ | Boundary Clarity | 25% | 0.70 | What's in scope vs out of scope? |
15
+ | Constraint Clarity| 20% | 0.65 | Performance, compatibility, data requirements? |
16
+ | Acceptance Criteria| 20% | 0.70 | How do we know it's done? |
17
+
18
+ **Ambiguity score** = 1.0 − (0.35×goal + 0.25×boundary + 0.20×constraint + 0.20×acceptance)
19
+
20
+ **Gate:** ambiguity ≤ 0.20 AND all dimensions ≥ their minimums → ready to write SPEC.md.
21
+
22
+ A score of 0.20 means 80% weighted clarity — enough precision that the planner won't silently make wrong assumptions.
23
+ </ambiguity_model>
24
+
25
+ <interview_perspectives>
26
+ Rotate through these perspectives — each naturally surfaces different blindspots:
27
+
28
+ **Researcher (rounds 1–2):** Ground the discussion in current reality.
29
+ - "What exists in the codebase today related to this phase?"
30
+ - "What's the delta between today and the target state?"
31
+ - "What triggers this work — what's broken or missing?"
32
+
33
+ **Simplifier (round 2):** Surface minimum viable scope.
34
+ - "What's the simplest version that solves the core problem?"
35
+ - "If you had to cut 50%, what's the irreducible core?"
36
+ - "What would make this phase a success even without the nice-to-haves?"
37
+
38
+ **Boundary Keeper (round 3):** Lock the perimeter.
39
+ - "What explicitly will NOT be done in this phase?"
40
+ - "What adjacent problems is it tempting to solve but shouldn't?"
41
+ - "What does 'done' look like — what's the final deliverable?"
42
+
43
+ **Failure Analyst (round 4):** Find the edge cases that invalidate requirements.
44
+ - "What's the worst thing that could go wrong if we get the requirements wrong?"
45
+ - "What does a broken version of this look like?"
46
+ - "What would cause a verifier to reject the output?"
47
+
48
+ **Seed Closer (rounds 5–6):** Lock remaining undecided territory.
49
+ - "We have [dimension] at [score] — what would make it completely clear?"
50
+ - "The remaining ambiguity is in [area] — can we make a decision now?"
51
+ - "Is there anything you'd regret not specifying before planning starts?"
52
+ </interview_perspectives>
53
+
54
+ <process>
55
+
56
+ ## Step 1: Initialize
57
+
58
+ ```bash
59
+ _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
60
+ INIT=$(pp_run init phase-op "${PHASE}")
61
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
62
+ ```
63
+
64
+ Parse JSON for: `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `padded_phase`, `state_path`, `requirements_path`, `roadmap_path`, `planning_path`, `response_language`, `commit_docs`.
65
+
66
+ **If `response_language` is set:** All user-facing text in this workflow MUST be in `{response_language}`. Technical terms, code, and file paths stay in English.
67
+
68
+ **If `phase_found` is false:**
69
+ ```
70
+ Phase [X] not found in roadmap.
71
+ Use /pp:progress to see available phases.
72
+ ```
73
+ Exit.
74
+
75
+ **Check for existing SPEC.md:**
76
+ ```bash
77
+ ls ${phase_dir}/*-SPEC.md 2>/dev/null | grep -v AI-SPEC | head -1 || true
78
+ ```
79
+
80
+ If SPEC.md already exists:
81
+
82
+ **If `--auto`:** Auto-select "Update it". Log: `[auto] SPEC.md exists — updating.`
83
+
84
+ **Otherwise:** Use AskUserQuestion:
85
+ - header: "Spec"
86
+ - question: "Phase [X] already has a SPEC.md. What do you want to do?"
87
+ - options:
88
+ - "Update it" — Revise and re-score
89
+ - "View it" — Show current spec
90
+ - "Skip" — Exit (use existing spec as-is)
91
+
92
+ If "View": Display SPEC.md, then offer Update/Skip.
93
+ If "Skip": Exit with message: "Existing SPEC.md unchanged. Run /pp:discuss-phase [X] to continue."
94
+ If "Update": Load existing SPEC.md, continue to Step 3.
95
+
96
+ ## Step 2: Scout Codebase
97
+
98
+ **Read these files before any questions:**
99
+ - `{requirements_path}` — Project requirements
100
+ - `{state_path}` — Decisions already made, current phase, blockers
101
+ - ROADMAP.md phase entry — Phase description, goals, canonical refs
102
+
103
+ **Grep the codebase** for code/files relevant to this phase goal. Look for:
104
+ - Existing implementations of similar functionality
105
+ - Integration points where new code will connect
106
+ - Test coverage gaps relevant to the phase
107
+ - Prior phase artifacts (SUMMARY.md, VERIFICATION.md) that inform current state
108
+
109
+ **Synthesize current state** — the grounded baseline for the interview:
110
+ - What exists today related to this phase
111
+ - The gap between current state and the phase goal
112
+ - The primary deliverable: what file/behavior/capability does NOT exist yet?
113
+
114
+ Confirm your current state synthesis internally. Do not present it to the user yet — you'll use it to ask precise, grounded questions.
115
+
116
+ ## Step 3: First Ambiguity Assessment
117
+
118
+ Before questioning begins, score the phase's current ambiguity based only on what ROADMAP.md and REQUIREMENTS.md say:
119
+
120
+ ```
121
+ Goal Clarity: [score 0.0–1.0]
122
+ Boundary Clarity: [score 0.0–1.0]
123
+ Constraint Clarity: [score 0.0–1.0]
124
+ Acceptance Criteria:[score 0.0–1.0]
125
+
126
+ Ambiguity: [score] ([calculate])
127
+ ```
128
+
129
+ **If `--auto` and initial ambiguity already ≤ 0.20 with all minimums met:** Skip interview — derive SPEC.md directly from roadmap + requirements. Log: `[auto] Phase requirements are already sufficiently clear — generating SPEC.md from existing context.` Jump to Step 6.
130
+
131
+ **Otherwise:** Continue to Step 4.
132
+
133
+ ## Step 4: Socratic Interview Loop
134
+
135
+ **Max 6 rounds.** Each round: 2–3 questions max. End round after user responds.
136
+
137
+ **Round selection by perspective:**
138
+ - Round 1: Researcher
139
+ - Round 2: Researcher + Simplifier
140
+ - Round 3: Boundary Keeper
141
+ - Round 4: Failure Analyst
142
+ - Rounds 5–6: Seed Closer (focus on lowest-scoring dimensions)
143
+
144
+ **After each round:**
145
+ 1. Update all 4 dimension scores from the user's answers
146
+ 2. Calculate new ambiguity score
147
+ 3. Display the updated scoring:
148
+
149
+ ```
150
+ After round [N]:
151
+ Goal Clarity: [score] (min 0.75) [✓ or ↑ needed]
152
+ Boundary Clarity: [score] (min 0.70) [✓ or ↑ needed]
153
+ Constraint Clarity: [score] (min 0.65) [✓ or ↑ needed]
154
+ Acceptance Criteria:[score] (min 0.70) [✓ or ↑ needed]
155
+ Ambiguity: [score] (gate: ≤ 0.20)
156
+ ```
157
+
158
+ **Gate check after each round:**
159
+
160
+ If gate passes (ambiguity ≤ 0.20 AND all minimums met):
161
+
162
+ **If `--auto`:** Jump to Step 6.
163
+
164
+ **Otherwise:** AskUserQuestion:
165
+ - header: "Spec Gate Passed"
166
+ - question: "Ambiguity is [score] — requirements are clear enough to write SPEC.md. Proceed?"
167
+ - options:
168
+ - "Yes — write SPEC.md" → Jump to Step 6
169
+ - "One more round" → Continue interview
170
+ - "Done talking — write it" → Jump to Step 6
171
+
172
+ **If max rounds reached (6) and gate not passed:**
173
+
174
+ **If `--auto`:** Write SPEC.md anyway — flag unresolved dimensions. Log: `[auto] Max rounds reached. Writing SPEC.md with [N] dimensions below minimum. Planner will need to treat these as assumptions.`
175
+
176
+ **Otherwise:** AskUserQuestion:
177
+ - header: "Max Rounds"
178
+ - question: "After 6 rounds, ambiguity is [score]. [List dimensions still below minimum.] What would you like to do?"
179
+ - options:
180
+ - "Write SPEC.md anyway — flag gaps" → Write SPEC.md, mark unresolved dimensions in Ambiguity Report
181
+ - "Keep talking" → Continue (no round limit from here)
182
+ - "Abandon" → Exit without writing
183
+
184
+ **If `--auto` mode throughout:** Replace all AskUserQuestion calls above with Claude's recommended choice. Log decisions inline. Apply the same logic as `--auto` in discuss-phase.
185
+
186
+ **Text mode (`workflow.text_mode: true` or `--text` flag):** Use plain-text numbered lists instead of AskUserQuestion TUI menus.
187
+
188
+ ## Step 5: (covered inline — ambiguity scoring is per-round)
189
+
190
+ ## Step 5.5: Edge-Completeness Probe
191
+
192
+ Run AFTER the ambiguity gate passes (you probe edges of clear requirements, not vague
193
+ ones). Reference: @~/.claude/pp-core/references/edge-probe.md.
194
+
195
+ **Runtime coverage compute — resolve and invoke edge-probe.cjs:**
196
+
197
+ ```bash
198
+ # Resolve the compiled edge-probe.cjs against the GSD install dir via RUNTIME_DIR (#448)
199
+ # — NOT the consuming project's git root — falling back to git toplevel / $HOME/.claude.
200
+ # Mirrors the ui-safety-gate.cjs resolution idiom at autonomous.md:290 / plan-phase.md:631.
201
+ _GSD_RT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
202
+ EDGE_PROBE_JS=$(for _c in \
203
+ "$_GSD_RT/pp-core/bin/lib/edge-probe.cjs" \
204
+ "$_GSD_RT/bin/lib/edge-probe.cjs" \
205
+ "$_GSD_RT/.claude/bin/lib/edge-probe.cjs" \
206
+ "$HOME/.claude/pp-core/bin/lib/edge-probe.cjs" \
207
+ "$HOME/.claude/bin/lib/edge-probe.cjs"; do
208
+ [ -f "$_c" ] && { echo "$_c"; break; }
209
+ done)
210
+
211
+ # Graceful degradation — never silent skip (RR-04). Build ONLY when $_GSD_RT is a verified
212
+ # GSD source checkout (has tsconfig.build.json + src/edge-probe.cts), and pin npm to it with
213
+ # --prefix so we never trigger the CONSUMING project's own build:lib (its cwd package scripts:
214
+ # codegen/migrations/writes) during a spec workflow. Real installs ship the compiled .cjs via
215
+ # prepublishOnly, so this build path only matters in a GSD dev checkout (review High).
216
+ if [ -z "$EDGE_PROBE_JS" ]; then
217
+ if [ -f "$_GSD_RT/tsconfig.build.json" ] && [ -f "$_GSD_RT/src/edge-probe.cts" ]; then
218
+ npm --prefix "$_GSD_RT" run build:lib 2>/dev/null || true
219
+ EDGE_PROBE_JS=$(for _c in \
220
+ "$_GSD_RT/pp-core/bin/lib/edge-probe.cjs" \
221
+ "$_GSD_RT/bin/lib/edge-probe.cjs" \
222
+ "$_GSD_RT/.claude/bin/lib/edge-probe.cjs" \
223
+ "$HOME/.claude/pp-core/bin/lib/edge-probe.cjs" \
224
+ "$HOME/.claude/bin/lib/edge-probe.cjs"; do
225
+ [ -f "$_c" ] && { echo "$_c"; break; }
226
+ done)
227
+ fi
228
+ if [ -z "$EDGE_PROBE_JS" ]; then
229
+ echo "ERROR: edge-probe.cjs not found — reinstall GSD or run \`npm run build:lib\` in your GSD checkout." >&2
230
+ exit 1
231
+ fi
232
+ fi
233
+
234
+ # Write the Requirements gathered in THIS spec session to a temp JSON, then invoke the
235
+ # canonical coverage compute. Populate the heredoc from the SPEC's Requirements — one object
236
+ # per requirement: {"id","text","shapes"?}. This is the load-bearing step: an empty file makes
237
+ # the probe a no-op, so the guard below fails loud rather than silently skipping (RR-04).
238
+ REQS_JSON=$(mktemp "${TMPDIR:-/tmp}/edge-probe-reqs-XXXXXX.json")
239
+ cat > "$REQS_JSON" <<'JSON'
240
+ [
241
+ { "id": "R1", "text": "<replace: requirement text from the SPEC>" }
242
+ ]
243
+ JSON
244
+ # Guard — never invoke on an empty/invalid array, OR one still holding the heredoc
245
+ # `<replace: …>` placeholder (a forgotten substitution would otherwise yield a
246
+ # meaningful-looking but bogus coverage report). Fail loud, not silent no-op.
247
+ if ! node -e 'const a=require(process.argv[1]);if(!Array.isArray(a)||a.length===0)process.exit(1);if(a.some(r=>typeof r.text!=="string"||!r.text.trim()||r.text.includes("<replace:")))process.exit(1)' "$REQS_JSON" 2>/dev/null; then
248
+ echo "ERROR: edge-probe requirements JSON is empty/invalid or still holds the <replace: …> placeholder — populate \$REQS_JSON from the SPEC Requirements before Step 5.5 runs." >&2
249
+ exit 1
250
+ fi
251
+ # Invoke the compiled engine and CAPTURE its report — it computes which categories apply per
252
+ # requirement. The covered/backstop/dismissed/unresolved rows in $COVERAGE drive the
253
+ # resolution loop below (canonical taxonomy compute, NOT LLM re-derivation from prose).
254
+ # The engine FAILS CLOSED (exit 2) on an invalid authored shape or bad input — so the capture
255
+ # MUST be exit-checked. A bare `COVERAGE=$(node …)` swallows that exit code, leaves $COVERAGE
256
+ # empty, and lets the workflow fall through to prose re-derivation: fail-OPEN at the boundary
257
+ # the engine validation exists to protect. Make the run fatal, then validate the captured
258
+ # report is well-formed JSON before the resolution loop consumes it.
259
+ if ! COVERAGE=$(node "$EDGE_PROBE_JS" "$REQS_JSON"); then
260
+ rm -f "$REQS_JSON"
261
+ echo "ERROR: edge-probe engine failed (invalid shapes or bad input) — fix the requirement(s) and re-run; never proceed with empty coverage." >&2
262
+ exit 1
263
+ fi
264
+ rm -f "$REQS_JSON"
265
+ # Exit-0-but-garbage guard: the report must parse as JSON with the expected { items[], coverage{} } shape.
266
+ if ! printf '%s' "$COVERAGE" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{let r;try{r=JSON.parse(s)}catch{process.exit(1)}if(!r||!Array.isArray(r.items)||typeof r.coverage!=="object"||r.coverage===null)process.exit(1)})'; then
267
+ echo "ERROR: edge-probe produced an unparseable or malformed coverage report — refusing to proceed with the resolution loop." >&2
268
+ exit 1
269
+ fi
270
+ # Zero-applicable guard: a report where the engine proposed NO applicable edge across ANY
271
+ # requirement is far more likely a shape-classification miss (or malformed requirements) than
272
+ # a genuinely edge-free spec — the same fail-open shape as an invalid shape yielding
273
+ # applicable:0. Surface it loudly; the author must explicitly confirm "no applicable edges"
274
+ # below rather than silently emitting a green empty ## Edge Coverage section.
275
+ APPLICABLE=$(printf '%s' "$COVERAGE" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{let n=0;try{n=JSON.parse(s).coverage.applicable}catch{n=0}process.stdout.write(String(n))})')
276
+ if [ "$APPLICABLE" = "0" ]; then
277
+ echo "WARNING: edge-probe proposed ZERO applicable edges across all requirements — likely a classification miss or malformed requirements, not a genuinely edge-free spec. Do NOT silently write an empty Edge Coverage section." >&2
278
+ fi
279
+ ```
280
+
281
+ If `$APPLICABLE` is `0`, do NOT proceed silently: ask the author to confirm via AskUserQuestion
282
+ ("The edge probe found no applicable edges for any requirement — is this genuinely an
283
+ edge-free spec, or should we revisit the requirement wording / authored shapes?"). Only write
284
+ an empty `## Edge Coverage` section after explicit confirmation.
285
+
286
+ For each Requirement gathered so far:
287
+ 1. Classify its shape and raise only applicable edge categories (relevance filter — see
288
+ the taxonomy in the reference). Reuse any edges the Round-4 Failure Analyst already
289
+ surfaced as pre-`covered`.
290
+ 2. For each raised category, propose a CONCRETE candidate edge (not "consider
291
+ boundaries" — e.g. "R2 merges intervals; what about `[[1,2],[2,3]]` that only touch?").
292
+ 3. Resolve each with the user (AskUserQuestion; text mode → numbered list):
293
+ - **Specify it** → write a new pass/fail line into Acceptance Criteria AND mark the
294
+ edge `covered`.
295
+ - **Dismiss (reason)** → mark `dismissed` with a required non-empty reason.
296
+ - **Backstop with a test** → mark `backstop`; note "held-out edge test" for plan-phase.
297
+ - **Defer** → leave `unresolved`.
298
+ - An `unclassified` row (probe `unclassified — review manually`) means the requirement's
299
+ prose matched no shape cue (#1110) — treat it like any other candidate (**Specify**,
300
+ **Dismiss (reason)**, or **Defer**). A manual-review nudge, not a hard block.
301
+
302
+ **Soft gate (after resolving):**
303
+ - All applicable edges resolved → proceed to Step 6.
304
+ - Any `unresolved` → AskUserQuestion:
305
+ - header: "Edge Coverage"
306
+ - question: "[N] edge(s) are unresolved: [list]. What do you want to do?"
307
+ - options: "Resolve now" (loop back) / "Write SPEC.md anyway — flag unresolved" /
308
+ "Keep probing"
309
+ - On "anyway": write SPEC.md with those rows marked `⚠ Edge unresolved — planner must
310
+ treat as assumption`.
311
+
312
+ **`--auto` mode:** auto-`covered` where a defensible acceptance criterion can be written;
313
+ otherwise auto-`backstop` (never auto-dismiss — a wrong dismissal is the exact silent
314
+ failure being eliminated). Log: `[auto] edge coverage: C covered, B backstop, U unresolved`.
315
+
316
+ **`unclassified` exception (#1110):** `--auto` leaves an `unclassified` candidate
317
+ **`unresolved`** (the soft gate surfaces it as a flagged planner assumption) — it never
318
+ auto-`backstop`s it. A missing shape is not evidence an edge exists, so minting a held-out
319
+ edge obligation on a requirement that may be genuinely edge-free would be a false claim and
320
+ risks a vacuous edge test. Leaving it `unresolved` keeps the zero-cue requirement visible
321
+ (never a silent drop) without fabricating an edge — which is exactly #1110's purpose: surface
322
+ it for review, do not auto-handle it.
323
+
324
+ Populate the `## Edge Coverage` section of SPEC.md from the resolved edges.
325
+
326
+ ## Step 5.6: Prohibition-Completeness Probe (must-NOT)
327
+
328
+ Run AFTER Step 5.5 (you probe the must-NOT axis of clear requirements, over the same
329
+ requirement list). Reference: @~/.claude/pp-core/references/prohibition-probe.md — the
330
+ portable two-stage protocol, the canon-referral rule, and the status×verification schema
331
+ live there (size-cap discipline; keep this step lean).
332
+
333
+ **D1 — no compiled engine (ADR-550 D7b).** Unlike Step 5.5, the prohibition probe has NO
334
+ compiled recall engine and runs NO `node` invocation here. The recall stage is an LLM prose
335
+ pass: the closed eight-category edge taxonomy a classifier can apply does not exist for the
336
+ open values/safety/ethics must-NOT axis. Do NOT copy the Step 5.5 engine-resolution block.
337
+ Only the schema/projection layer is real code; the recall is prose.
338
+
339
+ For each Requirement gathered so far, run the two-stage recall→precision pass:
340
+
341
+ 1. **Stage 1 — Recall (adversarial prose probe).** Ask the single adversarial question of the
342
+ requirement: *"What could this feature silently become that the author would NOT want, but
343
+ the spec does not forbid?"* Over-produce (~10 raw must-NOT candidates) — recall first.
344
+ 2. **Stage 2 — Precision (one-pass classifier).** Filter the raw list in a single pass:
345
+ **DROP routine-engineering** items (normal correctness/hygiene — "must not mutate input",
346
+ "must not throw on empty" — owned by the edge probe or code review); **KEEP
347
+ values / safety / ethics** items (manipulative framing, protected-attribute proxies, raw
348
+ PII in plaintext). This collapses ~10 → ~2–3 genuine prohibitions.
349
+ 3. **Canon-referral (ADR-550 D6, PROB-13).** A kept candidate that is canon security/compliance
350
+ (OWASP / prototype-pollution / path-traversal / injection / GDPR / generic fairness) is
351
+ NOT minted here — emit a one-line breadcrumb (*"prototype-pollution is canon — owned by
352
+ /pp:secure-phase + eslint; not minted here"*) and DROP it. Minting canon items duplicates
353
+ /pp:secure-phase and drowns the bespoke signal.
354
+ 4. **Resolve each surfaced (non-canon) prohibition** (AskUserQuestion; text mode → numbered list):
355
+ - **Keep it** → write a NEGATIVE acceptance criterion (a must-NOT line) into Acceptance
356
+ Criteria AND mark the prohibition `resolved` with a verification tier: `test` (a
357
+ mechanical negative test/lint/assertion exists) or `judgment` (real but not mechanically
358
+ checkable — routes to judgment review).
359
+ - **Capture the wired-check descriptor on `test`-tier (#1278, SOFT).** When a prohibition is
360
+ resolved `verification: test`, ALSO capture the descriptor of the wired check so
361
+ `verify-phase` can LOCATE it deterministically (no verifier invention at verify time).
362
+ Capture the flat scalars — persisted into SPEC and projected onto the
363
+ `must_haves.prohibitions` item by `projectProhibitions`:
364
+ - `check_kind` — `node-test` | `lint-rule`.
365
+ - `check_target` — the negative-test file path (for `node-test`), or the path to lint
366
+ (for `lint-rule`).
367
+ - `check_rule` — the eslint rule id (e.g. `local/no-source-grep`); `lint-rule` only.
368
+ - `check_violation_fixture` (#1346) — path to a KNOWN-BAD subject the wired check is run
369
+ against to **machine-prove fail-first**; rides BOTH kinds. Capture it to let the item green
370
+ end-to-end with zero hand-authoring at verify time; for `node-test` the negative test should
371
+ read its subject from the `GSD_PROHIB_SUBJECT` env var so the prover can inject this fixture.
372
+ This is a **SOFT capture (CHK-04): a `test`-tier prohibition WITHOUT a descriptor is still
373
+ allowed** — if the author cannot yet name the wired check, leave the descriptor empty and
374
+ proceed. It is NOT a hard authoring block; the item simply stays fail-closed/flagged
375
+ downstream (an absent/partial descriptor — or one with no `check_violation_fixture` —
376
+ → `descriptorFromProjection` null/under-specified/fixture-less → producer fail-closed
377
+ locate-or-unprovable, never green). Do NOT capture `failFirst` here — it is a
378
+ verify-time caller attestation, not a spec-authored field (#1279).
379
+ - **Dismiss (reason)** → mark `dismissed` with a REQUIRED non-empty reason (PROB-05). The
380
+ reason string is the audit trail; silence is not a valid dismissal.
381
+ - **Defer** → leave `unresolved`.
382
+
383
+ **Soft gate (after resolving) — PROB-06:**
384
+ - All applicable prohibitions resolved → proceed to Step 6.
385
+ - Any `unresolved` → AskUserQuestion:
386
+ - header: "Prohibitions"
387
+ - question: "[N] prohibition(s) are unresolved: [list]. What do you want to do?"
388
+ - options: "Resolve now" (loop back) / "Write SPEC.md anyway — flag unresolved" /
389
+ "Keep probing"
390
+ - On "anyway": write SPEC.md with those rows marked `⚠ Prohibition unresolved — planner
391
+ must treat as assumption`. This is a soft gate (write-anyway-with-flags), never a silent
392
+ skip — the soft gate IS the control.
393
+
394
+ **`--auto` mode:** auto-`resolved` where a defensible negative acceptance criterion can be
395
+ written (test or judgment tier); otherwise leave `unresolved`. **`--auto` NEVER auto-dismisses
396
+ a prohibition** — a wrong dismissal is the exact silent failure this probe eliminates (PROB-06,
397
+ the load-bearing safety property). On a `test`-tier auto-resolution, capture the `check_kind` /
398
+ `check_target` / `check_rule` / `check_violation_fixture` descriptor **only when a wired check is unambiguous**; otherwise
399
+ leave it empty — `--auto` NEVER fabricates a check path or fixture (a wrong locate is re-validated and
400
+ fails closed at the producer, but a fabricated path is still noise to avoid). Log:
401
+ `[auto] prohibitions: R resolved, U unresolved`.
402
+
403
+ **Text mode (PROB-09):** per Step 5's text-mode rule, replace the AskUserQuestion menus above
404
+ with plain-text numbered lists — there is NO hard AskUserQuestion dependency, so the probe
405
+ runs identically for non-Claude / text-mode hosts.
406
+
407
+ Populate the `## Prohibitions` section of SPEC.md from the resolved prohibitions (each
408
+ `resolved`/`test` row is a checkable negative acceptance criterion; `resolved`/`judgment`
409
+ rows route to judgment review; `⚠ UNRESOLVED` rows are flagged as assumptions). A
410
+ `resolved`/`test` row ALSO carries its captured `check_kind` / `check_target` / `check_rule` /
411
+ `check_violation_fixture` descriptor when present (so the projection feeds `verify-phase`'s deterministic locate + machine-proof, #1278 + #1346);
412
+ a `test` row with no captured descriptor is still valid — it stays fail-closed/flagged
413
+ downstream rather than blocking authoring.
414
+
415
+ ## Step 6: Generate SPEC.md
416
+
417
+ Use the SPEC.md template from @~/.claude/pp-core/templates/spec.md.
418
+
419
+ - Populate the **Edge Coverage** section from Step 5.5 (covered/dismissed/backstop/unresolved rows).
420
+ - Populate the **Prohibitions** section from Step 5.6 (resolved/dismissed/unresolved rows with the test|judgment tier).
421
+
422
+ **Requirements for every requirement entry:**
423
+ - One specific, testable statement
424
+ - Current state (what exists now)
425
+ - Target state (what it should become)
426
+ - Acceptance criterion (how to verify it was met)
427
+
428
+ **Vague requirements are rejected:**
429
+ - ✗ "The system should be fast"
430
+ - ✗ "Improve user experience"
431
+ - ✓ "API endpoint responds in < 200ms at p95 under 100 concurrent requests"
432
+ - ✓ "CLI command exits with code 1 and prints to stderr on invalid input"
433
+
434
+ **Count requirements.** The display in discuss-phase reads: "Found SPEC.md — {N} requirements locked."
435
+
436
+ **Boundaries must be explicit lists:**
437
+ - "In scope" — what this phase produces
438
+ - "Out of scope" — what it explicitly does NOT do (with brief reasoning)
439
+
440
+ **Acceptance criteria must be pass/fail checkboxes** — no "should feel good" or "looks reasonable."
441
+
442
+ **If any dimensions are below minimum**, mark them in the Ambiguity Report with: `⚠ Below minimum — planner must treat as assumption`.
443
+
444
+ Write to: `{phase_dir}/{padded_phase}-SPEC.md`
445
+
446
+ ## Step 7: Commit
447
+
448
+ ```bash
449
+ git add "${phase_dir}/${padded_phase}-SPEC.md"
450
+ git commit -m "spec(phase-${phase_number}): add SPEC.md for ${phase_name} — ${requirement_count} requirements (#2213)"
451
+ ```
452
+
453
+ If `commit_docs` is false: Skip commit. Note that SPEC.md was written but not committed.
454
+
455
+ ## Step 8: Wrap Up
456
+
457
+ Display:
458
+
459
+ ```
460
+ SPEC.md written — {N} requirements locked.
461
+
462
+ Phase {X}: {name}
463
+ Ambiguity: {final_score} (gate: ≤ 0.20)
464
+
465
+ Next: /pp:discuss-phase {X}
466
+ discuss-phase will detect SPEC.md and focus on implementation decisions only.
467
+ ```
468
+
469
+ </process>
470
+
471
+ <critical_rules>
472
+ - Every requirement MUST have current state, target state, and acceptance criterion
473
+ - Boundaries section is MANDATORY — cannot be empty
474
+ - "In scope" and "Out of scope" must be explicit lists, not narrative prose
475
+ - Acceptance criteria must be pass/fail — no subjective criteria
476
+ - SPEC.md is NEVER written if the user selects "Abandon"
477
+ - Do NOT ask about HOW to implement — that is discuss-phase territory
478
+ - Scout the codebase BEFORE the first question — grounded questions only
479
+ - Max 2–3 questions per round — do not frontload all questions at once
480
+ - Step 5.5 edge probe runs after the ambiguity gate; dismissals require a reason; --auto never auto-dismisses
481
+ - Step 5.6 prohibition probe runs after the edge probe; dismissals require a reason; --auto never auto-dismisses a prohibition
482
+ </critical_rules>
483
+
484
+ <success_criteria>
485
+ - Codebase scouted and current state understood before questioning
486
+ - All 4 dimensions scored after every round
487
+ - Gate passed OR user explicitly chose to write despite gaps
488
+ - SPEC.md contains only falsifiable requirements
489
+ - Boundaries are explicit (in scope / out of scope with reasoning)
490
+ - Acceptance criteria are pass/fail checkboxes
491
+ - SPEC.md committed atomically (when commit_docs is true)
492
+ - User directed to /pp:discuss-phase as next step
493
+ - Edge-completeness probe run; Edge Coverage section populated; unresolved edges flagged as assumptions
494
+ - Prohibition-completeness probe run; Prohibitions section populated; unresolved prohibitions flagged as assumptions
495
+ </success_criteria>