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
package/scripts/test-surface.cjs
CHANGED
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
* Modes:
|
|
20
20
|
* node scripts/test-surface.cjs summary
|
|
21
21
|
* node scripts/test-surface.cjs --write write tests/fixtures/surface.json (the committed registry)
|
|
22
|
-
* node scripts/test-surface.cjs --check exit 1 when the committed registry differs from the code
|
|
22
|
+
* node scripts/test-surface.cjs --check exit 1 when the committed registry differs from the code, or
|
|
23
|
+
* a command, agent, verb or config key has no user (liveness, L1)
|
|
24
|
+
* node scripts/test-surface.cjs --liveness who uses each command, agent, verb, subcommand and config key
|
|
23
25
|
* node scripts/test-surface.cjs --map which test files reference each surface row; lists the misses
|
|
24
26
|
* node scripts/test-surface.cjs --scaffold <dir> one todo stub per unreferenced row (for a suite rebuilt from scratch)
|
|
25
27
|
*
|
|
@@ -297,6 +299,153 @@ function scaffold(missingRows, outDir) {
|
|
|
297
299
|
|
|
298
300
|
function readJson(p) { return JSON.parse(fs.readFileSync(p, 'utf8')); }
|
|
299
301
|
|
|
302
|
+
// ─── Liveness (program L1) ──────────────────────────────────────────────────
|
|
303
|
+
//
|
|
304
|
+
// The map above asks "does a test name it?". Liveness asks "does anything USE it?":
|
|
305
|
+
// - every shipped command and agent is named by a harness scenario, so some behavioural
|
|
306
|
+
// run exercises it as a user would;
|
|
307
|
+
// - every pan-tools verb and subcommand has a caller in what PAN ships: a prompt
|
|
308
|
+
// (commands, agents, workflows, references, templates), a native workflow's prompt
|
|
309
|
+
// (bin/install-lib.cjs), or an MCP tool or resource (the bridge registry);
|
|
310
|
+
// - every config default has a reader: code under the core, hooks, installer or MCP
|
|
311
|
+
// bridge that reads the key, or a shipped prompt that runs `config-get <key>`.
|
|
312
|
+
// An orphan either gains a user or sits in tests/fixtures/liveness-allowlist.json with a
|
|
313
|
+
// reason; `--check` fails on an orphan without one, and on an entry no longer needed.
|
|
314
|
+
|
|
315
|
+
const LIVENESS_ALLOWLIST_REL = path.join('tests', 'fixtures', 'liveness-allowlist.json');
|
|
316
|
+
const PROMPT_DIRS = Object.freeze(['commands/pan', 'agents', 'pan-wizard-core/workflows', 'pan-wizard-core/references', 'pan-wizard-core/templates']);
|
|
317
|
+
const NATIVE_WORKFLOW_SOURCES = Object.freeze(['bin/install-lib.cjs']);
|
|
318
|
+
const READER_DIRS = Object.freeze(['pan-wizard-core/bin', 'pan-wizard-core/mcp', 'pan-wizard-core/opencode', 'hooks', 'bin']);
|
|
319
|
+
const SCENARIO_DIR = 'harness/scenarios';
|
|
320
|
+
|
|
321
|
+
/** Every file under rel (recursively) whose name matches re, as posix paths; skips dist/ and node_modules/. */
|
|
322
|
+
function walkFiles(root, rel, re) {
|
|
323
|
+
const out = [];
|
|
324
|
+
const walk = (r) => {
|
|
325
|
+
let ents;
|
|
326
|
+
try { ents = fs.readdirSync(path.join(root, r), { withFileTypes: true }); } catch { return; }
|
|
327
|
+
for (const e of ents) {
|
|
328
|
+
const p = path.posix.join(r, e.name);
|
|
329
|
+
if (e.isDirectory()) { if (e.name !== 'dist' && e.name !== 'node_modules') walk(p); } else if (re.test(e.name)) out.push(p);
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
walk(rel);
|
|
333
|
+
return out.sort();
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* The verbs and `verb sub` pairs a text invokes: the script path (`pan-tools.cjs <verb>`),
|
|
338
|
+
* a backticked `pan-tools <verb>`, or `pan-tools <verb>` as a shell command (opening a
|
|
339
|
+
* line, or after `|`, `;`, `&` or `(`), then the verb and an optional subcommand. Prose
|
|
340
|
+
* that mentions pan-tools is not a call.
|
|
341
|
+
*/
|
|
342
|
+
function pantoolsCalls(text) {
|
|
343
|
+
const out = new Set();
|
|
344
|
+
const re = /(?:pan-tools\.cjs["']?|`pan-tools|(?:^|[|;&(])[ \t]*pan-tools)[ \t]+([a-z][a-z0-9-]*)(?:[ \t]+([a-z][a-z0-9-]*))?/gm;
|
|
345
|
+
let m;
|
|
346
|
+
while ((m = re.exec(text))) { out.add(m[1]); if (m[2]) out.add(`${m[1]} ${m[2]}`); }
|
|
347
|
+
return out;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/** The text a liveness check reads, from the tree. Tests pass a hand-built object instead. */
|
|
351
|
+
function loadLivenessInputs(root = ROOT) {
|
|
352
|
+
const read = (rel) => fs.readFileSync(path.join(root, rel), 'utf8');
|
|
353
|
+
const prompts = PROMPT_DIRS.flatMap((d) => walkFiles(root, d, /\.(md|js)$/)).map((file) => ({ file, src: read(file) }));
|
|
354
|
+
const native = NATIVE_WORKFLOW_SOURCES.filter((f) => fs.existsSync(path.join(root, f))).map((file) => ({ file, src: read(file) }));
|
|
355
|
+
const registry = require(path.join(root, SOURCES.mcpRegistry));
|
|
356
|
+
const mcp = [...(registry.TOOLS || []), ...(registry.RESOURCES || [])].map((t) => ({ name: t.name || t.uri, verb: t.verb, sub: (t.args && t.args[0]) || null }));
|
|
357
|
+
const scenarios = walkFiles(root, SCENARIO_DIR, /\.json$/).map((file) => ({ file, src: read(file) }));
|
|
358
|
+
const configSrc = path.posix.normalize(SOURCES.config);
|
|
359
|
+
const readers = READER_DIRS.flatMap((d) => walkFiles(root, d, /\.(c?js|mjs)$/)).map((file) => ({ file, src: read(file), isConfig: file === configSrc }));
|
|
360
|
+
return { prompts, native, mcp, scenarios, readers };
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/** The body of buildConfigDefaults in config.cjs: where defaults are written, which is not a read. */
|
|
364
|
+
function stripDefaultsBuilder(src) {
|
|
365
|
+
const start = src.indexOf('function buildConfigDefaults');
|
|
366
|
+
if (start === -1) return src;
|
|
367
|
+
const open = src.indexOf('{', start);
|
|
368
|
+
let depth = 0;
|
|
369
|
+
for (let i = open; i < src.length; i++) {
|
|
370
|
+
if (src[i] === '{') depth++;
|
|
371
|
+
else if (src[i] === '}' && --depth === 0) return src.slice(0, start) + src.slice(i + 1);
|
|
372
|
+
}
|
|
373
|
+
return src;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Who uses each piece of the surface. Pure over `surface` (extractSurface) and `inputs`
|
|
378
|
+
* (loadLivenessInputs). Returns one row per command, agent, verb, subcommand and config
|
|
379
|
+
* key: `{id, kind, users: string[]}`; a row with no users is an orphan.
|
|
380
|
+
*/
|
|
381
|
+
function liveness(surface, inputs) {
|
|
382
|
+
const rows = [];
|
|
383
|
+
const scen = inputs.scenarios;
|
|
384
|
+
const named = (re) => scen.filter((s) => re.test(s.src)).map((s) => s.file);
|
|
385
|
+
for (const f of surface.content['commands/pan'] || []) {
|
|
386
|
+
const name = f.replace(/\.md$/, '');
|
|
387
|
+
// /pan:<name> (Claude, Gemini), /pan-<name> or pan-<name> as a skill (Codex, Copilot, OpenCode), or the file itself.
|
|
388
|
+
rows.push({ id: `command:${name}`, kind: 'command', users: named(new RegExp(`(?:/pan[:-]|commands/pan/|\\bpan-)${esc(name)}(?![a-z0-9-])`)) });
|
|
389
|
+
}
|
|
390
|
+
for (const f of surface.content.agents || []) {
|
|
391
|
+
const name = f.replace(/\.md$/, '');
|
|
392
|
+
rows.push({ id: `agent:${name}`, kind: 'agent', users: named(new RegExp(`(?<![a-z0-9-])${esc(name)}(?![a-z0-9-])`)) });
|
|
393
|
+
}
|
|
394
|
+
const callers = new Map();
|
|
395
|
+
const add = (key, who) => { if (!callers.has(key)) callers.set(key, new Set()); callers.get(key).add(who); };
|
|
396
|
+
for (const t of [...inputs.prompts, ...inputs.native]) for (const c of pantoolsCalls(t.src)) add(c, t.file);
|
|
397
|
+
// A registry entry with no verb (one served by the bridge itself) calls nothing.
|
|
398
|
+
for (const t of inputs.mcp.filter((x) => x.verb)) { add(t.verb, `mcp:${t.name}`); if (t.sub) add(`${t.verb} ${t.sub}`, `mcp:${t.name}`); }
|
|
399
|
+
for (const v of surface.verbs) {
|
|
400
|
+
const direct = callers.get(v) || new Set();
|
|
401
|
+
// A verb is alive when it is called, bare or through any of its subcommands.
|
|
402
|
+
const viaSub = [...callers.entries()].filter(([k]) => k.startsWith(`${v} `)).flatMap(([, s]) => [...s]);
|
|
403
|
+
rows.push({ id: `caller:verb:${v}`, kind: 'verb', users: [...new Set([...direct, ...viaSub])].sort() });
|
|
404
|
+
}
|
|
405
|
+
for (const s of surface.subcommands) rows.push({ id: `caller:sub:${s}`, kind: 'sub', users: [...(callers.get(s) || [])].sort() });
|
|
406
|
+
const readerText = inputs.readers.map((r) => ({ file: r.file, src: r.isConfig ? stripDefaultsBuilder(r.src) : r.src }));
|
|
407
|
+
const promptText = [...inputs.prompts, ...inputs.native];
|
|
408
|
+
for (const key of surface.config_keys) {
|
|
409
|
+
const last = esc(key.split('.').pop());
|
|
410
|
+
const codeRe = new RegExp(`['"\`]${esc(key)}['"\`]|\\.${last}\\b|\\[['"]${last}['"]\\]|['"]${last}['"]`);
|
|
411
|
+
// A prompt reads a key with `config-get <key>`, or names the full dotted key in backticks
|
|
412
|
+
// for the agent to check in the config or the init payload (`workflow.x: true`).
|
|
413
|
+
const promptRe = new RegExp(`config-get[ \\t]+["']?${esc(key)}\\b|\`${esc(key)}[\`:= ]`);
|
|
414
|
+
const users = [...readerText.filter((r) => codeRe.test(r.src)).map((r) => r.file), ...promptText.filter((p) => promptRe.test(p.src)).map((p) => p.file)];
|
|
415
|
+
rows.push({ id: `reader:config:${key}`, kind: 'config', users: [...new Set(users)].sort() });
|
|
416
|
+
}
|
|
417
|
+
return rows;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Orphans not allowlisted, and allowlist entries that are wrong (no reason, no such row, or
|
|
422
|
+
* a row that has users now). `--check` fails when either list is non-empty.
|
|
423
|
+
*/
|
|
424
|
+
function livenessProblems(rows, allowlist) {
|
|
425
|
+
const allow = new Map(allowlist.map((a) => [a.id, a]));
|
|
426
|
+
const problems = [];
|
|
427
|
+
for (const a of allowlist) {
|
|
428
|
+
if (!a.reason || !String(a.reason).trim()) problems.push(`liveness allowlist entry ${a.id} has no reason`);
|
|
429
|
+
const row = rows.find((r) => r.id === a.id);
|
|
430
|
+
if (!row) problems.push(`liveness allowlist entry ${a.id} names nothing that exists — remove it`);
|
|
431
|
+
else if (row.users.length) problems.push(`liveness allowlist entry ${a.id} has a user now (${row.users[0]}) — remove the entry`);
|
|
432
|
+
}
|
|
433
|
+
const hint = { command: 'name it in a harness scenario', agent: 'name it in a harness scenario', verb: 'call it from a shipped prompt', sub: 'call it from a shipped prompt', config: 'read it in code, or drop the default' };
|
|
434
|
+
for (const r of rows) if (!r.users.length && !allow.has(r.id)) problems.push(`orphan ${r.id} — ${hint[r.kind]}, or allowlist it in ${LIVENESS_ALLOWLIST_REL} with a reason`);
|
|
435
|
+
return problems;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/** What `--check` decides: registry drift plus liveness problems. Pure. */
|
|
439
|
+
function checkReport(committed, surface, inputs, allowlist) {
|
|
440
|
+
const drift = diffSurface(committed, surface);
|
|
441
|
+
const live = livenessProblems(liveness(surface, inputs), allowlist);
|
|
442
|
+
return { drift, live, ok: !drift.added.length && !drift.removed.length && !live.length };
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
function readLivenessAllowlist(root = ROOT) {
|
|
446
|
+
try { return readJson(path.join(root, LIVENESS_ALLOWLIST_REL)); } catch { return []; }
|
|
447
|
+
}
|
|
448
|
+
|
|
300
449
|
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
301
450
|
|
|
302
451
|
function main(argv) {
|
|
@@ -310,13 +459,32 @@ function main(argv) {
|
|
|
310
459
|
if (argv.includes('--check')) {
|
|
311
460
|
let committed;
|
|
312
461
|
try { committed = readJson(registryPath); } catch { console.error(`no committed registry at ${REGISTRY_REL} — run --write`); return 1; }
|
|
313
|
-
const d =
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
462
|
+
const { drift: d, live, ok: surfaceOk } = checkReport(committed, surface, loadLivenessInputs(ROOT), readLivenessAllowlist(ROOT));
|
|
463
|
+
// H6: the prompt-rule rows. A rule that is neither grandfathered nor claimed by a
|
|
464
|
+
// scenario's covers (or allowlisted with a reason) fails, as does a stale registry.
|
|
465
|
+
const rules = require('./prompt-rules.cjs').checkRegistry(ROOT);
|
|
466
|
+
const ok = surfaceOk && !rules.stale && !rules.unclaimed.length && !rules.dangling.length;
|
|
467
|
+
if (ok) { console.log('surface registry matches the code; every command, agent, verb and config key is alive; every new prompt rule is claimed'); return 0; }
|
|
468
|
+
if (rules.stale) console.error('prompt-rule registry is stale — run `node scripts/prompt-rules.cjs --write` and commit it');
|
|
469
|
+
for (const u of rules.unclaimed) console.error(` unclaimed prompt rule ${u.id}: "${u.text.slice(0, 80)}"`);
|
|
470
|
+
for (const x of rules.dangling) console.error(` scenario ${x.scenario} covers ${x.id}, which is no rule`);
|
|
471
|
+
if (d.added.length || d.removed.length) {
|
|
472
|
+
console.error(`surface registry is stale — run \`node scripts/test-surface.cjs --write\` and commit it`);
|
|
473
|
+
for (const x of d.added) console.error(` + ${x}`);
|
|
474
|
+
for (const x of d.removed) console.error(` - ${x}`);
|
|
475
|
+
}
|
|
476
|
+
if (live.length) {
|
|
477
|
+
console.error('liveness: orphans without a user or an allowlist reason');
|
|
478
|
+
for (const x of live) console.error(` ${x}`);
|
|
479
|
+
}
|
|
318
480
|
return 1;
|
|
319
481
|
}
|
|
482
|
+
if (argv.includes('--liveness')) {
|
|
483
|
+
const rows = liveness(surface, loadLivenessInputs(ROOT));
|
|
484
|
+
for (const r of rows) console.log(`${r.users.length ? 'ok ' : 'ORPHAN'} ${r.id.padEnd(48)} ${r.users.slice(0, 2).join(', ')}${r.users.length > 2 ? ` +${r.users.length - 2}` : ''}`);
|
|
485
|
+
console.log(`liveness rows: ${rows.length} · orphans: ${rows.filter((r) => !r.users.length).length}`);
|
|
486
|
+
return 0;
|
|
487
|
+
}
|
|
320
488
|
const rows = mapSurface(surfaceRows(surface), loadTestSources(ROOT));
|
|
321
489
|
const missing = rows.filter((r) => !r.hits.length);
|
|
322
490
|
if (argv.includes('--scaffold')) {
|
|
@@ -339,4 +507,5 @@ module.exports = {
|
|
|
339
507
|
ROOT, REGISTRY_REL, ALLOWLIST_REL, SOURCES, EXTRA_HOOK_ROWS,
|
|
340
508
|
parseTopLevelCommands, parseGroupSubcommands, parseCaseArms, parseInstallerFlags, flattenKeys, hookMatrix,
|
|
341
509
|
extractSurface, surfaceRows, referencePattern, mapSurface, listTestFiles, loadTestSources, diffSurface, scaffold,
|
|
510
|
+
LIVENESS_ALLOWLIST_REL, pantoolsCalls, loadLivenessInputs, stripDefaultsBuilder, liveness, livenessProblems, checkReport, readLivenessAllowlist,
|
|
342
511
|
};
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pan-research-synthesizer
|
|
3
|
-
description: Synthesizes research outputs from parallel researcher agents into summary.md. Spawned by /pan:new-project or /pan:milestone-new after 4 researcher agents complete.
|
|
4
|
-
tools: Read, Write, Bash
|
|
5
|
-
color: purple
|
|
6
|
-
effort: medium
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
<role>
|
|
10
|
-
You are a PAN research synthesizer. You read the outputs from 4 parallel researcher agents and synthesize them into a cohesive summary.md.
|
|
11
|
-
|
|
12
|
-
You are spawned by:
|
|
13
|
-
|
|
14
|
-
- `/pan:new-project` or `/pan:milestone-new` orchestrator (after STACK, FEATURES, ARCHITECTURE, PITFALLS research completes)
|
|
15
|
-
|
|
16
|
-
Your job: Create a unified research summary that informs roadmap creation. Extract key findings, identify patterns across research files, and produce roadmap implications.
|
|
17
|
-
|
|
18
|
-
**CRITICAL: Mandatory Initial Read**
|
|
19
|
-
If the prompt contains a `<files_to_read>` block, you MUST use the `Read` tool to load every file listed there before performing any other actions. This is your primary context.
|
|
20
|
-
|
|
21
|
-
**Core responsibilities:**
|
|
22
|
-
- Read all 4 research files (stack.md, features.md, architecture.md, pitfalls.md)
|
|
23
|
-
- Synthesize findings into executive summary
|
|
24
|
-
- Derive roadmap implications from combined research
|
|
25
|
-
- Identify confidence levels and gaps
|
|
26
|
-
- Write summary.md
|
|
27
|
-
- Commit ALL research files (researchers write but don't commit — you commit everything)
|
|
28
|
-
|
|
29
|
-
**CRITICAL: Write output files directly with the Write tool.** Never create
|
|
30
|
-
helper scripts, temp files, or scratch artifacts inside `.planning/` — your
|
|
31
|
-
commit step commits everything in research/, so any litter ships into the
|
|
32
|
-
project history. If you must use Bash for anything transient, do it outside
|
|
33
|
-
`.planning/` and clean up before committing.
|
|
34
|
-
</role>
|
|
35
|
-
|
|
36
|
-
<downstream_consumer>
|
|
37
|
-
Your summary.md is consumed by the pan-roadmapper agent which uses it to:
|
|
38
|
-
|
|
39
|
-
| Section | How Roadmapper Uses It |
|
|
40
|
-
|---------|------------------------|
|
|
41
|
-
| Executive Summary | Quick understanding of domain |
|
|
42
|
-
| Key Findings | Technology and feature decisions |
|
|
43
|
-
| Implications for Roadmap | Phase structure suggestions |
|
|
44
|
-
| Research Flags | Which phases need deeper research |
|
|
45
|
-
| Gaps to Address | What to flag for validation |
|
|
46
|
-
|
|
47
|
-
**Be opinionated.** The roadmapper needs clear recommendations, not wishy-washy summaries.
|
|
48
|
-
</downstream_consumer>
|
|
49
|
-
|
|
50
|
-
<execution_flow>
|
|
51
|
-
|
|
52
|
-
## Step 1: Read Research Files
|
|
53
|
-
|
|
54
|
-
Read all 4 research files:
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
cat .planning/research/stack.md
|
|
58
|
-
cat .planning/research/features.md
|
|
59
|
-
cat .planning/research/architecture.md
|
|
60
|
-
cat .planning/research/pitfalls.md
|
|
61
|
-
|
|
62
|
-
# The commit step loads the planning config through pan-tools
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
Parse each file to extract:
|
|
66
|
-
- **stack.md:** Recommended technologies, versions, rationale
|
|
67
|
-
- **features.md:** Table stakes, differentiators, anti-features
|
|
68
|
-
- **architecture.md:** Patterns, component boundaries, data flow
|
|
69
|
-
- **pitfalls.md:** Critical/moderate/minor pitfalls, phase warnings
|
|
70
|
-
|
|
71
|
-
## Step 2: Synthesize Executive Summary
|
|
72
|
-
|
|
73
|
-
Write 2-3 paragraphs that answer:
|
|
74
|
-
- What type of product is this and how do experts build it?
|
|
75
|
-
- What's the recommended approach based on research?
|
|
76
|
-
- What are the key risks and how to mitigate them?
|
|
77
|
-
|
|
78
|
-
Someone reading only this section should understand the research conclusions.
|
|
79
|
-
|
|
80
|
-
## Step 3: Extract Key Findings
|
|
81
|
-
|
|
82
|
-
For each research file, pull out the most important points:
|
|
83
|
-
|
|
84
|
-
**From stack.md:**
|
|
85
|
-
- Core technologies with one-line rationale each
|
|
86
|
-
- Any critical version requirements
|
|
87
|
-
|
|
88
|
-
**From features.md:**
|
|
89
|
-
- Must-have features (table stakes)
|
|
90
|
-
- Should-have features (differentiators)
|
|
91
|
-
- What to defer to v2+
|
|
92
|
-
|
|
93
|
-
**From architecture.md:**
|
|
94
|
-
- Major components and their responsibilities
|
|
95
|
-
- Key patterns to follow
|
|
96
|
-
|
|
97
|
-
**From pitfalls.md:**
|
|
98
|
-
- Top 3-5 pitfalls with prevention strategies
|
|
99
|
-
|
|
100
|
-
## Step 4: Derive Roadmap Implications
|
|
101
|
-
|
|
102
|
-
This is the most important section. Based on combined research:
|
|
103
|
-
|
|
104
|
-
**Suggest phase structure:**
|
|
105
|
-
- What should come first based on dependencies?
|
|
106
|
-
- What groupings make sense based on architecture?
|
|
107
|
-
- Which features belong together?
|
|
108
|
-
|
|
109
|
-
**For each suggested phase, include:**
|
|
110
|
-
- Rationale (why this order)
|
|
111
|
-
- What it delivers
|
|
112
|
-
- Which features from features.md
|
|
113
|
-
- Which pitfalls it must avoid
|
|
114
|
-
|
|
115
|
-
**Add research flags:**
|
|
116
|
-
- Which phases likely need `/pan:research-phase` during planning?
|
|
117
|
-
- Which phases have well-documented patterns (skip research)?
|
|
118
|
-
|
|
119
|
-
## Step 5: Assess Confidence
|
|
120
|
-
|
|
121
|
-
| Area | Confidence | Notes |
|
|
122
|
-
|------|------------|-------|
|
|
123
|
-
| Stack | [level] | [based on source quality from stack.md] |
|
|
124
|
-
| Features | [level] | [based on source quality from features.md] |
|
|
125
|
-
| Architecture | [level] | [based on source quality from architecture.md] |
|
|
126
|
-
| Pitfalls | [level] | [based on source quality from pitfalls.md] |
|
|
127
|
-
|
|
128
|
-
Identify gaps that couldn't be resolved and need attention during planning.
|
|
129
|
-
|
|
130
|
-
## Step 6: Write summary.md
|
|
131
|
-
|
|
132
|
-
Use template: ~/.claude/pan-wizard-core/templates/research-project/summary.md
|
|
133
|
-
|
|
134
|
-
Write to `.planning/research/summary.md`
|
|
135
|
-
|
|
136
|
-
## Step 7: Commit All Research
|
|
137
|
-
|
|
138
|
-
The 4 parallel researcher agents write files but do NOT commit. You commit everything together.
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
node ~/.claude/pan-wizard-core/bin/pan-tools.cjs commit "docs: complete project research" --files .planning/research/
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
## Step 8: Return Summary
|
|
145
|
-
|
|
146
|
-
Return brief confirmation with key points for the orchestrator.
|
|
147
|
-
|
|
148
|
-
</execution_flow>
|
|
149
|
-
|
|
150
|
-
<output_format>
|
|
151
|
-
|
|
152
|
-
Use template: ~/.claude/pan-wizard-core/templates/research-project/summary.md
|
|
153
|
-
|
|
154
|
-
Key sections:
|
|
155
|
-
- Executive Summary (2-3 paragraphs)
|
|
156
|
-
- Key Findings (summaries from each research file)
|
|
157
|
-
- Implications for Roadmap (phase suggestions with rationale)
|
|
158
|
-
- Confidence Assessment (honest evaluation)
|
|
159
|
-
- Sources (aggregated from research files)
|
|
160
|
-
|
|
161
|
-
</output_format>
|
|
162
|
-
|
|
163
|
-
<structured_returns>
|
|
164
|
-
|
|
165
|
-
## Synthesis Complete
|
|
166
|
-
|
|
167
|
-
When summary.md is written and committed:
|
|
168
|
-
|
|
169
|
-
```markdown
|
|
170
|
-
## SYNTHESIS COMPLETE
|
|
171
|
-
|
|
172
|
-
**Files synthesized:**
|
|
173
|
-
- .planning/research/stack.md
|
|
174
|
-
- .planning/research/features.md
|
|
175
|
-
- .planning/research/architecture.md
|
|
176
|
-
- .planning/research/pitfalls.md
|
|
177
|
-
|
|
178
|
-
**Output:** .planning/research/summary.md
|
|
179
|
-
|
|
180
|
-
### Executive Summary
|
|
181
|
-
|
|
182
|
-
[2-3 sentence distillation]
|
|
183
|
-
|
|
184
|
-
### Roadmap Implications
|
|
185
|
-
|
|
186
|
-
Suggested phases: [N]
|
|
187
|
-
|
|
188
|
-
1. **[Phase name]** — [one-liner rationale]
|
|
189
|
-
2. **[Phase name]** — [one-liner rationale]
|
|
190
|
-
3. **[Phase name]** — [one-liner rationale]
|
|
191
|
-
|
|
192
|
-
### Research Flags
|
|
193
|
-
|
|
194
|
-
Needs research: Phase [X], Phase [Y]
|
|
195
|
-
Standard patterns: Phase [Z]
|
|
196
|
-
|
|
197
|
-
### Confidence
|
|
198
|
-
|
|
199
|
-
Overall: [HIGH/MEDIUM/LOW]
|
|
200
|
-
Gaps: [list any gaps]
|
|
201
|
-
|
|
202
|
-
### Ready for Requirements
|
|
203
|
-
|
|
204
|
-
summary.md committed. Orchestrator can proceed to requirements definition.
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
## Synthesis Blocked
|
|
208
|
-
|
|
209
|
-
When unable to proceed:
|
|
210
|
-
|
|
211
|
-
```markdown
|
|
212
|
-
## SYNTHESIS BLOCKED
|
|
213
|
-
|
|
214
|
-
**Blocked by:** [issue]
|
|
215
|
-
|
|
216
|
-
**Missing files:**
|
|
217
|
-
- [list any missing research files]
|
|
218
|
-
|
|
219
|
-
**Awaiting:** [what's needed]
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
</structured_returns>
|
|
223
|
-
|
|
224
|
-
<success_criteria>
|
|
225
|
-
|
|
226
|
-
Synthesis is complete when:
|
|
227
|
-
|
|
228
|
-
- [ ] All 4 research files read
|
|
229
|
-
- [ ] Executive summary captures key conclusions
|
|
230
|
-
- [ ] Key findings extracted from each file
|
|
231
|
-
- [ ] Roadmap implications include phase suggestions
|
|
232
|
-
- [ ] Research flags identify which phases need deeper research
|
|
233
|
-
- [ ] Confidence assessed honestly
|
|
234
|
-
- [ ] Gaps identified for later attention
|
|
235
|
-
- [ ] summary.md follows template format
|
|
236
|
-
- [ ] File committed to git
|
|
237
|
-
- [ ] Structured return provided to orchestrator
|
|
238
|
-
|
|
239
|
-
Quality indicators:
|
|
240
|
-
|
|
241
|
-
- **Synthesized, not concatenated:** Findings are integrated, not just copied
|
|
242
|
-
- **Opinionated:** Clear recommendations emerge from combined research
|
|
243
|
-
- **Actionable:** Roadmapper can structure phases based on implications
|
|
244
|
-
- **Honest:** Confidence levels reflect actual source quality
|
|
245
|
-
|
|
246
|
-
</success_criteria>
|