@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,125 @@
|
|
|
1
|
+
# Domain-Aware Probing Patterns
|
|
2
|
+
|
|
3
|
+
Shared reference for `/pp-begin`, `/pp:discuss-phase`, and domain exploration workflows.
|
|
4
|
+
|
|
5
|
+
When the user mentions a technology area, use these probes to ask insightful follow-up questions. Don't run through them as a checklist -- pick the 2-3 most relevant based on context. The goal is to surface hidden assumptions and trade-offs the user may not have considered yet.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Authentication
|
|
10
|
+
|
|
11
|
+
| User mentions | Agent probes with domain knowledge |
|
|
12
|
+
|---|---|
|
|
13
|
+
| "login" or "auth" | OAuth (which providers?), JWT, or session-based? Do you need social login or just email/password? |
|
|
14
|
+
| "users" or "accounts" | MFA required? Password reset flow? Email verification? |
|
|
15
|
+
| "sessions" | Session duration and refresh strategy? Server-side sessions or stateless tokens? |
|
|
16
|
+
| "roles" or "permissions" | RBAC, ABAC, or simple role checks? How many distinct roles? |
|
|
17
|
+
| "API keys" | Key rotation strategy? Scoped permissions per key? Rate limiting per key? |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Real-Time Updates
|
|
22
|
+
|
|
23
|
+
| User mentions | Agent probes with domain knowledge |
|
|
24
|
+
|---|---|
|
|
25
|
+
| "real-time" or "live updates" | WebSockets, SSE, or polling? What specifically needs to be real-time vs. eventual? |
|
|
26
|
+
| "notifications" | Push notifications (browser/mobile), in-app only, or both? Persistence and read receipts? |
|
|
27
|
+
| "collaboration" or "multiplayer" | Conflict resolution strategy? Operational transforms or CRDTs? Expected concurrent users? |
|
|
28
|
+
| "chat" or "messaging" | Message history and search? Typing indicators? Read receipts? |
|
|
29
|
+
| "streaming" | Reconnection strategy? What happens when the connection drops -- queue or discard? |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Dashboard
|
|
34
|
+
|
|
35
|
+
| User mentions | Agent probes with domain knowledge |
|
|
36
|
+
|---|---|
|
|
37
|
+
| "dashboard" | What data sources feed it? How many distinct views? |
|
|
38
|
+
| "charts" or "graphs" | Interactive or static? Drill-down capability? Export to CSV/PDF? |
|
|
39
|
+
| "metrics" or "KPIs" | Refresh strategy -- real-time, periodic polling, or on-demand? Acceptable staleness? |
|
|
40
|
+
| "admin panel" | Role-based visibility? Which actions beyond viewing (edit, delete, approve)? |
|
|
41
|
+
| "mobile" or "responsive" | Simplified mobile view or full parity? Touch interactions for charts? |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## API Design
|
|
46
|
+
|
|
47
|
+
| User mentions | Agent probes with domain knowledge |
|
|
48
|
+
|---|---|
|
|
49
|
+
| "API" | REST, GraphQL, or RPC-style? Internal only or public-facing? |
|
|
50
|
+
| "endpoints" or "routes" | Versioning strategy (URL path, header, query param)? Breaking change policy? |
|
|
51
|
+
| "pagination" | Cursor-based or offset? Expected result set sizes? Stable ordering guarantee? |
|
|
52
|
+
| "rate limiting" | Per-user, per-IP, or per-API-key? Burst allowance? How to communicate limits to clients? |
|
|
53
|
+
| "errors" | Structured error format? Error codes vs. messages? How much detail in production errors? |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Database
|
|
58
|
+
|
|
59
|
+
| User mentions | Agent probes with domain knowledge |
|
|
60
|
+
|---|---|
|
|
61
|
+
| "database" or "storage" | SQL or NoSQL? What drives the choice -- relational integrity, flexibility, scale? |
|
|
62
|
+
| "ORM" or "queries" | ORM (which one?) or raw queries? Query builder as middle ground? |
|
|
63
|
+
| "migrations" | Migration tool? Rollback strategy? How do you handle data migrations vs. schema migrations? |
|
|
64
|
+
| "seeding" or "test data" | Seed data for development? Realistic fake data or minimal fixtures? |
|
|
65
|
+
| "scale" or "performance" | Read/write ratio? Read replicas? Connection pooling strategy? |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Search
|
|
70
|
+
|
|
71
|
+
| User mentions | Agent probes with domain knowledge |
|
|
72
|
+
|---|---|
|
|
73
|
+
| "search" | Full-text or exact match? Dedicated search engine (Elasticsearch, Meilisearch) or database-level? |
|
|
74
|
+
| "filtering" or "facets" | Faceted filtering? How many filter dimensions? Combined filters (AND/OR)? |
|
|
75
|
+
| "autocomplete" or "typeahead" | Debounce strategy? Minimum character threshold? Result ranking? |
|
|
76
|
+
| "indexing" | Index size and update frequency? Real-time indexing or batch? Acceptable index lag? |
|
|
77
|
+
| "fuzzy" or "typo tolerance" | Fuzzy matching? Synonym support? Language-specific stemming? |
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## File Upload/Storage
|
|
82
|
+
|
|
83
|
+
| User mentions | Agent probes with domain knowledge |
|
|
84
|
+
|---|---|
|
|
85
|
+
| "upload" or "file upload" | Local filesystem or cloud (S3, GCS, Azure Blob)? Direct upload or through server? |
|
|
86
|
+
| "images" or "media" | Processing pipeline -- resize, compress, thumbnail generation? Format conversion? |
|
|
87
|
+
| "size limits" | Max file size? Max total storage per user? What happens when limits are hit? |
|
|
88
|
+
| "CDN" | CDN for delivery? Cache invalidation for updated files? Signed URLs for access control? |
|
|
89
|
+
| "documents" or "attachments" | Virus scanning? Preview generation? Versioning of uploaded files? |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Caching
|
|
94
|
+
|
|
95
|
+
| User mentions | Agent probes with domain knowledge |
|
|
96
|
+
|---|---|
|
|
97
|
+
| "caching" or "performance" | Where to cache -- browser, CDN, application layer, database query cache? |
|
|
98
|
+
| "invalidation" | Invalidation strategy -- TTL, event-driven, or manual? Cache-aside vs. write-through? |
|
|
99
|
+
| "stale data" | Acceptable staleness window? Stale-while-revalidate pattern? |
|
|
100
|
+
| "Redis" or "Memcached" | Cache topology -- single node or clustered? Persistence needed or pure cache? |
|
|
101
|
+
| "CDN" or "edge" | Edge caching for static assets? Dynamic content at the edge? Cache key strategy? |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Testing
|
|
106
|
+
|
|
107
|
+
| User mentions | Agent probes with domain knowledge |
|
|
108
|
+
|---|---|
|
|
109
|
+
| "testing" or "tests" | Unit, integration, and E2E balance? Where do you invest most testing effort? |
|
|
110
|
+
| "mocking" or "stubs" | Mock external services or use test containers? Database mocking strategy? |
|
|
111
|
+
| "CI" or "pipeline" | Tests in CI? Parallel test execution? Test-on-PR or test-on-push? |
|
|
112
|
+
| "coverage" | Coverage targets? Coverage as gate or advisory? Which metrics (line, branch, function)? |
|
|
113
|
+
| "E2E" or "browser testing" | Playwright, Cypress, or other? Headed vs. headless? Visual regression testing? |
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Deployment
|
|
118
|
+
|
|
119
|
+
| User mentions | Agent probes with domain knowledge |
|
|
120
|
+
|---|---|
|
|
121
|
+
| "deploy" or "hosting" | Container, serverless, or traditional VM/VPS? Managed platform (Vercel, Railway) or self-hosted? |
|
|
122
|
+
| "CI/CD" or "pipeline" | GitHub Actions, GitLab CI, or other? Deploy on merge to main or manual trigger? |
|
|
123
|
+
| "environments" | How many environments (dev, staging, prod)? Environment parity strategy? |
|
|
124
|
+
| "rollback" | Rollback strategy? Blue-green, canary, or instant rollback? Database rollback considerations? |
|
|
125
|
+
| "secrets" or "config" | Secret management -- env vars, vault, or platform-native? Per-environment config strategy? |
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"items": [
|
|
3
|
+
{ "requirement_id": "R1", "category": "boundary", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What happens exactly at each min/max/threshold — and one step either side?" },
|
|
4
|
+
{ "requirement_id": "R1", "category": "precision", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?" }
|
|
5
|
+
],
|
|
6
|
+
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{ "id": "R1", "text": "Round a number to N decimal places, rounding half to nearest" }]
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"items": [
|
|
3
|
+
{ "requirement_id": "R1", "category": "adjacency", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
|
4
|
+
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
|
5
|
+
{ "requirement_id": "R1", "category": "ordering", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When elements compare equal, is output order specified and stable?" }
|
|
6
|
+
],
|
|
7
|
+
"coverage": { "applicable": 3, "resolved": 0, "unresolved": 3, "byVerification": { "explicit": 0, "backstop": 0 } }
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{ "id": "R1", "text": "Merge a list of overlapping intervals into the minimal set" }]
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"items": [
|
|
3
|
+
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
|
4
|
+
{ "requirement_id": "R1", "category": "encoding", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Whose definition of length/equality applies — bytes, code points, grapheme clusters, or normalized form?" }
|
|
5
|
+
],
|
|
6
|
+
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{ "id": "R1", "text": "Truncate a display string to its first N characters" }]
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"items": [
|
|
3
|
+
{ "requirement_id": "R1", "category": "boundary", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What happens exactly at each min/max/threshold — and one step either side?" },
|
|
4
|
+
{ "requirement_id": "R1", "category": "precision", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?" }
|
|
5
|
+
],
|
|
6
|
+
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{ "id": "R1", "text": "Compute the total price as an amount rounded to two decimals" }]
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"items": [
|
|
3
|
+
{ "requirement_id": "R1", "category": "adjacency", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
|
4
|
+
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
|
5
|
+
{ "requirement_id": "R1", "category": "ordering", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When elements compare equal, is output order specified and stable?" }
|
|
6
|
+
],
|
|
7
|
+
"coverage": { "applicable": 3, "resolved": 0, "unresolved": 3, "byVerification": { "explicit": 0, "backstop": 0 } }
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{ "id": "R1", "text": "Return all items in the list with duplicates removed" }]
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"items": [
|
|
3
|
+
{ "requirement_id": "R1", "category": "adjacency", "status": "resolved", "verification": "explicit", "resolution": "AC#6: touching intervals merge", "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
|
4
|
+
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
|
5
|
+
{ "requirement_id": "R1", "category": "ordering", "status": "dismissed", "verification": null, "resolution": null, "reason": "output is canonically sorted; no tie possible", "probe": "When elements compare equal, is output order specified and stable?" }
|
|
6
|
+
],
|
|
7
|
+
"coverage": { "applicable": 3, "resolved": 2, "unresolved": 1, "byVerification": { "explicit": 1, "backstop": 0 } }
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{ "id": "R1", "text": "Merge a list of overlapping intervals into the minimal set" }]
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
[
|
|
2
|
+
{ "requirement_id": "R1", "category": "adjacency", "status": "resolved", "verification": "explicit", "resolution": "AC#6: touching intervals merge", "reason": null },
|
|
3
|
+
{ "requirement_id": "R1", "category": "ordering", "status": "dismissed", "resolution": null, "reason": "output is canonically sorted; no tie possible" }
|
|
4
|
+
]
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# Edge-Probe — Spec-Completeness Reference
|
|
2
|
+
|
|
3
|
+
Shared reference for the spec/requirements phase. Companion to
|
|
4
|
+
`@~/.claude/pp-core/references/domain-probes.md`: `domain-probes` covers the
|
|
5
|
+
**technology axis** (auth, search, caching, deployment); this covers the
|
|
6
|
+
**data/behavior-shape axis** (boundaries, adjacency, encoding, ordering…). Walk each
|
|
7
|
+
requirement against the closed taxonomy below, propose a concrete candidate edge for each
|
|
8
|
+
applicable category, and resolve each to exactly one state. Adopt the established QA names
|
|
9
|
+
verbatim — this is decades-old black-box test technique, moved upstream to the spec layer.
|
|
10
|
+
|
|
11
|
+
This doc is written in generic `requirements → checks → verifier` terms with no
|
|
12
|
+
tool-specific vocabulary, so it is portable: copy it into any spec/requirements process.
|
|
13
|
+
A short mapping table at the end binds it to common host structures.
|
|
14
|
+
|
|
15
|
+
## Why front-of-pipeline
|
|
16
|
+
|
|
17
|
+
A goal-backward verifier only checks assertions that exist; an assertion only exists for a
|
|
18
|
+
requirement that was written down. A domain-boundary edge the author never surfaced is
|
|
19
|
+
invisible to the verifier — and worse, the verifier is *confidently wrong* about it
|
|
20
|
+
(measured: ~0.93 confidence while catching 0/12 omitted-edge defects, an expected
|
|
21
|
+
calibration error of 0.81 — worse than a coin flip — versus 100% / 0.03 on edges the spec
|
|
22
|
+
did state). The fix is not a better verifier or a confidence gate; confidence is
|
|
23
|
+
uninformative across these regimes. The fix is **spec completeness**: surface the omitted
|
|
24
|
+
edge into an explicit, checkable assertion *before* any code exists, after which the
|
|
25
|
+
verifier reliably catches it.
|
|
26
|
+
|
|
27
|
+
The underlying techniques are classic and should be named as such — **Boundary Value
|
|
28
|
+
Analysis**, **Equivalence Partitioning**, the **Category-Partition method**, and
|
|
29
|
+
**Metamorphic Relations**; property-based testing (PBT) is the academic name for the
|
|
30
|
+
held-out backstop. The literature applies these at the *test* layer (back of pipeline,
|
|
31
|
+
generating checks). The differentiated move here is **placement, not technique**: apply the
|
|
32
|
+
same edge taxonomy at the *spec* layer (front of pipeline, generating requirements), with
|
|
33
|
+
the explicit goal of extending a verifier's reach. Recent LLM spec work corroborates the
|
|
34
|
+
core finding that the spec layer is the measured weak point:
|
|
35
|
+
|
|
36
|
+
- SLD-Spec — program slicing + logical deletion (code→spec): arXiv 2509.09917
|
|
37
|
+
- Specine / AutoReSpec / SpecMind — spec alignment & postcondition inference
|
|
38
|
+
- CodeSpecBench (2604.12268), OSVBench (2504.20964), VERINA (2505.23135) — benchmarks
|
|
39
|
+
showing models solve tasks far better than they generate precise behavioral specs
|
|
40
|
+
- LLM property-based tests for edge cases: arXiv 2510.25297 (PBT+EBT ≈ 81% edge detection)
|
|
41
|
+
|
|
42
|
+
## Inputs
|
|
43
|
+
|
|
44
|
+
A list of requirements, each a `{ id, text, shapes? }` record where `text` is a testable
|
|
45
|
+
statement and `shapes` is an optional author-supplied override of the data/behavior shape.
|
|
46
|
+
The five shapes are: `numeric-range`, `collection`, `text`, `stateful`, `io`. When
|
|
47
|
+
`shapes` is absent, a heuristic classifier proposes them from the requirement prose
|
|
48
|
+
(propose-then-confirm) — the author may correct the shape.
|
|
49
|
+
|
|
50
|
+
## Taxonomy (8 categories)
|
|
51
|
+
|
|
52
|
+
Closed and small by design: a fixed eight the author must explicitly clear beats thirty
|
|
53
|
+
nobody finishes. The failure mode being eliminated was never "too few categories" — it was
|
|
54
|
+
that no taxonomy was *systematically applied at all*. Categories 1, 2, and 4 alone cover
|
|
55
|
+
the three canonical corpus defects (banker's-rounding ties, touching intervals, grapheme
|
|
56
|
+
truncation). Growth happens via optional domain packs, not by bloating the core.
|
|
57
|
+
|
|
58
|
+
| id | name (QA term) | applies to shapes | probe question |
|
|
59
|
+
|----|----------------|-------------------|----------------|
|
|
60
|
+
| boundary | Boundary values | numeric-range | What happens exactly at each min/max/threshold — and one step either side? |
|
|
61
|
+
| adjacency | Adjacency / touching | collection | When two things are exactly equal or just touch, do they merge, collide, or separate? |
|
|
62
|
+
| empty | Empty / degenerate | collection, text | What is the result for empty, single-element, or null input? |
|
|
63
|
+
| encoding | Encoding / representation | text | Whose definition of length/equality applies — bytes, code points, grapheme clusters, or normalized form? |
|
|
64
|
+
| ordering | Ordering / stability | collection | When elements compare equal, is output order specified and stable? |
|
|
65
|
+
| precision | Precision / overflow | numeric-range | Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)? |
|
|
66
|
+
| idempotency | Idempotency / repetition | stateful | What happens if this runs twice on the same input? |
|
|
67
|
+
| concurrency | Concurrency / effect ordering | stateful, io | If interrupted or run in parallel, what is guaranteed? |
|
|
68
|
+
|
|
69
|
+
## Relevance filter + resolution states
|
|
70
|
+
|
|
71
|
+
Two rules keep the probe honest and prevent an "everything is N/A" failure mode:
|
|
72
|
+
|
|
73
|
+
1. **Relevance filter first.** Classify each requirement's shape, then raise only the
|
|
74
|
+
categories whose `applies to shapes` intersect that requirement's shapes. A pure-text
|
|
75
|
+
requirement is never asked about overflow. This is what makes an unresolved edge
|
|
76
|
+
meaningful: it is an edge that *applies* and was not addressed.
|
|
77
|
+
2. **Dismissal requires a reason string.** "N/A — input is a bounded enum, no boundary
|
|
78
|
+
exists" is valid; silence is not. The reason string is the audit trail.
|
|
79
|
+
|
|
80
|
+
**Zero-classification surfaces an `unclassified` candidate (#1110).** The relevance filter is
|
|
81
|
+
a heuristic over prose cues, so a requirement whose wording *is* edge-relevant but matches no
|
|
82
|
+
shape cue would otherwise classify to zero shapes → zero edges and vanish from coverage with
|
|
83
|
+
no signal — the same silent blind spot the probe exists to catch. Instead, a requirement with
|
|
84
|
+
non-empty prose, no authored `shapes`, and zero matched shapes surfaces exactly one soft
|
|
85
|
+
`unclassified — review manually` candidate (`category: "unclassified"`, `status: "unresolved"`).
|
|
86
|
+
It is a dismissible nudge — resolve it, or dismiss it with a reason (e.g. a genuinely edge-free
|
|
87
|
+
static-asset requirement) — never a hard block. `unclassified` is a review signal, **not** a
|
|
88
|
+
ninth taxonomy category: the closed eight above are unchanged, and an explicit `shapes: []`
|
|
89
|
+
opt-out stays silent (the author's deliberate "no edge surface").
|
|
90
|
+
|
|
91
|
+
Each raised edge carries two orthogonal axes — a resolution **lifecycle** and, when
|
|
92
|
+
resolved, a **verification** tier (ADR-550 Decision 7, the shared probe-core model):
|
|
93
|
+
|
|
94
|
+
- **status** — `resolved | dismissed | unresolved`:
|
|
95
|
+
- **resolved** — the edge is addressed; *how* it is addressed is the verification tier.
|
|
96
|
+
- **dismissed** — not applicable, accompanied by a required, non-empty reason string.
|
|
97
|
+
- **unresolved** — carried forward and flagged; the author chose not to resolve it yet.
|
|
98
|
+
- **verification** (only when `status` is `resolved`; `null` otherwise) — `explicit | backstop`:
|
|
99
|
+
- **explicit** — a checkable assertion for the edge is written (a SPEC acceptance criterion).
|
|
100
|
+
- **backstop** — a held-out / property-based test stands in for an edge the author knows
|
|
101
|
+
but cannot fully articulate in prose (records intent; the test body is authored later).
|
|
102
|
+
|
|
103
|
+
Splitting these axes keeps the lifecycle enum free of a verification fact (the old single
|
|
104
|
+
enum smuggled `covered`/`backstop` — both *resolved* — into one flat list) and lets sibling
|
|
105
|
+
probes add their own verification tiers (e.g. `test | judgment`) without a parallel enum.
|
|
106
|
+
|
|
107
|
+
`coverage.resolved` is the count of **closed** edges — `resolved` + `dismissed` (the
|
|
108
|
+
pre-re-cut "covered + dismissed + backstop" set, count-preserved). An `unresolved`
|
|
109
|
+
*applicable* edge is the precise signal a soft completeness gate raises.
|
|
110
|
+
|
|
111
|
+
## Output schema
|
|
112
|
+
|
|
113
|
+
The probe emits, per edge, an item of the form:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
{ requirement_id, category, status, verification, resolution, reason, probe }
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
plus a coverage summary:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
coverage: { applicable, resolved, unresolved, byVerification: { explicit, backstop } }
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`applicable` is the number of raised edges, `resolved` = closed (`resolved` + `dismissed`)
|
|
126
|
+
status edges, `unresolved` is the remainder, and `byVerification` breaks the
|
|
127
|
+
`resolved`-status edges down by tier (probe-agnostic in core; the edge adapter declares
|
|
128
|
+
`{ explicit, backstop }`). This JSON is the stable contract both the reference
|
|
129
|
+
implementation and any third-party port emit.
|
|
130
|
+
|
|
131
|
+
## Generic mapping (requirements → checks → verifier)
|
|
132
|
+
|
|
133
|
+
| Host structure | "requirement" | a `resolved`/`explicit` edge becomes | a `resolved`/`backstop` edge becomes |
|
|
134
|
+
|----------------|---------------|--------------------------|---------------------------|
|
|
135
|
+
| GSD SPEC | a SPEC Requirement | an Acceptance Criterion that `plan-phase` lifts into `must_haves.truths` | a non-inferable check in `must_haves.truths` (needs a held-out/PBT test) |
|
|
136
|
+
| Gherkin feature | a Scenario | an additional `Then` assertion / Scenario Outline row | a tagged scenario routed to a property test |
|
|
137
|
+
| OpenAPI operation | an operation | a response/constraint example + schema rule | a contract/property test on the operation |
|
|
138
|
+
| Docstring contract | a documented behavior | an assertion in the contract test | a property-based test for the function |
|
|
139
|
+
|
|
140
|
+
The portable invariant: a `resolved`/`explicit` edge produces **the unit your verifier
|
|
141
|
+
iterates over** (GSD: a `must_haves.truth`); a `resolved`/`backstop` edge produces a test
|
|
142
|
+
added to that same set as a non-inferable check. An `unresolved` edge is an explicit
|
|
143
|
+
assumption the downstream planner must surface, not silently drop.
|
|
144
|
+
|
|
145
|
+
## Worked example (merge-intervals)
|
|
146
|
+
|
|
147
|
+
Given a single requirement with no resolutions yet:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
[{ "id": "R1", "text": "Merge a list of overlapping intervals into the minimal set" }]
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
the requirement classifies as a `collection`, which raises `adjacency`, `empty`, and
|
|
154
|
+
`ordering` (but not `boundary`/`precision`/`encoding`/`idempotency`/`concurrency`). With no
|
|
155
|
+
resolutions supplied, every applicable edge is `unresolved`:
|
|
156
|
+
|
|
157
|
+
```json edge-probe:02-merge-intervals/expected-coverage.json
|
|
158
|
+
{
|
|
159
|
+
"items": [
|
|
160
|
+
{ "requirement_id": "R1", "category": "adjacency", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
|
161
|
+
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
|
162
|
+
{ "requirement_id": "R1", "category": "ordering", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When elements compare equal, is output order specified and stable?" }
|
|
163
|
+
],
|
|
164
|
+
"coverage": { "applicable": 3, "resolved": 0, "unresolved": 3, "byVerification": { "explicit": 0, "backstop": 0 } }
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
The `adjacency` row is the one that catches the canonical defect: `[[1,2],[2,3]]` intervals
|
|
169
|
+
that only *touch* — does the spec say they merge? Resolving it `resolved`/`explicit` writes
|
|
170
|
+
that assertion, and the verifier can then enforce it. This worked-example block is kept
|
|
171
|
+
byte-for-byte (parsed-JSON) identical to its fixture by `edge-probe-docs-fixtures.test.cjs`,
|
|
172
|
+
so the doc and the reference implementation cannot silently drift.
|
|
173
|
+
|
|
174
|
+
## Worked example (round-half-even)
|
|
175
|
+
|
|
176
|
+
Given a requirement to round floating-point values using the banker's-rounding (half-even)
|
|
177
|
+
rule, the requirement classifies as `numeric-range`, which raises `boundary` and `precision`
|
|
178
|
+
(but not `adjacency`/`empty`/`ordering`/`encoding`/`idempotency`/`concurrency`):
|
|
179
|
+
|
|
180
|
+
```json edge-probe:01-round-half-even/expected-coverage.json
|
|
181
|
+
{
|
|
182
|
+
"items": [
|
|
183
|
+
{ "requirement_id": "R1", "category": "boundary", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What happens exactly at each min/max/threshold — and one step either side?" },
|
|
184
|
+
{ "requirement_id": "R1", "category": "precision", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?" }
|
|
185
|
+
],
|
|
186
|
+
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
The `precision` row surfaces the canonical defect for this requirement: IEEE 754 floating-point
|
|
191
|
+
arithmetic rounds 2.5 to 2 (not 3) under half-even — the probe asks whether the spec
|
|
192
|
+
states that contract explicitly, so the verifier can enforce it.
|
|
193
|
+
|
|
194
|
+
## Worked example (truncate-graphemes)
|
|
195
|
+
|
|
196
|
+
Given a requirement to truncate a string to N grapheme clusters (not bytes or code points),
|
|
197
|
+
the requirement classifies as `text`, which raises `empty` and `encoding`:
|
|
198
|
+
|
|
199
|
+
```json edge-probe:03-truncate-graphemes/expected-coverage.json
|
|
200
|
+
{
|
|
201
|
+
"items": [
|
|
202
|
+
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
|
203
|
+
{ "requirement_id": "R1", "category": "encoding", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Whose definition of length/equality applies — bytes, code points, grapheme clusters, or normalized form?" }
|
|
204
|
+
],
|
|
205
|
+
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
The `encoding` row is the load-bearing one: a requirement that says "truncate to 10
|
|
210
|
+
characters" is ambiguous — the spec must state whether "character" means bytes, UTF-16
|
|
211
|
+
code units, Unicode code points, or grapheme clusters (emoji sequences are 1 grapheme,
|
|
212
|
+
multiple code points).
|
|
213
|
+
|
|
214
|
+
## Worked example (money-rounding)
|
|
215
|
+
|
|
216
|
+
Given a requirement to round monetary amounts to two decimal places, the requirement
|
|
217
|
+
classifies as `numeric-range`, which raises `boundary` and `precision`:
|
|
218
|
+
|
|
219
|
+
```json edge-probe:04-money-rounding/expected-coverage.json
|
|
220
|
+
{
|
|
221
|
+
"items": [
|
|
222
|
+
{ "requirement_id": "R1", "category": "boundary", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What happens exactly at each min/max/threshold — and one step either side?" },
|
|
223
|
+
{ "requirement_id": "R1", "category": "precision", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?" }
|
|
224
|
+
],
|
|
225
|
+
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
The `boundary` row asks what the minimum and maximum representable values are (negative
|
|
230
|
+
amounts? fractional cents?). The `precision` row asks whether IEEE 754 binary rounding
|
|
231
|
+
can produce `$0.30000000000000004` — the spec must commit to a representation.
|
|
232
|
+
|
|
233
|
+
## Worked example (list-dedupe)
|
|
234
|
+
|
|
235
|
+
Given a requirement to deduplicate a list of items, the requirement classifies as
|
|
236
|
+
`collection`, which raises `adjacency`, `empty`, and `ordering`:
|
|
237
|
+
|
|
238
|
+
```json edge-probe:05-list-dedupe/expected-coverage.json
|
|
239
|
+
{
|
|
240
|
+
"items": [
|
|
241
|
+
{ "requirement_id": "R1", "category": "adjacency", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
|
242
|
+
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
|
243
|
+
{ "requirement_id": "R1", "category": "ordering", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When elements compare equal, is output order specified and stable?" }
|
|
244
|
+
],
|
|
245
|
+
"coverage": { "applicable": 3, "resolved": 0, "unresolved": 3, "byVerification": { "explicit": 0, "backstop": 0 } }
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
The `ordering` row is the non-obvious one: dedupe removes duplicates, but which copy is
|
|
250
|
+
kept — first occurrence, last, or implementation-defined? The spec must commit.
|
|
251
|
+
|
|
252
|
+
## Worked example (resolved-mixed)
|
|
253
|
+
|
|
254
|
+
The same merge-intervals requirement after a resolution session where `adjacency` was
|
|
255
|
+
resolved with an explicit acceptance criterion, `ordering` was dismissed, and `empty` was
|
|
256
|
+
left unresolved:
|
|
257
|
+
|
|
258
|
+
```json edge-probe:06-resolved-mixed/expected-coverage.json
|
|
259
|
+
{
|
|
260
|
+
"items": [
|
|
261
|
+
{ "requirement_id": "R1", "category": "adjacency", "status": "resolved", "verification": "explicit", "resolution": "AC#6: touching intervals merge", "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
|
262
|
+
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
|
263
|
+
{ "requirement_id": "R1", "category": "ordering", "status": "dismissed", "verification": null, "resolution": null, "reason": "output is canonically sorted; no tie possible", "probe": "When elements compare equal, is output order specified and stable?" }
|
|
264
|
+
],
|
|
265
|
+
"coverage": { "applicable": 3, "resolved": 2, "unresolved": 1, "byVerification": { "explicit": 1, "backstop": 0 } }
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
`coverage.resolved` is 2 — the closed set (adjacency=`resolved`/`explicit` + ordering=`dismissed`);
|
|
270
|
+
`unresolved` is 1 (empty); `byVerification.explicit` is 1 (the single explicitly-verified
|
|
271
|
+
edge), `backstop` 0. The soft gate raises on this example because one applicable edge remains
|
|
272
|
+
unresolved — the author must either specify, dismiss, or backstop it before writing the SPEC.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Execute-Phase — MVP+TDD Gate (Runtime Enforcement)
|
|
2
|
+
|
|
3
|
+
> Loaded by `execute-phase` workflow and `pp-executor` agent only when **both** `MVP_MODE=true` AND `TDD_MODE=true` for the phase. Defines the runtime gate that blocks behavior-adding tasks until a failing-test commit exists.
|
|
4
|
+
|
|
5
|
+
## When this gate fires
|
|
6
|
+
|
|
7
|
+
- `MVP_MODE` is `true` (resolved from CLI flag → ROADMAP `**Mode:**` field → config; see `references/planner-mvp-mode.md`).
|
|
8
|
+
- `TDD_MODE` is `true` (resolved from `--tdd` flag → `workflow.tdd_mode` config).
|
|
9
|
+
- The current task being executed has `tdd="true"` in its `<task>` frontmatter (set by the planner per Phase 1).
|
|
10
|
+
- The task's `<behavior>` block lists at least one expected behavior.
|
|
11
|
+
|
|
12
|
+
If any of these is false, the gate is inactive — execution proceeds normally.
|
|
13
|
+
|
|
14
|
+
## What the gate checks
|
|
15
|
+
|
|
16
|
+
For each task gated by MVP+TDD, the executor MUST verify (before running the implementation step):
|
|
17
|
+
|
|
18
|
+
1. **A failing-test commit exists.** Search git log on the current branch for a commit matching `test({phase}-{plan})` whose subject mentions the same plan as the current task. The commit must touch a test file (`*.test.*`, `*.spec.*`, `tests/**`).
|
|
19
|
+
2. **The test was actually red.** The commit message body or the executor's recent shell history must show the test failed when first run. Acceptable evidence:
|
|
20
|
+
- Commit message contains `RED:` prefix or `(RED)` tag
|
|
21
|
+
- Recent terminal output shows `FAIL` or non-zero exit on the new test before any implementation commit
|
|
22
|
+
3. **No implementation commit yet.** No `feat({phase}-{plan})` commit may exist for the same plan ID before the failing-test commit.
|
|
23
|
+
|
|
24
|
+
If any check fails, the gate trips.
|
|
25
|
+
|
|
26
|
+
## What "behavior-adding task" means
|
|
27
|
+
|
|
28
|
+
A task is behavior-adding when:
|
|
29
|
+
- Its frontmatter has `tdd="true"` AND
|
|
30
|
+
- Its `<behavior>` block names at least one user-visible outcome (not a config-only or doc-only task) AND
|
|
31
|
+
- Its `<files>` list includes at least one source file (not exclusively docs/tests/config files such as `*.md`, `*.json`, `*.test.*`, `*.spec.*`, `*.yml`, `*.yaml`, `*.toml`, `*.ini`, `.env*`)
|
|
32
|
+
|
|
33
|
+
Pure documentation, configuration, or test-only tasks are skipped by this gate even when both modes are active.
|
|
34
|
+
|
|
35
|
+
## What happens when the gate trips
|
|
36
|
+
|
|
37
|
+
The executor MUST:
|
|
38
|
+
|
|
39
|
+
1. Halt before running the task's implementation step.
|
|
40
|
+
2. Emit a structured halt report:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
44
|
+
MVP+TDD GATE TRIPPED — Plan {plan_id}, Task {task_id}
|
|
45
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
46
|
+
|
|
47
|
+
Reason: {missing_red_commit | red_commit_not_failing | feat_before_test}
|
|
48
|
+
|
|
49
|
+
Behavior expected to be tested:
|
|
50
|
+
- {first behavior bullet}
|
|
51
|
+
|
|
52
|
+
Required next step:
|
|
53
|
+
1. Write a failing test for the behavior above.
|
|
54
|
+
2. Commit it as: test({phase}-{plan}): {short description}
|
|
55
|
+
3. Re-run /pp:execute-phase
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
3. Exit the current execution wave cleanly. Do NOT roll back any prior commits in the same wave.
|
|
59
|
+
4. Update `STATE.md` with `last_gate_trip: {plan_id}/{task_id}` so the user can resume after writing the test.
|
|
60
|
+
|
|
61
|
+
## Escalation: end-of-phase TDD review under MVP+TDD
|
|
62
|
+
|
|
63
|
+
The existing end-of-phase TDD review (in `workflows/execute-phase.md`'s `tdd_review_checkpoint` step) is normally **advisory** — it surfaces gate violations but does not block phase completion.
|
|
64
|
+
|
|
65
|
+
Under MVP+TDD, escalate this to **blocking**:
|
|
66
|
+
- If any TDD plan is missing a RED or GREEN commit, the executor MUST refuse to mark the phase complete.
|
|
67
|
+
- The user is shown the same review table, but the verdict line reads:
|
|
68
|
+
> "Phase blocked: {N} TDD plan(s) violate the RED→GREEN gate sequence under MVP+TDD. Resolve and re-run /pp:execute-phase, or override with `/pp:execute-phase {phase} --force-mvp-gate` to ship anyway."
|
|
69
|
+
|
|
70
|
+
The `--force-mvp-gate` flag is documented but not introduced by this plan — it is the escape hatch the spec mentions; if the user later builds it, the workflow already references the contract.
|
|
71
|
+
|
|
72
|
+
## What this gate does NOT do
|
|
73
|
+
|
|
74
|
+
- It does not enforce REFACTOR commits. REFACTOR remains optional (per `references/tdd.md`).
|
|
75
|
+
- It does not check test quality (the test could be trivially passing). That's the planner's job.
|
|
76
|
+
- It does not run tests. The executor only inspects git log + file system. Running tests is the implementation step's job.
|
|
77
|
+
- It does not gate config-only or doc-only tasks (see "behavior-adding task" definition).
|
|
78
|
+
|
|
79
|
+
## Compatibility with existing TDD discipline
|
|
80
|
+
|
|
81
|
+
This gate is additive to `references/tdd.md`. Tasks not under MVP+TDD continue to use the existing advisory TDD discipline (RED/GREEN/REFACTOR commits with end-of-phase review checkpoint). Only the runtime gate and the blocking escalation are new.
|