@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,495 @@
|
|
|
1
|
+
<purpose>
|
|
2
|
+
Clarify WHAT a phase delivers through a Socratic interview loop with quantitative ambiguity scoring.
|
|
3
|
+
Produces a SPEC.md with falsifiable requirements that discuss-phase treats as locked decisions.
|
|
4
|
+
|
|
5
|
+
This workflow handles "what" and "why" — discuss-phase handles "how".
|
|
6
|
+
</purpose>
|
|
7
|
+
|
|
8
|
+
<ambiguity_model>
|
|
9
|
+
Score each dimension 0.0 (completely unclear) to 1.0 (crystal clear):
|
|
10
|
+
|
|
11
|
+
| Dimension | Weight | Minimum | What it measures |
|
|
12
|
+
|-------------------|--------|---------|---------------------------------------------------|
|
|
13
|
+
| Goal Clarity | 35% | 0.75 | Is the outcome specific and measurable? |
|
|
14
|
+
| Boundary Clarity | 25% | 0.70 | What's in scope vs out of scope? |
|
|
15
|
+
| Constraint Clarity| 20% | 0.65 | Performance, compatibility, data requirements? |
|
|
16
|
+
| Acceptance Criteria| 20% | 0.70 | How do we know it's done? |
|
|
17
|
+
|
|
18
|
+
**Ambiguity score** = 1.0 − (0.35×goal + 0.25×boundary + 0.20×constraint + 0.20×acceptance)
|
|
19
|
+
|
|
20
|
+
**Gate:** ambiguity ≤ 0.20 AND all dimensions ≥ their minimums → ready to write SPEC.md.
|
|
21
|
+
|
|
22
|
+
A score of 0.20 means 80% weighted clarity — enough precision that the planner won't silently make wrong assumptions.
|
|
23
|
+
</ambiguity_model>
|
|
24
|
+
|
|
25
|
+
<interview_perspectives>
|
|
26
|
+
Rotate through these perspectives — each naturally surfaces different blindspots:
|
|
27
|
+
|
|
28
|
+
**Researcher (rounds 1–2):** Ground the discussion in current reality.
|
|
29
|
+
- "What exists in the codebase today related to this phase?"
|
|
30
|
+
- "What's the delta between today and the target state?"
|
|
31
|
+
- "What triggers this work — what's broken or missing?"
|
|
32
|
+
|
|
33
|
+
**Simplifier (round 2):** Surface minimum viable scope.
|
|
34
|
+
- "What's the simplest version that solves the core problem?"
|
|
35
|
+
- "If you had to cut 50%, what's the irreducible core?"
|
|
36
|
+
- "What would make this phase a success even without the nice-to-haves?"
|
|
37
|
+
|
|
38
|
+
**Boundary Keeper (round 3):** Lock the perimeter.
|
|
39
|
+
- "What explicitly will NOT be done in this phase?"
|
|
40
|
+
- "What adjacent problems is it tempting to solve but shouldn't?"
|
|
41
|
+
- "What does 'done' look like — what's the final deliverable?"
|
|
42
|
+
|
|
43
|
+
**Failure Analyst (round 4):** Find the edge cases that invalidate requirements.
|
|
44
|
+
- "What's the worst thing that could go wrong if we get the requirements wrong?"
|
|
45
|
+
- "What does a broken version of this look like?"
|
|
46
|
+
- "What would cause a verifier to reject the output?"
|
|
47
|
+
|
|
48
|
+
**Seed Closer (rounds 5–6):** Lock remaining undecided territory.
|
|
49
|
+
- "We have [dimension] at [score] — what would make it completely clear?"
|
|
50
|
+
- "The remaining ambiguity is in [area] — can we make a decision now?"
|
|
51
|
+
- "Is there anything you'd regret not specifying before planning starts?"
|
|
52
|
+
</interview_perspectives>
|
|
53
|
+
|
|
54
|
+
<process>
|
|
55
|
+
|
|
56
|
+
## Step 1: Initialize
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
_PP_SHIM_NAME="pp-tools.cjs"; _PP_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; PP_TOOLS="${_PP_RUNTIME_ROOT}/pp-core/bin/${_PP_SHIM_NAME}"; if [ -f "$PP_TOOLS" ]; then pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${_PP_RUNTIME_ROOT}/.claude/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${_PP_RUNTIME_ROOT}/.claude/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${_PP_RUNTIME_ROOT}/.codex/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${_PP_RUNTIME_ROOT}/.codex/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif command -v pp-tools >/dev/null 2>&1; then PP_TOOLS="$(command -v pp-tools)"; pp_run() { "$PP_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="$HOME/.claude/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${HERMES_HOME:-$HOME/.hermes}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CODEX_HOME:-$HOME/.codex}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; else echo "ERROR: pp-tools.cjs not found at $PP_TOOLS and pp-tools is not on PATH. Run: npx -y @pareto4/pp-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${PP_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${PP_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
|
|
60
|
+
INIT=$(pp_run init phase-op "${PHASE}")
|
|
61
|
+
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Parse JSON for: `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `padded_phase`, `state_path`, `requirements_path`, `roadmap_path`, `planning_path`, `response_language`, `commit_docs`.
|
|
65
|
+
|
|
66
|
+
**If `response_language` is set:** All user-facing text in this workflow MUST be in `{response_language}`. Technical terms, code, and file paths stay in English.
|
|
67
|
+
|
|
68
|
+
**If `phase_found` is false:**
|
|
69
|
+
```
|
|
70
|
+
Phase [X] not found in roadmap.
|
|
71
|
+
Use /pp:progress to see available phases.
|
|
72
|
+
```
|
|
73
|
+
Exit.
|
|
74
|
+
|
|
75
|
+
**Check for existing SPEC.md:**
|
|
76
|
+
```bash
|
|
77
|
+
ls ${phase_dir}/*-SPEC.md 2>/dev/null | grep -v AI-SPEC | head -1 || true
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
If SPEC.md already exists:
|
|
81
|
+
|
|
82
|
+
**If `--auto`:** Auto-select "Update it". Log: `[auto] SPEC.md exists — updating.`
|
|
83
|
+
|
|
84
|
+
**Otherwise:** Use AskUserQuestion:
|
|
85
|
+
- header: "Spec"
|
|
86
|
+
- question: "Phase [X] already has a SPEC.md. What do you want to do?"
|
|
87
|
+
- options:
|
|
88
|
+
- "Update it" — Revise and re-score
|
|
89
|
+
- "View it" — Show current spec
|
|
90
|
+
- "Skip" — Exit (use existing spec as-is)
|
|
91
|
+
|
|
92
|
+
If "View": Display SPEC.md, then offer Update/Skip.
|
|
93
|
+
If "Skip": Exit with message: "Existing SPEC.md unchanged. Run /pp:discuss-phase [X] to continue."
|
|
94
|
+
If "Update": Load existing SPEC.md, continue to Step 3.
|
|
95
|
+
|
|
96
|
+
## Step 2: Scout Codebase
|
|
97
|
+
|
|
98
|
+
**Read these files before any questions:**
|
|
99
|
+
- `{requirements_path}` — Project requirements
|
|
100
|
+
- `{state_path}` — Decisions already made, current phase, blockers
|
|
101
|
+
- ROADMAP.md phase entry — Phase description, goals, canonical refs
|
|
102
|
+
|
|
103
|
+
**Grep the codebase** for code/files relevant to this phase goal. Look for:
|
|
104
|
+
- Existing implementations of similar functionality
|
|
105
|
+
- Integration points where new code will connect
|
|
106
|
+
- Test coverage gaps relevant to the phase
|
|
107
|
+
- Prior phase artifacts (SUMMARY.md, VERIFICATION.md) that inform current state
|
|
108
|
+
|
|
109
|
+
**Synthesize current state** — the grounded baseline for the interview:
|
|
110
|
+
- What exists today related to this phase
|
|
111
|
+
- The gap between current state and the phase goal
|
|
112
|
+
- The primary deliverable: what file/behavior/capability does NOT exist yet?
|
|
113
|
+
|
|
114
|
+
Confirm your current state synthesis internally. Do not present it to the user yet — you'll use it to ask precise, grounded questions.
|
|
115
|
+
|
|
116
|
+
## Step 3: First Ambiguity Assessment
|
|
117
|
+
|
|
118
|
+
Before questioning begins, score the phase's current ambiguity based only on what ROADMAP.md and REQUIREMENTS.md say:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
Goal Clarity: [score 0.0–1.0]
|
|
122
|
+
Boundary Clarity: [score 0.0–1.0]
|
|
123
|
+
Constraint Clarity: [score 0.0–1.0]
|
|
124
|
+
Acceptance Criteria:[score 0.0–1.0]
|
|
125
|
+
|
|
126
|
+
Ambiguity: [score] ([calculate])
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**If `--auto` and initial ambiguity already ≤ 0.20 with all minimums met:** Skip interview — derive SPEC.md directly from roadmap + requirements. Log: `[auto] Phase requirements are already sufficiently clear — generating SPEC.md from existing context.` Jump to Step 6.
|
|
130
|
+
|
|
131
|
+
**Otherwise:** Continue to Step 4.
|
|
132
|
+
|
|
133
|
+
## Step 4: Socratic Interview Loop
|
|
134
|
+
|
|
135
|
+
**Max 6 rounds.** Each round: 2–3 questions max. End round after user responds.
|
|
136
|
+
|
|
137
|
+
**Round selection by perspective:**
|
|
138
|
+
- Round 1: Researcher
|
|
139
|
+
- Round 2: Researcher + Simplifier
|
|
140
|
+
- Round 3: Boundary Keeper
|
|
141
|
+
- Round 4: Failure Analyst
|
|
142
|
+
- Rounds 5–6: Seed Closer (focus on lowest-scoring dimensions)
|
|
143
|
+
|
|
144
|
+
**After each round:**
|
|
145
|
+
1. Update all 4 dimension scores from the user's answers
|
|
146
|
+
2. Calculate new ambiguity score
|
|
147
|
+
3. Display the updated scoring:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
After round [N]:
|
|
151
|
+
Goal Clarity: [score] (min 0.75) [✓ or ↑ needed]
|
|
152
|
+
Boundary Clarity: [score] (min 0.70) [✓ or ↑ needed]
|
|
153
|
+
Constraint Clarity: [score] (min 0.65) [✓ or ↑ needed]
|
|
154
|
+
Acceptance Criteria:[score] (min 0.70) [✓ or ↑ needed]
|
|
155
|
+
Ambiguity: [score] (gate: ≤ 0.20)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Gate check after each round:**
|
|
159
|
+
|
|
160
|
+
If gate passes (ambiguity ≤ 0.20 AND all minimums met):
|
|
161
|
+
|
|
162
|
+
**If `--auto`:** Jump to Step 6.
|
|
163
|
+
|
|
164
|
+
**Otherwise:** AskUserQuestion:
|
|
165
|
+
- header: "Spec Gate Passed"
|
|
166
|
+
- question: "Ambiguity is [score] — requirements are clear enough to write SPEC.md. Proceed?"
|
|
167
|
+
- options:
|
|
168
|
+
- "Yes — write SPEC.md" → Jump to Step 6
|
|
169
|
+
- "One more round" → Continue interview
|
|
170
|
+
- "Done talking — write it" → Jump to Step 6
|
|
171
|
+
|
|
172
|
+
**If max rounds reached (6) and gate not passed:**
|
|
173
|
+
|
|
174
|
+
**If `--auto`:** Write SPEC.md anyway — flag unresolved dimensions. Log: `[auto] Max rounds reached. Writing SPEC.md with [N] dimensions below minimum. Planner will need to treat these as assumptions.`
|
|
175
|
+
|
|
176
|
+
**Otherwise:** AskUserQuestion:
|
|
177
|
+
- header: "Max Rounds"
|
|
178
|
+
- question: "After 6 rounds, ambiguity is [score]. [List dimensions still below minimum.] What would you like to do?"
|
|
179
|
+
- options:
|
|
180
|
+
- "Write SPEC.md anyway — flag gaps" → Write SPEC.md, mark unresolved dimensions in Ambiguity Report
|
|
181
|
+
- "Keep talking" → Continue (no round limit from here)
|
|
182
|
+
- "Abandon" → Exit without writing
|
|
183
|
+
|
|
184
|
+
**If `--auto` mode throughout:** Replace all AskUserQuestion calls above with Claude's recommended choice. Log decisions inline. Apply the same logic as `--auto` in discuss-phase.
|
|
185
|
+
|
|
186
|
+
**Text mode (`workflow.text_mode: true` or `--text` flag):** Use plain-text numbered lists instead of AskUserQuestion TUI menus.
|
|
187
|
+
|
|
188
|
+
## Step 5: (covered inline — ambiguity scoring is per-round)
|
|
189
|
+
|
|
190
|
+
## Step 5.5: Edge-Completeness Probe
|
|
191
|
+
|
|
192
|
+
Run AFTER the ambiguity gate passes (you probe edges of clear requirements, not vague
|
|
193
|
+
ones). Reference: @~/.claude/pp-core/references/edge-probe.md.
|
|
194
|
+
|
|
195
|
+
**Runtime coverage compute — resolve and invoke edge-probe.cjs:**
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# Resolve the compiled edge-probe.cjs against the GSD install dir via RUNTIME_DIR (#448)
|
|
199
|
+
# — NOT the consuming project's git root — falling back to git toplevel / $HOME/.claude.
|
|
200
|
+
# Mirrors the ui-safety-gate.cjs resolution idiom at autonomous.md:290 / plan-phase.md:631.
|
|
201
|
+
_GSD_RT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
|
|
202
|
+
EDGE_PROBE_JS=$(for _c in \
|
|
203
|
+
"$_GSD_RT/pp-core/bin/lib/edge-probe.cjs" \
|
|
204
|
+
"$_GSD_RT/bin/lib/edge-probe.cjs" \
|
|
205
|
+
"$_GSD_RT/.claude/bin/lib/edge-probe.cjs" \
|
|
206
|
+
"$HOME/.claude/pp-core/bin/lib/edge-probe.cjs" \
|
|
207
|
+
"$HOME/.claude/bin/lib/edge-probe.cjs"; do
|
|
208
|
+
[ -f "$_c" ] && { echo "$_c"; break; }
|
|
209
|
+
done)
|
|
210
|
+
|
|
211
|
+
# Graceful degradation — never silent skip (RR-04). Build ONLY when $_GSD_RT is a verified
|
|
212
|
+
# GSD source checkout (has tsconfig.build.json + src/edge-probe.cts), and pin npm to it with
|
|
213
|
+
# --prefix so we never trigger the CONSUMING project's own build:lib (its cwd package scripts:
|
|
214
|
+
# codegen/migrations/writes) during a spec workflow. Real installs ship the compiled .cjs via
|
|
215
|
+
# prepublishOnly, so this build path only matters in a GSD dev checkout (review High).
|
|
216
|
+
if [ -z "$EDGE_PROBE_JS" ]; then
|
|
217
|
+
if [ -f "$_GSD_RT/tsconfig.build.json" ] && [ -f "$_GSD_RT/src/edge-probe.cts" ]; then
|
|
218
|
+
npm --prefix "$_GSD_RT" run build:lib 2>/dev/null || true
|
|
219
|
+
EDGE_PROBE_JS=$(for _c in \
|
|
220
|
+
"$_GSD_RT/pp-core/bin/lib/edge-probe.cjs" \
|
|
221
|
+
"$_GSD_RT/bin/lib/edge-probe.cjs" \
|
|
222
|
+
"$_GSD_RT/.claude/bin/lib/edge-probe.cjs" \
|
|
223
|
+
"$HOME/.claude/pp-core/bin/lib/edge-probe.cjs" \
|
|
224
|
+
"$HOME/.claude/bin/lib/edge-probe.cjs"; do
|
|
225
|
+
[ -f "$_c" ] && { echo "$_c"; break; }
|
|
226
|
+
done)
|
|
227
|
+
fi
|
|
228
|
+
if [ -z "$EDGE_PROBE_JS" ]; then
|
|
229
|
+
echo "ERROR: edge-probe.cjs not found — reinstall GSD or run \`npm run build:lib\` in your GSD checkout." >&2
|
|
230
|
+
exit 1
|
|
231
|
+
fi
|
|
232
|
+
fi
|
|
233
|
+
|
|
234
|
+
# Write the Requirements gathered in THIS spec session to a temp JSON, then invoke the
|
|
235
|
+
# canonical coverage compute. Populate the heredoc from the SPEC's Requirements — one object
|
|
236
|
+
# per requirement: {"id","text","shapes"?}. This is the load-bearing step: an empty file makes
|
|
237
|
+
# the probe a no-op, so the guard below fails loud rather than silently skipping (RR-04).
|
|
238
|
+
REQS_JSON=$(mktemp "${TMPDIR:-/tmp}/edge-probe-reqs-XXXXXX.json")
|
|
239
|
+
cat > "$REQS_JSON" <<'JSON'
|
|
240
|
+
[
|
|
241
|
+
{ "id": "R1", "text": "<replace: requirement text from the SPEC>" }
|
|
242
|
+
]
|
|
243
|
+
JSON
|
|
244
|
+
# Guard — never invoke on an empty/invalid array, OR one still holding the heredoc
|
|
245
|
+
# `<replace: …>` placeholder (a forgotten substitution would otherwise yield a
|
|
246
|
+
# meaningful-looking but bogus coverage report). Fail loud, not silent no-op.
|
|
247
|
+
if ! node -e 'const a=require(process.argv[1]);if(!Array.isArray(a)||a.length===0)process.exit(1);if(a.some(r=>typeof r.text!=="string"||!r.text.trim()||r.text.includes("<replace:")))process.exit(1)' "$REQS_JSON" 2>/dev/null; then
|
|
248
|
+
echo "ERROR: edge-probe requirements JSON is empty/invalid or still holds the <replace: …> placeholder — populate \$REQS_JSON from the SPEC Requirements before Step 5.5 runs." >&2
|
|
249
|
+
exit 1
|
|
250
|
+
fi
|
|
251
|
+
# Invoke the compiled engine and CAPTURE its report — it computes which categories apply per
|
|
252
|
+
# requirement. The covered/backstop/dismissed/unresolved rows in $COVERAGE drive the
|
|
253
|
+
# resolution loop below (canonical taxonomy compute, NOT LLM re-derivation from prose).
|
|
254
|
+
# The engine FAILS CLOSED (exit 2) on an invalid authored shape or bad input — so the capture
|
|
255
|
+
# MUST be exit-checked. A bare `COVERAGE=$(node …)` swallows that exit code, leaves $COVERAGE
|
|
256
|
+
# empty, and lets the workflow fall through to prose re-derivation: fail-OPEN at the boundary
|
|
257
|
+
# the engine validation exists to protect. Make the run fatal, then validate the captured
|
|
258
|
+
# report is well-formed JSON before the resolution loop consumes it.
|
|
259
|
+
if ! COVERAGE=$(node "$EDGE_PROBE_JS" "$REQS_JSON"); then
|
|
260
|
+
rm -f "$REQS_JSON"
|
|
261
|
+
echo "ERROR: edge-probe engine failed (invalid shapes or bad input) — fix the requirement(s) and re-run; never proceed with empty coverage." >&2
|
|
262
|
+
exit 1
|
|
263
|
+
fi
|
|
264
|
+
rm -f "$REQS_JSON"
|
|
265
|
+
# Exit-0-but-garbage guard: the report must parse as JSON with the expected { items[], coverage{} } shape.
|
|
266
|
+
if ! printf '%s' "$COVERAGE" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{let r;try{r=JSON.parse(s)}catch{process.exit(1)}if(!r||!Array.isArray(r.items)||typeof r.coverage!=="object"||r.coverage===null)process.exit(1)})'; then
|
|
267
|
+
echo "ERROR: edge-probe produced an unparseable or malformed coverage report — refusing to proceed with the resolution loop." >&2
|
|
268
|
+
exit 1
|
|
269
|
+
fi
|
|
270
|
+
# Zero-applicable guard: a report where the engine proposed NO applicable edge across ANY
|
|
271
|
+
# requirement is far more likely a shape-classification miss (or malformed requirements) than
|
|
272
|
+
# a genuinely edge-free spec — the same fail-open shape as an invalid shape yielding
|
|
273
|
+
# applicable:0. Surface it loudly; the author must explicitly confirm "no applicable edges"
|
|
274
|
+
# below rather than silently emitting a green empty ## Edge Coverage section.
|
|
275
|
+
APPLICABLE=$(printf '%s' "$COVERAGE" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{let n=0;try{n=JSON.parse(s).coverage.applicable}catch{n=0}process.stdout.write(String(n))})')
|
|
276
|
+
if [ "$APPLICABLE" = "0" ]; then
|
|
277
|
+
echo "WARNING: edge-probe proposed ZERO applicable edges across all requirements — likely a classification miss or malformed requirements, not a genuinely edge-free spec. Do NOT silently write an empty Edge Coverage section." >&2
|
|
278
|
+
fi
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
If `$APPLICABLE` is `0`, do NOT proceed silently: ask the author to confirm via AskUserQuestion
|
|
282
|
+
("The edge probe found no applicable edges for any requirement — is this genuinely an
|
|
283
|
+
edge-free spec, or should we revisit the requirement wording / authored shapes?"). Only write
|
|
284
|
+
an empty `## Edge Coverage` section after explicit confirmation.
|
|
285
|
+
|
|
286
|
+
For each Requirement gathered so far:
|
|
287
|
+
1. Classify its shape and raise only applicable edge categories (relevance filter — see
|
|
288
|
+
the taxonomy in the reference). Reuse any edges the Round-4 Failure Analyst already
|
|
289
|
+
surfaced as pre-`covered`.
|
|
290
|
+
2. For each raised category, propose a CONCRETE candidate edge (not "consider
|
|
291
|
+
boundaries" — e.g. "R2 merges intervals; what about `[[1,2],[2,3]]` that only touch?").
|
|
292
|
+
3. Resolve each with the user (AskUserQuestion; text mode → numbered list):
|
|
293
|
+
- **Specify it** → write a new pass/fail line into Acceptance Criteria AND mark the
|
|
294
|
+
edge `covered`.
|
|
295
|
+
- **Dismiss (reason)** → mark `dismissed` with a required non-empty reason.
|
|
296
|
+
- **Backstop with a test** → mark `backstop`; note "held-out edge test" for plan-phase.
|
|
297
|
+
- **Defer** → leave `unresolved`.
|
|
298
|
+
- An `unclassified` row (probe `unclassified — review manually`) means the requirement's
|
|
299
|
+
prose matched no shape cue (#1110) — treat it like any other candidate (**Specify**,
|
|
300
|
+
**Dismiss (reason)**, or **Defer**). A manual-review nudge, not a hard block.
|
|
301
|
+
|
|
302
|
+
**Soft gate (after resolving):**
|
|
303
|
+
- All applicable edges resolved → proceed to Step 6.
|
|
304
|
+
- Any `unresolved` → AskUserQuestion:
|
|
305
|
+
- header: "Edge Coverage"
|
|
306
|
+
- question: "[N] edge(s) are unresolved: [list]. What do you want to do?"
|
|
307
|
+
- options: "Resolve now" (loop back) / "Write SPEC.md anyway — flag unresolved" /
|
|
308
|
+
"Keep probing"
|
|
309
|
+
- On "anyway": write SPEC.md with those rows marked `⚠ Edge unresolved — planner must
|
|
310
|
+
treat as assumption`.
|
|
311
|
+
|
|
312
|
+
**`--auto` mode:** auto-`covered` where a defensible acceptance criterion can be written;
|
|
313
|
+
otherwise auto-`backstop` (never auto-dismiss — a wrong dismissal is the exact silent
|
|
314
|
+
failure being eliminated). Log: `[auto] edge coverage: C covered, B backstop, U unresolved`.
|
|
315
|
+
|
|
316
|
+
**`unclassified` exception (#1110):** `--auto` leaves an `unclassified` candidate
|
|
317
|
+
**`unresolved`** (the soft gate surfaces it as a flagged planner assumption) — it never
|
|
318
|
+
auto-`backstop`s it. A missing shape is not evidence an edge exists, so minting a held-out
|
|
319
|
+
edge obligation on a requirement that may be genuinely edge-free would be a false claim and
|
|
320
|
+
risks a vacuous edge test. Leaving it `unresolved` keeps the zero-cue requirement visible
|
|
321
|
+
(never a silent drop) without fabricating an edge — which is exactly #1110's purpose: surface
|
|
322
|
+
it for review, do not auto-handle it.
|
|
323
|
+
|
|
324
|
+
Populate the `## Edge Coverage` section of SPEC.md from the resolved edges.
|
|
325
|
+
|
|
326
|
+
## Step 5.6: Prohibition-Completeness Probe (must-NOT)
|
|
327
|
+
|
|
328
|
+
Run AFTER Step 5.5 (you probe the must-NOT axis of clear requirements, over the same
|
|
329
|
+
requirement list). Reference: @~/.claude/pp-core/references/prohibition-probe.md — the
|
|
330
|
+
portable two-stage protocol, the canon-referral rule, and the status×verification schema
|
|
331
|
+
live there (size-cap discipline; keep this step lean).
|
|
332
|
+
|
|
333
|
+
**D1 — no compiled engine (ADR-550 D7b).** Unlike Step 5.5, the prohibition probe has NO
|
|
334
|
+
compiled recall engine and runs NO `node` invocation here. The recall stage is an LLM prose
|
|
335
|
+
pass: the closed eight-category edge taxonomy a classifier can apply does not exist for the
|
|
336
|
+
open values/safety/ethics must-NOT axis. Do NOT copy the Step 5.5 engine-resolution block.
|
|
337
|
+
Only the schema/projection layer is real code; the recall is prose.
|
|
338
|
+
|
|
339
|
+
For each Requirement gathered so far, run the two-stage recall→precision pass:
|
|
340
|
+
|
|
341
|
+
1. **Stage 1 — Recall (adversarial prose probe).** Ask the single adversarial question of the
|
|
342
|
+
requirement: *"What could this feature silently become that the author would NOT want, but
|
|
343
|
+
the spec does not forbid?"* Over-produce (~10 raw must-NOT candidates) — recall first.
|
|
344
|
+
2. **Stage 2 — Precision (one-pass classifier).** Filter the raw list in a single pass:
|
|
345
|
+
**DROP routine-engineering** items (normal correctness/hygiene — "must not mutate input",
|
|
346
|
+
"must not throw on empty" — owned by the edge probe or code review); **KEEP
|
|
347
|
+
values / safety / ethics** items (manipulative framing, protected-attribute proxies, raw
|
|
348
|
+
PII in plaintext). This collapses ~10 → ~2–3 genuine prohibitions.
|
|
349
|
+
3. **Canon-referral (ADR-550 D6, PROB-13).** A kept candidate that is canon security/compliance
|
|
350
|
+
(OWASP / prototype-pollution / path-traversal / injection / GDPR / generic fairness) is
|
|
351
|
+
NOT minted here — emit a one-line breadcrumb (*"prototype-pollution is canon — owned by
|
|
352
|
+
/pp:secure-phase + eslint; not minted here"*) and DROP it. Minting canon items duplicates
|
|
353
|
+
/pp:secure-phase and drowns the bespoke signal.
|
|
354
|
+
4. **Resolve each surfaced (non-canon) prohibition** (AskUserQuestion; text mode → numbered list):
|
|
355
|
+
- **Keep it** → write a NEGATIVE acceptance criterion (a must-NOT line) into Acceptance
|
|
356
|
+
Criteria AND mark the prohibition `resolved` with a verification tier: `test` (a
|
|
357
|
+
mechanical negative test/lint/assertion exists) or `judgment` (real but not mechanically
|
|
358
|
+
checkable — routes to judgment review).
|
|
359
|
+
- **Capture the wired-check descriptor on `test`-tier (#1278, SOFT).** When a prohibition is
|
|
360
|
+
resolved `verification: test`, ALSO capture the descriptor of the wired check so
|
|
361
|
+
`verify-phase` can LOCATE it deterministically (no verifier invention at verify time).
|
|
362
|
+
Capture the flat scalars — persisted into SPEC and projected onto the
|
|
363
|
+
`must_haves.prohibitions` item by `projectProhibitions`:
|
|
364
|
+
- `check_kind` — `node-test` | `lint-rule`.
|
|
365
|
+
- `check_target` — the negative-test file path (for `node-test`), or the path to lint
|
|
366
|
+
(for `lint-rule`).
|
|
367
|
+
- `check_rule` — the eslint rule id (e.g. `local/no-source-grep`); `lint-rule` only.
|
|
368
|
+
- `check_violation_fixture` (#1346) — path to a KNOWN-BAD subject the wired check is run
|
|
369
|
+
against to **machine-prove fail-first**; rides BOTH kinds. Capture it to let the item green
|
|
370
|
+
end-to-end with zero hand-authoring at verify time; for `node-test` the negative test should
|
|
371
|
+
read its subject from the `GSD_PROHIB_SUBJECT` env var so the prover can inject this fixture.
|
|
372
|
+
This is a **SOFT capture (CHK-04): a `test`-tier prohibition WITHOUT a descriptor is still
|
|
373
|
+
allowed** — if the author cannot yet name the wired check, leave the descriptor empty and
|
|
374
|
+
proceed. It is NOT a hard authoring block; the item simply stays fail-closed/flagged
|
|
375
|
+
downstream (an absent/partial descriptor — or one with no `check_violation_fixture` —
|
|
376
|
+
→ `descriptorFromProjection` null/under-specified/fixture-less → producer fail-closed
|
|
377
|
+
locate-or-unprovable, never green). Do NOT capture `failFirst` here — it is a
|
|
378
|
+
verify-time caller attestation, not a spec-authored field (#1279).
|
|
379
|
+
- **Dismiss (reason)** → mark `dismissed` with a REQUIRED non-empty reason (PROB-05). The
|
|
380
|
+
reason string is the audit trail; silence is not a valid dismissal.
|
|
381
|
+
- **Defer** → leave `unresolved`.
|
|
382
|
+
|
|
383
|
+
**Soft gate (after resolving) — PROB-06:**
|
|
384
|
+
- All applicable prohibitions resolved → proceed to Step 6.
|
|
385
|
+
- Any `unresolved` → AskUserQuestion:
|
|
386
|
+
- header: "Prohibitions"
|
|
387
|
+
- question: "[N] prohibition(s) are unresolved: [list]. What do you want to do?"
|
|
388
|
+
- options: "Resolve now" (loop back) / "Write SPEC.md anyway — flag unresolved" /
|
|
389
|
+
"Keep probing"
|
|
390
|
+
- On "anyway": write SPEC.md with those rows marked `⚠ Prohibition unresolved — planner
|
|
391
|
+
must treat as assumption`. This is a soft gate (write-anyway-with-flags), never a silent
|
|
392
|
+
skip — the soft gate IS the control.
|
|
393
|
+
|
|
394
|
+
**`--auto` mode:** auto-`resolved` where a defensible negative acceptance criterion can be
|
|
395
|
+
written (test or judgment tier); otherwise leave `unresolved`. **`--auto` NEVER auto-dismisses
|
|
396
|
+
a prohibition** — a wrong dismissal is the exact silent failure this probe eliminates (PROB-06,
|
|
397
|
+
the load-bearing safety property). On a `test`-tier auto-resolution, capture the `check_kind` /
|
|
398
|
+
`check_target` / `check_rule` / `check_violation_fixture` descriptor **only when a wired check is unambiguous**; otherwise
|
|
399
|
+
leave it empty — `--auto` NEVER fabricates a check path or fixture (a wrong locate is re-validated and
|
|
400
|
+
fails closed at the producer, but a fabricated path is still noise to avoid). Log:
|
|
401
|
+
`[auto] prohibitions: R resolved, U unresolved`.
|
|
402
|
+
|
|
403
|
+
**Text mode (PROB-09):** per Step 5's text-mode rule, replace the AskUserQuestion menus above
|
|
404
|
+
with plain-text numbered lists — there is NO hard AskUserQuestion dependency, so the probe
|
|
405
|
+
runs identically for non-Claude / text-mode hosts.
|
|
406
|
+
|
|
407
|
+
Populate the `## Prohibitions` section of SPEC.md from the resolved prohibitions (each
|
|
408
|
+
`resolved`/`test` row is a checkable negative acceptance criterion; `resolved`/`judgment`
|
|
409
|
+
rows route to judgment review; `⚠ UNRESOLVED` rows are flagged as assumptions). A
|
|
410
|
+
`resolved`/`test` row ALSO carries its captured `check_kind` / `check_target` / `check_rule` /
|
|
411
|
+
`check_violation_fixture` descriptor when present (so the projection feeds `verify-phase`'s deterministic locate + machine-proof, #1278 + #1346);
|
|
412
|
+
a `test` row with no captured descriptor is still valid — it stays fail-closed/flagged
|
|
413
|
+
downstream rather than blocking authoring.
|
|
414
|
+
|
|
415
|
+
## Step 6: Generate SPEC.md
|
|
416
|
+
|
|
417
|
+
Use the SPEC.md template from @~/.claude/pp-core/templates/spec.md.
|
|
418
|
+
|
|
419
|
+
- Populate the **Edge Coverage** section from Step 5.5 (covered/dismissed/backstop/unresolved rows).
|
|
420
|
+
- Populate the **Prohibitions** section from Step 5.6 (resolved/dismissed/unresolved rows with the test|judgment tier).
|
|
421
|
+
|
|
422
|
+
**Requirements for every requirement entry:**
|
|
423
|
+
- One specific, testable statement
|
|
424
|
+
- Current state (what exists now)
|
|
425
|
+
- Target state (what it should become)
|
|
426
|
+
- Acceptance criterion (how to verify it was met)
|
|
427
|
+
|
|
428
|
+
**Vague requirements are rejected:**
|
|
429
|
+
- ✗ "The system should be fast"
|
|
430
|
+
- ✗ "Improve user experience"
|
|
431
|
+
- ✓ "API endpoint responds in < 200ms at p95 under 100 concurrent requests"
|
|
432
|
+
- ✓ "CLI command exits with code 1 and prints to stderr on invalid input"
|
|
433
|
+
|
|
434
|
+
**Count requirements.** The display in discuss-phase reads: "Found SPEC.md — {N} requirements locked."
|
|
435
|
+
|
|
436
|
+
**Boundaries must be explicit lists:**
|
|
437
|
+
- "In scope" — what this phase produces
|
|
438
|
+
- "Out of scope" — what it explicitly does NOT do (with brief reasoning)
|
|
439
|
+
|
|
440
|
+
**Acceptance criteria must be pass/fail checkboxes** — no "should feel good" or "looks reasonable."
|
|
441
|
+
|
|
442
|
+
**If any dimensions are below minimum**, mark them in the Ambiguity Report with: `⚠ Below minimum — planner must treat as assumption`.
|
|
443
|
+
|
|
444
|
+
Write to: `{phase_dir}/{padded_phase}-SPEC.md`
|
|
445
|
+
|
|
446
|
+
## Step 7: Commit
|
|
447
|
+
|
|
448
|
+
```bash
|
|
449
|
+
git add "${phase_dir}/${padded_phase}-SPEC.md"
|
|
450
|
+
git commit -m "spec(phase-${phase_number}): add SPEC.md for ${phase_name} — ${requirement_count} requirements (#2213)"
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
If `commit_docs` is false: Skip commit. Note that SPEC.md was written but not committed.
|
|
454
|
+
|
|
455
|
+
## Step 8: Wrap Up
|
|
456
|
+
|
|
457
|
+
Display:
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
SPEC.md written — {N} requirements locked.
|
|
461
|
+
|
|
462
|
+
Phase {X}: {name}
|
|
463
|
+
Ambiguity: {final_score} (gate: ≤ 0.20)
|
|
464
|
+
|
|
465
|
+
Next: /pp:discuss-phase {X}
|
|
466
|
+
discuss-phase will detect SPEC.md and focus on implementation decisions only.
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
</process>
|
|
470
|
+
|
|
471
|
+
<critical_rules>
|
|
472
|
+
- Every requirement MUST have current state, target state, and acceptance criterion
|
|
473
|
+
- Boundaries section is MANDATORY — cannot be empty
|
|
474
|
+
- "In scope" and "Out of scope" must be explicit lists, not narrative prose
|
|
475
|
+
- Acceptance criteria must be pass/fail — no subjective criteria
|
|
476
|
+
- SPEC.md is NEVER written if the user selects "Abandon"
|
|
477
|
+
- Do NOT ask about HOW to implement — that is discuss-phase territory
|
|
478
|
+
- Scout the codebase BEFORE the first question — grounded questions only
|
|
479
|
+
- Max 2–3 questions per round — do not frontload all questions at once
|
|
480
|
+
- Step 5.5 edge probe runs after the ambiguity gate; dismissals require a reason; --auto never auto-dismisses
|
|
481
|
+
- Step 5.6 prohibition probe runs after the edge probe; dismissals require a reason; --auto never auto-dismisses a prohibition
|
|
482
|
+
</critical_rules>
|
|
483
|
+
|
|
484
|
+
<success_criteria>
|
|
485
|
+
- Codebase scouted and current state understood before questioning
|
|
486
|
+
- All 4 dimensions scored after every round
|
|
487
|
+
- Gate passed OR user explicitly chose to write despite gaps
|
|
488
|
+
- SPEC.md contains only falsifiable requirements
|
|
489
|
+
- Boundaries are explicit (in scope / out of scope with reasoning)
|
|
490
|
+
- Acceptance criteria are pass/fail checkboxes
|
|
491
|
+
- SPEC.md committed atomically (when commit_docs is true)
|
|
492
|
+
- User directed to /pp:discuss-phase as next step
|
|
493
|
+
- Edge-completeness probe run; Edge Coverage section populated; unresolved edges flagged as assumptions
|
|
494
|
+
- Prohibition-completeness probe run; Prohibitions section populated; unresolved prohibitions flagged as assumptions
|
|
495
|
+
</success_criteria>
|