pan-wizard 3.35.0 → 3.37.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 (339) hide show
  1. package/CHANGELOG.md +3645 -0
  2. package/README.md +46 -52
  3. package/agents/pan-conductor.md +2 -3
  4. package/agents/pan-counterfactual.md +1 -2
  5. package/agents/pan-debugger.md +14 -3
  6. package/agents/pan-design-checker.md +1 -2
  7. package/agents/pan-designer.md +2 -3
  8. package/agents/pan-document_code.md +1 -2
  9. package/agents/pan-executor.md +25 -0
  10. package/agents/pan-hardener.md +4 -3
  11. package/agents/pan-integration-checker.md +1 -2
  12. package/agents/pan-knowledge.md +1 -2
  13. package/agents/pan-meta-reviewer.md +3 -3
  14. package/agents/pan-optimizer.md +4 -4
  15. package/agents/pan-phase-researcher.md +80 -475
  16. package/agents/pan-plan-checker.md +40 -3
  17. package/agents/pan-planner.md +21 -7
  18. package/agents/pan-previewer.md +3 -2
  19. package/agents/pan-project-researcher.md +72 -493
  20. package/agents/pan-release.md +1 -1
  21. package/agents/pan-reviewer.md +14 -3
  22. package/agents/pan-roadmapper.md +12 -7
  23. package/agents/pan-verifier.md +9 -4
  24. package/bin/install-lib.cjs +134 -14
  25. package/bin/install.js +59 -12
  26. package/commands/pan/army.md +1 -1
  27. package/commands/pan/autodev.md +76 -0
  28. package/commands/pan/cost.md +21 -1
  29. package/commands/pan/exec-phase.md +3 -4
  30. package/commands/pan/focus-auto.md +14 -7
  31. package/commands/pan/focus-design.md +4 -5
  32. package/commands/pan/focus-docs.md +24 -0
  33. package/commands/pan/learn.md +13 -6
  34. package/commands/pan/milestone-audit.md +8 -1
  35. package/commands/pan/milestone-done.md +10 -5
  36. package/commands/pan/milestone-new.md +2 -2
  37. package/commands/pan/new-project.md +15 -12
  38. package/commands/pan/plan-phase.md +15 -9
  39. package/commands/pan/preview.md +1 -1
  40. package/commands/pan/quick.md +1 -1
  41. package/commands/pan/review-deep.md +11 -5
  42. package/commands/pan/settings.md +6 -0
  43. package/commands/pan/verify-phase.md +6 -2
  44. package/docs/AGENTS.md +917 -0
  45. package/docs/ARCHITECTURE.md +1054 -0
  46. package/docs/CLI-REFERENCE.md +4582 -0
  47. package/docs/COMPARISON.md +116 -0
  48. package/docs/DEVELOPMENT.md +490 -0
  49. package/docs/ECOSYSTEM-REVIEW-2026-06.md +107 -0
  50. package/docs/ECOSYSTEM-REVIEW-2026-08.md +349 -0
  51. package/docs/EXAMPLES.md +584 -0
  52. package/docs/FAQ.md +254 -0
  53. package/docs/FIELD-HARVEST-2026-07.md +88 -0
  54. package/docs/FIELD-REPORT-army-2026-06.md +121 -0
  55. package/docs/HOOKS.md +638 -0
  56. package/docs/IMPROVEMENT-TODO.md +246 -0
  57. package/docs/INTERNALS.md +485 -0
  58. package/docs/MIGRATION-v2-to-v3.md +258 -0
  59. package/docs/SECURITY-HARDENING.md +230 -0
  60. package/docs/SKILLS-ENHANCEMENT-PLAN-V2.md +122 -0
  61. package/docs/SKILLS-FULL-TEXT.md +9685 -0
  62. package/docs/SKILLS-REFERENCE.md +1037 -0
  63. package/docs/TROUBLESHOOTING.md +1084 -0
  64. package/docs/USER-GUIDE.md +1437 -0
  65. package/docs/archive/SKILLS-ENHANCEMENT-PLAN.md +230 -0
  66. package/docs/audits/AUDIT-2026-08-e2e-ROADMAP.md +117 -0
  67. package/docs/audits/AUDIT-2026-08-e2e-VERIFICATION.md +693 -0
  68. package/docs/audits/AUDIT-2026-08-e2e.md +1546 -0
  69. package/docs/audits/OUTSTANDING-2026-08.md +275 -0
  70. package/docs/audits/STABILITY-TEST-2026-08.md +640 -0
  71. package/docs/branding/README-brand-draft.md +119 -0
  72. package/docs/branding/handoff/IMPLEMENTATION.md +205 -0
  73. package/docs/branding/handoff/README-brand-draft.md +119 -0
  74. package/docs/branding/handoff/image-prompts.md +46 -0
  75. package/docs/branding/image-prompts.md +46 -0
  76. package/docs/branding/nano-banana-prompts.txt +60 -0
  77. package/docs/context-monitor.md +13 -0
  78. package/docs/decisions/ADR-0001-strategic-feature-prioritization.md +83 -0
  79. package/docs/decisions/ADR-0002-copilot-cli-runtime.md +71 -0
  80. package/docs/decisions/ADR-0003-smart-execution.md +84 -0
  81. package/docs/decisions/ADR-0004-copilot-cli-interaction.md +89 -0
  82. package/docs/decisions/ADR-0005-command-naming.md +80 -0
  83. package/docs/decisions/ADR-0006-focus-commands.md +101 -0
  84. package/docs/decisions/ADR-0007-ship-v1.md +73 -0
  85. package/docs/decisions/ADR-0008-map-codebase-mermaid-togaf.md +80 -0
  86. package/docs/decisions/ADR-0009-production-deployment-checklist.md +68 -0
  87. package/docs/decisions/ADR-0010-standards-integration.md +79 -0
  88. package/docs/decisions/ADR-0011-help-commands-rewrite.md +64 -0
  89. package/docs/decisions/ADR-0012-contributors-attribution-index.md +42 -0
  90. package/docs/decisions/ADR-0013-strategic-feature-additions.md +53 -0
  91. package/docs/decisions/ADR-0014-internal-cleanup-code-quality.md +53 -0
  92. package/docs/decisions/ADR-0015-focus-auto-runner.md +296 -0
  93. package/docs/decisions/ADR-0016-enhanced-doc-sync.md +54 -0
  94. package/docs/decisions/ADR-0017-enhanced-focus-design.md +69 -0
  95. package/docs/decisions/ADR-0018-user-reality-testing.md +84 -0
  96. package/docs/decisions/ADR-0019-end-to-end-user-acceptance-testing.md +113 -0
  97. package/docs/decisions/ADR-0020-ai-drift-prevention.md +55 -0
  98. package/docs/decisions/ADR-0021-codebase-mapper-v2.md +76 -0
  99. package/docs/decisions/ADR-0022-lifecycle-completeness.md +63 -0
  100. package/docs/decisions/ADR-0023-opus-4-7-adoption.md +89 -0
  101. package/docs/decisions/ADR-0024-spec-b-v2-completion.md +137 -0
  102. package/docs/decisions/ADR-0025-behavioral-guardrails-layer.md +129 -0
  103. package/docs/decisions/ADR-0026-self-improvement-loop.md +171 -0
  104. package/docs/decisions/ADR-0027-doc-code-link-graph.md +164 -0
  105. package/docs/decisions/ADR-0028-unified-agents-skills-target.md +46 -0
  106. package/docs/decisions/ADR-0029-experiment-evaluator.md +76 -0
  107. package/docs/decisions/ADR-0030-planning-concurrency.md +37 -0
  108. package/docs/decisions/ADR-0031-focus-auto-backlog-source.md +47 -0
  109. package/docs/decisions/ADR-0032-squad-model.md +64 -0
  110. package/docs/decisions/ADR-0033-army-campaign.md +40 -0
  111. package/docs/decisions/ADR-0034-scheduled-campaigns.md +57 -0
  112. package/docs/decisions/ADR-0035-army-hud-dashboard.md +40 -0
  113. package/docs/decisions/ADR-0036-agentic-memory-architecture.md +106 -0
  114. package/docs/decisions/ADR-0037-pin-security-agents-to-opus.md +51 -0
  115. package/docs/decisions/ADR-0038-skill-aligned-decomposition.md +41 -0
  116. package/docs/decisions/ADR-0039-worktree-as-project-variant.md +37 -0
  117. package/docs/decisions/ADR-0040-memory-injection-defense.md +55 -0
  118. package/docs/decisions/ADR-0041-mcp-dual-era-bridge.md +47 -0
  119. package/docs/decisions/ADR-0042-design-parity-both-flows.md +45 -0
  120. package/docs/decisions/ADR-0043-addressable-planning-roots.md +56 -0
  121. package/docs/decisions/ADR-0044-bound-the-cached-context.md +104 -0
  122. package/docs/decisions/ADR-0045-agent-plugins-bundle.md +76 -0
  123. package/docs/decisions/ADR-0046-subagent-frontmatter-decisions.md +39 -0
  124. package/docs/decisions/ADR-0047-pan-harness.md +76 -0
  125. package/docs/decisions/ADR-0048-one-core-per-project.md +43 -0
  126. package/docs/decisions/ADR-0049-machine-verdicts-and-findings-ledger.md +116 -0
  127. package/docs/specs/ai_drift_prevention_featureai.md +286 -0
  128. package/docs/specs/codebase_mapper_v2_featureai.md +930 -0
  129. package/docs/specs/command_naming_optimization_featureai.md +930 -0
  130. package/docs/specs/comp_analysis_markdown_v1.md +149 -0
  131. package/docs/specs/continuous_autonomous_execution_featureai.md +304 -0
  132. package/docs/specs/contributors_attribution_index_featureai.md +476 -0
  133. package/docs/specs/copilot_cli_interaction_featureai.md +868 -0
  134. package/docs/specs/copilot_cli_runtime_featureai.md +647 -0
  135. package/docs/specs/custom-skills-assessment.md +461 -0
  136. package/docs/specs/deployment_audit_findings_featureai.md +243 -0
  137. package/docs/specs/doc_code_link_graph_featureai.md +253 -0
  138. package/docs/specs/documentation_alignment_cleanup_featureai.md +69 -0
  139. package/docs/specs/e2e_visual_testing_featureai.md +615 -0
  140. package/docs/specs/end_to_end_user_acceptance_testing_featureai.md +810 -0
  141. package/docs/specs/evidence-loop-plan.md +76 -0
  142. package/docs/specs/evidence_loop_featureai.md +497 -0
  143. package/docs/specs/focus-auto-optimize-category.md +449 -0
  144. package/docs/specs/focus-auto-optimize-superplan.md +188 -0
  145. package/docs/specs/focus_auto_runner_featureai.md +1102 -0
  146. package/docs/specs/focus_design_v2_featureai.md +197 -0
  147. package/docs/specs/focus_sync_v2_featureai.md +202 -0
  148. package/docs/specs/git_integration_overhaul_featureai.md +326 -0
  149. package/docs/specs/glm_zai_provider_featureai.md +200 -0
  150. package/docs/specs/googlecli_adoption_featureai.md +661 -0
  151. package/docs/specs/help_commands_rewrite_featureai.md +860 -0
  152. package/docs/specs/industry_analysis_strategic_additions_featureai.md +231 -0
  153. package/docs/specs/industry_comparison_and_feature_gaps_featureai.md +674 -0
  154. package/docs/specs/internal_cleanup_code_quality_featureai.md +486 -0
  155. package/docs/specs/investigations/README.md +31 -0
  156. package/docs/specs/investigations/digests/2026-09-28.md +47 -0
  157. package/docs/specs/investigations/digests/2026-10-08.md +62 -0
  158. package/docs/specs/investigations/digests/2026-10-10.md +61 -0
  159. package/docs/specs/investigations/features/debugger-red-loop-first.md +55 -0
  160. package/docs/specs/investigations/features/harness-cross-host-behaviour.md +93 -0
  161. package/docs/specs/investigations/features/optimize-apply-regression-gate.md +66 -0
  162. package/docs/specs/investigations/features/reviewer-smell-baseline.md +57 -0
  163. package/docs/specs/investigations/features/trace-failure-capture.md +69 -0
  164. package/docs/specs/lifecycle_completeness_featureai.md +754 -0
  165. package/docs/specs/local-first-ci.md +42 -0
  166. package/docs/specs/map_codebase_mermaid_togaf_featureai.md +805 -0
  167. package/docs/specs/market-delta-2026-09-superplan.md +310 -0
  168. package/docs/specs/market-ideas-2026-09.md +131 -0
  169. package/docs/specs/market-ideas-2026-10.md +428 -0
  170. package/docs/specs/market-ideas-ledger.md +177 -0
  171. package/docs/specs/memory-optimization-2026-10.md +285 -0
  172. package/docs/specs/multi-track-planning-roots.md +143 -0
  173. package/docs/specs/multi_model_routing_featureai.md +687 -0
  174. package/docs/specs/multi_model_routing_superplan.md +197 -0
  175. package/docs/specs/opus_47_existing_enhancements_featureai.md +247 -0
  176. package/docs/specs/opus_47_extended_features_featureai.md +363 -0
  177. package/docs/specs/opus_47_extended_features_v2_featureai.md +397 -0
  178. package/docs/specs/pan_focus_commands_featureai.md +2336 -0
  179. package/docs/specs/pan_zcode_mcp_bridge_featureai.md +120 -0
  180. package/docs/specs/product-excellence-superplan.md +315 -0
  181. package/docs/specs/product_excellence_program_2026_q4_featureai.md +365 -0
  182. package/docs/specs/production_deployment_readiness_featureai.md +433 -0
  183. package/docs/specs/production_readiness_ship_v1_featureai.md +698 -0
  184. package/docs/specs/real_test_enforcement_featureai.md +213 -0
  185. package/docs/specs/reality-check-2026-09-superplan.md +362 -0
  186. package/docs/specs/right-sized-ceremony.md +74 -0
  187. package/docs/specs/roadmap_and_competition_2026_q4_featureai.md +390 -0
  188. package/docs/specs/self_improvement_loop_featureai.md +875 -0
  189. package/docs/specs/skill-aligned-decomposition.md +155 -0
  190. package/docs/specs/standards_integration_featureai.md +833 -0
  191. package/docs/specs/testing-system-redesign-2026-09.md +267 -0
  192. package/docs/specs/user_reality_testing_system_featureai.md +788 -0
  193. package/docs/specs/watch-triggers.json +22 -0
  194. package/docs/specs/workflow-integration-redesign.md +742 -0
  195. package/docs/specs/workflow_state_consistency_featureai.md +183 -0
  196. package/hooks/dist/pan-context-monitor.js +9 -2
  197. package/hooks/dist/pan-cost-logger.js +5 -0
  198. package/hooks/dist/pan-guard.js +28 -5
  199. package/hooks/dist/pan-stop-guard.js +9 -9
  200. package/hooks/dist/pan-trace-logger.js +5 -0
  201. package/package.json +10 -2
  202. package/pan-wizard-core/bin/lib/agents-md.cjs +57 -8
  203. package/pan-wizard-core/bin/lib/autodev-report.cjs +180 -0
  204. package/pan-wizard-core/bin/lib/autodev.cjs +642 -0
  205. package/pan-wizard-core/bin/lib/ci.cjs +143 -0
  206. package/pan-wizard-core/bin/lib/commands.cjs +1 -1
  207. package/pan-wizard-core/bin/lib/config.cjs +41 -5
  208. package/pan-wizard-core/bin/lib/constants.cjs +27 -1
  209. package/pan-wizard-core/bin/lib/core.cjs +31 -14
  210. package/pan-wizard-core/bin/lib/cost.cjs +160 -4
  211. package/pan-wizard-core/bin/lib/cross-family.cjs +164 -0
  212. package/pan-wizard-core/bin/lib/debug-cases.cjs +104 -0
  213. package/pan-wizard-core/bin/lib/doc-lint.cjs +5 -3
  214. package/pan-wizard-core/bin/lib/failure-class.cjs +81 -0
  215. package/pan-wizard-core/bin/lib/findings.cjs +148 -9
  216. package/pan-wizard-core/bin/lib/focus.cjs +1 -1
  217. package/pan-wizard-core/bin/lib/git.cjs +1 -1
  218. package/pan-wizard-core/bin/lib/hosts.cjs +88 -0
  219. package/pan-wizard-core/bin/lib/init.cjs +7 -2
  220. package/pan-wizard-core/bin/lib/knowledge.cjs +2 -0
  221. package/pan-wizard-core/bin/lib/merge.cjs +50 -0
  222. package/pan-wizard-core/bin/lib/mutate.cjs +268 -0
  223. package/pan-wizard-core/bin/lib/next-action.cjs +112 -0
  224. package/pan-wizard-core/bin/lib/optimize.cjs +2 -2
  225. package/pan-wizard-core/bin/lib/phase-gate.cjs +15 -9
  226. package/pan-wizard-core/bin/lib/phase-remove.cjs +91 -11
  227. package/pan-wizard-core/bin/lib/phase.cjs +85 -13
  228. package/pan-wizard-core/bin/lib/plan-lint.cjs +310 -0
  229. package/pan-wizard-core/bin/lib/preview.cjs +26 -4
  230. package/pan-wizard-core/bin/lib/requirements-lint.cjs +130 -0
  231. package/pan-wizard-core/bin/lib/research-lint.cjs +268 -0
  232. package/pan-wizard-core/bin/lib/review-deep.cjs +14 -22
  233. package/pan-wizard-core/bin/lib/review-vote.cjs +105 -0
  234. package/pan-wizard-core/bin/lib/roadmap.cjs +1 -0
  235. package/pan-wizard-core/bin/lib/runner.cjs +2 -16
  236. package/pan-wizard-core/bin/lib/sizing.cjs +356 -0
  237. package/pan-wizard-core/bin/lib/squads.cjs +1 -1
  238. package/pan-wizard-core/bin/lib/state-write.cjs +247 -0
  239. package/pan-wizard-core/bin/lib/test-gate.cjs +433 -0
  240. package/pan-wizard-core/bin/lib/uat.cjs +149 -0
  241. package/pan-wizard-core/bin/lib/usage.cjs +104 -0
  242. package/pan-wizard-core/bin/lib/verdict.cjs +26 -3
  243. package/pan-wizard-core/bin/lib/verify-plan-set.cjs +30 -1
  244. package/pan-wizard-core/bin/lib/verify-preflight.cjs +2 -2
  245. package/pan-wizard-core/bin/lib/verify-red.cjs +174 -0
  246. package/pan-wizard-core/bin/lib/verify-retro.cjs +3 -2
  247. package/pan-wizard-core/bin/lib/verify-scope.cjs +143 -2
  248. package/pan-wizard-core/bin/lib/verify.cjs +86 -31
  249. package/pan-wizard-core/bin/lib/worktree.cjs +70 -0
  250. package/pan-wizard-core/bin/pan-tools.cjs +257 -28
  251. package/pan-wizard-core/learnings/universal/autonomous-loop.md +2 -2
  252. package/pan-wizard-core/mcp/orchestrator.cjs +4 -1
  253. package/pan-wizard-core/references/continuation-format.md +3 -3
  254. package/pan-wizard-core/references/design-methodology.md +1 -1
  255. package/pan-wizard-core/references/guardrails.md +1 -1
  256. package/pan-wizard-core/references/handoff-decisions.md +1 -1
  257. package/pan-wizard-core/references/model-profiles.md +2 -3
  258. package/pan-wizard-core/references/questioning.md +24 -0
  259. package/pan-wizard-core/references/ui-brand.md +4 -6
  260. package/pan-wizard-core/references/verdict-contract.md +2 -1
  261. package/pan-wizard-core/templates/config.json +10 -2
  262. package/pan-wizard-core/templates/debug.md +1 -0
  263. package/pan-wizard-core/templates/design.md +5 -4
  264. package/pan-wizard-core/templates/discovery.md +2 -2
  265. package/pan-wizard-core/templates/phase-prompt.md +7 -0
  266. package/pan-wizard-core/templates/requirements.md +9 -0
  267. package/pan-wizard-core/templates/research.md +10 -0
  268. package/pan-wizard-core/templates/summary-complex.md +5 -1
  269. package/pan-wizard-core/templates/summary-minimal.md +4 -0
  270. package/pan-wizard-core/templates/summary-standard.md +5 -1
  271. package/pan-wizard-core/templates/summary.md +8 -1
  272. package/pan-wizard-core/workflows/add-phase.md +4 -6
  273. package/pan-wizard-core/workflows/assumptions.md +19 -1
  274. package/pan-wizard-core/workflows/diagnose-issues.md +2 -0
  275. package/pan-wizard-core/workflows/discuss-phase.md +4 -2
  276. package/pan-wizard-core/workflows/exec-lean.md +69 -0
  277. package/pan-wizard-core/workflows/exec-phase.md +79 -15
  278. package/pan-wizard-core/workflows/execute-plan.md +3 -1
  279. package/{commands/pan → pan-wizard-core/workflows}/focus-doc-audit.md +13 -29
  280. package/{commands/pan → pan-wizard-core/workflows}/focus-drift-walking.md +3 -18
  281. package/{commands/pan → pan-wizard-core/workflows}/focus-exec.md +8 -23
  282. package/{commands/pan → pan-wizard-core/workflows}/focus-plan.md +6 -20
  283. package/{commands/pan → pan-wizard-core/workflows}/focus-scan.md +3 -16
  284. package/{commands/pan → pan-wizard-core/workflows}/focus-sync.md +7 -21
  285. package/pan-wizard-core/workflows/health.md +6 -0
  286. package/pan-wizard-core/workflows/help.md +114 -77
  287. package/pan-wizard-core/workflows/insert-phase.md +4 -6
  288. package/pan-wizard-core/workflows/learn.md +3 -3
  289. package/pan-wizard-core/workflows/milestone-audit.md +2 -2
  290. package/pan-wizard-core/workflows/milestone-new.md +38 -95
  291. package/pan-wizard-core/workflows/new-project.md +96 -258
  292. package/pan-wizard-core/workflows/optimize.md +107 -5
  293. package/pan-wizard-core/workflows/phase-tests.md +10 -0
  294. package/pan-wizard-core/workflows/plan-phase.md +106 -45
  295. package/pan-wizard-core/workflows/profile.md +50 -0
  296. package/pan-wizard-core/workflows/progress.md +10 -0
  297. package/pan-wizard-core/workflows/quick.md +34 -43
  298. package/pan-wizard-core/workflows/remove-phase.md +11 -1
  299. package/pan-wizard-core/workflows/research-phase.md +118 -40
  300. package/pan-wizard-core/workflows/resume-project.md +18 -2
  301. package/pan-wizard-core/workflows/settings.md +33 -19
  302. package/pan-wizard-core/workflows/todo-check.md +6 -2
  303. package/pan-wizard-core/workflows/transition.md +22 -4
  304. package/pan-wizard-core/workflows/uat-walkthrough.md +90 -0
  305. package/pan-wizard-core/workflows/update.md +1 -1
  306. package/pan-wizard-core/workflows/verify-phase.md +39 -46
  307. package/scripts/build-agent-plugin.js +35 -15
  308. package/scripts/build-help.cjs +106 -0
  309. package/scripts/build-plugin.js +10 -1
  310. package/scripts/deprecate-old-versions.js +70 -3
  311. package/scripts/generate-skills-docs.py +1 -1
  312. package/scripts/git-hooks/pre-push +27 -0
  313. package/scripts/install-git-hooks.js +7 -5
  314. package/scripts/install-pre-push.cjs +38 -0
  315. package/scripts/land.cjs +151 -0
  316. package/scripts/local-ci.cjs +501 -0
  317. package/scripts/local-schedule.cjs +277 -0
  318. package/scripts/mutation-probe.cjs +7 -80
  319. package/scripts/prompt-lint.cjs +32 -0
  320. package/scripts/prompt-rules.cjs +156 -0
  321. package/scripts/run-tests.cjs +7 -1
  322. package/scripts/test-quality-lint.cjs +3 -3
  323. package/scripts/test-surface.cjs +175 -6
  324. package/agents/pan-research-synthesizer.md +0 -246
  325. package/commands/pan/audit-deployment.md +0 -386
  326. package/commands/pan/dashboard.md +0 -22
  327. package/commands/pan/discord.md +0 -19
  328. package/commands/pan/mcp-bridge.md +0 -143
  329. package/commands/pan/milestone-cleanup.md +0 -19
  330. package/commands/pan/milestone-gaps.md +0 -35
  331. package/commands/pan/optimize.md +0 -115
  332. package/commands/pan/profile.md +0 -76
  333. package/commands/pan/research-phase.md +0 -189
  334. package/pan-wizard-core/bin/lib/bridge.cjs +0 -269
  335. package/pan-wizard-core/templates/research-project/architecture.md +0 -204
  336. package/pan-wizard-core/templates/research-project/features.md +0 -147
  337. package/pan-wizard-core/templates/research-project/pitfalls.md +0 -200
  338. package/pan-wizard-core/templates/research-project/stack.md +0 -120
  339. package/pan-wizard-core/templates/research-project/summary.md +0 -170
@@ -41,7 +41,8 @@
41
41
  * phase next-decimal <phase> Calculate next decimal phase number
42
42
  * phase add <description> Append new phase to roadmap + create dir
43
43
  * phase insert <after> <description> Insert decimal phase after existing
44
- * phase remove <phase> [--force] Remove phase, renumber all subsequent
44
+ * phase remove <phase> [--force] [--with-decimals]
45
+ * Remove phase, renumber all subsequent
45
46
  * phase complete <phase> Mark phase done, update state + roadmap
46
47
  *
47
48
  * Roadmap Operations:
@@ -92,6 +93,26 @@
92
93
  * verify commits <h1> [h2] ... Batch verify commit hashes
93
94
  * verify artifacts <plan-file> Check must_haves.artifacts
94
95
  * verify key-links <plan-file> Check must_haves.key_links
96
+ * verify red <phase> Each test the phase changed fails at the
97
+ * [--timeout <ms>] phase's base and passes at HEAD (V4)
98
+ * verify mutate --phase N Mutation report on the phase's changed lines
99
+ * [--max n] [--seed n] (V5): which mutants the suite does not kill;
100
+ * [--timeout <ms>] writes {NN}-mutation.json
101
+ * verify review-focus <phase> Every plan has a Review Focus: <=5 items,
102
+ * each naming its task and test (P4)
103
+ * verify decisions <phase> Plans cite only DD-N ids the design records,
104
+ * and every recorded one is cited (P2)
105
+ * usage Local census: installed commands and agents
106
+ * used, never used, unfinished (L9)
107
+ * research lint <phase|path> Claims table: source and date on every claim,
108
+ * [--now YYYY-MM-DD] stale ones per type window (P3)
109
+ *
110
+ * Test Gate (V2):
111
+ * test run [--phase N] [--baseline] Run the project's tests, any language; with
112
+ * [--command "<cmd>"] --phase, write {NN}-test-run.json (or the
113
+ * [--timeout <ms>] [--rebaseline] --baseline record) to the phase directory; an
114
+ * existing baseline is kept unless --rebaseline
115
+ * test detect The test command the gate would run, and why
95
116
  *
96
117
  * Template Fill:
97
118
  * template fill summary --phase N Create pre-filled summary.md
@@ -240,11 +261,14 @@ const findings = require('./lib/findings.cjs');
240
261
  const verifyPlanSet = require('./lib/verify-plan-set.cjs');
241
262
  const verifyIntegrity = require('./lib/verify-integrity.cjs');
242
263
  const phaseGate = require('./lib/phase-gate.cjs');
264
+ const testGate = require('./lib/test-gate.cjs');
265
+ const verifyRed = require('./lib/verify-red.cjs');
266
+ const verifyScope = require('./lib/verify-scope.cjs');
267
+ const mutate = require('./lib/mutate.cjs');
243
268
  const knowledge = require('./lib/knowledge.cjs');
244
269
  const skillAlign = require('./lib/skill-align.cjs');
245
270
  const hygiene = require('./lib/hygiene.cjs');
246
271
  const whatif = require('./lib/whatif.cjs');
247
- const bridge = require('./lib/bridge.cjs');
248
272
  const optimize = require('./lib/optimize.cjs');
249
273
  const git = require('./lib/git.cjs');
250
274
  const distill = require('./lib/distill.cjs');
@@ -365,7 +389,7 @@ async function main() {
365
389
  + ' --planning-dir <path> act on an arbitrary project-relative planning tree\n'
366
390
  + ' --all-tracks (hygiene) act on the root tree AND every discovered track\n'
367
391
  + ' env: PAN_TRACK, PAN_PLANNING_DIR (flags win)\n'
368
- + '\nCommands: state, resolve-model, estimate-cost, find-phase, git, distill, experiment, commit, verify-summary, template, frontmatter, verify, generate-slug, current-timestamp, list-todos, verify-path-exists, config-ensure-section, config-set, config-get, history-digest, phases, roadmap, requirements, phase, milestone, validate, progress, context-budget, todo, scaffold, init, phase-plan-index, state-snapshot, summary-extract, rollback-snapshot, batch-commit, websearch, focus, preflight, dashboard, hud, report, learnings, deps, drift-check, memory, bridge, whatif, knowledge, skills, hygiene, review-deep, findings, preview, cost, models, squad, worktree, campaign, bus, cache, retro, codebase, standards, optimize, doc-lint, learn, links, version';
392
+ + '\nCommands: state, resolve-model, estimate-cost, find-phase, git, distill, experiment, commit, verify-summary, template, frontmatter, verify, test, review, debug, uat, merge, research, usage, generate-slug, current-timestamp, list-todos, verify-path-exists, config-ensure-section, config-set, config-get, history-digest, phases, roadmap, requirements, phase, milestone, validate, progress, next-action, size, autodev, context-budget, todo, scaffold, init, phase-plan-index, state-snapshot, summary-extract, rollback-snapshot, batch-commit, websearch, focus, preflight, dashboard, hud, report, learnings, deps, drift-check, memory, whatif, knowledge, skills, hygiene, review-deep, findings, preview, cost, models, squad, worktree, campaign, bus, cache, retro, codebase, standards, optimize, doc-lint, learn, links, version';
369
393
 
370
394
  if (!command) {
371
395
  error(USAGE);
@@ -390,6 +414,29 @@ async function main() {
390
414
  state.cmdStateUpdate(cwd, args[2], args[3]);
391
415
  } else if (subcommand === 'get') {
392
416
  state.cmdStateGet(cwd, args[2], raw);
417
+ } else if (subcommand === 'init' || subcommand === 'section' || subcommand === 'quick-task' || subcommand === 'apply') {
418
+ // A7b: the wholesale and by-section writers of state.md.
419
+ const sw = require('./lib/state-write.cjs');
420
+ if (subcommand === 'init') {
421
+ sw.cmdStateInit(cwd, {
422
+ coreValue: getArgValue(args, '--core-value'), focus: getArgValue(args, '--focus'),
423
+ phase: getArgValue(args, '--phase'), phaseName: getArgValue(args, '--phase-name'),
424
+ totalPhases: getArgValue(args, '--total-phases'), status: getArgValue(args, '--status'),
425
+ activity: getArgValue(args, '--activity'),
426
+ force: args.includes('--force'), keepContext: args.includes('--keep-context'),
427
+ }, raw);
428
+ } else if (subcommand === 'section') {
429
+ sw.cmdStateSection(cwd, args[2] && !args[2].startsWith('--') ? args[2] : null, {
430
+ append: getArgValue(args, '--append'), set: getArgValue(args, '--set'), under: getArgValue(args, '--under'),
431
+ }, raw);
432
+ } else if (subcommand === 'quick-task') {
433
+ sw.cmdStateQuickTask(cwd, {
434
+ description: getArgValue(args, '--description'), commit: getArgValue(args, '--commit'),
435
+ directory: getArgValue(args, '--directory'), status: getArgValue(args, '--status'), date: getArgValue(args, '--date'),
436
+ }, raw);
437
+ } else {
438
+ sw.cmdStateApply(cwd, getArgValue(args, '--json'), raw);
439
+ }
393
440
  } else if (subcommand === 'patch') {
394
441
  const patches = {};
395
442
  for (let i = 2; i < args.length; i += 2) {
@@ -446,7 +493,7 @@ async function main() {
446
493
  } else if (subcommand === 'load' || !subcommand) {
447
494
  state.cmdStateLoad(cwd, raw);
448
495
  } else {
449
- error(`Unknown state subcommand: ${subcommand}. Available: json, update, get, patch, compact, advance-plan, record-metric, update-progress, add-decision, add-blocker, resolve-blocker, record-session, load, snapshot`);
496
+ error(`Unknown state subcommand: ${subcommand}. Available: json, update, get, patch, init, section, quick-task, apply, compact, advance-plan, record-metric, update-progress, add-decision, add-blocker, resolve-blocker, record-session, load, snapshot`);
450
497
  }
451
498
  break;
452
499
  }
@@ -630,6 +677,24 @@ async function main() {
630
677
  break;
631
678
  }
632
679
 
680
+ case 'test': {
681
+ const subcommand = args[1];
682
+ if (subcommand === 'run') {
683
+ testGate.cmdTestRun(cwd, {
684
+ phase: getArgValue(args, '--phase'),
685
+ baseline: args.includes('--baseline'),
686
+ rebaseline: args.includes('--rebaseline'),
687
+ command: getArgValue(args, '--command'),
688
+ timeout: getArgValue(args, '--timeout'),
689
+ }, raw);
690
+ } else if (subcommand === 'detect') {
691
+ testGate.cmdTestDetect(cwd, raw);
692
+ } else {
693
+ error('Unknown test subcommand. Available: run, detect');
694
+ }
695
+ break;
696
+ }
697
+
633
698
  case 'verify': {
634
699
  const subcommand = args[1];
635
700
  if (subcommand === 'plan-structure') {
@@ -656,8 +721,31 @@ async function main() {
656
721
  verifyPlanSet.cmdVerifyPlanSet(cwd, args[2], raw);
657
722
  } else if (subcommand === 'test-integrity') {
658
723
  verifyIntegrity.cmdVerifyTestIntegrity(cwd, args[2], raw);
724
+ } else if (subcommand === 'red') {
725
+ verifyRed.cmdVerifyRed(cwd, args[2], raw, { timeout: getArgValue(args, '--timeout') });
726
+ } else if (subcommand === 'review-focus') {
727
+ require('./lib/plan-lint.cjs').cmdVerifyReviewFocus(cwd, args[2], raw);
728
+ } else if (subcommand === 'decisions') {
729
+ require('./lib/plan-lint.cjs').cmdVerifyDecisions(cwd, args[2], raw);
730
+ } else if (subcommand === 'gates') {
731
+ require('./lib/plan-lint.cjs').cmdVerifyGates(cwd, args[2], raw);
732
+ } else if (subcommand === 'requirements') {
733
+ require('./lib/requirements-lint.cjs').cmdVerifyRequirements(cwd, raw);
734
+ } else if (subcommand === 'traceability') {
735
+ const named = args.slice(2).filter((a) => !a.startsWith('--'));
736
+ const ids = named.filter((a) => /^[A-Z][A-Z0-9]*-\d+$/.test(a));
737
+ // A misspelt id (auth-01) must not silently trace every requirement instead.
738
+ if (ids.length < named.length) error(`verify traceability: not a requirement id: ${named.filter((a) => !ids.includes(a)).join(', ')} (expected e.g. AUTH-01)`);
739
+ require('./lib/requirements-lint.cjs').cmdVerifyTrace(cwd, ids, raw);
740
+ } else if (subcommand === 'mutate') {
741
+ mutate.cmdVerifyMutate(cwd, {
742
+ phase: getArgValue(args, '--phase') || (args[2] && !args[2].startsWith('--') ? args[2] : null),
743
+ max: getArgValue(args, '--max'),
744
+ seed: getArgValue(args, '--seed'),
745
+ timeout: getArgValue(args, '--timeout'),
746
+ }, raw);
659
747
  } else {
660
- error('Unknown verify subcommand. Available: plan-structure, phase-completeness, references, commits, artifacts, key-links, reconcile, stubs, scope, stale, plan-set, test-integrity');
748
+ error('Unknown verify subcommand. Available: plan-structure, phase-completeness, references, commits, artifacts, key-links, reconcile, stubs, scope, stale, plan-set, test-integrity, red, mutate, review-focus, decisions, gates, requirements, traceability');
661
749
  }
662
750
  break;
663
751
  }
@@ -769,7 +857,7 @@ async function main() {
769
857
  } else if (subcommand === 'remove') {
770
858
  if (!args[2]) error('phase remove requires a phase number');
771
859
  const forceFlag = args.includes('--force');
772
- phase.cmdPhaseRemove(cwd, args[2], { force: forceFlag }, raw);
860
+ phase.cmdPhaseRemove(cwd, args[2], { force: forceFlag, withDecimals: args.includes('--with-decimals') }, raw);
773
861
  } else if (subcommand === 'complete') {
774
862
  if (!args[2]) error('phase complete requires a phase number');
775
863
  const noCommit = args.includes('--no-commit');
@@ -815,7 +903,7 @@ async function main() {
815
903
  const fullFlag = args.includes('--full');
816
904
  const driftFlag = args.includes('--drift');
817
905
  const linksFlag = args.includes('--links');
818
- verify.cmdValidateHealth(cwd, { repair: repairFlag, standards: standardsFlag, full: fullFlag, drift: driftFlag, links: linksFlag }, raw);
906
+ verify.cmdValidateHealth(cwd, { repair: repairFlag, standards: standardsFlag, full: fullFlag, drift: driftFlag, links: linksFlag, only: (getArgValue(args, '--only') || '').split(',').map((s) => s.trim()).filter(Boolean) }, raw);
819
907
  } else if (subcommand === 'deployment') {
820
908
  verify.cmdValidateDeployment(cwd, raw);
821
909
  } else {
@@ -824,6 +912,68 @@ async function main() {
824
912
  break;
825
913
  }
826
914
 
915
+ case 'autodev': {
916
+ // A1: the deterministic outer loop — a fresh host session per unit, stops in code.
917
+ require('./lib/autodev.cjs').cmdAutodev(cwd, args[1], {
918
+ host: getArgValue(args, '--host'), maxUsd: getArgValue(args, '--max-usd'), maxUsdDay: getArgValue(args, '--max-usd-day'),
919
+ maxTurns: getArgValue(args, '--max-turns'), run: getArgValue(args, '--run'), worktrees: args.includes('--worktrees'), quality: args.includes('--quality'),
920
+ ci: args.includes('--ci') ? (getArgValue(args, '--ci') === 'local' ? 'local' : 'pr') : false, ciRounds: getArgValue(args, '--ci-rounds'), ciPush: args.includes('--ci-push'), ciBase: getArgValue(args, '--ci-base'),
921
+ }, raw);
922
+ break;
923
+ }
924
+
925
+ case 'next-action': {
926
+ require('./lib/next-action.cjs').cmdNextAction(cwd, raw);
927
+ break;
928
+ }
929
+
930
+ case 'size': {
931
+ // Right-sized ceremony: lean or full for a phase or a quick task (sizing.cjs).
932
+ const S = require('./lib/sizing.cjs');
933
+ const subcommand = args[1];
934
+ const opts = { quality: args.includes('--quality'), full: args.includes('--full') };
935
+ if (subcommand === 'phase') {
936
+ if (!args[2] || args[2].startsWith('--')) error('Usage: size phase <N> [--quality] [--full]');
937
+ const r = S.sizePhase(cwd, args[2], opts);
938
+ output(r, raw, r.path);
939
+ } else if (subcommand === 'task') {
940
+ // --file <path>: size a document (new-project's idea or brief) instead of a description.
941
+ const file = getArgValue(args, '--file');
942
+ const text = file ? fs.readFileSync(require('path').resolve(cwd, file), 'utf8') : args.slice(2).filter((a) => a !== '--quality' && a !== '--full').join(' ');
943
+ if (!text.trim()) error('Usage: size task "<description>" | --file <path> [--quality] [--full]');
944
+ const r = S.sizeTask(cwd, text, opts);
945
+ output(r, raw, r.path);
946
+ } else if (subcommand === 'phase-plan') {
947
+ // size phase-plan <N>: the lean phase's plan, checked and recorded, with no planner.
948
+ if (!args[2] || args[2].startsWith('--')) error('Usage: size phase-plan <N> [--quality] [--full]');
949
+ const r = S.planLeanPhase(cwd, args[2], opts);
950
+ output(r, raw, r.ok ? r.path : (r.error || 'failed'), r.ok ? 0 : 1);
951
+ } else if (subcommand === 'quick-plan') {
952
+ // size quick-plan --out <file> --num <N> "<description>": the lean quick task's plan.
953
+ const out = getArgValue(args, '--out');
954
+ const num = getArgValue(args, '--num');
955
+ const skip = new Set(['--out', out, '--num', num]);
956
+ const text = args.slice(2).filter((a) => !skip.has(a)).join(' ');
957
+ if (!out || !text.trim()) error('Usage: size quick-plan --out <file> [--num N] "<description>"');
958
+ const outPath = require('path').resolve(cwd, out);
959
+ fs.mkdirSync(require('path').dirname(outPath), { recursive: true });
960
+ fs.writeFileSync(outPath, S.leanQuickPlan(cwd, text, num));
961
+ output({ written: true, path: out }, raw, out);
962
+ } else if (subcommand === 'plan-check') {
963
+ if (!args[2] || args[2].startsWith('--')) error('Usage: size plan-check <N>');
964
+ const r = S.engineCheckPlans(cwd, args[2]);
965
+ if (r.ok) {
966
+ const rec = S.recordEngineCheck(cwd, args[2], r);
967
+ r.recorded = !rec.error;
968
+ if (rec.error) r.record_error = rec.reason || rec.error;
969
+ }
970
+ output(r, raw, r.ok ? 'passed' : 'failed', r.ok && r.recorded ? 0 : 1);
971
+ } else {
972
+ error('Unknown size subcommand. Available: phase, task, phase-plan, quick-plan, plan-check');
973
+ }
974
+ break;
975
+ }
976
+
827
977
  case 'progress': {
828
978
  const subcommand = args[1] || 'json';
829
979
  commands.cmdProgressRender(cwd, subcommand, raw);
@@ -980,7 +1130,7 @@ async function main() {
980
1130
  break;
981
1131
  }
982
1132
  if (batch.error) {
983
- // The newest batch is the one /pan:focus-exec runs; classifying another would
1133
+ // The newest batch is the one /pan:focus-auto --step exec runs; classifying another would
984
1134
  // hand it waves for the wrong items, so an unusable newest batch is an error.
985
1135
  output({ error: batch.error }, raw);
986
1136
  break;
@@ -1140,23 +1290,6 @@ async function main() {
1140
1290
  break;
1141
1291
  }
1142
1292
 
1143
- case 'bridge': {
1144
- const subcommand = args[1];
1145
- if (subcommand === 'list') {
1146
- bridge.cmdBridgeList(cwd, raw);
1147
- } else if (subcommand === 'recommend') {
1148
- bridge.cmdBridgeRecommend(cwd, args[2], {
1149
- max_recommendations: Number(getArgValue(args, '--max') || 10),
1150
- min_score: Number(getArgValue(args, '--min-score') || 1),
1151
- }, raw);
1152
- } else if (subcommand === 'cache') {
1153
- bridge.cmdBridgeCache(cwd, getArgValue(args, '--servers'), getArgValue(args, '--runtime'), raw);
1154
- } else {
1155
- error('Unknown bridge subcommand. Available: list, recommend, cache');
1156
- }
1157
- break;
1158
- }
1159
-
1160
1293
  case 'whatif': {
1161
1294
  const subcommand = args[1];
1162
1295
  if (subcommand === 'prepare') {
@@ -1257,6 +1390,89 @@ async function main() {
1257
1390
  break;
1258
1391
  }
1259
1392
 
1393
+ case 'review': {
1394
+ // Program R1: the diff a reviewer reads, with the plans' intent beside it.
1395
+ const subcommand = args[1];
1396
+ if (subcommand === 'scope') {
1397
+ verifyScope.cmdReviewScope(cwd, args[2], raw);
1398
+ } else if (subcommand === 'vote') {
1399
+ // R2: merge k reviewer passes; a finding survives only with a quorum of votes.
1400
+ const valued = new Set(['--phase', '--quorum', '--out']);
1401
+ const files = args.slice(2).filter((a, i, all) => !a.startsWith('--') && !valued.has(all[i - 1]));
1402
+ require('./lib/review-vote.cjs').cmdReviewVote(cwd, { files, phase: getArgValue(args, '--phase'), quorum: getArgValue(args, '--quorum'), out: getArgValue(args, '--out') }, raw);
1403
+ } else if (subcommand === 'cross-family') {
1404
+ // R4: the review on another host's CLI, read-only; off unless the project opts in.
1405
+ require('./lib/cross-family.cjs').cmdReviewCrossFamily(cwd, args[2], {
1406
+ host: getArgValue(args, '--host'), reps: getArgValue(args, '--reps'), dryRun: args.includes('--dry-run'),
1407
+ }, raw);
1408
+ } else {
1409
+ error('Unknown review subcommand. Available: scope, vote, cross-family');
1410
+ }
1411
+ break;
1412
+ }
1413
+
1414
+ case 'merge': {
1415
+ // L6a: the human merge gate on the CLI; confirm runs only in a person's terminal.
1416
+ const subcommand = args[1];
1417
+ const M = require('./lib/merge.cjs');
1418
+ if (subcommand === 'request') {
1419
+ M.cmdMergeRequest(cwd, args[2], { phase: getArgValue(args, '--phase'), ciGreen: args.includes('--ci-green') }, raw);
1420
+ } else if (subcommand === 'confirm') {
1421
+ M.cmdMergeConfirm(cwd, args[2], raw);
1422
+ } else {
1423
+ error('Unknown merge subcommand. Available: request, confirm');
1424
+ }
1425
+ break;
1426
+ }
1427
+
1428
+ case 'uat': {
1429
+ // L8: UAT results recorded through the engine, so every runtime leaves the same uat.md.
1430
+ const subcommand = args[1];
1431
+ const U = require('./lib/uat.cjs');
1432
+ if (subcommand === 'record') {
1433
+ U.cmdUatRecord(cwd, args[2], { test: getArgValue(args, '--test'), result: getArgValue(args, '--result'), reported: getArgValue(args, '--reported'), severity: getArgValue(args, '--severity'), reason: getArgValue(args, '--reason') }, raw);
1434
+ } else if (subcommand === 'status') {
1435
+ U.cmdUatStatus(cwd, args[2], raw);
1436
+ } else {
1437
+ error('Unknown uat subcommand. Available: record, status');
1438
+ }
1439
+ break;
1440
+ }
1441
+
1442
+ case 'debug': {
1443
+ // P5: a debug session's reproduction as the closing check, and the resolved case base.
1444
+ const subcommand = args[1];
1445
+ const D = require('./lib/debug-cases.cjs');
1446
+ if (subcommand === 'repro') {
1447
+ D.cmdDebugRepro(cwd, args[2], raw, { timeout: getArgValue(args, '--timeout') });
1448
+ } else if (subcommand === 'similar') {
1449
+ D.cmdDebugSimilar(cwd, args[2], raw, { limit: getArgValue(args, '--limit') });
1450
+ } else {
1451
+ error('Unknown debug subcommand. Available: repro, similar');
1452
+ }
1453
+ break;
1454
+ }
1455
+
1456
+ case 'usage': {
1457
+ // Program L9: which installed commands and agents this project used, from its own files.
1458
+ require('./lib/usage.cjs').cmdUsage(cwd, raw);
1459
+ break;
1460
+ }
1461
+
1462
+ case 'research': {
1463
+ // Program P3: research claims carry a source and a checked date.
1464
+ const subcommand = args[1];
1465
+ if (subcommand === 'lint') {
1466
+ require('./lib/research-lint.cjs').cmdResearchLint(cwd, args[2], { now: getArgValue(args, '--now') }, raw);
1467
+ } else if (subcommand === 'check') {
1468
+ // Research answers at most five blocking questions, each with a source or an assumption.
1469
+ require('./lib/research-lint.cjs').cmdResearchCheck(cwd, args[2], args[3], { market: args.includes('--market') }, raw);
1470
+ } else {
1471
+ error('Unknown research subcommand. Available: lint, check');
1472
+ }
1473
+ break;
1474
+ }
1475
+
1260
1476
  case 'review-deep': {
1261
1477
  const subcommand = args[1];
1262
1478
  const phaseNum = args[2];
@@ -1264,6 +1480,7 @@ async function main() {
1264
1480
  reviewerFile: getArgValue(args, '--reviewer-file'),
1265
1481
  hardenerFile: getArgValue(args, '--hardener-file'),
1266
1482
  metaFile: getArgValue(args, '--meta-file'),
1483
+ crossFile: getArgValue(args, '--cross-file'),
1267
1484
  };
1268
1485
  if (subcommand === 'merge') {
1269
1486
  reviewDeep.cmdReviewDeepMerge(cwd, phaseNum, opts, raw);
@@ -1307,8 +1524,12 @@ async function main() {
1307
1524
  }, raw);
1308
1525
  } else if (subcommand === 'debt') {
1309
1526
  findings.cmdFindingsDebt(cwd, { milestone: filters.milestone }, raw);
1527
+ } else if (subcommand === 'suppressions') {
1528
+ findings.cmdFindingsSuppressions(cwd, { phase: filters.phase, agent: filters.agent }, raw);
1529
+ } else if (subcommand === 'prove') {
1530
+ findings.cmdFindingsProve(cwd, { id: findings.findingIdsIn(args.slice(2))[0], test: getArgValue(args, '--test'), timeout: getArgValue(args, '--timeout') }, raw);
1310
1531
  } else {
1311
- error('Unknown findings subcommand. Available: record, list, dispose, debt');
1532
+ error('Unknown findings subcommand. Available: record, list, dispose, debt, suppressions, prove');
1312
1533
  }
1313
1534
  break;
1314
1535
  }
@@ -1359,8 +1580,10 @@ async function main() {
1359
1580
  }, raw);
1360
1581
  } else if (subcommand === 'limits') {
1361
1582
  cost.cmdCostLimits(cwd, raw);
1583
+ } else if (subcommand === 'budget') {
1584
+ cost.cmdCostBudget(cwd, getArgValue(args, '--phase') || (args[2] && !args[2].startsWith('--') ? args[2] : null), raw);
1362
1585
  } else {
1363
- error('Unknown cost subcommand. Available: report, append, clear, rebuild, limits');
1586
+ error('Unknown cost subcommand. Available: report, append, clear, rebuild, limits, budget');
1364
1587
  }
1365
1588
  break;
1366
1589
  }
@@ -1399,8 +1622,14 @@ async function main() {
1399
1622
  worktree.cmdWorktreeRemove(cwd, args[2], getArgValue(args, '--branch'), raw, { force: args.includes('--force') });
1400
1623
  } else if (subcommand === 'cleanup') {
1401
1624
  worktree.cmdWorktreeCleanup(cwd, raw, { force: args.includes('--force') });
1625
+ } else if (subcommand === 'preflight') {
1626
+ // A3: shadow-merge branches onto the base in a throwaway worktree and run the oracle.
1627
+ worktree.cmdWorktreePreflight(cwd, {
1628
+ base: getArgValue(args, '--base'), test: getArgValue(args, '--test'),
1629
+ branches: String(getArgValue(args, '--branches') || '').split(',').map((b) => b.trim()).filter(Boolean),
1630
+ }, raw);
1402
1631
  } else {
1403
- error('Unknown worktree subcommand. Available: list, create, remove, cleanup');
1632
+ error('Unknown worktree subcommand. Available: list, create, remove, cleanup, preflight');
1404
1633
  }
1405
1634
  break;
1406
1635
  }
@@ -79,7 +79,7 @@ patterns:
79
79
 
80
80
  ## P-360 — Campaign telemetry must be both captured and trustworthy
81
81
 
82
- **Evidence:** Three production projects showed campaign telemetry failing in *both* directions. (1) **Absent** — a full 5-mission army campaign (the compliance project v1.1) produced **zero** cost/trace/bus records, although the hooks were installed, registered on `SubagentStop`, and verified working in isolation; a main-loop coordinator's work never fired `SubagentStop`, so nothing was captured. (2) **Corrupted** — two projects that *did* capture (a weeks-long focus-auto loop and a phase-exec project) logged physically-impossible figures: a single subagent record claiming billions of cache-read tokens, cache-hit pinned at 100%, and many byte-identical rows. Root cause: the transcript fallback summed `usage` across *every* assistant message in a transcript whose `session_id` is shared by all subagents — so each event re-summed the whole growing transcript, and `cache_read` (re-read every turn) multiplied by the turn count. Either way the HUD, `/pan:cost`, and `/pan:optimize` consumed nothing usable.
82
+ **Evidence:** Three production projects showed campaign telemetry failing in *both* directions. (1) **Absent** — a full 5-mission army campaign (the compliance project v1.1) produced **zero** cost/trace/bus records, although the hooks were installed, registered on `SubagentStop`, and verified working in isolation; a main-loop coordinator's work never fired `SubagentStop`, so nothing was captured. (2) **Corrupted** — two projects that *did* capture (a weeks-long focus-auto loop and a phase-exec project) logged physically-impossible figures: a single subagent record claiming billions of cache-read tokens, cache-hit pinned at 100%, and many byte-identical rows. Root cause: the transcript fallback summed `usage` across *every* assistant message in a transcript whose `session_id` is shared by all subagents — so each event re-summed the whole growing transcript, and `cache_read` (re-read every turn) multiplied by the turn count. Either way the HUD, `/pan:cost`, and `/pan:learn --optimize` consumed nothing usable.
83
83
 
84
84
  **Rule:** For any long-running, multi-step autonomous campaign, telemetry must survive the spawn pattern *and* be numerically sane:
85
85
 
@@ -89,4 +89,4 @@ patterns:
89
89
  4. **Sanity-check before you trust the number.** A cache-hit pinned at 100%, or cache-read far exceeding input, is a miscount — not a triumph. Cap or flag implausible records instead of aggregating them.
90
90
  5. **Preflight a telemetry probe** at campaign start (write then read one record); treat empty *or* absurd telemetry as a defect, not a quiet state.
91
91
 
92
- **Applies in:** `/pan:army` Phase 0 + Learn step, `pan-conductor` campaign mode, `hooks/pan-cost-logger.js` + `pan-trace-logger.js`, the HUD telemetry panels, `/pan:cost`, `/pan:optimize`.
92
+ **Applies in:** `/pan:army` Phase 0 + Learn step, `pan-conductor` campaign mode, `hooks/pan-cost-logger.js` + `pan-trace-logger.js`, the HUD telemetry panels, `/pan:cost`, `/pan:learn --optimize`.
@@ -101,7 +101,10 @@ function normalizeStatus(status) {
101
101
  function isPhaseOpen(phase) {
102
102
  if (!phase || typeof phase !== 'object') return false;
103
103
  const status = normalizeStatus(phase.status);
104
- if (status !== COMPLETE_STATUS) return true;
104
+ // The legacy `verified` alias stands for complete-and-verified: once merged, that phase
105
+ // is finished too. Without this a caller sending it got request_merge on every cycle,
106
+ // for a phase already merged (found by H7's nextAction fuzz).
107
+ if (status !== COMPLETE_STATUS) return !(PHASE_NEXT[status] === 'request_merge' && phase.merged === true);
105
108
  // Complete on disk, but the run facts decide whether it is actually finished.
106
109
  return !(phase.verified === true && phase.merged === true);
107
110
  }
@@ -99,7 +99,7 @@ Add note that this is the last plan and what comes after:
99
99
 
100
100
  **Also available:**
101
101
  - `/pan:discuss-phase 2` — gather context first
102
- - `/pan:research-phase 2` — investigate unknowns
102
+ - `/pan:plan-phase --research-only 2` — investigate unknowns
103
103
  - Review roadmap
104
104
 
105
105
  ---
@@ -128,7 +128,7 @@ Show completion status before next action:
128
128
 
129
129
  **Also available:**
130
130
  - `/pan:discuss-phase 3` — gather context first
131
- - `/pan:research-phase 3` — investigate unknowns
131
+ - `/pan:plan-phase --research-only 3` — investigate unknowns
132
132
  - Review what Phase 2 built
133
133
 
134
134
  ---
@@ -149,7 +149,7 @@ When there's no clear primary action:
149
149
 
150
150
  **To discuss context first:** `/pan:discuss-phase 3`
151
151
 
152
- **To research unknowns:** `/pan:research-phase 3`
152
+ **To research unknowns:** `/pan:plan-phase --research-only 3`
153
153
 
154
154
  <sub>`/clear` first → fresh context window</sub>
155
155
 
@@ -52,7 +52,7 @@ ordered; a tier makes a contiguous prefix (plus its named additions) mandatory.
52
52
  - **Components & boundaries** — what modules are added/touched; confirm the design honors the discovered boundaries (no layer violations).
53
53
  - **Interface contract** — exact invocation + input/output schema + status/exit codes, per project convention.
54
54
  - **State & filesystem scope** — reads from / writes to (must stay within project root / `.planning/`), state mutations, side effects.
55
- - **Design decisions** — each significant decision: what was decided, why, alternatives rejected.
55
+ - **Design decisions** — each decision that passes the three-question test (hard to reverse, a reasonable engineer could choose otherwise, more than one task depends on it): its id (`DD-N`, which plans cite), what was decided, why, alternatives rejected.
56
56
 
57
57
  ### 4. ADR (`phase`+)
58
58
  - A right-sized Architecture Decision Record: Status · Date · Context (problem, forces, current state, requirements traceability) · Decision (summary + numbered sub-decisions with rationale + integration) · Consequences (positive **and** negative, every negative with a mitigation or explicit acceptance).
@@ -11,7 +11,7 @@ phase — context compaction may have dropped earlier sections.
11
11
  |----------|--------------|----------------|
12
12
  | "User's request is clear, no need to clarify" | You're guessing at intent. Phase 0 catches misunderstandings before scaffolding. | Run the Phase 0 clarification check (see `new-project.md` / `plan-phase.md`). |
13
13
  | "Phase tests passed locally, /pan:verify-phase isn't needed" | One run isn't validation. verify-phase checks the phase goal against the code (must-haves, artifacts, wiring, requirements, anti-patterns) and runs the full test suite — not just the phase's own tests. | Always run `/pan:verify-phase` before marking a phase complete. |
14
- | "I'll skip /pan:focus-scan and pick the next item myself" | Manual selection ignores priority/budget logic in `focus.cjs`. You'll bias toward easy items and miss higher-priority work. | Use `/pan:focus-scan` → `/pan:focus-plan` → `/pan:focus-exec`. |
14
+ | "I'll skip /pan:focus-auto --step scan and pick the next item myself" | Manual selection ignores priority/budget logic in `focus.cjs`. You'll bias toward easy items and miss higher-priority work. | Use `/pan:focus-auto --step scan` → `/pan:focus-auto --step plan` → `/pan:focus-auto --step exec`. |
15
15
  | "I'll bump the model / add a flag / refactor while I'm here" | Scope creep. The user asked for one change; surrounding cleanup belongs in a separate item. | Do only the requested change. Note unrelated cleanup as a TODO for a future focus-scan. |
16
16
  | "I'll mark this phase complete; the docs can lag behind" | Doc/state drift compounds. By the next session, the agent reads stale docs and proceeds on false assumptions. | Run the doc-sync step (update CHANGELOG/state and commit via `pan-tools commit`) before phase completion. CHANGELOG and version bumps are part of the phase, not after it. |
17
17
  | "The tests pass, so the code is portable" | Tests run on one Node version on one OS. Modern Node auto-detects ESM syntax, so `import`/`export` in a project with no `package.json` passes locally and fails under `"type": "commonjs"` or older Node. | Declare the module type explicitly whenever you emit `import`/`export` or `require` — `"type"` in `package.json`, or `.mjs`/`.cjs` extensions. Never rely on syntax detection. |
@@ -83,7 +83,7 @@ Lives in `summary.md`, after `## Files Created/Modified`:
83
83
  - DT-1: Chose <option> for O-N. Reason: <rationale>.
84
84
 
85
85
  ### Deviations (from plan; must explain)
86
- - DV-1: Plan said <X>; I did <Y>. Reason: <rationale>. Verification: <how I confirmed Y is acceptable>.
86
+ - DV-1: Plan said <X>; I did <Y>. Reason: <rationale>. Verification: <how I confirmed Y is acceptable>. Cost if wrong: <low | medium | high> — <what breaks if this call was wrong>.
87
87
 
88
88
  ### Open questions for verifier
89
89
  - Q-1: <question>. Why it matters: <stake>.
@@ -65,7 +65,6 @@ Since the 2026-07 **COST RESET**, `quality` and `balanced` are identical — bot
65
65
  | pan-executor | reasoning | reasoning | mid |
66
66
  | pan-phase-researcher | reasoning | reasoning | fast |
67
67
  | pan-project-researcher | reasoning | reasoning | fast |
68
- | pan-research-synthesizer | reasoning | reasoning | fast |
69
68
  | pan-debugger | reasoning | reasoning | mid |
70
69
  | pan-document_code | reasoning | reasoning | fast |
71
70
  | pan-verifier | reasoning | reasoning | fast |
@@ -96,7 +95,7 @@ Relative cost per tier (fast = 1× baseline):
96
95
  | mid | 3× |
97
96
  | fast | 1× |
98
97
 
99
- Use `/pan:profile <profile>` to see estimated cost differences before switching.
98
+ Use `/pan:settings --profile <profile>` to see estimated cost differences before switching.
100
99
 
101
100
  ---
102
101
 
@@ -242,7 +241,7 @@ Full routing config in `.planning/config.json`:
242
241
 
243
242
  ## Switching Profiles
244
243
 
245
- Runtime: `/pan:profile <profile>`
244
+ Runtime: `/pan:settings --profile <profile>`
246
245
 
247
246
  ### Downgrade Confirmation
248
247
 
@@ -142,4 +142,28 @@ Loop until "Create project.md" selected.
142
142
 
143
143
  </anti_patterns>
144
144
 
145
+ <clarification_taxonomy>
146
+
147
+ Before asking anything, scan the idea or the phase against these categories and note where it is ambiguous: where two reasonable readings would build different things. A category with no ambiguity needs no question.
148
+
149
+ - **Scope**: what is in, what is explicitly out, where this ends
150
+ - **Users** and roles: who acts, with what permissions, how many of them
151
+ - **Behaviour** and flows: the main path, its order, what triggers it
152
+ - **Data** and state: what is stored, its shape, its lifetime, who owns it
153
+ - **Interfaces**: other systems, files, APIs and formats this touches
154
+ - **Errors and edge cases**: empty, missing, duplicate, too large, offline, concurrent
155
+ - **Non-functional**: speed, scale, security, accessibility, cost
156
+ - **Constraints**: stack, platform, deadlines, compliance, what must not change
157
+ - **Done**: how the user will know it works; what they would check first
158
+
159
+ </clarification_taxonomy>
160
+
161
+ <question_budget>
162
+
163
+ Ask at most five clarifying questions in one questioning session (a new-project round, or one discuss-phase). Rank the ambiguities by impact × uncertainty: how much the build would differ between readings, times how unsure you are which reading the user means. Ask the top ones, one question per call unless two are independent and short.
164
+
165
+ Everything you did not ask about is recorded, never silently guessed. Write it into the document you produce as a line the user can correct: `Assumed: <the reading you chose> (<category>)`. A wrong assumption in writing costs the user one correction; a wrong guess in code costs a rework.
166
+
167
+ </question_budget>
168
+
145
169
  </questioning_guide>
@@ -86,13 +86,11 @@ Plans: 3/5 complete
86
86
  ```
87
87
  ◆ Spawning researcher...
88
88
 
89
- ◆ Spawning 4 researchers in parallel...
90
- → Stack research
91
- → Features research
92
- → Architecture research
93
- → Pitfalls research
89
+ ◆ Spawning 2 mappers in parallel...
90
+ → Tech mapper
91
+ → Architecture mapper
94
92
 
95
- ✓ Researcher complete: STACK.md written
93
+ ✓ Researcher complete: 3 questions answered
96
94
  ```
97
95
 
98
96
  ---
@@ -25,8 +25,9 @@ A judging agent ends its report with one fenced `pan-verdict` block. The block i
25
25
  | `phase` | when you know it | the phase number you were asked about, e.g. `"03"` |
26
26
  | `verdict` | yes | your own verdict word (table below) |
27
27
  | `outcome` | yes | `pass`, `fail` or `needs_human` |
28
- | `findings` | yes (may be empty) | a list of `{class, severity, where, summary}` |
28
+ | `findings` | yes (may be empty) | a list of `{class, severity, where, summary}`, plus `pre_existing: true` on a finding in code the change did not touch (recorded as deferred debt, never a blocker) |
29
29
  | `resolutions` | on a re-check | a list of `{id, status, evidence}` answering each earlier open finding you were given in `<open_findings>`: `status` is `resolved` (with `evidence`: what you checked and saw), `still_present` or `cannot_tell`. A finding you leave out stays open, and `resolved` without evidence is recorded as `cannot_tell` |
30
+ | `declined` | when you set a behaviour aside | a list of `{behaviour, reason}`: something in scope you chose not to judge (outside your lens, outside the diff, no way to run it). It is recorded on the verdict, so silence about it is never read as a pass |
30
31
  | `not_checked` | when a check could not run | a list of `{check, reason}`: a check you were asked to make and could not run, and why (no test script, no browser, a file you could not read). Never fold it into `pass`: a verdict with entries here says what it did not see |
31
32
 
32
33
  | Agent | `verdict` → `outcome` |
@@ -2,15 +2,23 @@
2
2
  "mode": "interactive",
3
3
  "depth": "standard",
4
4
  "workflow": {
5
- "research": true,
5
+ "research": false,
6
6
  "plan_check": true,
7
7
  "verifier": true,
8
8
  "auto_advance": false,
9
9
  "nyquist_validation": false,
10
10
  "phase_record_compact": false,
11
- "phase_gate": "warn",
11
+ "phase_gate": "enforce",
12
+ "mutation_gate": "report",
13
+ "mutation_floor": 0.6,
14
+ "review_mode": "single",
15
+ "cross_family_review": "off",
16
+ "worktree_isolation": false,
12
17
  "phase_reports": { "enabled": false, "open": false, "theme": "auto", "index": true }
13
18
  },
19
+ "cost": {
20
+ "phase_budget_usd": 20
21
+ },
14
22
  "planning": {
15
23
  "commit_docs": true,
16
24
  "search_gitignored": false
@@ -37,6 +37,7 @@ started: [when it broke / always broken]
37
37
  command: [one command you have RUN that fails on the reported symptom, or "none"]
38
38
  fails_with: [the output that shows the symptom, secrets redacted]
39
39
  deterministic: [yes / rate N of M runs for a flaky bug]
40
+ requirement: [the requirement or UAT truth this reproduces, e.g. REQ-4, when there is one]
40
41
  tried: [only when command is "none": what you tried and why it cannot be built]
41
42
 
42
43
  ## Eliminated