@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,402 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* probe-core — generic spec-phase probe resolution model (ADR-550 Decision 7).
|
|
4
|
+
*
|
|
5
|
+
* Extracted from the edge-probe (the first adapter) once the prohibition probe (#644)
|
|
6
|
+
* proved it the *second* adapter of the same model: one adapter is a hypothetical seam,
|
|
7
|
+
* two is a real one. This module owns everything generic — the resolution lifecycle,
|
|
8
|
+
* the status×verification re-cut, `validateResolution`/`validateRequirement`, the
|
|
9
|
+
* `analyzeCoverage(items, resolutions?, validators)` merge/rollup/orphan-reject engine,
|
|
10
|
+
* the `byVerification` rollup, and the `runProbeCli` I/O scaffold. Each probe is a thin
|
|
11
|
+
* adapter: it supplies the proposal logic (deterministic for edge, LLM-recall for
|
|
12
|
+
* prohibition) and its closed vocabularies via injected validators.
|
|
13
|
+
*
|
|
14
|
+
* Authored as strict TypeScript (`src/probe-core.cts`) and compiled by
|
|
15
|
+
* `tsc -p tsconfig.build.json` to the gitignored runtime artifact
|
|
16
|
+
* `gsd-core/bin/lib/probe-core.cjs`. Do NOT hand-write the `.cjs`; it is emitted.
|
|
17
|
+
*
|
|
18
|
+
* Two orthogonal axes (the re-cut):
|
|
19
|
+
* - status: resolved | dismissed | unresolved — the resolution LIFECYCLE (shared)
|
|
20
|
+
* - verification: <probe-defined> | null — HOW a resolved item is verified
|
|
21
|
+
* The edge adapter declares `verification: explicit | backstop`; the prohibition adapter
|
|
22
|
+
* (#644) will declare `test | judgment`. Splitting the axes keeps the lifecycle enum free
|
|
23
|
+
* of a verification fact and lets a sibling probe add its own tiers without a parallel enum.
|
|
24
|
+
*
|
|
25
|
+
* Typing is hybrid (ADR-550 #5): generic type params for adapter DX, but enforcement runs
|
|
26
|
+
* through injected runtime validators, because the CLI executes over JSON where TS types are
|
|
27
|
+
* erased. The contract test pins the validators, not the types.
|
|
28
|
+
*/
|
|
29
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
30
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
31
|
+
};
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.PROHIBITION_VALIDATORS = exports.VALID_STATUS = void 0;
|
|
34
|
+
exports.validateRequirement = validateRequirement;
|
|
35
|
+
exports.validateResolution = validateResolution;
|
|
36
|
+
exports.analyzeCoverage = analyzeCoverage;
|
|
37
|
+
exports.validateProhibitionResolution = validateProhibitionResolution;
|
|
38
|
+
exports.projectProhibitions = projectProhibitions;
|
|
39
|
+
exports.dispositionForProhibition = dispositionForProhibition;
|
|
40
|
+
exports.runProbeCli = runProbeCli;
|
|
41
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
42
|
+
/** The LOCKED set of valid lifecycle statuses (the re-cut: no covered/backstop). */
|
|
43
|
+
exports.VALID_STATUS = ['resolved', 'dismissed', 'unresolved'];
|
|
44
|
+
function errMessage(e) {
|
|
45
|
+
return e instanceof Error ? e.message : String(e);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Structural guard for the report an adapter's `analyze` returns. The scaffold types `analyze`
|
|
49
|
+
* loosely (it runs over JSON-parsed input the adapter `as`-casts), so a future adapter (#644)
|
|
50
|
+
* that forgets to validate inside its closure could hand back a malformed object. Rather than
|
|
51
|
+
* stringify garbage as green output, `runProbeCli` checks the report shape and fails closed.
|
|
52
|
+
*/
|
|
53
|
+
function isValidReport(report) {
|
|
54
|
+
if (report == null || typeof report !== 'object')
|
|
55
|
+
return false;
|
|
56
|
+
const r = report;
|
|
57
|
+
if (!Array.isArray(r.items))
|
|
58
|
+
return false;
|
|
59
|
+
const c = r.coverage;
|
|
60
|
+
if (c == null || typeof c !== 'object')
|
|
61
|
+
return false;
|
|
62
|
+
if (typeof c.applicable !== 'number' || typeof c.resolved !== 'number' || typeof c.unresolved !== 'number') {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
if (c.byVerification == null || typeof c.byVerification !== 'object')
|
|
66
|
+
return false;
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Validate a requirement's generic structural fields — fail closed on malformed input rather
|
|
71
|
+
* than coercing it. Probe-specific fields (e.g. the edge adapter's `shapes`) are validated by
|
|
72
|
+
* the adapter. Typed loosely because the CLI casts arbitrary parsed JSON to `Requirement`.
|
|
73
|
+
*/
|
|
74
|
+
function validateRequirement(requirement) {
|
|
75
|
+
const r = requirement;
|
|
76
|
+
if (typeof r.id !== 'string' || !r.id.trim()) {
|
|
77
|
+
throw new Error(`requirement id must be a non-empty string (got ${JSON.stringify(r.id)})`);
|
|
78
|
+
}
|
|
79
|
+
if (r.text != null && typeof r.text !== 'string') {
|
|
80
|
+
throw new Error(`requirement ${r.id} text must be a string when present`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Validate a resolution against the probe's injected validators. Rejects an unknown status,
|
|
85
|
+
* a dismissal without a non-empty reason, a `resolved` item with a missing/unknown
|
|
86
|
+
* verification tier, and a `resolved` item missing any field its tier requires (per
|
|
87
|
+
* `requiredFieldsByVerification`). Returns true on success.
|
|
88
|
+
*/
|
|
89
|
+
function validateResolution(r, validators) {
|
|
90
|
+
const key = `${r.requirement_id}::${r.category}`;
|
|
91
|
+
if (!exports.VALID_STATUS.includes(r.status)) {
|
|
92
|
+
throw new Error(`invalid status "${r.status}" for ${key}`);
|
|
93
|
+
}
|
|
94
|
+
// Invariant (this module's header): `verification` is null unless `status` is `resolved`.
|
|
95
|
+
// Enforce it for EVERY status — a dismissed/unresolved resolution carrying a verification
|
|
96
|
+
// tier would otherwise merge verbatim (`analyzeCoverage` below) and silently break the
|
|
97
|
+
// model for the second adapter (#644) that inherits this seam. Fail closed across the full
|
|
98
|
+
// status×verification space, not just `resolved`.
|
|
99
|
+
if (r.status !== 'resolved' && r.verification != null) {
|
|
100
|
+
throw new Error(`verification must be null unless status is "resolved" (got "${r.verification}") for ${key}`);
|
|
101
|
+
}
|
|
102
|
+
// An `unresolved` resolution is an UNACTED item: it must carry no resolution/reason payload.
|
|
103
|
+
// A populated payload is an authoring mistake (the author meant resolved/dismissed) that
|
|
104
|
+
// would otherwise be silently dropped into the unresolved count with no error pointing at
|
|
105
|
+
// it. Reject it so the mistake surfaces.
|
|
106
|
+
if (r.status === 'unresolved') {
|
|
107
|
+
if (r.resolution != null && String(r.resolution).trim()) {
|
|
108
|
+
throw new Error(`unresolved must not carry a resolution (${key})`);
|
|
109
|
+
}
|
|
110
|
+
if (r.reason != null && String(r.reason).trim()) {
|
|
111
|
+
throw new Error(`unresolved must not carry a reason (${key})`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (r.status === 'dismissed' && !(r.reason && String(r.reason).trim())) {
|
|
115
|
+
throw new Error(`dismissed requires a reason (${key})`);
|
|
116
|
+
}
|
|
117
|
+
if (r.status === 'resolved') {
|
|
118
|
+
const tier = r.verification;
|
|
119
|
+
if (tier == null) {
|
|
120
|
+
throw new Error(`resolved requires a verification tier (one of: ${validators.verification.join(', ')}) for ${key}`);
|
|
121
|
+
}
|
|
122
|
+
if (!validators.verification.includes(tier)) {
|
|
123
|
+
throw new Error(`invalid verification "${tier}" for ${key} — must be one of: ${validators.verification.join(', ')}`);
|
|
124
|
+
}
|
|
125
|
+
const required = validators.requiredFieldsByVerification[tier] ?? [];
|
|
126
|
+
for (const field of required) {
|
|
127
|
+
// field is 'resolution' | 'reason'; both are `string | null | undefined` on Resolution,
|
|
128
|
+
// so the indexed access is string-typed (no unknown-to-string coercion).
|
|
129
|
+
const value = r[field];
|
|
130
|
+
if (!(value != null && String(value).trim())) {
|
|
131
|
+
throw new Error(`${tier} requires a ${field} (${key})`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Merge author resolutions onto ALREADY-PROPOSED items and roll up coverage counts.
|
|
139
|
+
*
|
|
140
|
+
* Core operates on `items[]`, never a `proposeFn`: probes have different deterministic
|
|
141
|
+
* surfaces (edge = deterministic propose + LLM resolve; prohibition = LLM propose + deterministic
|
|
142
|
+
* validate/merge), so proposal stays in each adapter and core must not assume it is deterministic.
|
|
143
|
+
*
|
|
144
|
+
* `coverage.resolved` is the COUNT of CLOSED items (`resolved` + `dismissed` status) =
|
|
145
|
+
* `applicable - unresolved` — the pre-re-cut "covered + dismissed + backstop" set,
|
|
146
|
+
* count-preserved. `byVerification` breaks the `resolved`-status items down by tier (each tier
|
|
147
|
+
* initialized to 0). Throws on any invalid resolution, a duplicate, an orphan (a resolution
|
|
148
|
+
* matching no proposed item), or a proposed item whose category is outside `validators.categories`.
|
|
149
|
+
*/
|
|
150
|
+
function analyzeCoverage(items, resolutions = [], validators) {
|
|
151
|
+
if (!Array.isArray(items)) {
|
|
152
|
+
throw new Error('items must be an array');
|
|
153
|
+
}
|
|
154
|
+
const key = (r) => `${r.requirement_id}::${r.category}`;
|
|
155
|
+
const resMap = new Map();
|
|
156
|
+
for (const r of resolutions) {
|
|
157
|
+
validateResolution(r, validators);
|
|
158
|
+
if (resMap.has(key(r))) {
|
|
159
|
+
throw new Error(`duplicate resolution for ${key(r)}`);
|
|
160
|
+
}
|
|
161
|
+
resMap.set(key(r), r);
|
|
162
|
+
}
|
|
163
|
+
const validCategories = new Set(validators.categories);
|
|
164
|
+
const merged = [];
|
|
165
|
+
const itemKeys = new Set();
|
|
166
|
+
for (const item of items) {
|
|
167
|
+
if (!validCategories.has(item.category)) {
|
|
168
|
+
throw new Error(`item ${key(item)} has unknown category "${item.category}" — not one of: ${validators.categories.join(', ')}`);
|
|
169
|
+
}
|
|
170
|
+
itemKeys.add(key(item));
|
|
171
|
+
const o = resMap.get(key(item));
|
|
172
|
+
if (o) {
|
|
173
|
+
merged.push({ ...item, status: o.status, verification: o.verification ?? null, resolution: o.resolution ?? null, reason: o.reason ?? null });
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// No author resolution: the item is rolled up VERBATIM, so its own status/fields must be
|
|
177
|
+
// valid too. The edge adapter only proposes `unresolved` items, but the prohibition adapter
|
|
178
|
+
// (#644) proposes LLM-generated items that arrive already populated — one carrying an
|
|
179
|
+
// out-of-enum status (e.g. the dropped "covered") or `dismissed` with no reason would
|
|
180
|
+
// otherwise be counted closed without validation. An Item is structurally a superset of a
|
|
181
|
+
// Resolution, so the same fail-closed check guards both. (ADR-550 Decision 5 hardens this
|
|
182
|
+
// shared seam for the second adapter; m1.)
|
|
183
|
+
validateResolution(item, validators);
|
|
184
|
+
merged.push(item);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Reject orphan resolutions — a resolution whose (requirement_id, category) matches no
|
|
188
|
+
// proposed item (typo'd category or a non-applicable one) would otherwise be silently
|
|
189
|
+
// dropped, leaving the author believing an item is resolved while the report shows it
|
|
190
|
+
// unresolved (adversarial-review HIGH; preserved from the edge-probe's original engine).
|
|
191
|
+
for (const k of resMap.keys()) {
|
|
192
|
+
if (!itemKeys.has(k)) {
|
|
193
|
+
throw new Error(`unknown resolution for ${k} — no matching proposed item (typo'd category or non-applicable shape?)`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const unresolved = merged.filter((i) => i.status === 'unresolved').length;
|
|
197
|
+
const applicable = merged.length;
|
|
198
|
+
const resolved = applicable - unresolved; // closed set: resolved-status + dismissed
|
|
199
|
+
const byVerification = {};
|
|
200
|
+
for (const tier of validators.verification)
|
|
201
|
+
byVerification[tier] = 0;
|
|
202
|
+
for (const i of merged) {
|
|
203
|
+
if (i.status === 'resolved' && i.verification != null) {
|
|
204
|
+
byVerification[i.verification] = (byVerification[i.verification] ?? 0) + 1;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return { items: merged, coverage: { applicable, resolved, unresolved, byVerification } };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* The prohibition adapter's injected runtime validators (ADR-550 #5). There is no closed
|
|
211
|
+
* category taxonomy (recall is open-vocabulary values/safety/ethics prose), so `categories`
|
|
212
|
+
* is intentionally empty — `analyzeCoverage` is not the prohibition entry point and the
|
|
213
|
+
* round-trip schema layer does not gate on category. The verification tiers are
|
|
214
|
+
* `test | judgment` (ADR-550 D7a); both require only a present `resolution`/`reason` per their
|
|
215
|
+
* lifecycle (a resolved prohibition's checkable content is the `statement`, validated by the
|
|
216
|
+
* schema layer, not a `resolution` string), so `requiredFieldsByVerification` is the minimal
|
|
217
|
+
* fail-closed set: a dismissed item still needs its reason (enforced by `validateResolution`).
|
|
218
|
+
*/
|
|
219
|
+
exports.PROHIBITION_VALIDATORS = {
|
|
220
|
+
categories: [],
|
|
221
|
+
verification: ['test', 'judgment'],
|
|
222
|
+
// A resolved prohibition's checkable content is the `statement` (schema-layer validated), NOT a
|
|
223
|
+
// `resolution` string — the canonical fixtures and the reference doc's worked examples all carry
|
|
224
|
+
// `resolution: null`. So the per-tier required set is empty: `resolved` still requires a present
|
|
225
|
+
// verification tier (enforced in validateResolution) and `dismissed` still requires a reason
|
|
226
|
+
// (enforced unconditionally), but neither tier requires a `resolution`. This matches the corpus
|
|
227
|
+
// the docs-fixtures parity test pins; the validators.test.cjs regression keeps them aligned.
|
|
228
|
+
requiredFieldsByVerification: { test: [], judgment: [] },
|
|
229
|
+
};
|
|
230
|
+
/** Validate a prohibition resolution against the prohibition verification vocabulary. */
|
|
231
|
+
function validateProhibitionResolution(resolution) {
|
|
232
|
+
return validateResolution(resolution, exports.PROHIBITION_VALIDATORS);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Deterministically project resolved prohibition items into the `must_haves.prohibitions:`
|
|
236
|
+
* list shape (the SPEC<->plan projection; ADR-550 Decision 5c). This is a FUNCTION the parity
|
|
237
|
+
* assertion round-trips, never a prompt: the same input always yields the same output, and the
|
|
238
|
+
* output is the exact re-readable block shape `parseMustHavesBlock(content, 'prohibitions')`
|
|
239
|
+
* returns — `{ statement, status, verification }` plus `reason` only when present (a dismissed
|
|
240
|
+
* item's audit trail). `resolution`/`requirement_id`/`category` are recall-stage bookkeeping
|
|
241
|
+
* and are intentionally NOT projected into the plan block (which is keyed on the must-NOT
|
|
242
|
+
* statement, not the source requirement). A non-array input projects to `[]` (fail-soft on the
|
|
243
|
+
* empty/zero-prohibition case), never a throw.
|
|
244
|
+
*
|
|
245
|
+
* An OPTIONAL wired-check descriptor (#1278) projects as the LOCKED flat scalar keys
|
|
246
|
+
* `check_kind`/`check_target`/`check_rule` (NEVER a nested `check:{}` object; `failFirst` is never
|
|
247
|
+
* projected). These ride the EXISTING continuation-KV path of `parseMustHavesBlock`
|
|
248
|
+
* (src/frontmatter.cts:344) with NO shared-parser rewrite (IMPL-SCOPING §3 Option 1). The keys are
|
|
249
|
+
* emitted ONLY for a well-formed descriptor (valid `check_kind` + non-empty `check_target`; plus
|
|
250
|
+
* `check_rule` only for a lint-rule that carries one); a descriptor-less or under-specified item is
|
|
251
|
+
* byte-identical to today (CHK-07), so an under-specified descriptor projects absent and fails closed
|
|
252
|
+
* at the producer downstream (CHK-06), never as a partial-but-locatable green.
|
|
253
|
+
*/
|
|
254
|
+
function projectProhibitions(items) {
|
|
255
|
+
if (!Array.isArray(items))
|
|
256
|
+
return [];
|
|
257
|
+
const out = [];
|
|
258
|
+
for (const item of items) {
|
|
259
|
+
if (item == null || typeof item !== 'object')
|
|
260
|
+
continue;
|
|
261
|
+
const p = item;
|
|
262
|
+
const statement = typeof p.statement === 'string' ? p.statement : '';
|
|
263
|
+
const entry = {
|
|
264
|
+
statement,
|
|
265
|
+
status: typeof p.status === 'string' ? p.status : 'unresolved',
|
|
266
|
+
};
|
|
267
|
+
if (p.verification != null)
|
|
268
|
+
entry.verification = String(p.verification);
|
|
269
|
+
if (p.reason != null && String(p.reason).trim())
|
|
270
|
+
entry.reason = String(p.reason);
|
|
271
|
+
// Optional wired-check descriptor (#1278): emit flat scalars ONLY when well-formed. A valid kind
|
|
272
|
+
// plus a non-empty target is the minimum; under that bar nothing is emitted (CHK-07 byte-identity,
|
|
273
|
+
// and the producer fails closed on the absent descriptor — CHK-06).
|
|
274
|
+
const kind = p.check_kind;
|
|
275
|
+
const targetOk = typeof p.check_target === 'string' && p.check_target.trim() !== '';
|
|
276
|
+
if ((kind === 'node-test' || kind === 'lint-rule') && targetOk) {
|
|
277
|
+
entry.check_kind = kind;
|
|
278
|
+
entry.check_target = String(p.check_target);
|
|
279
|
+
// `check_rule` rides only the lint-rule path (node-test never carries one); a lint-rule missing
|
|
280
|
+
// its rule leaves check_rule absent so the producer's fail-closed locate rejects it (CHK-06).
|
|
281
|
+
if (kind === 'lint-rule' && typeof p.check_rule === 'string' && p.check_rule.trim() !== '') {
|
|
282
|
+
entry.check_rule = String(p.check_rule);
|
|
283
|
+
}
|
|
284
|
+
// `check_violation_fixture` (#1346) rides BOTH kinds — it's what the #1279 prover machine-proves
|
|
285
|
+
// fail-first against. Emit ONLY a non-empty fixture (a blank one projects absent so green still
|
|
286
|
+
// hard-gates downstream — never a partial green); meaningless without the descriptor, so it lives
|
|
287
|
+
// inside this well-formed-descriptor branch.
|
|
288
|
+
if (typeof p.check_violation_fixture === 'string' && p.check_violation_fixture.trim() !== '') {
|
|
289
|
+
entry.check_violation_fixture = String(p.check_violation_fixture);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
out.push(entry);
|
|
293
|
+
}
|
|
294
|
+
return out;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Deterministic verify-time disposition for a single prohibition — the FAIL-CLOSED default
|
|
298
|
+
* (ADR-550 Decision 5d, the safety half of the 2026-06-12 "B-with-guard" maintainer decision).
|
|
299
|
+
*
|
|
300
|
+
* This is the cheap safety guarantee: a well-formed prohibition that reaches verify-phase with NO
|
|
301
|
+
* wired enforcement evidence can NEVER be a silent pass. It is `{ status: 'unverified', flagged:
|
|
302
|
+
* true }` — never `green` — exactly like an unresolved judgment item. The HEAVY half (a real
|
|
303
|
+
* negative-test enforcement mechanism that, given evidence, flips a test-tier item to green) was OUT
|
|
304
|
+
* of #644 scope and LANDED in #1259 as the `prohibition-enforcement` producer (it builds the
|
|
305
|
+
* `enforcementEvidence` this helper reads). This helper's policy is unchanged: ANY prohibition
|
|
306
|
+
* without enforcement evidence — test- or judgment-tier — disposes as flagged-unverified.
|
|
307
|
+
*
|
|
308
|
+
* The function is pure: same input always yields the same disposition (no LLM judgment, ADR-550
|
|
309
|
+
* D5). The LLM-judge soft-gate for judgment-tier items is a verify-phase PROSE concern (the
|
|
310
|
+
* verifier records a non-authoritative verdict + the unverified-prohibition flag); this helper
|
|
311
|
+
* only owns the deterministic fail-closed default that the plan-01-01 CI safety assertion pins.
|
|
312
|
+
*/
|
|
313
|
+
function dispositionForProhibition(prohibition, context = {}) {
|
|
314
|
+
const p = (prohibition ?? {});
|
|
315
|
+
const tier = p.verification === 'test' || p.verification === 'judgment' ? p.verification : null;
|
|
316
|
+
const evidence = Array.isArray(context.enforcementEvidence) ? context.enforcementEvidence : [];
|
|
317
|
+
const hasEnforcement = evidence.length > 0;
|
|
318
|
+
// FAIL CLOSED: no wired enforcement evidence -> flagged unverified, never green. This holds for
|
|
319
|
+
// every tier (the producer that builds enforcement evidence for a test-tier item — the
|
|
320
|
+
// `prohibition-enforcement` module — landed in #1259). The guard the safety assertion proves: an
|
|
321
|
+
// unwired item can never be silently skipped.
|
|
322
|
+
if (!hasEnforcement) {
|
|
323
|
+
return {
|
|
324
|
+
status: 'unverified',
|
|
325
|
+
flagged: true,
|
|
326
|
+
tier,
|
|
327
|
+
reason: tier === 'test'
|
|
328
|
+
? 'test-tier prohibition has no passing wired enforcement check — flagged unverified (fail-closed; never a silent pass, ADR-550 D5d)'
|
|
329
|
+
: 'prohibition has no enforcement evidence — flagged unverified (fail-closed; never a silent pass, ADR-550 D5d)',
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
// D4 GUARD: a judgment-tier (or unknown-tier) prohibition is NEVER a silent green from this
|
|
333
|
+
// deterministic helper — it always routes to human/LLM judgment review (ADR-550 D4; verify-phase.md).
|
|
334
|
+
// Only a test-tier item with wired enforcement evidence may go green; the producer that supplies
|
|
335
|
+
// that evidence (`prohibition-enforcement`, #1259) runs the wired check and requires a genuine pass.
|
|
336
|
+
if (tier === 'test') {
|
|
337
|
+
return {
|
|
338
|
+
status: 'green',
|
|
339
|
+
flagged: false,
|
|
340
|
+
tier,
|
|
341
|
+
reason: 'test-tier prohibition has wired enforcement evidence',
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
status: 'unverified',
|
|
346
|
+
flagged: true,
|
|
347
|
+
tier,
|
|
348
|
+
reason: 'judgment-tier prohibition routes to judgment review — never a silent green (ADR-550 D4)',
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Read the requirements file (and optional resolutions file), run the adapter's `analyze`,
|
|
353
|
+
* and write the report as pretty JSON + newline. With no requirements path, writes the usage
|
|
354
|
+
* line to stderr and exits 2. A JSON-parse failure or any `analyze` throw is a handled error:
|
|
355
|
+
* stderr + exit 2, never an uncaught stack trace — so the engine's fail-closed validation
|
|
356
|
+
* surfaces at the workflow boundary rather than failing open.
|
|
357
|
+
*/
|
|
358
|
+
function runProbeCli(analyze, options) {
|
|
359
|
+
const argv = options.argv ?? process.argv;
|
|
360
|
+
const readFile = options.readFile ?? ((p) => node_fs_1.default.readFileSync(p, 'utf8'));
|
|
361
|
+
const write = options.write ?? ((s) => { process.stdout.write(s); });
|
|
362
|
+
const writeErr = options.writeErr ?? ((s) => { process.stderr.write(s); });
|
|
363
|
+
const exit = options.exit ?? ((code) => { process.exit(code); });
|
|
364
|
+
const reqPath = argv[2];
|
|
365
|
+
const resPath = argv[3];
|
|
366
|
+
if (!reqPath) {
|
|
367
|
+
writeErr(`usage: ${options.usage}\n`);
|
|
368
|
+
exit(2);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
let requirements;
|
|
372
|
+
try {
|
|
373
|
+
requirements = JSON.parse(readFile(reqPath));
|
|
374
|
+
}
|
|
375
|
+
catch (e) {
|
|
376
|
+
writeErr(`error: cannot parse JSON from ${reqPath}: ${errMessage(e)}\n`);
|
|
377
|
+
exit(2);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
let resolutions = [];
|
|
381
|
+
if (resPath) {
|
|
382
|
+
try {
|
|
383
|
+
resolutions = JSON.parse(readFile(resPath));
|
|
384
|
+
}
|
|
385
|
+
catch (e) {
|
|
386
|
+
writeErr(`error: cannot parse JSON from ${resPath}: ${errMessage(e)}\n`);
|
|
387
|
+
exit(2);
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
try {
|
|
392
|
+
const report = analyze(requirements, resolutions);
|
|
393
|
+
if (!isValidReport(report)) {
|
|
394
|
+
throw new Error('adapter returned a structurally-invalid coverage report (expected { items[], coverage{ applicable, resolved, unresolved, byVerification } })');
|
|
395
|
+
}
|
|
396
|
+
write(`${JSON.stringify(report, null, 2)}\n`);
|
|
397
|
+
}
|
|
398
|
+
catch (e) {
|
|
399
|
+
writeErr(`error: ${errMessage(e)}\n`);
|
|
400
|
+
exit(2);
|
|
401
|
+
}
|
|
402
|
+
}
|