@pareto4/pp-core 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +23 -0
- package/GEMINI.md +53 -0
- package/LICENSE +22 -0
- package/README.md +100 -0
- package/agents/pp-advisor-researcher.md +108 -0
- package/agents/pp-ai-researcher.md +114 -0
- package/agents/pp-assumptions-analyzer.md +105 -0
- package/agents/pp-code-fixer.md +669 -0
- package/agents/pp-code-reviewer.md +387 -0
- package/agents/pp-codebase-mapper.md +853 -0
- package/agents/pp-debug-session-manager.md +315 -0
- package/agents/pp-debugger.md +1453 -0
- package/agents/pp-doc-classifier.md +168 -0
- package/agents/pp-doc-synthesizer.md +204 -0
- package/agents/pp-doc-verifier.md +217 -0
- package/agents/pp-doc-writer.md +616 -0
- package/agents/pp-domain-researcher.md +147 -0
- package/agents/pp-eval-auditor.md +191 -0
- package/agents/pp-eval-planner.md +154 -0
- package/agents/pp-executor.md +808 -0
- package/agents/pp-framework-selector.md +160 -0
- package/agents/pp-integration-checker.md +470 -0
- package/agents/pp-intel-updater.md +339 -0
- package/agents/pp-mempalace-curator.md +47 -0
- package/agents/pp-nyquist-auditor.md +204 -0
- package/agents/pp-pattern-mapper.md +335 -0
- package/agents/pp-phase-researcher.md +867 -0
- package/agents/pp-plan-checker.md +988 -0
- package/agents/pp-planner.md +1052 -0
- package/agents/pp-project-researcher.md +612 -0
- package/agents/pp-research-synthesizer.md +260 -0
- package/agents/pp-roadmapper.md +741 -0
- package/agents/pp-security-auditor.md +156 -0
- package/agents/pp-ui-auditor.md +495 -0
- package/agents/pp-ui-checker.md +309 -0
- package/agents/pp-ui-researcher.md +375 -0
- package/agents/pp-user-profiler.md +171 -0
- package/agents/pp-verifier.md +967 -0
- package/assets/gsd-logo-2000-transparent.png +0 -0
- package/assets/gsd-logo-2000-transparent.svg +17 -0
- package/assets/gsd-logo-2000.png +0 -0
- package/assets/gsd-logo-2000.svg +21 -0
- package/assets/terminal.svg +68 -0
- package/bin/install.js +12370 -0
- package/bin/lib/ui-safety-gate.cjs +107 -0
- package/commands/pp-add-tests.md +42 -0
- package/commands/pp-ai-integration-phase.md +37 -0
- package/commands/pp-audit-fix.md +34 -0
- package/commands/pp-audit-milestone.md +37 -0
- package/commands/pp-audit-uat.md +24 -0
- package/commands/pp-autonomous.md +51 -0
- package/commands/pp-capture.md +62 -0
- package/commands/pp-cleanup.md +24 -0
- package/commands/pp-code-review.md +59 -0
- package/commands/pp-complete-milestone.md +143 -0
- package/commands/pp-config.md +56 -0
- package/commands/pp-debug.md +52 -0
- package/commands/pp-discovery.md +34 -0
- package/commands/pp-discuss-phase.md +77 -0
- package/commands/pp-docs-update.md +49 -0
- package/commands/pp-eval-review.md +33 -0
- package/commands/pp-execute-phase.md +65 -0
- package/commands/pp-explore.md +27 -0
- package/commands/pp-extract-learnings.md +23 -0
- package/commands/pp-fast.md +31 -0
- package/commands/pp-forensics.md +57 -0
- package/commands/pp-graphify.md +204 -0
- package/commands/pp-health.md +31 -0
- package/commands/pp-help.md +28 -0
- package/commands/pp-import.md +45 -0
- package/commands/pp-inbox.md +39 -0
- package/commands/pp-ingest-docs.md +42 -0
- package/commands/pp-manager.md +45 -0
- package/commands/pp-map-codebase.md +83 -0
- package/commands/pp-mempalace-capture.md +71 -0
- package/commands/pp-mempalace-recall.md +102 -0
- package/commands/pp-milestone-summary.md +51 -0
- package/commands/pp-mvp-phase.md +45 -0
- package/commands/pp-new-milestone.md +45 -0
- package/commands/pp-new-project.md +47 -0
- package/commands/pp-ns-context.md +25 -0
- package/commands/pp-ns-ideate.md +24 -0
- package/commands/pp-ns-manage.md +36 -0
- package/commands/pp-ns-project.md +27 -0
- package/commands/pp-ns-review.md +29 -0
- package/commands/pp-ns-workflow.md +35 -0
- package/commands/pp-pause-work.md +43 -0
- package/commands/pp-phase.md +56 -0
- package/commands/pp-plan-phase.md +63 -0
- package/commands/pp-plan-review-convergence.md +60 -0
- package/commands/pp-pr-branch.md +26 -0
- package/commands/pp-profile-user.md +46 -0
- package/commands/pp-progress.md +49 -0
- package/commands/pp-quick.md +174 -0
- package/commands/pp-resume-work.md +30 -0
- package/commands/pp-review-backlog.md +63 -0
- package/commands/pp-review.md +42 -0
- package/commands/pp-secure-phase.md +36 -0
- package/commands/pp-settings.md +29 -0
- package/commands/pp-ship.md +24 -0
- package/commands/pp-sketch.md +60 -0
- package/commands/pp-spec-phase.md +63 -0
- package/commands/pp-spike.md +57 -0
- package/commands/pp-stats.md +20 -0
- package/commands/pp-surface.md +162 -0
- package/commands/pp-thread.md +24 -0
- package/commands/pp-ui-phase.md +35 -0
- package/commands/pp-ui-review.md +33 -0
- package/commands/pp-ultraplan-phase.md +34 -0
- package/commands/pp-undo.md +35 -0
- package/commands/pp-update.md +49 -0
- package/commands/pp-validate-phase.md +36 -0
- package/commands/pp-verify-work.md +39 -0
- package/commands/pp-workspace.md +52 -0
- package/commands/pp-workstreams.md +70 -0
- package/gemini-extension.json +6 -0
- package/hooks/dist/lib/git-cmd.js +150 -0
- package/hooks/dist/lib/pp-graphify-rebuild.sh +65 -0
- package/hooks/dist/managed-hooks-registry.cjs +39 -0
- package/hooks/dist/pp-check-update-worker.js +108 -0
- package/hooks/dist/pp-check-update.js +66 -0
- package/hooks/dist/pp-config-reload.js +133 -0
- package/hooks/dist/pp-context-monitor.js +196 -0
- package/hooks/dist/pp-cursor-post-tool.js +75 -0
- package/hooks/dist/pp-cursor-session-start.js +52 -0
- package/hooks/dist/pp-ensure-canonical-path.js +305 -0
- package/hooks/dist/pp-graphify-update.sh +158 -0
- package/hooks/dist/pp-phase-boundary.sh +47 -0
- package/hooks/dist/pp-prompt-guard.js +97 -0
- package/hooks/dist/pp-read-guard.js +101 -0
- package/hooks/dist/pp-read-injection-scanner.js +203 -0
- package/hooks/dist/pp-session-state.sh +59 -0
- package/hooks/dist/pp-statusline.js +566 -0
- package/hooks/dist/pp-update-banner.js +138 -0
- package/hooks/dist/pp-validate-commit.sh +57 -0
- package/hooks/dist/pp-workflow-guard.js +167 -0
- package/hooks/dist/pp-worktree-path-guard.js +185 -0
- package/hooks/hooks.json +70 -0
- package/hooks/lib/git-cmd.js +150 -0
- package/hooks/lib/pp-graphify-rebuild.sh +65 -0
- package/hooks/managed-hooks-registry.cjs +39 -0
- package/hooks/pp-check-update-worker.js +108 -0
- package/hooks/pp-check-update.js +66 -0
- package/hooks/pp-config-reload.js +133 -0
- package/hooks/pp-context-monitor.js +196 -0
- package/hooks/pp-cursor-post-tool.js +75 -0
- package/hooks/pp-cursor-session-start.js +52 -0
- package/hooks/pp-ensure-canonical-path.js +305 -0
- package/hooks/pp-graphify-update.sh +158 -0
- package/hooks/pp-phase-boundary.sh +47 -0
- package/hooks/pp-prompt-guard.js +97 -0
- package/hooks/pp-read-guard.js +101 -0
- package/hooks/pp-read-injection-scanner.js +203 -0
- package/hooks/pp-session-state.sh +59 -0
- package/hooks/pp-statusline.js +566 -0
- package/hooks/pp-update-banner.js +138 -0
- package/hooks/pp-validate-commit.sh +57 -0
- package/hooks/pp-workflow-guard.js +167 -0
- package/hooks/pp-worktree-path-guard.js +185 -0
- package/package.json +125 -0
- package/pp-core/bin/check-latest-version.cjs +161 -0
- package/pp-core/bin/lib/active-workstream-store.cjs +297 -0
- package/pp-core/bin/lib/adr-parser.cjs +399 -0
- package/pp-core/bin/lib/agent-command-router.cjs +68 -0
- package/pp-core/bin/lib/agent-install-check.cjs +143 -0
- package/pp-core/bin/lib/artifacts.cjs +51 -0
- package/pp-core/bin/lib/audit-command-router.cjs +61 -0
- package/pp-core/bin/lib/audit.cjs +743 -0
- package/pp-core/bin/lib/capability-activation.cjs +113 -0
- package/pp-core/bin/lib/capability-registry.cjs +3727 -0
- package/pp-core/bin/lib/capability-state.cjs +497 -0
- package/pp-core/bin/lib/capability-writer.cjs +355 -0
- package/pp-core/bin/lib/check-command-router.cjs +800 -0
- package/pp-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
- package/pp-core/bin/lib/cli-exit.cjs +61 -0
- package/pp-core/bin/lib/clock.cjs +95 -0
- package/pp-core/bin/lib/clusters.cjs +131 -0
- package/pp-core/bin/lib/code-review-flags.cjs +59 -0
- package/pp-core/bin/lib/command-aliases.cjs +809 -0
- package/pp-core/bin/lib/command-arg-projection.cjs +55 -0
- package/pp-core/bin/lib/command-roster.cjs +19 -0
- package/pp-core/bin/lib/command-routing-hub.cjs +300 -0
- package/pp-core/bin/lib/commands.cjs +1244 -0
- package/pp-core/bin/lib/config-loader.cjs +714 -0
- package/pp-core/bin/lib/config-schema.cjs +58 -0
- package/pp-core/bin/lib/config-types.cjs +20 -0
- package/pp-core/bin/lib/config.cjs +796 -0
- package/pp-core/bin/lib/configuration.cjs +209 -0
- package/pp-core/bin/lib/context-utilization.cjs +48 -0
- package/pp-core/bin/lib/core-utils.cjs +198 -0
- package/pp-core/bin/lib/decisions.cjs +136 -0
- package/pp-core/bin/lib/docs.cjs +264 -0
- package/pp-core/bin/lib/drift.cjs +364 -0
- package/pp-core/bin/lib/edge-probe.cjs +196 -0
- package/pp-core/bin/lib/fallow-runner.cjs +153 -0
- package/pp-core/bin/lib/federated-config.cjs +182 -0
- package/pp-core/bin/lib/frontmatter.cjs +494 -0
- package/pp-core/bin/lib/gap-checker.cjs +260 -0
- package/pp-core/bin/lib/git-base-branch.cjs +220 -0
- package/pp-core/bin/lib/graphify-command-router.cjs +72 -0
- package/pp-core/bin/lib/graphify.cjs +472 -0
- package/pp-core/bin/lib/gsd2-import.cjs +456 -0
- package/pp-core/bin/lib/init-command-router.cjs +62 -0
- package/pp-core/bin/lib/init.cjs +1912 -0
- package/pp-core/bin/lib/install-profiles.cjs +814 -0
- package/pp-core/bin/lib/installer-migration-authoring.cjs +122 -0
- package/pp-core/bin/lib/installer-migration-report.cjs +351 -0
- package/pp-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +225 -0
- package/pp-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
- package/pp-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
- package/pp-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
- package/pp-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs +123 -0
- package/pp-core/bin/lib/installer-migrations/005-rename-gsd-core-to-pp-core.cjs +109 -0
- package/pp-core/bin/lib/installer-migrations/006-rename-gsd-command-namespace.cjs +135 -0
- package/pp-core/bin/lib/installer-migrations.cjs +823 -0
- package/pp-core/bin/lib/intel-command-router.cjs +119 -0
- package/pp-core/bin/lib/intel.cjs +584 -0
- package/pp-core/bin/lib/io.cjs +220 -0
- package/pp-core/bin/lib/learnings.cjs +270 -0
- package/pp-core/bin/lib/legacy-cleanup.cjs +253 -0
- package/pp-core/bin/lib/loop-host-contract.cjs +105 -0
- package/pp-core/bin/lib/loop-resolver.cjs +479 -0
- package/pp-core/bin/lib/milestone.cjs +381 -0
- package/pp-core/bin/lib/model-catalog.cjs +154 -0
- package/pp-core/bin/lib/model-profiles.cjs +24 -0
- package/pp-core/bin/lib/model-resolver.cjs +467 -0
- package/pp-core/bin/lib/observability/event.cjs +51 -0
- package/pp-core/bin/lib/observability/logger.cjs +146 -0
- package/pp-core/bin/lib/observability/redaction.cjs +48 -0
- package/pp-core/bin/lib/package-identity.cjs +35 -0
- package/pp-core/bin/lib/package-legitimacy.cjs +368 -0
- package/pp-core/bin/lib/phase-command-router.cjs +209 -0
- package/pp-core/bin/lib/phase-id.cjs +213 -0
- package/pp-core/bin/lib/phase-lifecycle.cjs +74 -0
- package/pp-core/bin/lib/phase-locator.cjs +145 -0
- package/pp-core/bin/lib/phase.cjs +1446 -0
- package/pp-core/bin/lib/phases-command-router.cjs +43 -0
- package/pp-core/bin/lib/plan-drift-guard.cjs +117 -0
- package/pp-core/bin/lib/plan-scan.cjs +91 -0
- package/pp-core/bin/lib/planning-workspace.cjs +245 -0
- package/pp-core/bin/lib/probe-core.cjs +402 -0
- package/pp-core/bin/lib/profile-output.cjs +1164 -0
- package/pp-core/bin/lib/profile-pipeline-command-router.cjs +138 -0
- package/pp-core/bin/lib/profile-pipeline.cjs +519 -0
- package/pp-core/bin/lib/prohibition-enforcement.cjs +660 -0
- package/pp-core/bin/lib/project-root.cjs +119 -0
- package/pp-core/bin/lib/prompt-budget.cjs +305 -0
- package/pp-core/bin/lib/research-provider.cjs +137 -0
- package/pp-core/bin/lib/research-store.cjs +167 -0
- package/pp-core/bin/lib/review-reviewer-selection.cjs +121 -0
- package/pp-core/bin/lib/roadmap-command-router.cjs +166 -0
- package/pp-core/bin/lib/roadmap-parser.cjs +456 -0
- package/pp-core/bin/lib/roadmap-upgrade.cjs +476 -0
- package/pp-core/bin/lib/roadmap.cjs +738 -0
- package/pp-core/bin/lib/runtime-artifact-conversion.cjs +1966 -0
- package/pp-core/bin/lib/runtime-artifact-layout.cjs +342 -0
- package/pp-core/bin/lib/runtime-config-adapter-registry.cjs +103 -0
- package/pp-core/bin/lib/runtime-homes.cjs +272 -0
- package/pp-core/bin/lib/runtime-hooks-surface.cjs +1460 -0
- package/pp-core/bin/lib/runtime-name-policy.cjs +97 -0
- package/pp-core/bin/lib/runtime-slash.cjs +137 -0
- package/pp-core/bin/lib/schema-detect.cjs +159 -0
- package/pp-core/bin/lib/secrets.cjs +34 -0
- package/pp-core/bin/lib/security.cjs +480 -0
- package/pp-core/bin/lib/semver-compare.cjs +42 -0
- package/pp-core/bin/lib/shell-command-projection.cjs +550 -0
- package/pp-core/bin/lib/state-command-router.cjs +172 -0
- package/pp-core/bin/lib/state-document.cjs +312 -0
- package/pp-core/bin/lib/state.cjs +2587 -0
- package/pp-core/bin/lib/surface.cjs +505 -0
- package/pp-core/bin/lib/task-command-router.cjs +85 -0
- package/pp-core/bin/lib/teams-status.cjs +74 -0
- package/pp-core/bin/lib/template.cjs +246 -0
- package/pp-core/bin/lib/uat-predicate.cjs +329 -0
- package/pp-core/bin/lib/uat.cjs +359 -0
- package/pp-core/bin/lib/ui-safety-gate.cjs +98 -0
- package/pp-core/bin/lib/update-context.cjs +221 -0
- package/pp-core/bin/lib/validate-command-router.cjs +91 -0
- package/pp-core/bin/lib/validate.cjs +122 -0
- package/pp-core/bin/lib/verification-command-router.cjs +31 -0
- package/pp-core/bin/lib/verification.cjs +196 -0
- package/pp-core/bin/lib/verify-command-router.cjs +44 -0
- package/pp-core/bin/lib/verify.cjs +1932 -0
- package/pp-core/bin/lib/workstream-inventory-builder.cjs +81 -0
- package/pp-core/bin/lib/workstream-inventory.cjs +147 -0
- package/pp-core/bin/lib/workstream-name-policy.cjs +91 -0
- package/pp-core/bin/lib/workstream.cjs +386 -0
- package/pp-core/bin/lib/worktree-base-ref.cjs +350 -0
- package/pp-core/bin/lib/worktree-safety.cjs +985 -0
- package/pp-core/bin/pp-tools.cjs +2239 -0
- package/pp-core/bin/pp_run +20 -0
- package/pp-core/bin/shared/config-defaults.manifest.json +97 -0
- package/pp-core/bin/shared/config-schema.manifest.json +176 -0
- package/pp-core/bin/shared/model-catalog.json +160 -0
- package/pp-core/bin/shared/runtime-aliases.manifest.json +79 -0
- package/pp-core/bin/verify-reapply-patches.cjs +400 -0
- package/pp-core/contexts/dev.md +21 -0
- package/pp-core/contexts/research.md +22 -0
- package/pp-core/contexts/review.md +23 -0
- package/pp-core/references/agent-contracts.md +79 -0
- package/pp-core/references/ai-evals.md +156 -0
- package/pp-core/references/ai-frameworks.md +186 -0
- package/pp-core/references/artifact-types.md +131 -0
- package/pp-core/references/autonomous-smart-discuss.md +277 -0
- package/pp-core/references/checkpoints.md +814 -0
- package/pp-core/references/common-bug-patterns.md +114 -0
- package/pp-core/references/context-budget.md +85 -0
- package/pp-core/references/continuation-format.md +253 -0
- package/pp-core/references/debugger-philosophy.md +76 -0
- package/pp-core/references/decimal-phase-calculation.md +64 -0
- package/pp-core/references/doc-conflict-engine.md +91 -0
- package/pp-core/references/domain-probes.md +125 -0
- package/pp-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +7 -0
- package/pp-core/references/edge-probe-fixtures/01-round-half-even/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +8 -0
- package/pp-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +7 -0
- package/pp-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +7 -0
- package/pp-core/references/edge-probe-fixtures/04-money-rounding/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +8 -0
- package/pp-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +8 -0
- package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json +4 -0
- package/pp-core/references/edge-probe.md +272 -0
- package/pp-core/references/execute-mvp-tdd.md +81 -0
- package/pp-core/references/executor-examples.md +110 -0
- package/pp-core/references/few-shot-examples/plan-checker.md +73 -0
- package/pp-core/references/few-shot-examples/verifier.md +109 -0
- package/pp-core/references/gate-prompts.md +100 -0
- package/pp-core/references/gates.md +70 -0
- package/pp-core/references/git-integration.md +298 -0
- package/pp-core/references/git-planning-commit.md +40 -0
- package/pp-core/references/ios-scaffold.md +123 -0
- package/pp-core/references/loop-hook-dispatch.md +61 -0
- package/pp-core/references/mandatory-initial-read.md +2 -0
- package/pp-core/references/model-profile-resolution.md +38 -0
- package/pp-core/references/model-profiles.md +245 -0
- package/pp-core/references/mvp-concepts.md +49 -0
- package/pp-core/references/phase-argument-parsing.md +61 -0
- package/pp-core/references/planner-antipatterns.md +176 -0
- package/pp-core/references/planner-chunked.md +49 -0
- package/pp-core/references/planner-gap-closure.md +62 -0
- package/pp-core/references/planner-graphify-auto-update.md +67 -0
- package/pp-core/references/planner-guidance.md +186 -0
- package/pp-core/references/planner-human-verify-mode.md +57 -0
- package/pp-core/references/planner-interface-context.md +62 -0
- package/pp-core/references/planner-load-graph-context.md +36 -0
- package/pp-core/references/planner-mvp-mode.md +53 -0
- package/pp-core/references/planner-reviews.md +42 -0
- package/pp-core/references/planner-revision.md +87 -0
- package/pp-core/references/planner-source-audit.md +73 -0
- package/pp-core/references/planning-config.md +477 -0
- package/pp-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json +14 -0
- package/pp-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json +4 -0
- package/pp-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json +32 -0
- package/pp-core/references/prohibition-probe.md +326 -0
- package/pp-core/references/project-skills-discovery.md +19 -0
- package/pp-core/references/questioning.md +162 -0
- package/pp-core/references/research-documentation-lookup.md +29 -0
- package/pp-core/references/research-philosophy.md +29 -0
- package/pp-core/references/research-verification-protocol.md +27 -0
- package/pp-core/references/revision-loop.md +97 -0
- package/pp-core/references/scout-codebase.md +51 -0
- package/pp-core/references/skeleton-template.md +48 -0
- package/pp-core/references/sketch-interactivity.md +41 -0
- package/pp-core/references/sketch-theme-system.md +94 -0
- package/pp-core/references/sketch-tooling.md +45 -0
- package/pp-core/references/sketch-variant-patterns.md +81 -0
- package/pp-core/references/spidr-splitting.md +69 -0
- package/pp-core/references/tdd.md +330 -0
- package/pp-core/references/thinking-models-debug.md +44 -0
- package/pp-core/references/thinking-models-execution.md +50 -0
- package/pp-core/references/thinking-models-planning.md +62 -0
- package/pp-core/references/thinking-models-research.md +50 -0
- package/pp-core/references/thinking-models-verification.md +55 -0
- package/pp-core/references/thinking-partner.md +96 -0
- package/pp-core/references/ui-brand.md +162 -0
- package/pp-core/references/universal-anti-patterns.md +63 -0
- package/pp-core/references/user-profiling.md +681 -0
- package/pp-core/references/user-story-template.md +58 -0
- package/pp-core/references/verification-overrides.md +227 -0
- package/pp-core/references/verification-patterns.md +612 -0
- package/pp-core/references/verify-mvp-mode.md +85 -0
- package/pp-core/references/workstream-flag.md +111 -0
- package/pp-core/references/worktree-branch-check.md +44 -0
- package/pp-core/references/worktree-path-safety.md +67 -0
- package/pp-core/templates/AI-SPEC.md +246 -0
- package/pp-core/templates/DEBUG.md +169 -0
- package/pp-core/templates/README.md +77 -0
- package/pp-core/templates/SECURITY.md +61 -0
- package/pp-core/templates/UAT.md +265 -0
- package/pp-core/templates/UI-SPEC.md +100 -0
- package/pp-core/templates/VALIDATION.md +76 -0
- package/pp-core/templates/claude-md.md +145 -0
- package/pp-core/templates/codebase/architecture.md +255 -0
- package/pp-core/templates/codebase/concerns.md +310 -0
- package/pp-core/templates/codebase/conventions.md +307 -0
- package/pp-core/templates/codebase/integrations.md +280 -0
- package/pp-core/templates/codebase/stack.md +186 -0
- package/pp-core/templates/codebase/structure.md +285 -0
- package/pp-core/templates/codebase/testing.md +480 -0
- package/pp-core/templates/config.json +62 -0
- package/pp-core/templates/context.md +352 -0
- package/pp-core/templates/continue-here.md +78 -0
- package/pp-core/templates/copilot-instructions.md +7 -0
- package/pp-core/templates/debug-subagent-prompt.md +91 -0
- package/pp-core/templates/dev-preferences.md +21 -0
- package/pp-core/templates/discovery.md +146 -0
- package/pp-core/templates/discussion-log.md +63 -0
- package/pp-core/templates/milestone-archive.md +123 -0
- package/pp-core/templates/milestone.md +115 -0
- package/pp-core/templates/phase-prompt.md +610 -0
- package/pp-core/templates/planner-subagent-prompt.md +117 -0
- package/pp-core/templates/project.md +203 -0
- package/pp-core/templates/requirements.md +231 -0
- package/pp-core/templates/research-project/ARCHITECTURE.md +204 -0
- package/pp-core/templates/research-project/FEATURES.md +147 -0
- package/pp-core/templates/research-project/PITFALLS.md +200 -0
- package/pp-core/templates/research-project/STACK.md +120 -0
- package/pp-core/templates/research-project/SUMMARY.md +170 -0
- package/pp-core/templates/research.md +592 -0
- package/pp-core/templates/retrospective.md +54 -0
- package/pp-core/templates/roadmap.md +202 -0
- package/pp-core/templates/spec.md +333 -0
- package/pp-core/templates/state.md +195 -0
- package/pp-core/templates/summary-complex.md +60 -0
- package/pp-core/templates/summary-minimal.md +42 -0
- package/pp-core/templates/summary-standard.md +49 -0
- package/pp-core/templates/summary.md +249 -0
- package/pp-core/templates/user-profile.md +146 -0
- package/pp-core/templates/user-setup.md +311 -0
- package/pp-core/templates/verification-report.md +335 -0
- package/pp-core/workflows/_runtime-launcher.snippet.sh +1 -0
- package/pp-core/workflows/add-backlog.md +91 -0
- package/pp-core/workflows/add-phase.md +113 -0
- package/pp-core/workflows/add-tests.md +355 -0
- package/pp-core/workflows/add-todo.md +161 -0
- package/pp-core/workflows/ai-integration-phase.md +295 -0
- package/pp-core/workflows/analyze-dependencies.md +96 -0
- package/pp-core/workflows/audit-fix.md +178 -0
- package/pp-core/workflows/audit-milestone.md +362 -0
- package/pp-core/workflows/audit-uat.md +110 -0
- package/pp-core/workflows/autonomous.md +886 -0
- package/pp-core/workflows/check-todos.md +180 -0
- package/pp-core/workflows/cleanup.md +195 -0
- package/pp-core/workflows/code-review-fix.md +506 -0
- package/pp-core/workflows/code-review.md +696 -0
- package/pp-core/workflows/complete-milestone.md +857 -0
- package/pp-core/workflows/debug.md +237 -0
- package/pp-core/workflows/diagnose-issues.md +245 -0
- package/pp-core/workflows/discovery-phase.md +291 -0
- package/pp-core/workflows/discovery-sprint.md +1546 -0
- package/pp-core/workflows/discuss-phase/modes/advisor.md +176 -0
- package/pp-core/workflows/discuss-phase/modes/all.md +28 -0
- package/pp-core/workflows/discuss-phase/modes/analyze.md +44 -0
- package/pp-core/workflows/discuss-phase/modes/auto.md +57 -0
- package/pp-core/workflows/discuss-phase/modes/batch.md +52 -0
- package/pp-core/workflows/discuss-phase/modes/chain.md +98 -0
- package/pp-core/workflows/discuss-phase/modes/default.md +141 -0
- package/pp-core/workflows/discuss-phase/modes/power.md +44 -0
- package/pp-core/workflows/discuss-phase/modes/text.md +55 -0
- package/pp-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
- package/pp-core/workflows/discuss-phase/templates/context.md +136 -0
- package/pp-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
- package/pp-core/workflows/discuss-phase-assumptions.md +675 -0
- package/pp-core/workflows/discuss-phase-power.md +291 -0
- package/pp-core/workflows/discuss-phase.md +520 -0
- package/pp-core/workflows/do.md +111 -0
- package/pp-core/workflows/docs-update.md +1168 -0
- package/pp-core/workflows/edit-phase.md +295 -0
- package/pp-core/workflows/eval-review.md +159 -0
- package/pp-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
- package/pp-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
- package/pp-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
- package/pp-core/workflows/execute-phase/steps/worktree-recovery-policy.md +9 -0
- package/pp-core/workflows/execute-phase.md +1707 -0
- package/pp-core/workflows/execute-plan.md +541 -0
- package/pp-core/workflows/explore.md +146 -0
- package/pp-core/workflows/extract-learnings.md +243 -0
- package/pp-core/workflows/fast.md +124 -0
- package/pp-core/workflows/forensics.md +279 -0
- package/pp-core/workflows/graduation.md +196 -0
- package/pp-core/workflows/health.md +224 -0
- package/pp-core/workflows/help/modes/brief.md +22 -0
- package/pp-core/workflows/help/modes/default.md +50 -0
- package/pp-core/workflows/help/modes/full.md +791 -0
- package/pp-core/workflows/help/modes/topic.md +74 -0
- package/pp-core/workflows/help.md +24 -0
- package/pp-core/workflows/import.md +256 -0
- package/pp-core/workflows/inbox.md +387 -0
- package/pp-core/workflows/ingest-docs.md +340 -0
- package/pp-core/workflows/insert-phase.md +152 -0
- package/pp-core/workflows/list-phase-assumptions.md +178 -0
- package/pp-core/workflows/list-workspaces.md +57 -0
- package/pp-core/workflows/manager.md +435 -0
- package/pp-core/workflows/map-codebase.md +444 -0
- package/pp-core/workflows/milestone-summary.md +224 -0
- package/pp-core/workflows/mvp-phase.md +222 -0
- package/pp-core/workflows/new-milestone.md +643 -0
- package/pp-core/workflows/new-project.md +1563 -0
- package/pp-core/workflows/new-workspace.md +240 -0
- package/pp-core/workflows/next.md +347 -0
- package/pp-core/workflows/node-repair.md +92 -0
- package/pp-core/workflows/note.md +158 -0
- package/pp-core/workflows/pause-work.md +250 -0
- package/pp-core/workflows/plan-milestone-gaps.md +281 -0
- package/pp-core/workflows/plan-phase.md +1755 -0
- package/pp-core/workflows/plan-review-convergence.md +369 -0
- package/pp-core/workflows/plant-seed.md +230 -0
- package/pp-core/workflows/pr-branch.md +159 -0
- package/pp-core/workflows/profile-user.md +455 -0
- package/pp-core/workflows/progress.md +756 -0
- package/pp-core/workflows/quick.md +1045 -0
- package/pp-core/workflows/reapply-patches.md +443 -0
- package/pp-core/workflows/remove-phase.md +156 -0
- package/pp-core/workflows/remove-workspace.md +108 -0
- package/pp-core/workflows/resume-project.md +348 -0
- package/pp-core/workflows/review.md +765 -0
- package/pp-core/workflows/scan.md +107 -0
- package/pp-core/workflows/secure-phase.md +184 -0
- package/pp-core/workflows/session-report.md +146 -0
- package/pp-core/workflows/settings-advanced.md +816 -0
- package/pp-core/workflows/settings-integrations.md +312 -0
- package/pp-core/workflows/settings.md +592 -0
- package/pp-core/workflows/ship.md +465 -0
- package/pp-core/workflows/sketch-wrap-up.md +286 -0
- package/pp-core/workflows/sketch.md +361 -0
- package/pp-core/workflows/spec-phase.md +495 -0
- package/pp-core/workflows/spike-wrap-up.md +307 -0
- package/pp-core/workflows/spike.md +453 -0
- package/pp-core/workflows/stats.md +80 -0
- package/pp-core/workflows/sync-skills.md +182 -0
- package/pp-core/workflows/thread.md +222 -0
- package/pp-core/workflows/transition.md +694 -0
- package/pp-core/workflows/ui-phase.md +328 -0
- package/pp-core/workflows/ui-review.md +193 -0
- package/pp-core/workflows/ultraplan-phase.md +199 -0
- package/pp-core/workflows/undo.md +314 -0
- package/pp-core/workflows/update.md +501 -0
- package/pp-core/workflows/validate-phase.md +183 -0
- package/pp-core/workflows/verify-phase.md +569 -0
- package/pp-core/workflows/verify-work.md +804 -0
- package/scripts/affected-tests-lib.cjs +554 -0
- package/scripts/audit-workflow-script-paths.cjs +73 -0
- package/scripts/base64-scan.sh +351 -0
- package/scripts/build-hooks.js +254 -0
- package/scripts/changeset/README.md +129 -0
- package/scripts/changeset/cli.cjs +597 -0
- package/scripts/changeset/github-release-notes.cjs +199 -0
- package/scripts/changeset/lint.cjs +147 -0
- package/scripts/changeset/new.cjs +151 -0
- package/scripts/changeset/parse.cjs +114 -0
- package/scripts/changeset/render.cjs +34 -0
- package/scripts/changeset/serialize.cjs +130 -0
- package/scripts/check-alias-drift.cjs +114 -0
- package/scripts/check-env.cjs +312 -0
- package/scripts/check-npm-integrity.cjs +215 -0
- package/scripts/ci-guard-runner.cjs +22 -0
- package/scripts/ci-prepare-test-scope.cjs +93 -0
- package/scripts/ci-rebase-check.cjs +86 -0
- package/scripts/ci-test-scope.cjs +441 -0
- package/scripts/command-contract-helpers.cjs +64 -0
- package/scripts/diff-touches-shipped-paths.cjs +149 -0
- package/scripts/fix-slash-commands.cjs +161 -0
- package/scripts/gen-capability-registry.cjs +2646 -0
- package/scripts/gen-commands-reference.cjs +139 -0
- package/scripts/gen-inventory-manifest.cjs +114 -0
- package/scripts/gen-loop-host-contract.cjs +526 -0
- package/scripts/gen-research-agents.cjs +276 -0
- package/scripts/generate-package-identity.cjs +134 -0
- package/scripts/issue-dedupe.cjs +278 -0
- package/scripts/issue-version-gate.cjs +140 -0
- package/scripts/lib/allowlist-ratchet.cjs +236 -0
- package/scripts/lib/cli-exit.cjs +56 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +328 -0
- package/scripts/lint-allow-test-rule-refs.cjs +162 -0
- package/scripts/lint-command-contract.cjs +118 -0
- package/scripts/lint-descriptions.cjs +87 -0
- package/scripts/lint-docs-required.cjs +222 -0
- package/scripts/lint-legacy-dir-name.cjs +166 -0
- package/scripts/lint-package-identity-drift.cjs +141 -0
- package/scripts/lint-pr-check-project-dir.cjs +99 -0
- package/scripts/lint-regression-test-names.allowlist.json +269 -0
- package/scripts/lint-regression-test-names.cjs +117 -0
- package/scripts/lint-shell-command-projection-drift.cjs +62 -0
- package/scripts/lint-skill-deps.cjs +185 -0
- package/scripts/lint-test-file-count.allowlist.json +181 -0
- package/scripts/lint-test-file-count.cjs +246 -0
- package/scripts/lint-windows-test-portability.cjs +178 -0
- package/scripts/mutation-matrix.cjs +323 -0
- package/scripts/pr-target-policy.cjs +63 -0
- package/scripts/pr-template-policy.cjs +268 -0
- package/scripts/prompt-injection-scan.sh +207 -0
- package/scripts/registry-smoke.cjs +337 -0
- package/scripts/release-notes/discord-release-summary.cjs +373 -0
- package/scripts/release-notes/format-github-release-notes.cjs +261 -0
- package/scripts/release-tarball-smoke.cjs +763 -0
- package/scripts/research-profiles.cjs +149 -0
- package/scripts/run-affected-tests.cjs +7 -0
- package/scripts/run-tests.cjs +589 -0
- package/scripts/secret-scan-lint.sh +231 -0
- package/scripts/secret-scan.sh +358 -0
- package/scripts/setup-branch-protection.sh +234 -0
- package/scripts/strip-prose-atrefs.cjs +106 -0
- package/scripts/sync-manifest-versions.cjs +119 -0
- package/scripts/sync-next-version.cjs +133 -0
- package/scripts/sync-rulesets.sh +34 -0
- package/scripts/sync-runtime-launcher.cjs +425 -0
- package/scripts/test-failure-reasons.cjs +34 -0
- package/scripts/update-size-baseline.cjs +68 -0
- package/scripts/verify-npm-publish.cjs +240 -0
- package/scripts/verify-opengsd-sweep.cjs +288 -0
- package/scripts/verify-phase-02-rename.sh +258 -0
- package/scripts/verify-phase-03-rename.sh +376 -0
- package/scripts/workflow-policy.cjs +483 -0
- package/scripts/workflow-size.cjs +90 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Deterministic verifier for the /gsd-reapply-patches Step 5 "Hunk Verification
|
|
6
|
+
* Gate". For each backed-up patch file, asserts that the user's added lines
|
|
7
|
+
* (computed from a real diff against the pristine baseline, not from the
|
|
8
|
+
* LLM's prose summary) survive into the merged output.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* node scripts/verify-reapply-patches.cjs \
|
|
12
|
+
* --patches-dir <path> \ # gsd-local-patches/
|
|
13
|
+
* --config-dir <path> \ # ~/.claude (or runtime equivalent)
|
|
14
|
+
* [--pristine-dir <path>] # gsd-pristine/; if absent, falls back to
|
|
15
|
+
* # treating every significant backup line as
|
|
16
|
+
* # required (over-broad but safe for #2969:
|
|
17
|
+
* # false-positive halts beat silent successes
|
|
18
|
+
* # on lost content)
|
|
19
|
+
* [--json] # emit JSON report instead of human text
|
|
20
|
+
*
|
|
21
|
+
* Exit codes:
|
|
22
|
+
* 0 — every user-added line is present in the merged file (gate passes)
|
|
23
|
+
* 1 — at least one missing line in at least one file (gate fails)
|
|
24
|
+
* 2 — usage / structural error (e.g. patches dir missing)
|
|
25
|
+
*
|
|
26
|
+
* Bug #2969: the Step 5 gate previously trusted Claude's free-text "verified:
|
|
27
|
+
* yes/no" reporting per hunk. The LLM was filling in `yes` even when content
|
|
28
|
+
* had been silently dropped. Moving the check to a deterministic script is the
|
|
29
|
+
* durability fix.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
const fs = require('node:fs');
|
|
33
|
+
const path = require('node:path');
|
|
34
|
+
const crypto = require('node:crypto');
|
|
35
|
+
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
36
|
+
|
|
37
|
+
const SIGNIFICANT_MIN_CHARS = 12;
|
|
38
|
+
const GSD_HOOK_VERSION_LINE_RE = /^(?:\/\/|#)\s*(?:gsd|pp)-hook-version:\s*\S+\s*$/i;
|
|
39
|
+
|
|
40
|
+
function parseArgs(argv) {
|
|
41
|
+
const opts = { patchesDir: null, configDir: null, pristineDir: null, json: false };
|
|
42
|
+
for (let i = 0; i < argv.length; i++) {
|
|
43
|
+
const arg = argv[i];
|
|
44
|
+
if (arg === '--patches-dir') opts.patchesDir = argv[++i];
|
|
45
|
+
else if (arg === '--config-dir') opts.configDir = argv[++i];
|
|
46
|
+
else if (arg === '--pristine-dir') opts.pristineDir = argv[++i];
|
|
47
|
+
else if (arg === '--json') opts.json = true;
|
|
48
|
+
else if (arg === '--help' || arg === '-h') {
|
|
49
|
+
process.stdout.write(
|
|
50
|
+
'usage: verify-reapply-patches.cjs --patches-dir <path> --config-dir <path> [--pristine-dir <path>] [--json]\n',
|
|
51
|
+
);
|
|
52
|
+
throw new ExitError(0);
|
|
53
|
+
} else {
|
|
54
|
+
throw new ExitError(2, `unknown argument: ${arg}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return opts;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function isSignificantLine(line) {
|
|
61
|
+
const trimmed = line.trim();
|
|
62
|
+
if (trimmed.length < SIGNIFICANT_MIN_CHARS) return false;
|
|
63
|
+
// Pure punctuation / closing brackets carry too little structural info to
|
|
64
|
+
// reliably distinguish a survived hunk from incidental similarity.
|
|
65
|
+
if (/^[\s})\];,]+$/.test(trimmed)) return false;
|
|
66
|
+
// Generic decorative comments like `// ----` similarly fail the test.
|
|
67
|
+
if (/^[\s\-=#*/]+$/.test(trimmed)) return false;
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function normalizeUpstreamOwnedLine(line) {
|
|
72
|
+
const trimmed = line.trim();
|
|
73
|
+
if (!trimmed) return line;
|
|
74
|
+
if (GSD_HOOK_VERSION_LINE_RE.test(trimmed)) {
|
|
75
|
+
const prefix = trimmed.startsWith('#') ? '#' : '//';
|
|
76
|
+
const marker = trimmed.includes('pp-hook-version') ? 'pp-hook-version' : 'gsd-hook-version';
|
|
77
|
+
return `${prefix} ${marker}: __VERSION_TOKEN__`;
|
|
78
|
+
}
|
|
79
|
+
return line;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Compute the SHA-256 hex digest of a string (UTF-8 encoded).
|
|
84
|
+
*/
|
|
85
|
+
function sha256(content) {
|
|
86
|
+
return crypto.createHash('sha256').update(content, 'utf8').digest('hex');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Read the `pristine_hashes` map from backup-meta.json in the patches dir.
|
|
91
|
+
* Returns an empty object if backup-meta.json is absent, unreadable, or has no
|
|
92
|
+
* `pristine_hashes` field — callers must treat an empty map as "no recorded
|
|
93
|
+
* hash for any file" (no hash-validation possible, not an error).
|
|
94
|
+
*/
|
|
95
|
+
function readPristineHashes(patchesDir) {
|
|
96
|
+
const metaPath = path.join(patchesDir, 'backup-meta.json');
|
|
97
|
+
try {
|
|
98
|
+
const raw = fs.readFileSync(metaPath, 'utf8');
|
|
99
|
+
const parsed = JSON.parse(raw);
|
|
100
|
+
if (parsed && typeof parsed.pristine_hashes === 'object' && parsed.pristine_hashes !== null) {
|
|
101
|
+
return parsed.pristine_hashes;
|
|
102
|
+
}
|
|
103
|
+
} catch {
|
|
104
|
+
// absent or unreadable — not an error, just no recorded hashes
|
|
105
|
+
}
|
|
106
|
+
return {};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Walk a directory, returning every file's path relative to the root.
|
|
111
|
+
*/
|
|
112
|
+
function walk(rootDir, relPrefix = '') {
|
|
113
|
+
const out = [];
|
|
114
|
+
if (!fs.existsSync(rootDir)) return out;
|
|
115
|
+
for (const entry of fs.readdirSync(rootDir, { withFileTypes: true })) {
|
|
116
|
+
const rel = relPrefix ? path.join(relPrefix, entry.name) : entry.name;
|
|
117
|
+
const abs = path.join(rootDir, entry.name);
|
|
118
|
+
if (entry.isDirectory()) {
|
|
119
|
+
out.push(...walk(abs, rel));
|
|
120
|
+
} else if (entry.isFile()) {
|
|
121
|
+
out.push(rel);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Compute the set of "user-added" lines: lines present in the backup but
|
|
129
|
+
* absent from the pristine baseline. If no pristine is provided, falls back
|
|
130
|
+
* to using every significant line in the backup (over-broad but safe — favours
|
|
131
|
+
* false-positive failures over silent successes, which is the right side to
|
|
132
|
+
* err on for #2969).
|
|
133
|
+
*/
|
|
134
|
+
function computeUserAddedLines(backupContent, pristineContent) {
|
|
135
|
+
const backupLines = backupContent.split(/\r?\n/);
|
|
136
|
+
if (!pristineContent) {
|
|
137
|
+
return backupLines.filter(isSignificantLine);
|
|
138
|
+
}
|
|
139
|
+
const pristineSet = new Set(
|
|
140
|
+
pristineContent.split(/\r?\n/).map(normalizeUpstreamOwnedLine),
|
|
141
|
+
);
|
|
142
|
+
return backupLines.filter((line) => {
|
|
143
|
+
if (!isSignificantLine(line)) return false;
|
|
144
|
+
return !pristineSet.has(normalizeUpstreamOwnedLine(line));
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Stable reason codes for the per-file result. Tests assert via
|
|
150
|
+
* `assert.equal(result.reason, REASON.X)` rather than regex-matching prose,
|
|
151
|
+
* so the diagnostic surface is a typed enum, not free text.
|
|
152
|
+
*
|
|
153
|
+
* Adding a new reason requires updating the REASON map AND the tests'
|
|
154
|
+
* shape assertion that locks the documented set of codes.
|
|
155
|
+
*/
|
|
156
|
+
const REASON = Object.freeze({
|
|
157
|
+
OK_NO_USER_LINES_VS_PRISTINE: 'ok_no_user_lines_vs_pristine',
|
|
158
|
+
OK_NO_SIGNIFICANT_BACKUP_LINES: 'ok_no_significant_backup_lines',
|
|
159
|
+
// Bug #3657: the on-disk gsd-pristine/ file's SHA-256 does not match the
|
|
160
|
+
// hash recorded in backup-meta.json.pristine_hashes. This means the
|
|
161
|
+
// pristine snapshot was refreshed to a newer GSD version after the backup
|
|
162
|
+
// was captured. Using the wrong-version pristine as the diff baseline would
|
|
163
|
+
// invert the delta (upstream removals appear as "missing user lines").
|
|
164
|
+
// The verifier skips this file rather than false-failing it. A separate
|
|
165
|
+
// re-anchor step (or the git-aware fallback in the workflow) is needed to
|
|
166
|
+
// resolve this file; the guard here ensures the gate does not report spurious
|
|
167
|
+
// failures in the meantime.
|
|
168
|
+
OK_PRISTINE_DRIFT_DETECTED: 'ok_pristine_drift_detected',
|
|
169
|
+
// Bug #934: backup-meta.json records a pristine_hash for this file but the
|
|
170
|
+
// gsd-pristine/ file is absent from disk. This happens on post-#604-rename
|
|
171
|
+
// installs where saveLocalPatches discarded the only pristine candidate
|
|
172
|
+
// because its hash did not match the old-release hash (the file changed
|
|
173
|
+
// upstream between releases). Without a baseline the verifier cannot
|
|
174
|
+
// distinguish user-added lines from upstream-changed lines, so falling to
|
|
175
|
+
// over-broad mode would produce FAIL_USER_LINES_MISSING false positives for
|
|
176
|
+
// every upstream-removed line. The correct posture is advisory/non-blocking:
|
|
177
|
+
// report OK_NO_BASELINE so the caller can log a warning without halting the
|
|
178
|
+
// gate on a spurious failure. This is a bounded "cannot reason → do not
|
|
179
|
+
// block" rather than "ignore everything" — it only applies when the hash was
|
|
180
|
+
// recorded (modern installer) but the file is absent (specific gap).
|
|
181
|
+
OK_NO_BASELINE: 'ok_no_baseline',
|
|
182
|
+
FAIL_INSTALLED_MISSING: 'fail_installed_missing',
|
|
183
|
+
FAIL_INSTALLED_NOT_REGULAR_FILE: 'fail_installed_not_regular_file',
|
|
184
|
+
FAIL_READ_ERROR: 'fail_read_error',
|
|
185
|
+
FAIL_USER_LINES_MISSING: 'fail_user_lines_missing',
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
function verifyFile({ relPath, patchesDir, configDir, pristineDir, pristineHashes }) {
|
|
189
|
+
const backupPath = path.join(patchesDir, relPath);
|
|
190
|
+
const installedPath = path.join(configDir, relPath);
|
|
191
|
+
const result = { file: relPath, status: 'ok', missing: [], reason: null };
|
|
192
|
+
|
|
193
|
+
if (!fs.existsSync(backupPath) || !fs.statSync(backupPath).isFile()) {
|
|
194
|
+
return result; // walked entry no longer exists — non-fatal
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Installed path checks: must exist, must be a regular file, must be
|
|
198
|
+
// readable. Anything else is a fail-with-diagnostic, not a crash that
|
|
199
|
+
// aborts the whole gate run and drops structured output.
|
|
200
|
+
let installedStat;
|
|
201
|
+
try {
|
|
202
|
+
installedStat = fs.statSync(installedPath);
|
|
203
|
+
} catch {
|
|
204
|
+
result.status = 'fail';
|
|
205
|
+
result.reason = REASON.FAIL_INSTALLED_MISSING;
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
if (!installedStat.isFile()) {
|
|
209
|
+
result.status = 'fail';
|
|
210
|
+
result.reason = REASON.FAIL_INSTALLED_NOT_REGULAR_FILE;
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
let backupContent;
|
|
215
|
+
let installedContent;
|
|
216
|
+
try {
|
|
217
|
+
backupContent = fs.readFileSync(backupPath, 'utf8');
|
|
218
|
+
installedContent = fs.readFileSync(installedPath, 'utf8');
|
|
219
|
+
} catch {
|
|
220
|
+
result.status = 'fail';
|
|
221
|
+
result.reason = REASON.FAIL_READ_ERROR;
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Normalize to forward slashes so the key lookup matches on Windows
|
|
226
|
+
// where path.join produces backslash-separated relPath values but
|
|
227
|
+
// backup-meta.json stores keys written with forward slashes.
|
|
228
|
+
const hashKey = relPath.replace(/\\/g, '/');
|
|
229
|
+
const recordedHash = pristineHashes && pristineHashes[hashKey];
|
|
230
|
+
|
|
231
|
+
let pristineContent = null;
|
|
232
|
+
if (pristineDir) {
|
|
233
|
+
const pristinePath = path.join(pristineDir, relPath);
|
|
234
|
+
// Bug #934: track whether the pristine path EXISTS on disk (stat did not
|
|
235
|
+
// throw ENOENT). A regular file that fails to read, or a non-file path
|
|
236
|
+
// (e.g. a directory accidentally placed at the pristine path), is treated
|
|
237
|
+
// as "present but unusable" — we fall to over-broad mode (safe side).
|
|
238
|
+
// OK_NO_BASELINE is reserved for the strictly absent case: stat throws,
|
|
239
|
+
// meaning the file was never written (the gap the bug describes).
|
|
240
|
+
let pristinePathExists = false;
|
|
241
|
+
try {
|
|
242
|
+
const stat = fs.statSync(pristinePath);
|
|
243
|
+
pristinePathExists = true; // path exists (any type)
|
|
244
|
+
if (stat.isFile()) {
|
|
245
|
+
const candidate = fs.readFileSync(pristinePath, 'utf8');
|
|
246
|
+
// Bug #3657: if backup-meta.json recorded a pristine_hash for this
|
|
247
|
+
// file, validate that the on-disk pristine matches it. A mismatch
|
|
248
|
+
// means the installer refreshed gsd-pristine/ to a newer GSD version
|
|
249
|
+
// after the backup was captured. Using the wrong-version pristine as
|
|
250
|
+
// the diff baseline inverts the delta: upstream removals appear as
|
|
251
|
+
// "user-added lines that must survive", causing FAIL_USER_LINES_MISSING
|
|
252
|
+
// false positives. When the hash is stale, skip the pristine and fall
|
|
253
|
+
// through to over-broad mode (every significant backup line is checked).
|
|
254
|
+
// Over-broad mode never false-fails for a different reason because all
|
|
255
|
+
// backup lines that are genuinely user-added will still be present in a
|
|
256
|
+
// correctly merged install.
|
|
257
|
+
if (recordedHash) {
|
|
258
|
+
if (sha256(candidate) === recordedHash) {
|
|
259
|
+
// Hash matches: the on-disk pristine is the correct baseline.
|
|
260
|
+
pristineContent = candidate;
|
|
261
|
+
} else {
|
|
262
|
+
// Hash mismatch: the on-disk gsd-pristine/ was refreshed to a newer
|
|
263
|
+
// GSD version after the backup was captured. Using it as the diff
|
|
264
|
+
// baseline would invert the delta and produce false FAIL_USER_LINES_MISSING
|
|
265
|
+
// reports (Bug #3657). Report the file as ok with a diagnostic code
|
|
266
|
+
// so the gate does not false-fail; a re-anchor or git-aware baseline
|
|
267
|
+
// step is required to verify this file correctly.
|
|
268
|
+
result.reason = REASON.OK_PRISTINE_DRIFT_DETECTED;
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
} else {
|
|
272
|
+
// No recorded hash for this file (older installer or absent
|
|
273
|
+
// backup-meta) — use the on-disk pristine as-is (pre-fix behaviour).
|
|
274
|
+
pristineContent = candidate;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Non-file at pristinePath (e.g. a directory): stat succeeded so
|
|
278
|
+
// pristinePathExists is true; we fall through to over-broad mode below,
|
|
279
|
+
// which is safe and conservative.
|
|
280
|
+
} catch {
|
|
281
|
+
// Pristine stat threw — path is absent (ENOENT) or inaccessible.
|
|
282
|
+
// pristinePathExists stays false.
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Bug #934: recordedHash is present (modern installer) but the pristine
|
|
286
|
+
// path does not exist on disk at all (stat threw above). This means
|
|
287
|
+
// saveLocalPatches recorded a hash but could not write the corresponding
|
|
288
|
+
// gsd-pristine/ file (the only candidate was discarded because it was from
|
|
289
|
+
// a newer release). Falling to over-broad mode here would treat every
|
|
290
|
+
// upstream-changed line as a "user-added line that must survive", producing
|
|
291
|
+
// false FAIL_USER_LINES_MISSING for each upstream removal. Since we
|
|
292
|
+
// cannot reason correctly without a baseline, the safe answer is advisory/
|
|
293
|
+
// non-blocking: return OK_NO_BASELINE and let the caller decide.
|
|
294
|
+
// NOTE: this guard fires ONLY when stat threw (path absent), not when the
|
|
295
|
+
// path is present but non-file — in that case over-broad mode is safer.
|
|
296
|
+
if (!pristinePathExists && recordedHash) {
|
|
297
|
+
result.reason = REASON.OK_NO_BASELINE;
|
|
298
|
+
return result;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const userAdded = computeUserAddedLines(backupContent, pristineContent);
|
|
303
|
+
if (userAdded.length === 0) {
|
|
304
|
+
// Backup and pristine match exactly (or no significant content) — nothing
|
|
305
|
+
// to verify but also nothing to lose. Report as ok with diagnostic code.
|
|
306
|
+
result.reason = pristineContent
|
|
307
|
+
? REASON.OK_NO_USER_LINES_VS_PRISTINE
|
|
308
|
+
: REASON.OK_NO_SIGNIFICANT_BACKUP_LINES;
|
|
309
|
+
return result;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
for (const line of userAdded) {
|
|
313
|
+
if (!installedContent.includes(line)) {
|
|
314
|
+
result.missing.push(line.trim());
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (result.missing.length > 0) {
|
|
318
|
+
result.status = 'fail';
|
|
319
|
+
result.reason = REASON.FAIL_USER_LINES_MISSING;
|
|
320
|
+
}
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function main() {
|
|
325
|
+
const opts = parseArgs(process.argv.slice(2));
|
|
326
|
+
if (!opts.patchesDir || !opts.configDir) {
|
|
327
|
+
throw new ExitError(2, '--patches-dir and --config-dir are required');
|
|
328
|
+
}
|
|
329
|
+
if (!fs.existsSync(opts.patchesDir)) {
|
|
330
|
+
throw new ExitError(2, `patches dir not found: ${opts.patchesDir}`);
|
|
331
|
+
}
|
|
332
|
+
if (!fs.existsSync(opts.configDir)) {
|
|
333
|
+
throw new ExitError(2, `config dir not found: ${opts.configDir}`);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const files = walk(opts.patchesDir).filter((f) => !f.endsWith('backup-meta.json'));
|
|
337
|
+
// Bug #3657: read pristine_hashes from backup-meta.json once and share
|
|
338
|
+
// across all per-file verifications so each can detect drift independently.
|
|
339
|
+
const pristineHashes = readPristineHashes(opts.patchesDir);
|
|
340
|
+
const results = files.map((relPath) =>
|
|
341
|
+
verifyFile({
|
|
342
|
+
relPath,
|
|
343
|
+
patchesDir: opts.patchesDir,
|
|
344
|
+
configDir: opts.configDir,
|
|
345
|
+
pristineDir: opts.pristineDir,
|
|
346
|
+
pristineHashes,
|
|
347
|
+
}),
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
const failures = results.filter((r) => r.status === 'fail');
|
|
351
|
+
|
|
352
|
+
// Bug #3657 (Finding 1): aggregate drifted files into top-level report fields
|
|
353
|
+
// so workflow Step 5a can gate on drift distinctly from failures. Drift is
|
|
354
|
+
// NOT a failure (exit code stays 0) but the workflow now has structured data
|
|
355
|
+
// to decide whether to proceed. Per-file shape is unchanged: each drifted
|
|
356
|
+
// result still has status:'ok' + reason:OK_PRISTINE_DRIFT_DETECTED for
|
|
357
|
+
// backward compat. The new top-level fields are purely additive.
|
|
358
|
+
const driftedResults = results.filter((r) => r.reason === REASON.OK_PRISTINE_DRIFT_DETECTED);
|
|
359
|
+
const drifted = driftedResults.length;
|
|
360
|
+
const drifted_files = driftedResults.map((r) => r.file);
|
|
361
|
+
|
|
362
|
+
// Bug #934: aggregate no-baseline files into top-level report fields so the
|
|
363
|
+
// workflow can log a warning about files that could not be verified. Like
|
|
364
|
+
// drift, this is NOT a failure (exit code stays 0) but gives the caller
|
|
365
|
+
// structured data to surface the advisory condition.
|
|
366
|
+
const noBaselineResults = results.filter((r) => r.reason === REASON.OK_NO_BASELINE);
|
|
367
|
+
const no_baseline = noBaselineResults.length;
|
|
368
|
+
const no_baseline_files = noBaselineResults.map((r) => r.file);
|
|
369
|
+
|
|
370
|
+
if (opts.json) {
|
|
371
|
+
process.stdout.write(
|
|
372
|
+
JSON.stringify({ checked: results.length, failures: failures.length, drifted, drifted_files, no_baseline, no_baseline_files, results }, null, 2) + '\n',
|
|
373
|
+
);
|
|
374
|
+
} else {
|
|
375
|
+
process.stdout.write(`# Hunk Verification Gate (#2969)\n\n`);
|
|
376
|
+
process.stdout.write(`Checked: ${results.length} file(s)\n`);
|
|
377
|
+
process.stdout.write(`Failures: ${failures.length}\n\n`);
|
|
378
|
+
if (failures.length > 0) {
|
|
379
|
+
process.stdout.write(`## Files with missing user-added content\n\n`);
|
|
380
|
+
for (const r of failures) {
|
|
381
|
+
process.stdout.write(`- ${r.file}\n`);
|
|
382
|
+
if (r.reason) process.stdout.write(` reason: ${r.reason}\n`);
|
|
383
|
+
for (const line of r.missing.slice(0, 5)) {
|
|
384
|
+
process.stdout.write(` missing: ${line}\n`);
|
|
385
|
+
}
|
|
386
|
+
if (r.missing.length > 5) {
|
|
387
|
+
process.stdout.write(` …and ${r.missing.length - 5} more line(s)\n`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return failures.length > 0 ? 1 : 0;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
if (require.main === module) {
|
|
397
|
+
runMain(main);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
module.exports = { computeUserAddedLines, isSignificantLine, verifyFile, walk, REASON, readPristineHashes, sha256 };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Dev Context Profile
|
|
2
|
+
|
|
3
|
+
Agent output guidance for dev mode. Loaded when `context: dev` is set in config.json.
|
|
4
|
+
|
|
5
|
+
## Output Style
|
|
6
|
+
|
|
7
|
+
- Concise, action-oriented responses
|
|
8
|
+
- Lead with the code change or command, follow with brief rationale
|
|
9
|
+
- Skip preamble — assume the developer has full context
|
|
10
|
+
- Use inline code references (`file:line`) over prose descriptions
|
|
11
|
+
|
|
12
|
+
## Focus Areas
|
|
13
|
+
|
|
14
|
+
- Working code that compiles and passes tests
|
|
15
|
+
- Minimal diff — change only what is necessary
|
|
16
|
+
- Flag side effects or breaking changes immediately
|
|
17
|
+
- Surface the next actionable step at the end of every response
|
|
18
|
+
|
|
19
|
+
## Verbosity
|
|
20
|
+
|
|
21
|
+
Low. One-liner explanations unless the change is non-obvious. Omit background theory, alternative approaches, and caveats that do not affect the current task.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Research Context Profile
|
|
2
|
+
|
|
3
|
+
Agent output guidance for research mode. Loaded when `context: research` is set in config.json.
|
|
4
|
+
|
|
5
|
+
## Output Style
|
|
6
|
+
|
|
7
|
+
- Verbose, exploratory responses that surface trade-offs and alternatives
|
|
8
|
+
- Present multiple approaches with pros and cons before recommending one
|
|
9
|
+
- Include links, references, and citations where available
|
|
10
|
+
- Use structured headings and bullet lists for scan-ability
|
|
11
|
+
|
|
12
|
+
## Focus Areas
|
|
13
|
+
|
|
14
|
+
- Breadth of options — enumerate before narrowing
|
|
15
|
+
- Prior art and ecosystem conventions
|
|
16
|
+
- Risks, edge cases, and failure modes
|
|
17
|
+
- Dependencies and compatibility implications
|
|
18
|
+
- Long-term maintainability of each approach
|
|
19
|
+
|
|
20
|
+
## Verbosity
|
|
21
|
+
|
|
22
|
+
High. Explain reasoning, show evidence, and document assumptions. Include background context even if the developer likely knows it — research artifacts are read by future contributors who may not.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Review Context Profile
|
|
2
|
+
|
|
3
|
+
Agent output guidance for review mode. Loaded when `context: review` is set in config.json.
|
|
4
|
+
|
|
5
|
+
## Output Style
|
|
6
|
+
|
|
7
|
+
- Critical, detail-focused responses that prioritize correctness
|
|
8
|
+
- Organize findings by severity: blocking, important, nit
|
|
9
|
+
- Reference specific lines and files for every finding
|
|
10
|
+
- State what is correct as well as what needs change — confirm the good parts
|
|
11
|
+
|
|
12
|
+
## Focus Areas
|
|
13
|
+
|
|
14
|
+
- Correctness — logic errors, off-by-ones, missing edge cases
|
|
15
|
+
- Security — input validation, injection vectors, secret exposure
|
|
16
|
+
- Performance — unnecessary allocations, O(n^2) patterns, missing caching
|
|
17
|
+
- Style and consistency — naming, formatting, import order
|
|
18
|
+
- Test coverage — untested branches, missing assertions, flaky patterns
|
|
19
|
+
- Structural Findings (fallow) — machine-derived cross-module facts injected as `<structural_findings>{ findings: [...], summary: { total, unusedExports, duplicates, circularDependencies } }</structural_findings>`. Render in REVIEW.md under `## Structural Findings (fallow)` as a separate section from narrative findings. Treat as ground truth for cross-module facts; do not re-derive.
|
|
20
|
+
|
|
21
|
+
## Verbosity
|
|
22
|
+
|
|
23
|
+
Medium. Be thorough on findings but terse in explanation. Each issue should be one to three sentences: what is wrong, why it matters, and how to fix it.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Agent Contracts
|
|
2
|
+
|
|
3
|
+
Completion markers and handoff schemas for all GSD agents. Workflows use these markers to detect agent completion and route accordingly.
|
|
4
|
+
|
|
5
|
+
This doc describes what IS, not what should be. Casing inconsistencies are documented as they appear in agent source files.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Agent Registry
|
|
10
|
+
|
|
11
|
+
| Agent | Role | Completion Markers |
|
|
12
|
+
|-------|------|--------------------|
|
|
13
|
+
| pp-planner | Plan creation | `## PLANNING COMPLETE` |
|
|
14
|
+
| pp-executor | Plan execution | `## PLAN COMPLETE`, `## CHECKPOINT REACHED` |
|
|
15
|
+
| pp-phase-researcher | Phase-scoped research | `## RESEARCH COMPLETE`, `## RESEARCH BLOCKED` |
|
|
16
|
+
| pp-project-researcher | Project-wide research | `## RESEARCH COMPLETE`, `## RESEARCH BLOCKED` |
|
|
17
|
+
| pp-plan-checker | Plan validation | `## VERIFICATION PASSED`, `## ISSUES FOUND` |
|
|
18
|
+
| pp-research-synthesizer | Multi-research synthesis | `## SYNTHESIS COMPLETE`, `## SYNTHESIS BLOCKED` |
|
|
19
|
+
| pp-debugger | Debug investigation | `## DEBUG COMPLETE`, `## ROOT CAUSE FOUND`, `## CHECKPOINT REACHED` |
|
|
20
|
+
| pp-roadmapper | Roadmap creation/revision | `## ROADMAP CREATED`, `## ROADMAP REVISED`, `## ROADMAP BLOCKED` |
|
|
21
|
+
| pp-ui-auditor | UI review | `## UI REVIEW COMPLETE` |
|
|
22
|
+
| pp-ui-checker | UI validation | `## ISSUES FOUND` |
|
|
23
|
+
| pp-ui-researcher | UI spec creation | `## UI-SPEC COMPLETE`, `## UI-SPEC BLOCKED` |
|
|
24
|
+
| pp-verifier | Post-execution verification | `## Verification Complete` (title case) |
|
|
25
|
+
| pp-integration-checker | Cross-phase integration check | `## Integration Check Complete` (title case) |
|
|
26
|
+
| pp-nyquist-auditor | Sampling audit | `## PARTIAL`, `## ESCALATE` (non-standard) |
|
|
27
|
+
| pp-security-auditor | Security audit | `## OPEN_THREATS`, `## ESCALATE` (non-standard) |
|
|
28
|
+
| pp-codebase-mapper | Codebase analysis | No marker (writes docs directly) |
|
|
29
|
+
| pp-assumptions-analyzer | Assumption extraction | No marker (returns `## Assumptions` sections) |
|
|
30
|
+
| pp-doc-verifier | Doc validation | No marker (writes JSON to `.planning/tmp/`) |
|
|
31
|
+
| pp-doc-writer | Doc generation | No marker (writes docs directly) |
|
|
32
|
+
| pp-advisor-researcher | Advisory research | No marker (utility agent) |
|
|
33
|
+
| pp-user-profiler | User profiling | No marker (returns JSON in analysis tags) |
|
|
34
|
+
| pp-intel-updater | Codebase intelligence analysis | `## INTEL UPDATE COMPLETE`, `## INTEL UPDATE FAILED` |
|
|
35
|
+
|
|
36
|
+
## Marker Rules
|
|
37
|
+
|
|
38
|
+
1. **ALL-CAPS markers** (e.g., `## PLANNING COMPLETE`) are the standard convention
|
|
39
|
+
2. **Title-case markers** (e.g., `## Verification Complete`) exist in pp-verifier and pp-integration-checker -- these are intentional as-is, not bugs
|
|
40
|
+
3. **Non-standard markers** (e.g., `## PARTIAL`, `## ESCALATE`) in audit agents indicate partial results requiring orchestrator judgment
|
|
41
|
+
4. **Agents without markers** either write artifacts directly to disk or return structured data (JSON/sections) that the caller parses
|
|
42
|
+
5. Markers must appear as H2 headings (`## `) at the start of a line in the agent's final output
|
|
43
|
+
|
|
44
|
+
## Key Handoff Contracts
|
|
45
|
+
|
|
46
|
+
### Planner -> Executor (via PLAN.md)
|
|
47
|
+
|
|
48
|
+
| Field | Required | Description |
|
|
49
|
+
|-------|----------|-------------|
|
|
50
|
+
| Frontmatter | Yes | phase, plan, type, wave, depends_on, files_modified, autonomous, requirements |
|
|
51
|
+
| `<objective>` | Yes | What the plan achieves |
|
|
52
|
+
| `<tasks>` | Yes | Ordered task list with type, files, action, verify, acceptance_criteria |
|
|
53
|
+
| `<verification>` | Yes | Overall verification steps |
|
|
54
|
+
| `<success_criteria>` | Yes | Measurable completion criteria |
|
|
55
|
+
|
|
56
|
+
### Executor -> Verifier (via SUMMARY.md)
|
|
57
|
+
|
|
58
|
+
| Field | Required | Description |
|
|
59
|
+
|-------|----------|-------------|
|
|
60
|
+
| Frontmatter | Yes | phase, plan, subsystem, tags, key-files, metrics |
|
|
61
|
+
| Commits table | Yes | Per-task commit hashes and descriptions |
|
|
62
|
+
| Deviations section | Yes | Auto-fixed issues or "None" |
|
|
63
|
+
| Self-Check | Yes | PASSED or FAILED with details |
|
|
64
|
+
|
|
65
|
+
## Workflow Regex Patterns
|
|
66
|
+
|
|
67
|
+
Workflows match these markers to detect agent completion:
|
|
68
|
+
|
|
69
|
+
**plan-phase.md matches:**
|
|
70
|
+
- `## RESEARCH COMPLETE` / `## RESEARCH BLOCKED` (researcher output)
|
|
71
|
+
- `## PLANNING COMPLETE` (planner output)
|
|
72
|
+
- `## CHECKPOINT REACHED` (planner/executor pause)
|
|
73
|
+
- `## VERIFICATION PASSED` / `## ISSUES FOUND` (plan-checker output)
|
|
74
|
+
|
|
75
|
+
**execute-phase.md matches:**
|
|
76
|
+
- `## PHASE COMPLETE` (all plans in phase done)
|
|
77
|
+
- `## Self-Check: FAILED` (summary self-check)
|
|
78
|
+
|
|
79
|
+
> **NOTE:** `## PLAN COMPLETE` is the pp-executor's completion marker but execute-phase.md does not regex-match it. Instead, it detects executor completion via spot-checks (SUMMARY.md existence, git commit state). This is intentional behavior, not a mismatch.
|