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.
- package/CHANGELOG.md +3645 -0
- package/README.md +46 -52
- package/agents/pan-conductor.md +2 -3
- package/agents/pan-counterfactual.md +1 -2
- package/agents/pan-debugger.md +14 -3
- package/agents/pan-design-checker.md +1 -2
- package/agents/pan-designer.md +2 -3
- package/agents/pan-document_code.md +1 -2
- package/agents/pan-executor.md +25 -0
- package/agents/pan-hardener.md +4 -3
- package/agents/pan-integration-checker.md +1 -2
- package/agents/pan-knowledge.md +1 -2
- package/agents/pan-meta-reviewer.md +3 -3
- package/agents/pan-optimizer.md +4 -4
- package/agents/pan-phase-researcher.md +80 -475
- package/agents/pan-plan-checker.md +40 -3
- package/agents/pan-planner.md +21 -7
- package/agents/pan-previewer.md +3 -2
- package/agents/pan-project-researcher.md +72 -493
- package/agents/pan-release.md +1 -1
- package/agents/pan-reviewer.md +14 -3
- package/agents/pan-roadmapper.md +12 -7
- package/agents/pan-verifier.md +9 -4
- package/bin/install-lib.cjs +134 -14
- package/bin/install.js +59 -12
- package/commands/pan/army.md +1 -1
- package/commands/pan/autodev.md +76 -0
- package/commands/pan/cost.md +21 -1
- package/commands/pan/exec-phase.md +3 -4
- package/commands/pan/focus-auto.md +14 -7
- package/commands/pan/focus-design.md +4 -5
- package/commands/pan/focus-docs.md +24 -0
- package/commands/pan/learn.md +13 -6
- package/commands/pan/milestone-audit.md +8 -1
- package/commands/pan/milestone-done.md +10 -5
- package/commands/pan/milestone-new.md +2 -2
- package/commands/pan/new-project.md +15 -12
- package/commands/pan/plan-phase.md +15 -9
- package/commands/pan/preview.md +1 -1
- package/commands/pan/quick.md +1 -1
- package/commands/pan/review-deep.md +11 -5
- package/commands/pan/settings.md +6 -0
- package/commands/pan/verify-phase.md +6 -2
- package/docs/AGENTS.md +917 -0
- package/docs/ARCHITECTURE.md +1054 -0
- package/docs/CLI-REFERENCE.md +4582 -0
- package/docs/COMPARISON.md +116 -0
- package/docs/DEVELOPMENT.md +490 -0
- package/docs/ECOSYSTEM-REVIEW-2026-06.md +107 -0
- package/docs/ECOSYSTEM-REVIEW-2026-08.md +349 -0
- package/docs/EXAMPLES.md +584 -0
- package/docs/FAQ.md +254 -0
- package/docs/FIELD-HARVEST-2026-07.md +88 -0
- package/docs/FIELD-REPORT-army-2026-06.md +121 -0
- package/docs/HOOKS.md +638 -0
- package/docs/IMPROVEMENT-TODO.md +246 -0
- package/docs/INTERNALS.md +485 -0
- package/docs/MIGRATION-v2-to-v3.md +258 -0
- package/docs/SECURITY-HARDENING.md +230 -0
- package/docs/SKILLS-ENHANCEMENT-PLAN-V2.md +122 -0
- package/docs/SKILLS-FULL-TEXT.md +9685 -0
- package/docs/SKILLS-REFERENCE.md +1037 -0
- package/docs/TROUBLESHOOTING.md +1084 -0
- package/docs/USER-GUIDE.md +1437 -0
- package/docs/archive/SKILLS-ENHANCEMENT-PLAN.md +230 -0
- package/docs/audits/AUDIT-2026-08-e2e-ROADMAP.md +117 -0
- package/docs/audits/AUDIT-2026-08-e2e-VERIFICATION.md +693 -0
- package/docs/audits/AUDIT-2026-08-e2e.md +1546 -0
- package/docs/audits/OUTSTANDING-2026-08.md +275 -0
- package/docs/audits/STABILITY-TEST-2026-08.md +640 -0
- package/docs/branding/README-brand-draft.md +119 -0
- package/docs/branding/handoff/IMPLEMENTATION.md +205 -0
- package/docs/branding/handoff/README-brand-draft.md +119 -0
- package/docs/branding/handoff/image-prompts.md +46 -0
- package/docs/branding/image-prompts.md +46 -0
- package/docs/branding/nano-banana-prompts.txt +60 -0
- package/docs/context-monitor.md +13 -0
- package/docs/decisions/ADR-0001-strategic-feature-prioritization.md +83 -0
- package/docs/decisions/ADR-0002-copilot-cli-runtime.md +71 -0
- package/docs/decisions/ADR-0003-smart-execution.md +84 -0
- package/docs/decisions/ADR-0004-copilot-cli-interaction.md +89 -0
- package/docs/decisions/ADR-0005-command-naming.md +80 -0
- package/docs/decisions/ADR-0006-focus-commands.md +101 -0
- package/docs/decisions/ADR-0007-ship-v1.md +73 -0
- package/docs/decisions/ADR-0008-map-codebase-mermaid-togaf.md +80 -0
- package/docs/decisions/ADR-0009-production-deployment-checklist.md +68 -0
- package/docs/decisions/ADR-0010-standards-integration.md +79 -0
- package/docs/decisions/ADR-0011-help-commands-rewrite.md +64 -0
- package/docs/decisions/ADR-0012-contributors-attribution-index.md +42 -0
- package/docs/decisions/ADR-0013-strategic-feature-additions.md +53 -0
- package/docs/decisions/ADR-0014-internal-cleanup-code-quality.md +53 -0
- package/docs/decisions/ADR-0015-focus-auto-runner.md +296 -0
- package/docs/decisions/ADR-0016-enhanced-doc-sync.md +54 -0
- package/docs/decisions/ADR-0017-enhanced-focus-design.md +69 -0
- package/docs/decisions/ADR-0018-user-reality-testing.md +84 -0
- package/docs/decisions/ADR-0019-end-to-end-user-acceptance-testing.md +113 -0
- package/docs/decisions/ADR-0020-ai-drift-prevention.md +55 -0
- package/docs/decisions/ADR-0021-codebase-mapper-v2.md +76 -0
- package/docs/decisions/ADR-0022-lifecycle-completeness.md +63 -0
- package/docs/decisions/ADR-0023-opus-4-7-adoption.md +89 -0
- package/docs/decisions/ADR-0024-spec-b-v2-completion.md +137 -0
- package/docs/decisions/ADR-0025-behavioral-guardrails-layer.md +129 -0
- package/docs/decisions/ADR-0026-self-improvement-loop.md +171 -0
- package/docs/decisions/ADR-0027-doc-code-link-graph.md +164 -0
- package/docs/decisions/ADR-0028-unified-agents-skills-target.md +46 -0
- package/docs/decisions/ADR-0029-experiment-evaluator.md +76 -0
- package/docs/decisions/ADR-0030-planning-concurrency.md +37 -0
- package/docs/decisions/ADR-0031-focus-auto-backlog-source.md +47 -0
- package/docs/decisions/ADR-0032-squad-model.md +64 -0
- package/docs/decisions/ADR-0033-army-campaign.md +40 -0
- package/docs/decisions/ADR-0034-scheduled-campaigns.md +57 -0
- package/docs/decisions/ADR-0035-army-hud-dashboard.md +40 -0
- package/docs/decisions/ADR-0036-agentic-memory-architecture.md +106 -0
- package/docs/decisions/ADR-0037-pin-security-agents-to-opus.md +51 -0
- package/docs/decisions/ADR-0038-skill-aligned-decomposition.md +41 -0
- package/docs/decisions/ADR-0039-worktree-as-project-variant.md +37 -0
- package/docs/decisions/ADR-0040-memory-injection-defense.md +55 -0
- package/docs/decisions/ADR-0041-mcp-dual-era-bridge.md +47 -0
- package/docs/decisions/ADR-0042-design-parity-both-flows.md +45 -0
- package/docs/decisions/ADR-0043-addressable-planning-roots.md +56 -0
- package/docs/decisions/ADR-0044-bound-the-cached-context.md +104 -0
- package/docs/decisions/ADR-0045-agent-plugins-bundle.md +76 -0
- package/docs/decisions/ADR-0046-subagent-frontmatter-decisions.md +39 -0
- package/docs/decisions/ADR-0047-pan-harness.md +76 -0
- package/docs/decisions/ADR-0048-one-core-per-project.md +43 -0
- package/docs/decisions/ADR-0049-machine-verdicts-and-findings-ledger.md +116 -0
- package/docs/specs/ai_drift_prevention_featureai.md +286 -0
- package/docs/specs/codebase_mapper_v2_featureai.md +930 -0
- package/docs/specs/command_naming_optimization_featureai.md +930 -0
- package/docs/specs/comp_analysis_markdown_v1.md +149 -0
- package/docs/specs/continuous_autonomous_execution_featureai.md +304 -0
- package/docs/specs/contributors_attribution_index_featureai.md +476 -0
- package/docs/specs/copilot_cli_interaction_featureai.md +868 -0
- package/docs/specs/copilot_cli_runtime_featureai.md +647 -0
- package/docs/specs/custom-skills-assessment.md +461 -0
- package/docs/specs/deployment_audit_findings_featureai.md +243 -0
- package/docs/specs/doc_code_link_graph_featureai.md +253 -0
- package/docs/specs/documentation_alignment_cleanup_featureai.md +69 -0
- package/docs/specs/e2e_visual_testing_featureai.md +615 -0
- package/docs/specs/end_to_end_user_acceptance_testing_featureai.md +810 -0
- package/docs/specs/evidence-loop-plan.md +76 -0
- package/docs/specs/evidence_loop_featureai.md +497 -0
- package/docs/specs/focus-auto-optimize-category.md +449 -0
- package/docs/specs/focus-auto-optimize-superplan.md +188 -0
- package/docs/specs/focus_auto_runner_featureai.md +1102 -0
- package/docs/specs/focus_design_v2_featureai.md +197 -0
- package/docs/specs/focus_sync_v2_featureai.md +202 -0
- package/docs/specs/git_integration_overhaul_featureai.md +326 -0
- package/docs/specs/glm_zai_provider_featureai.md +200 -0
- package/docs/specs/googlecli_adoption_featureai.md +661 -0
- package/docs/specs/help_commands_rewrite_featureai.md +860 -0
- package/docs/specs/industry_analysis_strategic_additions_featureai.md +231 -0
- package/docs/specs/industry_comparison_and_feature_gaps_featureai.md +674 -0
- package/docs/specs/internal_cleanup_code_quality_featureai.md +486 -0
- package/docs/specs/investigations/README.md +31 -0
- package/docs/specs/investigations/digests/2026-09-28.md +47 -0
- package/docs/specs/investigations/digests/2026-10-08.md +62 -0
- package/docs/specs/investigations/digests/2026-10-10.md +61 -0
- package/docs/specs/investigations/features/debugger-red-loop-first.md +55 -0
- package/docs/specs/investigations/features/harness-cross-host-behaviour.md +93 -0
- package/docs/specs/investigations/features/optimize-apply-regression-gate.md +66 -0
- package/docs/specs/investigations/features/reviewer-smell-baseline.md +57 -0
- package/docs/specs/investigations/features/trace-failure-capture.md +69 -0
- package/docs/specs/lifecycle_completeness_featureai.md +754 -0
- package/docs/specs/local-first-ci.md +42 -0
- package/docs/specs/map_codebase_mermaid_togaf_featureai.md +805 -0
- package/docs/specs/market-delta-2026-09-superplan.md +310 -0
- package/docs/specs/market-ideas-2026-09.md +131 -0
- package/docs/specs/market-ideas-2026-10.md +428 -0
- package/docs/specs/market-ideas-ledger.md +177 -0
- package/docs/specs/memory-optimization-2026-10.md +285 -0
- package/docs/specs/multi-track-planning-roots.md +143 -0
- package/docs/specs/multi_model_routing_featureai.md +687 -0
- package/docs/specs/multi_model_routing_superplan.md +197 -0
- package/docs/specs/opus_47_existing_enhancements_featureai.md +247 -0
- package/docs/specs/opus_47_extended_features_featureai.md +363 -0
- package/docs/specs/opus_47_extended_features_v2_featureai.md +397 -0
- package/docs/specs/pan_focus_commands_featureai.md +2336 -0
- package/docs/specs/pan_zcode_mcp_bridge_featureai.md +120 -0
- package/docs/specs/product-excellence-superplan.md +315 -0
- package/docs/specs/product_excellence_program_2026_q4_featureai.md +365 -0
- package/docs/specs/production_deployment_readiness_featureai.md +433 -0
- package/docs/specs/production_readiness_ship_v1_featureai.md +698 -0
- package/docs/specs/real_test_enforcement_featureai.md +213 -0
- package/docs/specs/reality-check-2026-09-superplan.md +362 -0
- package/docs/specs/right-sized-ceremony.md +74 -0
- package/docs/specs/roadmap_and_competition_2026_q4_featureai.md +390 -0
- package/docs/specs/self_improvement_loop_featureai.md +875 -0
- package/docs/specs/skill-aligned-decomposition.md +155 -0
- package/docs/specs/standards_integration_featureai.md +833 -0
- package/docs/specs/testing-system-redesign-2026-09.md +267 -0
- package/docs/specs/user_reality_testing_system_featureai.md +788 -0
- package/docs/specs/watch-triggers.json +22 -0
- package/docs/specs/workflow-integration-redesign.md +742 -0
- package/docs/specs/workflow_state_consistency_featureai.md +183 -0
- package/hooks/dist/pan-context-monitor.js +9 -2
- package/hooks/dist/pan-cost-logger.js +5 -0
- package/hooks/dist/pan-guard.js +28 -5
- package/hooks/dist/pan-stop-guard.js +9 -9
- package/hooks/dist/pan-trace-logger.js +5 -0
- package/package.json +10 -2
- package/pan-wizard-core/bin/lib/agents-md.cjs +57 -8
- package/pan-wizard-core/bin/lib/autodev-report.cjs +180 -0
- package/pan-wizard-core/bin/lib/autodev.cjs +642 -0
- package/pan-wizard-core/bin/lib/ci.cjs +143 -0
- package/pan-wizard-core/bin/lib/commands.cjs +1 -1
- package/pan-wizard-core/bin/lib/config.cjs +41 -5
- package/pan-wizard-core/bin/lib/constants.cjs +27 -1
- package/pan-wizard-core/bin/lib/core.cjs +31 -14
- package/pan-wizard-core/bin/lib/cost.cjs +160 -4
- package/pan-wizard-core/bin/lib/cross-family.cjs +164 -0
- package/pan-wizard-core/bin/lib/debug-cases.cjs +104 -0
- package/pan-wizard-core/bin/lib/doc-lint.cjs +5 -3
- package/pan-wizard-core/bin/lib/failure-class.cjs +81 -0
- package/pan-wizard-core/bin/lib/findings.cjs +148 -9
- package/pan-wizard-core/bin/lib/focus.cjs +1 -1
- package/pan-wizard-core/bin/lib/git.cjs +1 -1
- package/pan-wizard-core/bin/lib/hosts.cjs +88 -0
- package/pan-wizard-core/bin/lib/init.cjs +7 -2
- package/pan-wizard-core/bin/lib/knowledge.cjs +2 -0
- package/pan-wizard-core/bin/lib/merge.cjs +50 -0
- package/pan-wizard-core/bin/lib/mutate.cjs +268 -0
- package/pan-wizard-core/bin/lib/next-action.cjs +112 -0
- package/pan-wizard-core/bin/lib/optimize.cjs +2 -2
- package/pan-wizard-core/bin/lib/phase-gate.cjs +15 -9
- package/pan-wizard-core/bin/lib/phase-remove.cjs +91 -11
- package/pan-wizard-core/bin/lib/phase.cjs +85 -13
- package/pan-wizard-core/bin/lib/plan-lint.cjs +310 -0
- package/pan-wizard-core/bin/lib/preview.cjs +26 -4
- package/pan-wizard-core/bin/lib/requirements-lint.cjs +130 -0
- package/pan-wizard-core/bin/lib/research-lint.cjs +268 -0
- package/pan-wizard-core/bin/lib/review-deep.cjs +14 -22
- package/pan-wizard-core/bin/lib/review-vote.cjs +105 -0
- package/pan-wizard-core/bin/lib/roadmap.cjs +1 -0
- package/pan-wizard-core/bin/lib/runner.cjs +2 -16
- package/pan-wizard-core/bin/lib/sizing.cjs +356 -0
- package/pan-wizard-core/bin/lib/squads.cjs +1 -1
- package/pan-wizard-core/bin/lib/state-write.cjs +247 -0
- package/pan-wizard-core/bin/lib/test-gate.cjs +433 -0
- package/pan-wizard-core/bin/lib/uat.cjs +149 -0
- package/pan-wizard-core/bin/lib/usage.cjs +104 -0
- package/pan-wizard-core/bin/lib/verdict.cjs +26 -3
- package/pan-wizard-core/bin/lib/verify-plan-set.cjs +30 -1
- package/pan-wizard-core/bin/lib/verify-preflight.cjs +2 -2
- package/pan-wizard-core/bin/lib/verify-red.cjs +174 -0
- package/pan-wizard-core/bin/lib/verify-retro.cjs +3 -2
- package/pan-wizard-core/bin/lib/verify-scope.cjs +143 -2
- package/pan-wizard-core/bin/lib/verify.cjs +86 -31
- package/pan-wizard-core/bin/lib/worktree.cjs +70 -0
- package/pan-wizard-core/bin/pan-tools.cjs +257 -28
- package/pan-wizard-core/learnings/universal/autonomous-loop.md +2 -2
- package/pan-wizard-core/mcp/orchestrator.cjs +4 -1
- package/pan-wizard-core/references/continuation-format.md +3 -3
- package/pan-wizard-core/references/design-methodology.md +1 -1
- package/pan-wizard-core/references/guardrails.md +1 -1
- package/pan-wizard-core/references/handoff-decisions.md +1 -1
- package/pan-wizard-core/references/model-profiles.md +2 -3
- package/pan-wizard-core/references/questioning.md +24 -0
- package/pan-wizard-core/references/ui-brand.md +4 -6
- package/pan-wizard-core/references/verdict-contract.md +2 -1
- package/pan-wizard-core/templates/config.json +10 -2
- package/pan-wizard-core/templates/debug.md +1 -0
- package/pan-wizard-core/templates/design.md +5 -4
- package/pan-wizard-core/templates/discovery.md +2 -2
- package/pan-wizard-core/templates/phase-prompt.md +7 -0
- package/pan-wizard-core/templates/requirements.md +9 -0
- package/pan-wizard-core/templates/research.md +10 -0
- package/pan-wizard-core/templates/summary-complex.md +5 -1
- package/pan-wizard-core/templates/summary-minimal.md +4 -0
- package/pan-wizard-core/templates/summary-standard.md +5 -1
- package/pan-wizard-core/templates/summary.md +8 -1
- package/pan-wizard-core/workflows/add-phase.md +4 -6
- package/pan-wizard-core/workflows/assumptions.md +19 -1
- package/pan-wizard-core/workflows/diagnose-issues.md +2 -0
- package/pan-wizard-core/workflows/discuss-phase.md +4 -2
- package/pan-wizard-core/workflows/exec-lean.md +69 -0
- package/pan-wizard-core/workflows/exec-phase.md +79 -15
- package/pan-wizard-core/workflows/execute-plan.md +3 -1
- package/{commands/pan → pan-wizard-core/workflows}/focus-doc-audit.md +13 -29
- package/{commands/pan → pan-wizard-core/workflows}/focus-drift-walking.md +3 -18
- package/{commands/pan → pan-wizard-core/workflows}/focus-exec.md +8 -23
- package/{commands/pan → pan-wizard-core/workflows}/focus-plan.md +6 -20
- package/{commands/pan → pan-wizard-core/workflows}/focus-scan.md +3 -16
- package/{commands/pan → pan-wizard-core/workflows}/focus-sync.md +7 -21
- package/pan-wizard-core/workflows/health.md +6 -0
- package/pan-wizard-core/workflows/help.md +114 -77
- package/pan-wizard-core/workflows/insert-phase.md +4 -6
- package/pan-wizard-core/workflows/learn.md +3 -3
- package/pan-wizard-core/workflows/milestone-audit.md +2 -2
- package/pan-wizard-core/workflows/milestone-new.md +38 -95
- package/pan-wizard-core/workflows/new-project.md +96 -258
- package/pan-wizard-core/workflows/optimize.md +107 -5
- package/pan-wizard-core/workflows/phase-tests.md +10 -0
- package/pan-wizard-core/workflows/plan-phase.md +106 -45
- package/pan-wizard-core/workflows/profile.md +50 -0
- package/pan-wizard-core/workflows/progress.md +10 -0
- package/pan-wizard-core/workflows/quick.md +34 -43
- package/pan-wizard-core/workflows/remove-phase.md +11 -1
- package/pan-wizard-core/workflows/research-phase.md +118 -40
- package/pan-wizard-core/workflows/resume-project.md +18 -2
- package/pan-wizard-core/workflows/settings.md +33 -19
- package/pan-wizard-core/workflows/todo-check.md +6 -2
- package/pan-wizard-core/workflows/transition.md +22 -4
- package/pan-wizard-core/workflows/uat-walkthrough.md +90 -0
- package/pan-wizard-core/workflows/update.md +1 -1
- package/pan-wizard-core/workflows/verify-phase.md +39 -46
- package/scripts/build-agent-plugin.js +35 -15
- package/scripts/build-help.cjs +106 -0
- package/scripts/build-plugin.js +10 -1
- package/scripts/deprecate-old-versions.js +70 -3
- package/scripts/generate-skills-docs.py +1 -1
- package/scripts/git-hooks/pre-push +27 -0
- package/scripts/install-git-hooks.js +7 -5
- package/scripts/install-pre-push.cjs +38 -0
- package/scripts/land.cjs +151 -0
- package/scripts/local-ci.cjs +501 -0
- package/scripts/local-schedule.cjs +277 -0
- package/scripts/mutation-probe.cjs +7 -80
- package/scripts/prompt-lint.cjs +32 -0
- package/scripts/prompt-rules.cjs +156 -0
- package/scripts/run-tests.cjs +7 -1
- package/scripts/test-quality-lint.cjs +3 -3
- package/scripts/test-surface.cjs +175 -6
- package/agents/pan-research-synthesizer.md +0 -246
- package/commands/pan/audit-deployment.md +0 -386
- package/commands/pan/dashboard.md +0 -22
- package/commands/pan/discord.md +0 -19
- package/commands/pan/mcp-bridge.md +0 -143
- package/commands/pan/milestone-cleanup.md +0 -19
- package/commands/pan/milestone-gaps.md +0 -35
- package/commands/pan/optimize.md +0 -115
- package/commands/pan/profile.md +0 -76
- package/commands/pan/research-phase.md +0 -189
- package/pan-wizard-core/bin/lib/bridge.cjs +0 -269
- package/pan-wizard-core/templates/research-project/architecture.md +0 -204
- package/pan-wizard-core/templates/research-project/features.md +0 -147
- package/pan-wizard-core/templates/research-project/pitfalls.md +0 -200
- package/pan-wizard-core/templates/research-project/stack.md +0 -120
- 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]
|
|
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,
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
90
|
-
→
|
|
91
|
-
→
|
|
92
|
-
→ Architecture research
|
|
93
|
-
→ Pitfalls research
|
|
89
|
+
◆ Spawning 2 mappers in parallel...
|
|
90
|
+
→ Tech mapper
|
|
91
|
+
→ Architecture mapper
|
|
94
92
|
|
|
95
|
-
✓ Researcher complete:
|
|
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":
|
|
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": "
|
|
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
|