mandrel 1.57.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/.agents/README.md +954 -0
- package/.agents/docs/SDLC.md +1420 -0
- package/.agents/docs/agentrc-reference.json +278 -0
- package/.agents/docs/configuration.md +1040 -0
- package/.agents/docs/workflows.md +59 -0
- package/.agents/instructions.md +384 -0
- package/.agents/personas/architect.md +107 -0
- package/.agents/personas/devops-engineer.md +36 -0
- package/.agents/personas/engineer-mobile.md +119 -0
- package/.agents/personas/engineer-web.md +110 -0
- package/.agents/personas/engineer.md +90 -0
- package/.agents/personas/product.md +88 -0
- package/.agents/personas/project-manager.md +110 -0
- package/.agents/personas/qa-engineer.md +91 -0
- package/.agents/personas/refactorer.md +110 -0
- package/.agents/personas/security-engineer.md +112 -0
- package/.agents/personas/sre.md +86 -0
- package/.agents/personas/technical-writer.md +100 -0
- package/.agents/personas/ux-designer.md +95 -0
- package/.agents/rules/api-conventions.md +75 -0
- package/.agents/rules/changelog-style.md +238 -0
- package/.agents/rules/gherkin-standards.md +146 -0
- package/.agents/rules/git-conventions.md +146 -0
- package/.agents/rules/orchestration-error-handling.md +35 -0
- package/.agents/rules/security-baseline.md +92 -0
- package/.agents/rules/shell-conventions.md +70 -0
- package/.agents/rules/test-seams.md +59 -0
- package/.agents/rules/testing-standards.md +177 -0
- package/.agents/runtime-deps.json +18 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +93 -0
- package/.agents/schemas/agentrc.schema.json +1583 -0
- package/.agents/schemas/audit-results.schema.json +69 -0
- package/.agents/schemas/audit-rules.json +134 -0
- package/.agents/schemas/audit-rules.schema.json +69 -0
- package/.agents/schemas/baselines/baseline-envelope.schema.json +44 -0
- package/.agents/schemas/baselines/bundle-size.schema.json +47 -0
- package/.agents/schemas/baselines/coverage.schema.json +50 -0
- package/.agents/schemas/baselines/crap.schema.json +52 -0
- package/.agents/schemas/baselines/duplication.schema.json +62 -0
- package/.agents/schemas/baselines/lighthouse.schema.json +59 -0
- package/.agents/schemas/baselines/lint.schema.json +47 -0
- package/.agents/schemas/baselines/maintainability.schema.json +71 -0
- package/.agents/schemas/baselines/mutation.schema.json +52 -0
- package/.agents/schemas/crap-baseline.schema.json +57 -0
- package/.agents/schemas/crap-report.schema.json +102 -0
- package/.agents/schemas/dispatch-manifest.json +232 -0
- package/.agents/schemas/epic-perf-report.schema.json +89 -0
- package/.agents/schemas/epic-spec.schema.json +183 -0
- package/.agents/schemas/friction-event.schema.json +56 -0
- package/.agents/schemas/lifecycle/README.md +18 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +13 -0
- package/.agents/schemas/lifecycle/checkpoint.written.schema.json +13 -0
- package/.agents/schemas/lifecycle/close-validate.end.schema.json +18 -0
- package/.agents/schemas/lifecycle/close-validate.start.schema.json +13 -0
- package/.agents/schemas/lifecycle/code-review.end.schema.json +30 -0
- package/.agents/schemas/lifecycle/code-review.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +14 -0
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.complete.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +14 -0
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +17 -0
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +15 -0
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +18 -0
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +16 -0
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +28 -0
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +16 -0
- package/.agents/schemas/lifecycle/intervention.recorded.schema.json +15 -0
- package/.agents/schemas/lifecycle/ledger-record.schema.json +59 -0
- package/.agents/schemas/lifecycle/notification.emitted.schema.json +18 -0
- package/.agents/schemas/lifecycle/pr.created.schema.json +14 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +16 -0
- package/.agents/schemas/lifecycle/retro.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/story.blocked.schema.json +13 -0
- package/.agents/schemas/lifecycle/story.dispatch.end.schema.json +17 -0
- package/.agents/schemas/lifecycle/story.dispatch.start.schema.json +15 -0
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +20 -0
- package/.agents/schemas/lifecycle/story.merged.schema.json +13 -0
- package/.agents/schemas/mi-report.schema.json +58 -0
- package/.agents/schemas/model-attribution.schema.json +49 -0
- package/.agents/schemas/qa-finding.schema.json +133 -0
- package/.agents/schemas/qa-ledger.schema.json +89 -0
- package/.agents/schemas/risk-verdict.schema.json +53 -0
- package/.agents/schemas/signal-event.schema.json +58 -0
- package/.agents/schemas/skill.schema.json +31 -0
- package/.agents/schemas/skills-index.schema.json +81 -0
- package/.agents/schemas/story-perf-summary.schema.json +73 -0
- package/.agents/schemas/validation-evidence.schema.json +78 -0
- package/.agents/scripts/README.md +93 -0
- package/.agents/scripts/acceptance-eval.js +284 -0
- package/.agents/scripts/acceptance-spec-reconciler.js +556 -0
- package/.agents/scripts/agents-bootstrap-github.js +634 -0
- package/.agents/scripts/analyze-execution.js +369 -0
- package/.agents/scripts/assert-branch.js +83 -0
- package/.agents/scripts/audit-labels-bootstrap.js +253 -0
- package/.agents/scripts/audit-to-stories.js +257 -0
- package/.agents/scripts/bootstrap.js +1378 -0
- package/.agents/scripts/check-baselines.js +81 -0
- package/.agents/scripts/check-dead-exports.js +311 -0
- package/.agents/scripts/check-doc-links.js +401 -0
- package/.agents/scripts/check-gherkin-placeholders.js +663 -0
- package/.agents/scripts/check-lifecycle-doc-drift.js +402 -0
- package/.agents/scripts/check-lifecycle-lint.js +379 -0
- package/.agents/scripts/check-prepush-recovery.js +90 -0
- package/.agents/scripts/check-windows-git-perf.js +138 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +67 -0
- package/.agents/scripts/coverage-capture.js +112 -0
- package/.agents/scripts/detect-merges.js +111 -0
- package/.agents/scripts/diagnose-friction.js +257 -0
- package/.agents/scripts/diagnose.js +240 -0
- package/.agents/scripts/dispatcher.js +295 -0
- package/.agents/scripts/drain-pending-cleanup.js +147 -0
- package/.agents/scripts/epic-audit-prepare.js +419 -0
- package/.agents/scripts/epic-audit-recheck.js +241 -0
- package/.agents/scripts/epic-deliver-note-intervention.js +192 -0
- package/.agents/scripts/epic-deliver-preflight.js +407 -0
- package/.agents/scripts/epic-deliver-prepare.js +383 -0
- package/.agents/scripts/epic-execute-record-wave.js +463 -0
- package/.agents/scripts/epic-plan-clarity.js +201 -0
- package/.agents/scripts/epic-plan-decompose.js +79 -0
- package/.agents/scripts/epic-plan-healthcheck.js +363 -0
- package/.agents/scripts/epic-plan-spec-validate.js +111 -0
- package/.agents/scripts/epic-plan-spec.js +198 -0
- package/.agents/scripts/epic-reconcile.js +637 -0
- package/.agents/scripts/evidence-gate.js +235 -0
- package/.agents/scripts/generate-config-docs.js +516 -0
- package/.agents/scripts/generate-lifecycle-docs.js +224 -0
- package/.agents/scripts/generate-skills-index.js +252 -0
- package/.agents/scripts/generate-workflows-doc.js +168 -0
- package/.agents/scripts/git-cleanup.js +124 -0
- package/.agents/scripts/git-pr-quality-gate.js +203 -0
- package/.agents/scripts/git-rebase-and-resolve.js +234 -0
- package/.agents/scripts/hierarchy-gate.js +176 -0
- package/.agents/scripts/hydrate-context.js +179 -0
- package/.agents/scripts/install-matrix-assert.js +282 -0
- package/.agents/scripts/lib/Graph.js +326 -0
- package/.agents/scripts/lib/ITicketingProvider.js +349 -0
- package/.agents/scripts/lib/Logger.js +194 -0
- package/.agents/scripts/lib/audit-suite/cli.js +64 -0
- package/.agents/scripts/lib/audit-suite/findings.js +164 -0
- package/.agents/scripts/lib/audit-suite/frontmatter-lint.js +32 -0
- package/.agents/scripts/lib/audit-suite/frontmatter.js +110 -0
- package/.agents/scripts/lib/audit-suite/index.js +22 -0
- package/.agents/scripts/lib/audit-suite/runner.js +233 -0
- package/.agents/scripts/lib/audit-suite/selector.js +235 -0
- package/.agents/scripts/lib/audit-suite/substitutions.js +124 -0
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +49 -0
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +130 -0
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +114 -0
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +93 -0
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +265 -0
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +246 -0
- package/.agents/scripts/lib/audit-to-stories/seed-epic-from-findings.js +160 -0
- package/.agents/scripts/lib/auto-refresh-baselines.js +308 -0
- package/.agents/scripts/lib/baseline-loader.js +0 -0
- package/.agents/scripts/lib/baseline-schema-registry.js +69 -0
- package/.agents/scripts/lib/baseline-snapshot.js +716 -0
- package/.agents/scripts/lib/baselines/component-matcher.js +21 -0
- package/.agents/scripts/lib/baselines/components.js +126 -0
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +203 -0
- package/.agents/scripts/lib/baselines/duplication-scanner.js +220 -0
- package/.agents/scripts/lib/baselines/env-overrides.js +129 -0
- package/.agents/scripts/lib/baselines/envelope.js +368 -0
- package/.agents/scripts/lib/baselines/exit-codes.js +89 -0
- package/.agents/scripts/lib/baselines/git-base.js +0 -0
- package/.agents/scripts/lib/baselines/kernel.js +111 -0
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +220 -0
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +157 -0
- package/.agents/scripts/lib/baselines/kinds/coverage.js +194 -0
- package/.agents/scripts/lib/baselines/kinds/crap.js +555 -0
- package/.agents/scripts/lib/baselines/kinds/duplication.js +197 -0
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +185 -0
- package/.agents/scripts/lib/baselines/kinds/lint.js +172 -0
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +340 -0
- package/.agents/scripts/lib/baselines/kinds/mutation.js +153 -0
- package/.agents/scripts/lib/baselines/path-canon.js +279 -0
- package/.agents/scripts/lib/baselines/preview-gates.js +298 -0
- package/.agents/scripts/lib/baselines/reader.js +321 -0
- package/.agents/scripts/lib/baselines/refresh-service.js +733 -0
- package/.agents/scripts/lib/baselines/scope.js +291 -0
- package/.agents/scripts/lib/baselines/writer.js +312 -0
- package/.agents/scripts/lib/bdd-runner-detect.js +417 -0
- package/.agents/scripts/lib/bdd-scenario-scanner.js +310 -0
- package/.agents/scripts/lib/bootstrap/baselines-layout-migration.js +202 -0
- package/.agents/scripts/lib/bootstrap/branch-protection.js +222 -0
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +171 -0
- package/.agents/scripts/lib/bootstrap/commit-push.js +146 -0
- package/.agents/scripts/lib/bootstrap/gh-list.js +153 -0
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +306 -0
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +89 -0
- package/.agents/scripts/lib/bootstrap/install-ledger.js +174 -0
- package/.agents/scripts/lib/bootstrap/manifest.js +272 -0
- package/.agents/scripts/lib/bootstrap/merge-methods.js +108 -0
- package/.agents/scripts/lib/bootstrap/preflight.js +195 -0
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +801 -0
- package/.agents/scripts/lib/bootstrap/prompt.js +480 -0
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +370 -0
- package/.agents/scripts/lib/bootstrap/summary.js +75 -0
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +256 -0
- package/.agents/scripts/lib/branch-name-guard.js +98 -0
- package/.agents/scripts/lib/c8-cli-path.js +21 -0
- package/.agents/scripts/lib/changed-files.js +184 -0
- package/.agents/scripts/lib/checks/baseline-drift-main-checkout.js +104 -0
- package/.agents/scripts/lib/checks/core-bare-clean.js +48 -0
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +54 -0
- package/.agents/scripts/lib/checks/index.js +288 -0
- package/.agents/scripts/lib/checks/push-hook-parity.js +106 -0
- package/.agents/scripts/lib/checks/stale-origin-epic.js +49 -0
- package/.agents/scripts/lib/checks/state.js +558 -0
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +186 -0
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +182 -0
- package/.agents/scripts/lib/checks/windows-coverage-noise-floor.js +92 -0
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +81 -0
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +55 -0
- package/.agents/scripts/lib/cli/parse-numeric.js +60 -0
- package/.agents/scripts/lib/cli/standard-args.js +351 -0
- package/.agents/scripts/lib/cli-args.js +286 -0
- package/.agents/scripts/lib/cli-utils.js +69 -0
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +44 -0
- package/.agents/scripts/lib/close-validation/projections/inputs.js +86 -0
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +286 -0
- package/.agents/scripts/lib/close-validation.js +897 -0
- package/.agents/scripts/lib/codebase-snapshot.js +513 -0
- package/.agents/scripts/lib/command-header.js +33 -0
- package/.agents/scripts/lib/config/acceptance-eval.js +95 -0
- package/.agents/scripts/lib/config/baselines.js +60 -0
- package/.agents/scripts/lib/config/ci.js +30 -0
- package/.agents/scripts/lib/config/commands.js +36 -0
- package/.agents/scripts/lib/config/defaults.js +119 -0
- package/.agents/scripts/lib/config/explain.js +348 -0
- package/.agents/scripts/lib/config/gates/bundle-size.schema.js +23 -0
- package/.agents/scripts/lib/config/gates/coverage.schema.js +18 -0
- package/.agents/scripts/lib/config/gates/crap.schema.js +33 -0
- package/.agents/scripts/lib/config/gates/duplication.schema.js +26 -0
- package/.agents/scripts/lib/config/gates/index.js +36 -0
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +23 -0
- package/.agents/scripts/lib/config/gates/lint.schema.js +9 -0
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +20 -0
- package/.agents/scripts/lib/config/gates/mutation.schema.js +12 -0
- package/.agents/scripts/lib/config/gates/shared.js +117 -0
- package/.agents/scripts/lib/config/github.js +122 -0
- package/.agents/scripts/lib/config/lifecycle.js +40 -0
- package/.agents/scripts/lib/config/limits.js +211 -0
- package/.agents/scripts/lib/config/paths.js +73 -0
- package/.agents/scripts/lib/config/preflight.js +58 -0
- package/.agents/scripts/lib/config/quality.js +665 -0
- package/.agents/scripts/lib/config/retro.js +77 -0
- package/.agents/scripts/lib/config/runners.js +105 -0
- package/.agents/scripts/lib/config/runtime.js +167 -0
- package/.agents/scripts/lib/config/shared.js +46 -0
- package/.agents/scripts/lib/config/sync-agentrc.js +243 -0
- package/.agents/scripts/lib/config/temp-paths.js +373 -0
- package/.agents/scripts/lib/config/validate-orchestration.js +81 -0
- package/.agents/scripts/lib/config/worktree-isolation.js +80 -0
- package/.agents/scripts/lib/config-resolver.js +298 -0
- package/.agents/scripts/lib/config-schema-shared.js +32 -0
- package/.agents/scripts/lib/config-schema.js +20 -0
- package/.agents/scripts/lib/config-settings-schema-delivery.js +332 -0
- package/.agents/scripts/lib/config-settings-schema-quality.js +165 -0
- package/.agents/scripts/lib/config-settings-schema.js +420 -0
- package/.agents/scripts/lib/coverage-baseline.js +352 -0
- package/.agents/scripts/lib/coverage-capture.js +195 -0
- package/.agents/scripts/lib/coverage-utils.js +239 -0
- package/.agents/scripts/lib/cpu-pool.js +223 -0
- package/.agents/scripts/lib/crap-engine.js +119 -0
- package/.agents/scripts/lib/crap-utils.js +479 -0
- package/.agents/scripts/lib/degraded-mode.js +69 -0
- package/.agents/scripts/lib/dependency-parser.js +129 -0
- package/.agents/scripts/lib/duplicate-search.js +189 -0
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +70 -0
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +197 -0
- package/.agents/scripts/lib/dynamic-workflow/capability.js +396 -0
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +80 -0
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +72 -0
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +90 -0
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +43 -0
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +83 -0
- package/.agents/scripts/lib/env-loader.js +52 -0
- package/.agents/scripts/lib/epic-merge-lock.js +239 -0
- package/.agents/scripts/lib/epic-plan-clarity.js +142 -0
- package/.agents/scripts/lib/epic-plan-ideation.js +228 -0
- package/.agents/scripts/lib/error-redactor.js +125 -0
- package/.agents/scripts/lib/errors/index.js +67 -0
- package/.agents/scripts/lib/feedback-loop/audit-results-graduator.js +230 -0
- package/.agents/scripts/lib/feedback-loop/code-review-graduator.js +207 -0
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +421 -0
- package/.agents/scripts/lib/feedback-loop/memory-freshness.js +480 -0
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +229 -0
- package/.agents/scripts/lib/findings/classify-finding.js +195 -0
- package/.agents/scripts/lib/findings/promote-finding.js +353 -0
- package/.agents/scripts/lib/findings/route-finding.js +283 -0
- package/.agents/scripts/lib/findings/semantic-issue-search.js +179 -0
- package/.agents/scripts/lib/findings/severity.js +102 -0
- package/.agents/scripts/lib/gates/baseline-store.js +106 -0
- package/.agents/scripts/lib/gates/friction.js +43 -0
- package/.agents/scripts/lib/gh-exec.js +553 -0
- package/.agents/scripts/lib/git/cached-fetch.js +0 -0
- package/.agents/scripts/lib/git/sync-from-base.js +162 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +213 -0
- package/.agents/scripts/lib/git-branch-lifecycle.js +353 -0
- package/.agents/scripts/lib/git-merge-orchestrator.js +261 -0
- package/.agents/scripts/lib/git-utils.js +363 -0
- package/.agents/scripts/lib/github-url.js +29 -0
- package/.agents/scripts/lib/install-cmd-parser.js +51 -0
- package/.agents/scripts/lib/issue-link-parser.js +74 -0
- package/.agents/scripts/lib/json-utils.js +60 -0
- package/.agents/scripts/lib/label-constants.js +169 -0
- package/.agents/scripts/lib/label-taxonomy.js +200 -0
- package/.agents/scripts/lib/maintainability-engine.js +164 -0
- package/.agents/scripts/lib/maintainability-utils.js +343 -0
- package/.agents/scripts/lib/mandrel-catalog.js +170 -0
- package/.agents/scripts/lib/mutation/baseline-snapshot.js +238 -0
- package/.agents/scripts/lib/mutation/config-detector.js +119 -0
- package/.agents/scripts/lib/mutation/stryker-runner.js +306 -0
- package/.agents/scripts/lib/mutation/survivor-report.js +160 -0
- package/.agents/scripts/lib/notifications/notifier.js +75 -0
- package/.agents/scripts/lib/observability/active-story-env.js +182 -0
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +221 -0
- package/.agents/scripts/lib/observability/perf-aggregator.js +887 -0
- package/.agents/scripts/lib/observability/perf-report-readers.js +319 -0
- package/.agents/scripts/lib/observability/perf-report-render.js +182 -0
- package/.agents/scripts/lib/observability/signals-writer.js +296 -0
- package/.agents/scripts/lib/observability/source-classifier.js +103 -0
- package/.agents/scripts/lib/observability/tool-trace-hook.js +417 -0
- package/.agents/scripts/lib/onboard/detect-stack.js +300 -0
- package/.agents/scripts/lib/onboard/scaffold-docs.js +128 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +173 -0
- package/.agents/scripts/lib/orchestration/cascade-grouping.js +275 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +131 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +80 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +132 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +142 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +149 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +158 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +56 -0
- package/.agents/scripts/lib/orchestration/code-review.js +652 -0
- package/.agents/scripts/lib/orchestration/column-sync.js +286 -0
- package/.agents/scripts/lib/orchestration/context-envelope.js +280 -0
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +581 -0
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +88 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +188 -0
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +144 -0
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +206 -0
- package/.agents/scripts/lib/orchestration/doc-reader.js +94 -0
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +473 -0
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +310 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/cli.js +167 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +151 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +74 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +78 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +72 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +155 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +321 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +75 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +86 -0
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/authoring-context.js +197 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/cli-args.js +48 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +94 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +414 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/prompts.js +55 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +105 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +120 -0
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +118 -0
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +295 -0
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +186 -0
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +50 -0
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +146 -0
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +110 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +392 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +217 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter.js +69 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +32 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +291 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +175 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +37 -0
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +127 -0
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +400 -0
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +285 -0
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +66 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +797 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +619 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +335 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +230 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +363 -0
- package/.agents/scripts/lib/orchestration/error-journal.js +139 -0
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +31 -0
- package/.agents/scripts/lib/orchestration/file-assumptions.js +506 -0
- package/.agents/scripts/lib/orchestration/finalize/close-planning-tickets.js +116 -0
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +241 -0
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +489 -0
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +88 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +219 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +309 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +99 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +123 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +57 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +114 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +426 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +84 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +365 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +72 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +69 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +214 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +137 -0
- package/.agents/scripts/lib/orchestration/label-transitions.js +43 -0
- package/.agents/scripts/lib/orchestration/lifecycle/bus.js +309 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +147 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +155 -0
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +226 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +69 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +378 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +248 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +527 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +259 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +278 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +355 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +647 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +331 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +140 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +421 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +168 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +668 -0
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +322 -0
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +114 -0
- package/.agents/scripts/lib/orchestration/manifest-builder.js +216 -0
- package/.agents/scripts/lib/orchestration/model-attribution.js +390 -0
- package/.agents/scripts/lib/orchestration/parked-follow-ons.js +147 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +87 -0
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +63 -0
- package/.agents/scripts/lib/orchestration/plan-runner/plan-router.js +86 -0
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +212 -0
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +213 -0
- package/.agents/scripts/lib/orchestration/planning-risk.js +155 -0
- package/.agents/scripts/lib/orchestration/planning-state-manager.js +318 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +56 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +33 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +78 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +68 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +118 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +396 -0
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +205 -0
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +47 -0
- package/.agents/scripts/lib/orchestration/preflight-cache.js +164 -0
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +202 -0
- package/.agents/scripts/lib/orchestration/reconciler.js +137 -0
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +152 -0
- package/.agents/scripts/lib/orchestration/recut.js +56 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +127 -0
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +94 -0
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +448 -0
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +335 -0
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +133 -0
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +57 -0
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +275 -0
- package/.agents/scripts/lib/orchestration/retro-proposals.js +395 -0
- package/.agents/scripts/lib/orchestration/retro-runner.js +171 -0
- package/.agents/scripts/lib/orchestration/review-depth.js +93 -0
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +363 -0
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +205 -0
- package/.agents/scripts/lib/orchestration/review-providers/native.js +805 -0
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +73 -0
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +396 -0
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +373 -0
- package/.agents/scripts/lib/orchestration/review-providers/types.js +89 -0
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +107 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +159 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +194 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +81 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +190 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +70 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +106 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +42 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +73 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +225 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +315 -0
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +149 -0
- package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +110 -0
- package/.agents/scripts/lib/orchestration/spec-freshness.js +320 -0
- package/.agents/scripts/lib/orchestration/spec-renderer.js +456 -0
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +80 -0
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +797 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +163 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +152 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +387 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +266 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +48 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +67 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +161 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +117 -0
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +86 -0
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +147 -0
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +142 -0
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +62 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix-scoped.js +221 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix-shared.js +123 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +216 -0
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +636 -0
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +198 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +105 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +222 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +220 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +291 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +234 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +110 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +86 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +112 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +157 -0
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +434 -0
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +290 -0
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +643 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +67 -0
- package/.agents/scripts/lib/orchestration/task-body-validator.js +391 -0
- package/.agents/scripts/lib/orchestration/ticket-lease.js +358 -0
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +783 -0
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +367 -0
- package/.agents/scripts/lib/orchestration/ticket-validator.js +691 -0
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +723 -0
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +474 -0
- package/.agents/scripts/lib/orchestration/ticketing/state.js +559 -0
- package/.agents/scripts/lib/orchestration/ticketing.js +55 -0
- package/.agents/scripts/lib/orchestration/wave-marker.js +28 -0
- package/.agents/scripts/lib/orchestration/wave-record-io.js +277 -0
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +189 -0
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +423 -0
- package/.agents/scripts/lib/path-security.js +25 -0
- package/.agents/scripts/lib/plan-phase-cleanup.js +125 -0
- package/.agents/scripts/lib/preflight-runner.js +196 -0
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +95 -0
- package/.agents/scripts/lib/presentation/manifest-builder.js +245 -0
- package/.agents/scripts/lib/presentation/manifest-formatter.js +243 -0
- package/.agents/scripts/lib/presentation/manifest-helpers.js +213 -0
- package/.agents/scripts/lib/presentation/manifest-persistence.js +262 -0
- package/.agents/scripts/lib/presentation/manifest-procedures.js +55 -0
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +252 -0
- package/.agents/scripts/lib/presentation/manifest-renderer.js +188 -0
- package/.agents/scripts/lib/presentation/manifest-story-views.js +119 -0
- package/.agents/scripts/lib/provider-factory.js +80 -0
- package/.agents/scripts/lib/push-epic-retry.js +209 -0
- package/.agents/scripts/lib/qa/console-allowlist.js +151 -0
- package/.agents/scripts/lib/qa/coverage-report.js +181 -0
- package/.agents/scripts/lib/qa/coverage-verdict.js +296 -0
- package/.agents/scripts/lib/qa/propose-missing-test.js +95 -0
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +296 -0
- package/.agents/scripts/lib/qa/qa-session.js +197 -0
- package/.agents/scripts/lib/qa/redact-evidence.js +245 -0
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +190 -0
- package/.agents/scripts/lib/qa/resolve-selection.js +373 -0
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +100 -0
- package/.agents/scripts/lib/runtime-deps/manifest.js +96 -0
- package/.agents/scripts/lib/runtime-deps/preflight.js +78 -0
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +202 -0
- package/.agents/scripts/lib/signals/detectors/common.js +36 -0
- package/.agents/scripts/lib/signals/detectors/hotspot.js +298 -0
- package/.agents/scripts/lib/signals/detectors/index.js +14 -0
- package/.agents/scripts/lib/signals/detectors/retry.js +289 -0
- package/.agents/scripts/lib/signals/detectors/rework.js +204 -0
- package/.agents/scripts/lib/signals/index.js +39 -0
- package/.agents/scripts/lib/signals/read.js +268 -0
- package/.agents/scripts/lib/signals/schema.js +225 -0
- package/.agents/scripts/lib/signals/span-tree.js +290 -0
- package/.agents/scripts/lib/signals/write.js +19 -0
- package/.agents/scripts/lib/single-story/confirm-merge.js +201 -0
- package/.agents/scripts/lib/single-story/story-merged-notify.js +126 -0
- package/.agents/scripts/lib/single-story-sweep/protection.js +274 -0
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +169 -0
- package/.agents/scripts/lib/single-story-sweep.js +329 -0
- package/.agents/scripts/lib/skills/parse-skill.js +202 -0
- package/.agents/scripts/lib/skills/walk-skill-files.js +56 -0
- package/.agents/scripts/lib/spec/index.js +36 -0
- package/.agents/scripts/lib/spec/loader.js +425 -0
- package/.agents/scripts/lib/spec/state.js +217 -0
- package/.agents/scripts/lib/story-body/story-body.js +743 -0
- package/.agents/scripts/lib/story-init/blocker-validator.js +68 -0
- package/.agents/scripts/lib/story-init/branch-initializer.js +422 -0
- package/.agents/scripts/lib/story-init/context-resolver.js +92 -0
- package/.agents/scripts/lib/story-init/donor-precheck.js +207 -0
- package/.agents/scripts/lib/story-init/hierarchy-tracer.js +36 -0
- package/.agents/scripts/lib/story-init/state-transitioner.js +80 -0
- package/.agents/scripts/lib/story-init/task-graph-builder.js +114 -0
- package/.agents/scripts/lib/story-init/transition-summary.js +34 -0
- package/.agents/scripts/lib/story-lifecycle.js +186 -0
- package/.agents/scripts/lib/story-plan.js +246 -0
- package/.agents/scripts/lib/task-utils.js +26 -0
- package/.agents/scripts/lib/templates/decomposer-prompts.js +168 -0
- package/.agents/scripts/lib/test-env.js +30 -0
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +52 -0
- package/.agents/scripts/lib/test-isolate/list-files.js +90 -0
- package/.agents/scripts/lib/test-isolate/parse-tap.js +75 -0
- package/.agents/scripts/lib/test-isolate/runner.js +483 -0
- package/.agents/scripts/lib/test-profile/parse-tap.js +136 -0
- package/.agents/scripts/lib/test-profile/render-report.js +45 -0
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +35 -0
- package/.agents/scripts/lib/test-tiers.js +94 -0
- package/.agents/scripts/lib/util/concurrent-map.js +59 -0
- package/.agents/scripts/lib/util/phase-timer-state.js +72 -0
- package/.agents/scripts/lib/util/phase-timer.js +163 -0
- package/.agents/scripts/lib/util/poll-loop.js +86 -0
- package/.agents/scripts/lib/util/with-timeout.js +32 -0
- package/.agents/scripts/lib/validation-evidence.js +323 -0
- package/.agents/scripts/lib/wave-runner/tick.js +665 -0
- package/.agents/scripts/lib/wave-runner/wave-checkpoint.js +91 -0
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +19 -0
- package/.agents/scripts/lib/workers/crap-worker.js +197 -0
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +137 -0
- package/.agents/scripts/lib/workers/maintainability-worker.js +79 -0
- package/.agents/scripts/lib/workspace-provisioner.js +189 -0
- package/.agents/scripts/lib/worktree/bootstrapper.js +48 -0
- package/.agents/scripts/lib/worktree/inspector.js +140 -0
- package/.agents/scripts/lib/worktree/lifecycle/creation.js +118 -0
- package/.agents/scripts/lib/worktree/lifecycle/drift-detection.js +62 -0
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +276 -0
- package/.agents/scripts/lib/worktree/lifecycle/gc.js +49 -0
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +178 -0
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +264 -0
- package/.agents/scripts/lib/worktree/lifecycle/precheck.js +100 -0
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +588 -0
- package/.agents/scripts/lib/worktree/lifecycle/registry-sync.js +124 -0
- package/.agents/scripts/lib/worktree/lifecycle/shared.js +26 -0
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +40 -0
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +349 -0
- package/.agents/scripts/lib/worktree-manager.js +243 -0
- package/.agents/scripts/lifecycle-diff.js +206 -0
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +194 -0
- package/.agents/scripts/lifecycle-emit.js +479 -0
- package/.agents/scripts/lint-baseline.js +507 -0
- package/.agents/scripts/lint-label-vocabulary.js +237 -0
- package/.agents/scripts/loc-delta.js +205 -0
- package/.agents/scripts/notify.js +307 -0
- package/.agents/scripts/package.json +3 -0
- package/.agents/scripts/post-structured-comment.js +127 -0
- package/.agents/scripts/pr-watch-with-update.js +152 -0
- package/.agents/scripts/providers/github/auth.js +65 -0
- package/.agents/scripts/providers/github/board-add.js +63 -0
- package/.agents/scripts/providers/github/branch-protection.js +186 -0
- package/.agents/scripts/providers/github/cache.js +72 -0
- package/.agents/scripts/providers/github/comments.js +131 -0
- package/.agents/scripts/providers/github/compose.js +111 -0
- package/.agents/scripts/providers/github/errors.js +242 -0
- package/.agents/scripts/providers/github/issues.js +242 -0
- package/.agents/scripts/providers/github/labels.js +179 -0
- package/.agents/scripts/providers/github/mappers.js +126 -0
- package/.agents/scripts/providers/github/merge-methods.js +82 -0
- package/.agents/scripts/providers/github/project-board.js +47 -0
- package/.agents/scripts/providers/github/projects-v2-graphql.js +472 -0
- package/.agents/scripts/providers/github/prs.js +103 -0
- package/.agents/scripts/providers/github/request-helpers.js +110 -0
- package/.agents/scripts/providers/github/sub-issues.js +369 -0
- package/.agents/scripts/providers/github/tickets.js +381 -0
- package/.agents/scripts/providers/github/transient-retry.js +62 -0
- package/.agents/scripts/providers/github.js +157 -0
- package/.agents/scripts/quality-preview.js +327 -0
- package/.agents/scripts/quality-watch.js +223 -0
- package/.agents/scripts/render-manifest.js +143 -0
- package/.agents/scripts/resync-status-column.js +176 -0
- package/.agents/scripts/retro-run.js +167 -0
- package/.agents/scripts/run-audit-suite.js +97 -0
- package/.agents/scripts/run-coverage.js +103 -0
- package/.agents/scripts/run-lint.js +94 -0
- package/.agents/scripts/run-test-profile.js +126 -0
- package/.agents/scripts/run-tests.js +185 -0
- package/.agents/scripts/run-verify.js +56 -0
- package/.agents/scripts/select-audits.js +155 -0
- package/.agents/scripts/signals-view.js +294 -0
- package/.agents/scripts/single-story-close.js +83 -0
- package/.agents/scripts/single-story-confirm-merge.js +183 -0
- package/.agents/scripts/single-story-init.js +692 -0
- package/.agents/scripts/stories-wave-tick.js +415 -0
- package/.agents/scripts/story-close.js +246 -0
- package/.agents/scripts/story-deliver-prepare.js +267 -0
- package/.agents/scripts/story-init.js +516 -0
- package/.agents/scripts/story-phase.js +327 -0
- package/.agents/scripts/story-plan.js +284 -0
- package/.agents/scripts/sync-agentrc.js +71 -0
- package/.agents/scripts/sync-branch-from-base.js +138 -0
- package/.agents/scripts/sync-claude-commands.js +151 -0
- package/.agents/scripts/test-isolate.js +222 -0
- package/.agents/scripts/test-wrapper.js +108 -0
- package/.agents/scripts/update-coverage-baseline.js +129 -0
- package/.agents/scripts/update-crap-baseline.js +177 -0
- package/.agents/scripts/update-duplication-baseline.js +134 -0
- package/.agents/scripts/update-maintainability-baseline.js +183 -0
- package/.agents/scripts/update-mutation-baseline.js +189 -0
- package/.agents/scripts/update-ticket-state.js +107 -0
- package/.agents/scripts/validate-docs-freshness.js +259 -0
- package/.agents/scripts/validate-skills.js +278 -0
- package/.agents/scripts/wave-tick.js +335 -0
- package/.agents/skills/core/analyze-execution/SKILL.md +98 -0
- package/.agents/skills/core/api-and-interface-design/SKILL.md +327 -0
- package/.agents/skills/core/baseline-refresh/SKILL.md +181 -0
- package/.agents/skills/core/browser-testing-with-devtools/SKILL.md +352 -0
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +274 -0
- package/.agents/skills/core/ci-cd-and-automation/examples.md +211 -0
- package/.agents/skills/core/code-review-and-quality/SKILL.md +421 -0
- package/.agents/skills/core/code-simplification/SKILL.md +389 -0
- package/.agents/skills/core/context-engineering/SKILL.md +309 -0
- package/.agents/skills/core/context-engineering/examples.md +58 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +338 -0
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +250 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +79 -0
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +323 -0
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +145 -0
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +425 -0
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +393 -0
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +357 -0
- package/.agents/skills/core/git-workflow-and-versioning/SKILL.md +352 -0
- package/.agents/skills/core/hydrate-context/SKILL.md +118 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +317 -0
- package/.agents/skills/core/idea-refinement/examples.md +437 -0
- package/.agents/skills/core/idea-refinement/frameworks.md +135 -0
- package/.agents/skills/core/idea-refinement/refinement-criteria.md +155 -0
- package/.agents/skills/core/idea-refinement/scripts/idea-refine.sh +15 -0
- package/.agents/skills/core/incremental-implementation/SKILL.md +271 -0
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +213 -0
- package/.agents/skills/core/knowledge-transfer/SKILL.md +175 -0
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +117 -0
- package/.agents/skills/core/performance-optimization/SKILL.md +314 -0
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +277 -0
- package/.agents/skills/core/property-based-testing/SKILL.md +148 -0
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +105 -0
- package/.agents/skills/core/refactoring-discipline/SKILL.md +111 -0
- package/.agents/skills/core/scope-triage/SKILL.md +127 -0
- package/.agents/skills/core/security-and-hardening/SKILL.md +400 -0
- package/.agents/skills/core/shipping-and-launch/SKILL.md +328 -0
- package/.agents/skills/core/spec-driven-development/SKILL.md +252 -0
- package/.agents/skills/core/test-driven-development/SKILL.md +475 -0
- package/.agents/skills/core/using-agent-skills/SKILL.md +232 -0
- package/.agents/skills/skills.index.json +596 -0
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +31 -0
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +51 -0
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +48 -0
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +31 -0
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +33 -0
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +31 -0
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +51 -0
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +54 -0
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +29 -0
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +30 -0
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +57 -0
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +9 -0
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +48 -0
- package/.agents/skills/stack/frontend/astro/SKILL.md +62 -0
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +30 -0
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +29 -0
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +50 -0
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +58 -0
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +34 -0
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +51 -0
- package/.agents/skills/stack/qa/gherkin-authoring/SKILL.md +257 -0
- package/.agents/skills/stack/qa/gherkin-authoring/examples/invoice-issue.feature +41 -0
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +199 -0
- package/.agents/skills/stack/qa/playwright/SKILL.md +50 -0
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +188 -0
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +142 -0
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +220 -0
- package/.agents/skills/stack/qa/vitest/SKILL.md +51 -0
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +68 -0
- package/.agents/starter-agentrc.json +22 -0
- package/.agents/templates/agent-protocol.md +72 -0
- package/.agents/templates/docs/architecture.md +30 -0
- package/.agents/templates/docs/decisions.md +24 -0
- package/.agents/templates/epic-from-idea.md +21 -0
- package/.agents/templates/single-story-body.md +17 -0
- package/.agents/workflows/agents-update.md +415 -0
- package/.agents/workflows/audit-architecture.md +312 -0
- package/.agents/workflows/audit-clean-code.md +179 -0
- package/.agents/workflows/audit-dependencies.md +91 -0
- package/.agents/workflows/audit-devops.md +110 -0
- package/.agents/workflows/audit-lighthouse.md +260 -0
- package/.agents/workflows/audit-performance.md +161 -0
- package/.agents/workflows/audit-privacy.md +104 -0
- package/.agents/workflows/audit-quality.md +191 -0
- package/.agents/workflows/audit-security.md +156 -0
- package/.agents/workflows/audit-seo.md +118 -0
- package/.agents/workflows/audit-sre.md +139 -0
- package/.agents/workflows/audit-to-stories.md +257 -0
- package/.agents/workflows/audit-ux-ui.md +102 -0
- package/.agents/workflows/epic-deliver.md +864 -0
- package/.agents/workflows/epic-plan.md +998 -0
- package/.agents/workflows/explain.md +118 -0
- package/.agents/workflows/git-cleanup.md +250 -0
- package/.agents/workflows/git-commit-all.md +15 -0
- package/.agents/workflows/git-merge-pr.md +377 -0
- package/.agents/workflows/git-pr-all.md +278 -0
- package/.agents/workflows/git-push.md +60 -0
- package/.agents/workflows/helpers/_merge-conflict-template.md +54 -0
- package/.agents/workflows/helpers/acceptance-self-eval.md +74 -0
- package/.agents/workflows/helpers/agents-sync-config.md +129 -0
- package/.agents/workflows/helpers/code-quality-guardrails.md +101 -0
- package/.agents/workflows/helpers/code-review.md +370 -0
- package/.agents/workflows/helpers/diagnose.md +117 -0
- package/.agents/workflows/helpers/epic-audit.md +295 -0
- package/.agents/workflows/helpers/epic-deliver-story.md +370 -0
- package/.agents/workflows/helpers/epic-plan-decompose.md +199 -0
- package/.agents/workflows/helpers/epic-plan-spec.md +184 -0
- package/.agents/workflows/helpers/epic-testing.md +125 -0
- package/.agents/workflows/helpers/parallel-tooling.md +88 -0
- package/.agents/workflows/helpers/signals.md +112 -0
- package/.agents/workflows/helpers/single-story-deliver.md +636 -0
- package/.agents/workflows/helpers/worktree-lifecycle.md +317 -0
- package/.agents/workflows/onboard.md +207 -0
- package/.agents/workflows/qa-assist.md +293 -0
- package/.agents/workflows/qa-explore.md +350 -0
- package/.agents/workflows/qa-run-harness.md +288 -0
- package/.agents/workflows/story-deliver.md +327 -0
- package/.agents/workflows/story-plan.md +233 -0
- package/LICENSE +21 -0
- package/README.md +193 -0
- package/bin/mandrel.js +56 -0
- package/bin/postinstall.js +195 -0
- package/lib/cli/__tests__/migrate.test.js +268 -0
- package/lib/cli/__tests__/sync-local-zone.test.js +247 -0
- package/lib/cli/__tests__/sync.test.js +372 -0
- package/lib/cli/__tests__/update-major.test.js +217 -0
- package/lib/cli/__tests__/update.test.js +696 -0
- package/lib/cli/__tests__/version-check.test.js +398 -0
- package/lib/cli/doctor.js +124 -0
- package/lib/cli/explain.js +107 -0
- package/lib/cli/migrate.js +260 -0
- package/lib/cli/registry.js +830 -0
- package/lib/cli/sync-commands.js +50 -0
- package/lib/cli/sync.js +200 -0
- package/lib/cli/uninstall.js +795 -0
- package/lib/cli/update.js +854 -0
- package/lib/cli/version-check.js +206 -0
- package/lib/migrations/README.md +69 -0
- package/lib/migrations/__tests__/index.test.js +216 -0
- package/lib/migrations/index.js +164 -0
- package/package.json +105 -0
|
@@ -0,0 +1,998 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
Orchestrates end-to-end Epic planning (PRD, Tech Spec, Acceptance Spec, and
|
|
4
|
+
Work Breakdown) for a GitHub Epic.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /epic-plan [Epic ID]
|
|
8
|
+
|
|
9
|
+
## Role
|
|
10
|
+
|
|
11
|
+
Director / Architect
|
|
12
|
+
|
|
13
|
+
## Context
|
|
14
|
+
|
|
15
|
+
You are the master orchestrator for the v5 Epic-Centric ticketing pipeline. Your
|
|
16
|
+
goal is to transform a high-level Epic into a fully decomposed, ready-to-execute
|
|
17
|
+
backlog of Features, Stories, and Tasks.
|
|
18
|
+
|
|
19
|
+
`/epic-plan` is the unified planning entry point. It delegates to the two
|
|
20
|
+
phase helpers — [`helpers/epic-plan-spec.md`](helpers/epic-plan-spec.md) and
|
|
21
|
+
[`helpers/epic-plan-decompose.md`](helpers/epic-plan-decompose.md) — and runs
|
|
22
|
+
both phases sequentially with a human confirmation gate between them. The Epic
|
|
23
|
+
ID is the single positional argument.
|
|
24
|
+
|
|
25
|
+
As of v5.6, planning artifacts (PRD, Tech Spec, ticket decomposition) are
|
|
26
|
+
authored **directly by you, the host LLM** — no external Gemini / Anthropic /
|
|
27
|
+
OpenAI API is called. The Node scripts are deterministic GitHub I/O wrappers
|
|
28
|
+
that (a) emit the authoring context you need and (b) validate and persist the
|
|
29
|
+
artifacts you author.
|
|
30
|
+
|
|
31
|
+
## Constraint
|
|
32
|
+
|
|
33
|
+
- Do not modify existing issues without explicit permission.
|
|
34
|
+
- Wait for user validation before migrating to Phase 8 when
|
|
35
|
+
`planningRisk.requiresReview` is true (or the operator passes
|
|
36
|
+
`--force-review`). Low-risk Epics auto-proceed after spec validation.
|
|
37
|
+
See [SDLC § Adaptive planning risk routing](../docs/SDLC.md#adaptive-planning-risk-routing)
|
|
38
|
+
for the full envelope shape and the planner-selected
|
|
39
|
+
`acceptance::n-a` route.
|
|
40
|
+
- Delegate Phase 7 and Phase 8 to the
|
|
41
|
+
[`helpers/epic-plan-spec.md`](helpers/epic-plan-spec.md) and
|
|
42
|
+
[`helpers/epic-plan-decompose.md`](helpers/epic-plan-decompose.md)
|
|
43
|
+
procedures respectively — they own the Epic lifecycle label transitions and
|
|
44
|
+
the `epic-plan-state` checkpoint. This wrapper must not apply those labels
|
|
45
|
+
directly.
|
|
46
|
+
|
|
47
|
+
## Prerequisites
|
|
48
|
+
|
|
49
|
+
1. **GitHub Epic**: An existing GitHub Issue with the `type::epic` label.
|
|
50
|
+
Skipped when entering via Phase 1 / `--idea` (the Epic does not exist
|
|
51
|
+
yet — Phases 1–4 will create it).
|
|
52
|
+
2. **API Keys**: `GITHUB_TOKEN` must be set in the `.env` file.
|
|
53
|
+
|
|
54
|
+
## Phase 1: Idea Refinement (s-plan-ideation entry)
|
|
55
|
+
|
|
56
|
+
This phase runs **only** when no `<epic#>` argument is supplied, or when
|
|
57
|
+
`--idea "<seed>"` is passed. If an Epic ID was provided, skip directly to
|
|
58
|
+
Phase 5 (Re-Plan Detection).
|
|
59
|
+
|
|
60
|
+
1. **Activate the ideation skill**: Read
|
|
61
|
+
`<agentRoot>/skills/core/idea-refinement/SKILL.md` via the `Read`
|
|
62
|
+
tool (resolve `<agentRoot>` from `project.paths.agentRoot` —
|
|
63
|
+
default `.agents`) and execute its procedure with the `--idea` value
|
|
64
|
+
(or a user-supplied seed if no argument was given) as the seed. The
|
|
65
|
+
skill drives its own three-phase divergent → convergent → sharpen
|
|
66
|
+
loop and returns a markdown one-pager with the canonical sections
|
|
67
|
+
(Problem Statement, Recommended Direction, Key Assumptions, MVP
|
|
68
|
+
Scope, Not Doing). This is the canonical pattern for framework
|
|
69
|
+
skills — they are library-style content read on-demand per
|
|
70
|
+
`<agentRoot>/instructions.md` section 1.B, not entries in the
|
|
71
|
+
host's harness-level skill registry.
|
|
72
|
+
|
|
73
|
+
2. **Run Phase 1.5 (Scope Triage) before the HITL stop**: The sharpened
|
|
74
|
+
one-pager feeds the scope-triage gate below, whose verdict folds into
|
|
75
|
+
the **same** Phase 1 HITL confirmation. Do not stop twice.
|
|
76
|
+
|
|
77
|
+
3. **HITL stop — confirm the sharpened one-pager**: Display the one-pager
|
|
78
|
+
to the operator and **STOP**. Do not proceed to Phase 2 until the
|
|
79
|
+
user explicitly confirms the direction. This is the same gate the
|
|
80
|
+
skill's own Phase 3 enforces; surfacing it here makes the wait
|
|
81
|
+
contract visible to `/epic-plan` callers. When the Phase 1.5 verdict is
|
|
82
|
+
`story` or `borderline`, this stop carries the three-way choice the
|
|
83
|
+
triage gate defines (below) instead of a plain confirm.
|
|
84
|
+
|
|
85
|
+
## Phase 1.5: Scope Triage (ideation path only)
|
|
86
|
+
|
|
87
|
+
This phase runs **only** on the ideation path, immediately after Phase 1
|
|
88
|
+
produces the sharpened one-pager. It is **skipped entirely** when an Epic ID
|
|
89
|
+
argument was supplied (the existing-Epic path jumps straight to Phase 5), and
|
|
90
|
+
it is **skipped** when `/epic-plan` was entered via a scope-triage handoff from
|
|
91
|
+
[`/story-plan`](story-plan.md) — a handoff is a triage decision already made,
|
|
92
|
+
and re-triaging it would re-litigate a settled call (the no-re-triage rule the
|
|
93
|
+
skill states once).
|
|
94
|
+
|
|
95
|
+
1. **Activate the scope-triage skill**: Read
|
|
96
|
+
[`<agentRoot>/skills/core/scope-triage/SKILL.md`](../skills/core/scope-triage/SKILL.md)
|
|
97
|
+
via the `Read` tool (resolve `<agentRoot>` from `project.paths.agentRoot` —
|
|
98
|
+
default `.agents`) and apply its rubric to the Phase 1 one-pager. The skill
|
|
99
|
+
anchors its sizing judgment **by reference** to
|
|
100
|
+
`DELIVERABLE_GRANULARITY_GUIDANCE` / `DEFAULT_TASK_SIZING` in
|
|
101
|
+
[`ticket-validator-sizing.js`](../scripts/lib/orchestration/ticket-validator-sizing.js)
|
|
102
|
+
and emits one verdict: `epic` | `story` | `borderline`. The verdict is
|
|
103
|
+
host-LLM judgment — there is **no `--flag`**, no scorer, no schema, and no
|
|
104
|
+
label transition.
|
|
105
|
+
|
|
106
|
+
2. **Fold the verdict into the existing Phase 1 HITL stop** — do **not** add a
|
|
107
|
+
second stop:
|
|
108
|
+
- **`epic` verdict** → no extra prompt. The Phase 1 confirmation proceeds
|
|
109
|
+
as a plain one-pager confirm and the run continues to Phase 2.
|
|
110
|
+
- **`story` or `borderline` verdict** → the Phase 1 confirmation prompt
|
|
111
|
+
presents a **three-way operator choice**:
|
|
112
|
+
- **Recommended: single Story** (with the triage rationale) — persist the
|
|
113
|
+
one-pager to a notes file and hand off to
|
|
114
|
+
`/story-plan --from-notes <path>`, identifying the invocation as a
|
|
115
|
+
scope-triage handoff so `/story-plan` skips its own gate. Then **exit
|
|
116
|
+
`/epic-plan`**.
|
|
117
|
+
- **Plan as Epic anyway** — ignore the recommendation and continue to
|
|
118
|
+
Phase 2 with the one-pager.
|
|
119
|
+
- **Abort** — stop planning entirely.
|
|
120
|
+
|
|
121
|
+
**Never auto-route.** The verdict is advisory; the operator always decides.
|
|
122
|
+
Being wrong in the `epic` direction is cheap (Phase 8.3 consolidation and
|
|
123
|
+
the sizing validator catch an over-planned Story later); the gate exists to
|
|
124
|
+
avoid the ceremony tax of pushing a story-sized scope through the full Epic
|
|
125
|
+
pipeline.
|
|
126
|
+
|
|
127
|
+
## Phase 2: Cross-Epic Duplicate Search
|
|
128
|
+
|
|
129
|
+
Runs immediately after Phase 1 (and only on the s-plan-ideation path).
|
|
130
|
+
Its job is to surface open Epics whose scope already overlaps with the
|
|
131
|
+
sharpened one-pager so the operator can fold the work in rather than
|
|
132
|
+
opening a duplicate.
|
|
133
|
+
|
|
134
|
+
1. **Invoke the duplicate-search module**: Call
|
|
135
|
+
`findSimilarOpenEpics({ onePager, provider })` exported from
|
|
136
|
+
[`.agents/scripts/lib/duplicate-search.js`](../scripts/lib/duplicate-search.js).
|
|
137
|
+
The `provider` is the resolved ticketing provider
|
|
138
|
+
(`provider-factory.js`), and `onePager` is the markdown returned by
|
|
139
|
+
Phase 1.
|
|
140
|
+
|
|
141
|
+
2. **HITL pause on match**: If the module returns a non-empty ranked
|
|
142
|
+
list, render the candidates (id, title, score, URL) and **STOP**. Do
|
|
143
|
+
not proceed to Phase 3 until the user either (a) confirms the new
|
|
144
|
+
Epic is genuinely distinct or (b) chooses to fold the idea into one of
|
|
145
|
+
the existing Epics, in which case `/epic-plan` exits and the operator
|
|
146
|
+
resumes work on the existing Epic ID.
|
|
147
|
+
|
|
148
|
+
3. **No-match fast path**: If the module returns `[]`, proceed
|
|
149
|
+
immediately to Phase 3 — no operator intervention required.
|
|
150
|
+
|
|
151
|
+
## Phase 3: Render Epic Body from One-Pager
|
|
152
|
+
|
|
153
|
+
Runs after Phase 2 clears (no duplicates, or operator confirmed the
|
|
154
|
+
new Epic is genuinely distinct).
|
|
155
|
+
|
|
156
|
+
1. **Render the body**: Call
|
|
157
|
+
`renderEpicBody({ onePager, template })` exported from
|
|
158
|
+
[`.agents/scripts/lib/epic-plan-ideation.js`](../scripts/lib/epic-plan-ideation.js).
|
|
159
|
+
The `template` argument is the contents of
|
|
160
|
+
[`.agents/templates/epic-from-idea.md`](../templates/epic-from-idea.md),
|
|
161
|
+
which carries the five canonical sections (Context, Goal, Non-Goals,
|
|
162
|
+
Scope, Acceptance Criteria). Sections missing from the one-pager are
|
|
163
|
+
rendered as `_(not specified)_` rather than left as raw `{{token}}`
|
|
164
|
+
placeholders.
|
|
165
|
+
|
|
166
|
+
2. **HITL stop — confirm the body**: Display the rendered body to the
|
|
167
|
+
operator and **STOP**. Do not proceed to Phase 4 until the user
|
|
168
|
+
explicitly confirms the body is correct. This is the last chance to
|
|
169
|
+
tweak wording before the GitHub Issue is opened.
|
|
170
|
+
|
|
171
|
+
## Phase 4: Open the GitHub Issue (`type::epic` only)
|
|
172
|
+
|
|
173
|
+
1. **Open the Epic Issue**: Call
|
|
174
|
+
`openEpicFromOnePager({ onePager, template, createIssue })` from the
|
|
175
|
+
same `epic-plan-ideation.js` module. Pass a `createIssue` port that
|
|
176
|
+
delegates to the resolved ticketing provider's `createIssue` method
|
|
177
|
+
(`provider-factory.js`; GitHub: `TicketGateway.createIssue`) so the
|
|
178
|
+
labels and body land via the canonical I/O surface.
|
|
179
|
+
|
|
180
|
+
**Board membership (Story #3822)**: the provider's `createIssue`
|
|
181
|
+
adds the new Epic to the configured Projects V2 board via the
|
|
182
|
+
shared `addIssueToBoard` helper
|
|
183
|
+
([`providers/github/board-add.js`](../scripts/providers/github/board-add.js))
|
|
184
|
+
— idempotent, non-fatal (warn-on-error), and a no-op when no
|
|
185
|
+
project number is configured — so the Epic lands on the board
|
|
186
|
+
without relying on GitHub's "Auto-add to project" built-in
|
|
187
|
+
workflow (off by default on fresh boards and not enableable via
|
|
188
|
+
API). The created issue's GraphQL `node_id` is surfaced as
|
|
189
|
+
`nodeId` on the returned envelope for follow-up board operations.
|
|
190
|
+
|
|
191
|
+
2. **Label discipline**: The Issue is opened with **only** the
|
|
192
|
+
`type::epic` label. **Do not** add any `state::*` label at creation
|
|
193
|
+
time — the Epic carries only `type::epic` until PRD authoring
|
|
194
|
+
advances it to `agent::review-spec` in Phase 7. The
|
|
195
|
+
`openEpicFromOnePager` helper already enforces this; the workflow
|
|
196
|
+
prose codifies the intent so future label-set tweaks don't silently
|
|
197
|
+
widen it.
|
|
198
|
+
|
|
199
|
+
3. **Continue to Phase 5**: The captured Epic ID becomes the new
|
|
200
|
+
`[Epic_ID]` for the rest of the planning pipeline. Re-Plan Detection
|
|
201
|
+
(Phase 5) will short-circuit because no PRD/Tech Spec is linked yet,
|
|
202
|
+
so the run flows naturally into Phase 6 (Epic Clarity Gate) and then
|
|
203
|
+
Phase 7.
|
|
204
|
+
|
|
205
|
+
## Phase 5: Re-Plan Detection
|
|
206
|
+
|
|
207
|
+
Before generating any artifacts, check whether the Epic has already been
|
|
208
|
+
planned.
|
|
209
|
+
|
|
210
|
+
1. **Fetch Epic**: Read the Epic issue body and check for a
|
|
211
|
+
`## Planning Artifacts` section containing PRD and Tech Spec references.
|
|
212
|
+
2. **If already planned**: Inform the user that this Epic already has planning
|
|
213
|
+
artifacts. Ask:
|
|
214
|
+
|
|
215
|
+
> "Epic #[ID] already has PRD (#XX) and Tech Spec (#XX) with YY decomposed
|
|
216
|
+
> tickets. Do you want to **re-plan**? This will **overwrite the PRD,
|
|
217
|
+
> Tech Spec, and Acceptance Spec in place** (same issue numbers, refreshed
|
|
218
|
+
> bodies, comment history preserved) and **close-and-recreate** all
|
|
219
|
+
> Feature/Story tickets."
|
|
220
|
+
|
|
221
|
+
3. **If user confirms re-plan**: Pass `--force` to all subsequent script
|
|
222
|
+
invocations. Under `--force`, the three context tickets (PRD, Tech Spec,
|
|
223
|
+
Acceptance Spec) are overwritten in place — their issue numbers, Epic
|
|
224
|
+
sub-issue links, and prior discussion are preserved, and each receives a
|
|
225
|
+
one-line regeneration audit comment. Feature/Story child tickets are still
|
|
226
|
+
closed and recreated, because a re-decomposition can legitimately produce a
|
|
227
|
+
different ticket set.
|
|
228
|
+
4. **If user declines**: Abort gracefully.
|
|
229
|
+
|
|
230
|
+
## Phase 5.5: Story-Sized Advisory (existing-Epic path)
|
|
231
|
+
|
|
232
|
+
An **advisory** scope-triage check that catches a story-sized scope which was
|
|
233
|
+
hand-opened directly as a `type::epic` issue before any ceremony is paid for.
|
|
234
|
+
Phase 6's Epic Clarity Gate scores section *presence*, not scope *size* — a
|
|
235
|
+
perfectly clear but story-sized Epic (typically a thin, freshly opened issue)
|
|
236
|
+
sails straight through to full planning. This advisory is the size check the
|
|
237
|
+
clarity gate does not make.
|
|
238
|
+
|
|
239
|
+
### Firing condition (load-bearing)
|
|
240
|
+
|
|
241
|
+
The advisory runs **only** when **both** hold:
|
|
242
|
+
|
|
243
|
+
1. **Phase 5 found no planning artifacts** — the Epic body has no
|
|
244
|
+
`## Planning Artifacts` section linking a PRD / Tech Spec (i.e. Phase 5
|
|
245
|
+
did **not** enter its re-plan branch).
|
|
246
|
+
2. **The Epic has no open Feature/Story children** — no open `type::feature`
|
|
247
|
+
or `type::story` sub-issues are linked to this Epic.
|
|
248
|
+
|
|
249
|
+
If **either** condition fails, **skip this phase silently** and continue to
|
|
250
|
+
Phase 6. It must **never** fire on the re-plan path: recommending a "downgrade
|
|
251
|
+
to a Story" on an Epic that already carries a PRD and a ticket tree is
|
|
252
|
+
nonsense and would collide with the `--force` re-plan flow. The advisory also
|
|
253
|
+
does not fire on the ideation path — that path already ran the Phase 1.5 scope
|
|
254
|
+
triage on the one-pager before the Epic existed.
|
|
255
|
+
|
|
256
|
+
### Triage
|
|
257
|
+
|
|
258
|
+
1. **Activate the scope-triage skill**: Read
|
|
259
|
+
[`<agentRoot>/skills/core/scope-triage/SKILL.md`](../skills/core/scope-triage/SKILL.md)
|
|
260
|
+
via the `Read` tool (resolve `<agentRoot>` from `project.paths.agentRoot` —
|
|
261
|
+
default `.agents`) and apply its rubric to the **Epic body**. The skill is
|
|
262
|
+
artifact-agnostic — it reads the same against an Epic body as against a
|
|
263
|
+
one-pager or a Story draft — and anchors its sizing judgment **by
|
|
264
|
+
reference** to `DELIVERABLE_GRANULARITY_GUIDANCE` / `DEFAULT_TASK_SIZING`
|
|
265
|
+
in
|
|
266
|
+
[`ticket-validator-sizing.js`](../scripts/lib/orchestration/ticket-validator-sizing.js).
|
|
267
|
+
It emits one verdict: `epic` | `story` | `borderline`. The verdict is
|
|
268
|
+
host-LLM judgment — there is **no `--flag`**, no scorer, no schema, and no
|
|
269
|
+
label transition behind this gate. Do **not** restate the skill's rubric or
|
|
270
|
+
its sizing thresholds here.
|
|
271
|
+
|
|
272
|
+
2. **`epic` verdict** → proceed silently. No extra prompt, no HITL stop. The
|
|
273
|
+
run continues straight to Phase 6. Being wrong in the `epic` direction is
|
|
274
|
+
cheap (Phase 8.3 consolidation and the sizing validator catch an
|
|
275
|
+
over-planned Story later), so an `epic` verdict never costs the operator a
|
|
276
|
+
stop.
|
|
277
|
+
|
|
278
|
+
3. **`story` or `borderline` verdict** → **STOP** and present a **three-way
|
|
279
|
+
operator choice**. Never auto-route; the verdict is advisory and the
|
|
280
|
+
operator always decides.
|
|
281
|
+
|
|
282
|
+
- **Recommended: convert to a standalone Story** (with the triage
|
|
283
|
+
rationale) — run the conversion path below.
|
|
284
|
+
- **Proceed as Epic anyway** — ignore the recommendation and continue to
|
|
285
|
+
Phase 6 with the Epic unchanged.
|
|
286
|
+
- **Abort** — stop planning entirely. The Epic is left exactly as it was;
|
|
287
|
+
no labels move and nothing is closed.
|
|
288
|
+
|
|
289
|
+
### Conversion path (close-and-recreate)
|
|
290
|
+
|
|
291
|
+
Conversion is **close-and-recreate**, not in-place relabeling. A `type::epic`
|
|
292
|
+
body does not satisfy `validateStoryBody` (it lacks the required Story
|
|
293
|
+
sections and would have to drop the Epic shape), and editing or relabeling the
|
|
294
|
+
existing issue violates the workflow's "Do not modify existing issues without
|
|
295
|
+
explicit permission" Constraint. So the conversion seeds a fresh Story and
|
|
296
|
+
closes the Epic in its favor, and **every** issue mutation below happens
|
|
297
|
+
**only after the operator explicitly confirms the conversion in-session**:
|
|
298
|
+
|
|
299
|
+
1. **Seed a notes file from the Epic body.** Write the Epic's Context / Goal /
|
|
300
|
+
Scope / Acceptance Criteria into a seed file under
|
|
301
|
+
`temp/epic-[Epic_ID]/scope-triage-seed.md` (the `temp/` tree is gitignored).
|
|
302
|
+
This is the same notes-file shape `/story-plan --from-notes` consumes.
|
|
303
|
+
|
|
304
|
+
2. **Hand off to `/story-plan --from-notes`.** Invoke
|
|
305
|
+
[`/story-plan --from-notes temp/epic-[Epic_ID]/scope-triage-seed.md`](story-plan.md),
|
|
306
|
+
**identifying the invocation as a scope-triage handoff** so `/story-plan`
|
|
307
|
+
skips its own escalation gate (the skill's no-re-triage rule — a handoff is
|
|
308
|
+
a settled triage decision, and re-running the gate on the receiving side
|
|
309
|
+
would re-litigate it and risk a ping-pong between the two workflows). The
|
|
310
|
+
replacement Story's `## Notes` section links back to the closed Epic
|
|
311
|
+
(`Converted from Epic #[Epic_ID] — scope triaged as a standalone Story`) so
|
|
312
|
+
the audit trail is bidirectional.
|
|
313
|
+
|
|
314
|
+
3. **Close the Epic in favor of the replacement.** Once `/story-plan` has
|
|
315
|
+
created the replacement Story (capture its number as `#N`), close the Epic
|
|
316
|
+
with a cross-linking comment:
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
gh issue close [Epic_ID] --repo <owner>/<repo> \
|
|
320
|
+
--comment "Closed in favor of #N — scope triaged as a standalone Story."
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
This is the only `gh issue close` in the path, and it runs **after** the
|
|
324
|
+
replacement Story exists, so the conversion never strands a closed Epic
|
|
325
|
+
with no successor. The replacement-Story back-link plus this close comment
|
|
326
|
+
give a reviewer the full bidirectional trail.
|
|
327
|
+
|
|
328
|
+
The conversion mutates two issues (creates the Story, closes the Epic) — both
|
|
329
|
+
behind the single operator confirmation above. After conversion `/epic-plan`
|
|
330
|
+
exits: the work now lives on the standalone Story, which the operator delivers
|
|
331
|
+
via [`/single-story-deliver`](helpers/single-story-deliver.md) or
|
|
332
|
+
[`/story-deliver`](story-deliver.md).
|
|
333
|
+
|
|
334
|
+
## Phase 6: Epic Clarity Gate
|
|
335
|
+
|
|
336
|
+
Runs on every existing-Epic invocation, after Phase 5 (Re-Plan
|
|
337
|
+
Detection) and the Phase 5.5 story-sized advisory, and before Phase 7
|
|
338
|
+
(PRD, Tech Spec & Acceptance Spec). The gate scores the Epic body
|
|
339
|
+
against the five canonical
|
|
340
|
+
sections from
|
|
341
|
+
[`.agents/templates/epic-from-idea.md`](../templates/epic-from-idea.md)
|
|
342
|
+
(Context, Goal, Non-Goals, Scope, Acceptance Criteria) and either
|
|
343
|
+
skips fast (when the Epic body is already clear) or drops into a
|
|
344
|
+
refinement loop seeded from the current Epic body. The scorer also
|
|
345
|
+
accepts common heading variants for back-compat (e.g. `## Problem`,
|
|
346
|
+
`## Direction`, `## MVP Scope`, `## Not Doing`, `## Out of Scope`) so
|
|
347
|
+
hand-authored Epics that predate the canonical headings continue to
|
|
348
|
+
pass without rewording.
|
|
349
|
+
|
|
350
|
+
The rubric is deterministic: section-presence against the five
|
|
351
|
+
canonical headings. A `clear` verdict requires **both** ≥ 4 of 5
|
|
352
|
+
sections present **and** the **Acceptance Criteria** section present —
|
|
353
|
+
AC is a required section, not one of the four optional passers, so an
|
|
354
|
+
Epic with no Acceptance Criteria is always `needs-refinement` (it would
|
|
355
|
+
otherwise hard-fail the `/epic-deliver` start gate downstream). See
|
|
356
|
+
[`lib/epic-plan-clarity.js`](../scripts/lib/epic-plan-clarity.js)
|
|
357
|
+
for the scoring logic.
|
|
358
|
+
|
|
359
|
+
1. **Score the body**: Run the clarity-check CLI in context-emission
|
|
360
|
+
mode.
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
node .agents/scripts/epic-plan-clarity.js --epic [Epic_ID] --emit-context \
|
|
364
|
+
> temp/epic-[Epic_ID]/clarity-context.json
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
The envelope carries
|
|
368
|
+
`{ epicId, epicBody, verdict, sections, missingOrPlaceholder }`.
|
|
369
|
+
|
|
370
|
+
2. **Clear fast path**: When `verdict === 'clear'`, print
|
|
371
|
+
`Epic clarity: clear — proceeding to Phase 7.` and continue. No
|
|
372
|
+
HITL, no prompt.
|
|
373
|
+
|
|
374
|
+
3. **Needs-refinement path**: When `verdict === 'needs-refinement'`,
|
|
375
|
+
activate the
|
|
376
|
+
[`core/idea-refinement`](../skills/core/idea-refinement/SKILL.md)
|
|
377
|
+
skill **seeded from the current Epic body** (not a blank seed),
|
|
378
|
+
with `missingOrPlaceholder` as the convergence target. The skill
|
|
379
|
+
runs its three-phase divergent → convergent → sharpen loop and
|
|
380
|
+
returns a sharpened one-pager.
|
|
381
|
+
|
|
382
|
+
4. **Re-render the body**: Call
|
|
383
|
+
`renderEpicBody({ onePager, template })` from
|
|
384
|
+
[`lib/epic-plan-ideation.js`](../scripts/lib/epic-plan-ideation.js)
|
|
385
|
+
(the same helper Phase 3 uses), passing the contents of
|
|
386
|
+
[`.agents/templates/epic-from-idea.md`](../templates/epic-from-idea.md).
|
|
387
|
+
Write the result to `temp/epic-[Epic_ID]/clarity-update.md`.
|
|
388
|
+
|
|
389
|
+
5. **HITL stop — confirm the diff**: Display the diff between the
|
|
390
|
+
current Epic body and the sharpened body and **STOP**. Operator
|
|
391
|
+
approves, edits, or aborts. Flag the blast radius in the
|
|
392
|
+
confirmation prompt: an approved body change feeds **three**
|
|
393
|
+
downstream artifacts (PRD, Tech Spec, Acceptance Spec) — treat
|
|
394
|
+
this gate as a one-shot rewrite, not an iterative draft. The
|
|
395
|
+
Constraint ("Do not modify existing issues without explicit
|
|
396
|
+
permission") is honored — no `gh issue edit` call until the
|
|
397
|
+
operator confirms.
|
|
398
|
+
|
|
399
|
+
6. **Persist**: On approval, run the persist mode:
|
|
400
|
+
|
|
401
|
+
```bash
|
|
402
|
+
node .agents/scripts/epic-plan-clarity.js --epic [Epic_ID] \
|
|
403
|
+
--updated-body temp/epic-[Epic_ID]/clarity-update.md
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
The CLI persists the new body via `provider.updateTicket` and
|
|
407
|
+
posts a `clarity-gate-update` audit comment recording the change.
|
|
408
|
+
Idempotent: no-op when the file content matches the current body.
|
|
409
|
+
|
|
410
|
+
7. **Re-verify**: Re-run the `--emit-context` step once to confirm
|
|
411
|
+
the verdict flipped to `clear`. If it still reads
|
|
412
|
+
`needs-refinement`, abort with a non-zero exit and surface a
|
|
413
|
+
remediation hint to the operator. Do not loop — one refinement
|
|
414
|
+
pass per invocation, matching the `--force` re-plan pattern.
|
|
415
|
+
|
|
416
|
+
## Phase 7: Epic Planning (PRD, Tech Spec & Acceptance Spec)
|
|
417
|
+
|
|
418
|
+
> **Epic-lease preflight (workflow guard).** Before any Phase 7 mutation,
|
|
419
|
+
> `epic-plan-spec.js` acquires the Epic-lease via the assignee-as-lease
|
|
420
|
+
> primitive (`lib/orchestration/ticket-lease.js`, wired through
|
|
421
|
+
> `lib/orchestration/epic-plan-lease-guard.js`). The lease rides the Epic's
|
|
422
|
+
> single assignee: the operator (`github.operatorHandle` in `.agentrc.json`)
|
|
423
|
+
> claims the Epic for the duration of the plan. The guard **fails closed**:
|
|
424
|
+
> `/epic-plan` emits no `story.heartbeat` during its run (heartbeats are a
|
|
425
|
+
> delivery-time signal), so there is no live-heartbeat source to judge a
|
|
426
|
+
> concurrent plan's liveness from. Any **foreign assignee** is therefore
|
|
427
|
+
> treated as a live claim — the persist half **exits non-zero and names the
|
|
428
|
+
> current owner**, so two `/epic-plan` runs cannot drive the same Epic
|
|
429
|
+
> concurrently. Pass **`--steal`** to forcibly transfer a foreign claim once
|
|
430
|
+
> you have confirmed the other run is dead. An **unassigned** Epic, or one
|
|
431
|
+
> **already held by this operator**, is taken (or re-affirmed) silently. The
|
|
432
|
+
> lease is **released after Phase 8** (decompose) completes; see the Phase 8
|
|
433
|
+
> note.
|
|
434
|
+
|
|
435
|
+
<!-- separator: adjacent blockquotes -->
|
|
436
|
+
|
|
437
|
+
> **Idempotent context tickets.** The persist half is find-or-create keyed on
|
|
438
|
+
> the Epic's `linkedIssues`: a re-run **reuses the already-linked PRD and Tech
|
|
439
|
+
> Spec issues** (and Acceptance Spec, when present) instead of creating
|
|
440
|
+
> duplicates. Pass `--force` to overwrite the canonical context tickets in
|
|
441
|
+
> place (same issue numbers, refreshed bodies).
|
|
442
|
+
|
|
443
|
+
<!-- separator: adjacent blockquotes -->
|
|
444
|
+
|
|
445
|
+
> **Three context tickets, not two.** Every Epic carries three planning
|
|
446
|
+
> artifacts as linked GitHub sub-issues: PRD (`context::prd`), Tech Spec
|
|
447
|
+
> (`context::tech-spec`), and Acceptance Spec
|
|
448
|
+
> (`context::acceptance-spec`). The Acceptance Spec captures the
|
|
449
|
+
> stable-ID acceptance criteria table (`| AC ID | Outcome | Feature
|
|
450
|
+
> File | Scenario | Disposition |`) that drives close-time
|
|
451
|
+
> reconciliation during `/epic-deliver` Phase 6. Operators may opt out
|
|
452
|
+
> for refactor-only or docs-only Epics by applying the
|
|
453
|
+
> `acceptance::n-a` label to the Epic ticket — when present, the
|
|
454
|
+
> `epic-plan-spec-author` skill skips the Acceptance Spec output and
|
|
455
|
+
> the runtime gates (start gate, finalize reconciler) honour the
|
|
456
|
+
> waiver — the spec ticket itself need not be authored or approved when
|
|
457
|
+
> the waiver is set. See [SDLC § Acceptance Spec — the third planning
|
|
458
|
+
> context ticket](../docs/SDLC.md#acceptance-spec--the-third-planning-context-ticket)
|
|
459
|
+
> for the full lifecycle.
|
|
460
|
+
|
|
461
|
+
<!-- separator: adjacent blockquotes -->
|
|
462
|
+
|
|
463
|
+
> **Parallel-safe file naming (per-Epic tree).** Multiple Epics may be
|
|
464
|
+
> planned or decomposed concurrently. Every temp file written in this
|
|
465
|
+
> workflow lives under the per-Epic tree
|
|
466
|
+
> (`temp/epic-[Epic_ID]/<artifact>`) — e.g.
|
|
467
|
+
> `temp/epic-[Epic_ID]/planner-context.json`,
|
|
468
|
+
> `temp/epic-[Epic_ID]/prd.md`, `temp/epic-[Epic_ID]/techspec.md`,
|
|
469
|
+
> `temp/epic-[Epic_ID]/decomposer-context.json`,
|
|
470
|
+
> `temp/epic-[Epic_ID]/tickets.json`. The directory namespace is the
|
|
471
|
+
> isolation boundary; basenames inside it are stable. Do **not** reuse
|
|
472
|
+
> bare flat names like `temp/prd.md` or the legacy
|
|
473
|
+
> `temp/<artifact>-epic-<id>.<ext>` shape — both have been retired.
|
|
474
|
+
>
|
|
475
|
+
> **Durability.** The per-Epic tree is durable across runs: only the
|
|
476
|
+
> wrapper scripts perform intra-phase cleanup of files they wrote in
|
|
477
|
+
> the same invocation (see
|
|
478
|
+
> [`lib/plan-phase-cleanup.js`](../scripts/lib/plan-phase-cleanup.js)).
|
|
479
|
+
> Nothing else garbage-collects the tree, so cross-Epic artifacts —
|
|
480
|
+
> retros, perf reports, signals, manifests — accumulate until an
|
|
481
|
+
> operator explicitly removes them.
|
|
482
|
+
|
|
483
|
+
1. **Gather Authoring Context**: Run the spec-phase CLI in context-emission
|
|
484
|
+
mode to fetch the Epic body, scraped project docs, and the recommended
|
|
485
|
+
system prompts.
|
|
486
|
+
|
|
487
|
+
```bash
|
|
488
|
+
node .agents/scripts/epic-plan-spec.js --epic [Epic_ID] --emit-context > temp/epic-[Epic_ID]/planner-context.json
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
2. **Activate the `epic-plan-spec-author` skill**: Read
|
|
492
|
+
[`<agentRoot>/skills/core/epic-plan-spec-author/SKILL.md`](../skills/core/epic-plan-spec-author/SKILL.md)
|
|
493
|
+
via the `Read` tool (resolve `<agentRoot>` from
|
|
494
|
+
`project.paths.agentRoot` — default `.agents`) and execute its
|
|
495
|
+
procedure with `[Epic_ID]` as input. The skill reads
|
|
496
|
+
`temp/epic-[Epic_ID]/planner-context.json`, authors the PRD, Tech
|
|
497
|
+
Spec, **risk verdict**, and **Acceptance Spec** against the embedded
|
|
498
|
+
system prompts, and writes them to `temp/epic-[Epic_ID]/prd.md`,
|
|
499
|
+
`temp/epic-[Epic_ID]/techspec.md`,
|
|
500
|
+
`temp/epic-[Epic_ID]/risk-verdict.json`, and
|
|
501
|
+
`temp/epic-[Epic_ID]/acceptance-spec.md`. The skill is the
|
|
502
|
+
authoritative authoring step — do **not** inline the PRD / Tech
|
|
503
|
+
Spec / risk-verdict / Acceptance Spec drafting in the workflow
|
|
504
|
+
body. The skill front-matter declares
|
|
505
|
+
`allowed_tools: [Read, Write, Bash]`; it never calls GitHub.
|
|
506
|
+
|
|
507
|
+
The skill body carries the authoritative PRD, Tech Spec, and
|
|
508
|
+
Acceptance Spec system prompts. The `systemPrompts` field on the
|
|
509
|
+
`--emit-context` envelope is a backstop for legacy callers; the
|
|
510
|
+
skill body wins when the two surfaces diverge.
|
|
511
|
+
|
|
512
|
+
3. **Persist to GitHub**: Run the spec-phase CLI's persist half. It
|
|
513
|
+
schema-validates the planner-authored risk verdict (`--risk-verdict`,
|
|
514
|
+
required — a missing or malformed verdict fails closed before any
|
|
515
|
+
GitHub mutation), derives the `planningRisk` envelope from it
|
|
516
|
+
(`deriveRiskEnvelope`), records a `risk-verdict` structured comment
|
|
517
|
+
on the Epic, flips the Epic to `agent::review-spec`, and writes the
|
|
518
|
+
`epic-plan-state` checkpoint (including the `riskVerdict` field).
|
|
519
|
+
The `--acceptance-spec` flag persists the third planning ticket
|
|
520
|
+
(`context::acceptance-spec`) alongside the PRD and Tech Spec; the
|
|
521
|
+
persist half fails loudly if any file is missing or empty. Omit
|
|
522
|
+
`--acceptance-spec` only when the Epic carries the `acceptance::n-a`
|
|
523
|
+
waiver label.
|
|
524
|
+
|
|
525
|
+
```bash
|
|
526
|
+
# Normal planning (three context tickets)
|
|
527
|
+
node .agents/scripts/epic-plan-spec.js --epic [Epic_ID] \
|
|
528
|
+
--prd temp/epic-[Epic_ID]/prd.md \
|
|
529
|
+
--techspec temp/epic-[Epic_ID]/techspec.md \
|
|
530
|
+
--risk-verdict temp/epic-[Epic_ID]/risk-verdict.json \
|
|
531
|
+
--acceptance-spec temp/epic-[Epic_ID]/acceptance-spec.md
|
|
532
|
+
|
|
533
|
+
# Re-planning (--force overwrites the three context tickets IN PLACE —
|
|
534
|
+
# same PRD / Tech Spec / Acceptance Spec issue numbers, refreshed bodies,
|
|
535
|
+
# tickets kept open, one regeneration audit comment each. Feature/Story
|
|
536
|
+
# child tickets are still close-and-recreate at decomposition time.)
|
|
537
|
+
node .agents/scripts/epic-plan-spec.js --epic [Epic_ID] \
|
|
538
|
+
--prd temp/epic-[Epic_ID]/prd.md \
|
|
539
|
+
--techspec temp/epic-[Epic_ID]/techspec.md \
|
|
540
|
+
--risk-verdict temp/epic-[Epic_ID]/risk-verdict.json \
|
|
541
|
+
--acceptance-spec temp/epic-[Epic_ID]/acceptance-spec.md --force
|
|
542
|
+
|
|
543
|
+
# Waived (acceptance::n-a label on Epic — no spec authored)
|
|
544
|
+
node .agents/scripts/epic-plan-spec.js --epic [Epic_ID] \
|
|
545
|
+
--prd temp/epic-[Epic_ID]/prd.md \
|
|
546
|
+
--techspec temp/epic-[Epic_ID]/techspec.md \
|
|
547
|
+
--risk-verdict temp/epic-[Epic_ID]/risk-verdict.json
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
4. **Verification and review routing**:
|
|
551
|
+
- Verify that the PRD, Technical Specification, and (when not waived)
|
|
552
|
+
Acceptance Specification have been posted as linked issues under
|
|
553
|
+
the Epic.
|
|
554
|
+
- Read `planningRisk` from the persist stdout JSON (or the
|
|
555
|
+
`epic-plan-state` checkpoint). Branch on
|
|
556
|
+
`planningRisk.requiresReview` unless the operator passed
|
|
557
|
+
`--force-review`:
|
|
558
|
+
- **High risk** (`requiresReview === true`) or **operator override**
|
|
559
|
+
(`--force-review`): **STOP**. Ask the USER to review the generated
|
|
560
|
+
PRD, Tech Spec, and Acceptance Spec on GitHub. Approval is the
|
|
561
|
+
user's verbal OK in this session — the three context tickets stay
|
|
562
|
+
**open** through delivery and are closed automatically by
|
|
563
|
+
`/epic-deliver` when the Epic PR opens. Do NOT proceed
|
|
564
|
+
to decomposition until the user confirms the plan is accurate.
|
|
565
|
+
- **Low risk** (`requiresReview === false` and no `--force-review`):
|
|
566
|
+
Emit the auto-proceed message from the persist stdout
|
|
567
|
+
(`reviewRouting.operatorMessage`) and **continue directly to Phase 8**
|
|
568
|
+
without an extra review stop. The Epic still carries
|
|
569
|
+
`agent::review-spec` until decomposition completes; the routing
|
|
570
|
+
decision is recorded in the `epic-plan-state` checkpoint.
|
|
571
|
+
|
|
572
|
+
5. **Tech Spec freshness check (advisory)**: After the Tech Spec issue
|
|
573
|
+
is created, `epic-plan-spec.js` runs
|
|
574
|
+
[`validateSpecFreshness`](../scripts/lib/orchestration/spec-freshness.js)
|
|
575
|
+
against the authored Tech Spec body, probing every cited path-shape
|
|
576
|
+
reference (backticked paths, `// header` lines in code blocks, and
|
|
577
|
+
inline mentions of paths under `.agents/`, `src/`, `lib/`, `app/`,
|
|
578
|
+
`tests/`, `packages/`, `scripts/`, `docs/`) against the configured
|
|
579
|
+
`baseBranch`. Results land in three buckets:
|
|
580
|
+
- **fresh** — path exists at the base ref (no action).
|
|
581
|
+
- **ambiguous** — path is absent but surrounding prose carries a
|
|
582
|
+
net-new cue (`introduce`, `add`, `create`, `new file`, `to be
|
|
583
|
+
created`, etc.); surfaced for review without alarm.
|
|
584
|
+
- **stale** — path is absent and no net-new cue is nearby; likely a
|
|
585
|
+
reference the Architect inherited from drift-stale docs.
|
|
586
|
+
|
|
587
|
+
When ≥1 stale reference is detected, a `spec-freshness` structured
|
|
588
|
+
comment is upserted on the Tech Spec issue listing each citation
|
|
589
|
+
with its line number. The full report is also written to
|
|
590
|
+
`<tempRoot>/epic-<id>-spec-freshness.json` for downstream tooling.
|
|
591
|
+
The check is **advisory and non-blocking** — Phase 7 completes even
|
|
592
|
+
when stale references are present, so the operator retains final
|
|
593
|
+
judgment on edge cases. If the run summary shows
|
|
594
|
+
`⚠️ Spec freshness: N stale / M ambiguous`, review the Tech Spec
|
|
595
|
+
issue's `spec-freshness` comment and correct the cited spec body
|
|
596
|
+
before approving the plan for Phase 8.
|
|
597
|
+
|
|
598
|
+
6. **BDD scenario cross-reference (advisory)**: When the project has
|
|
599
|
+
adopted BDD, `epic-plan-spec.js` populates the planner-context
|
|
600
|
+
envelope with `bddScenarios` — the output of
|
|
601
|
+
[`scanBddScenarios`](../scripts/lib/bdd-scenario-scanner.js) over
|
|
602
|
+
the canonical feature roots resolved by
|
|
603
|
+
[`resolveFeatureRoots`](../scripts/lib/bdd-runner-detect.js)
|
|
604
|
+
(`tests/features`, `features`, `test/features`). The Acceptance
|
|
605
|
+
Engineer step in the [`epic-plan-spec-author`](../skills/core/epic-plan-spec-author/SKILL.md)
|
|
606
|
+
skill scores each planned AC against the scenario index via
|
|
607
|
+
`findBestScenarioMatch`; when an existing scenario covers an AC's
|
|
608
|
+
outcome, the AC's `Scenario` column is annotated with `<file>:L<line>`
|
|
609
|
+
and the `Disposition` becomes `unchanged` / `refined` instead of
|
|
610
|
+
`new`. When `bddScenarios` is empty (no `.feature` files), the skill
|
|
611
|
+
degrades silently and the spec is authored exactly as before. The
|
|
612
|
+
matcher is keyword-based and deterministic so re-runs produce stable
|
|
613
|
+
dispositions.
|
|
614
|
+
|
|
615
|
+
7. **Cleanup**: The wrapper script (`epic-plan-spec.js`) deletes the Phase 7
|
|
616
|
+
temp files automatically on success — no operator action required. The
|
|
617
|
+
cleanup contract lives in
|
|
618
|
+
[`lib/plan-phase-cleanup.js`](../scripts/lib/plan-phase-cleanup.js).
|
|
619
|
+
**Run the Phase 7.5 spec-validate gate (below) on
|
|
620
|
+
`temp/epic-[Epic_ID]/techspec.md` *before* this cleanup deletes the file** —
|
|
621
|
+
the gate reads the authored spec from temp.
|
|
622
|
+
|
|
623
|
+
## Phase 7.5: Tech Spec Section Gate (`epic-plan-spec-validate.js`)
|
|
624
|
+
|
|
625
|
+
> **Hard gate (blocks Phase 8).** This step runs **after** the Tech Spec is
|
|
626
|
+
> authored (Phase 7) and **before** decomposition (Phase 8). Unlike the
|
|
627
|
+
> advisory spec-freshness and BDD cross-reference checks in Phase 7, this gate
|
|
628
|
+
> is **blocking**: a missing required section exits non-zero and Phase 8 MUST
|
|
629
|
+
> NOT proceed until it is resolved. It is the Phase 8-side counterpart to the
|
|
630
|
+
> Phase 6 Epic Clarity Gate — same detect-then-prompt pattern, one phase later.
|
|
631
|
+
|
|
632
|
+
**Why this gate exists.** Phase 8.3 (Holistic Consolidation) reconciles the
|
|
633
|
+
draft ticket array against the Tech Spec's `## Delivery Slicing` section, which
|
|
634
|
+
the [`epic-plan-decompose-author`](../skills/core/epic-plan-decompose-author/SKILL.md)
|
|
635
|
+
skill uses as the capability-boundary anchor (see Phase 8 step 2 below). When
|
|
636
|
+
the authored Tech Spec omits that section, the consolidation pass runs against a
|
|
637
|
+
void and produces groupings that reflect **technical shape** (e.g. cron jobs
|
|
638
|
+
together) rather than **capability boundaries** — reproduced on Epic #18 in
|
|
639
|
+
`dsj1984/athportal` (planned with v1.54.0), whose spec carried a detailed
|
|
640
|
+
`## Core Components` table but no `## Delivery Slicing` section.
|
|
641
|
+
|
|
642
|
+
**Run the gate** against the authored Tech Spec before the Phase 7 cleanup
|
|
643
|
+
deletes `temp/epic-[Epic_ID]/techspec.md`:
|
|
644
|
+
|
|
645
|
+
```bash
|
|
646
|
+
node .agents/scripts/epic-plan-spec-validate.js \
|
|
647
|
+
--techspec temp/epic-[Epic_ID]/techspec.md
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
- **Exit 0** — the spec contains a `## Delivery Slicing` heading (case-
|
|
651
|
+
insensitive; the gate also accepts the variant `## Delivery slicing` and the
|
|
652
|
+
shorthand `## Slicing`). Continue to Phase 8.
|
|
653
|
+
- **Exit non-zero** — the required section is missing. The gate is implemented
|
|
654
|
+
by [`lib/orchestration/spec-section-validator.js`](../scripts/lib/orchestration/spec-section-validator.js)
|
|
655
|
+
and prints an operator-visible message naming the missing section and the two
|
|
656
|
+
recovery paths:
|
|
657
|
+
|
|
658
|
+
```text
|
|
659
|
+
[epic-plan-spec-validate] Tech Spec is missing required section(s): ## Delivery Slicing
|
|
660
|
+
Spec file: temp/epic-18/techspec.md
|
|
661
|
+
|
|
662
|
+
Phase 8 (decomposition) reconciles the draft ticket array against the
|
|
663
|
+
Tech Spec's "## Delivery Slicing" section — without it, the Phase 8.3
|
|
664
|
+
consolidation pass has no capability-boundary anchor and groups by
|
|
665
|
+
technical shape instead.
|
|
666
|
+
|
|
667
|
+
To continue, do ONE of the following before re-running Phase 8:
|
|
668
|
+
1. Re-author the Tech Spec (re-run the Phase 7 spec-author step) so it
|
|
669
|
+
emits a "## Delivery Slicing" section, OR
|
|
670
|
+
2. Add a "## Delivery Slicing" section to the Tech Spec by hand,
|
|
671
|
+
describing the capability boundaries the work should be sliced along.
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
**STOP** on a non-zero exit: do not advance to Phase 8. Re-author the Tech
|
|
675
|
+
Spec (re-run the Phase 7 spec-author step) or add a `## Delivery Slicing`
|
|
676
|
+
section to the Tech Spec issue body by hand, then re-run the gate until it
|
|
677
|
+
exits 0.
|
|
678
|
+
|
|
679
|
+
## Phase 8: Work Breakdown Decomposition
|
|
680
|
+
|
|
681
|
+
> **Open-children guard (workflow guard).** Before persisting the breakdown,
|
|
682
|
+
> `epic-plan-decompose.js` refuses to run when the Epic **already has open
|
|
683
|
+
> Feature/Story children**, unless `--force` (close + recreate the tree) or
|
|
684
|
+
> `--resume` (continue a partial persist) is set. This stops a re-run from
|
|
685
|
+
> stacking a duplicate Feature/Story tree on top of an existing one — the
|
|
686
|
+
> phase exits non-zero and lists the open children. Once persist completes,
|
|
687
|
+
> the Epic-lease acquired in Phase 7 is **released** (best-effort; a release
|
|
688
|
+
> failure never fails decompose).
|
|
689
|
+
|
|
690
|
+
<!-- separator: adjacent blockquotes -->
|
|
691
|
+
|
|
692
|
+
> **Hierarchy.** The decomposer emits an Epic → Feature → Story tree.
|
|
693
|
+
> Acceptance criteria and verification steps are inlined on each Story
|
|
694
|
+
> body (`acceptance[]` / `verify[]` fields) and resolved against the
|
|
695
|
+
> Acceptance Spec context ticket at close time. See
|
|
696
|
+
> [`.agents/instructions.md` § 5.D](../instructions.md) for the full
|
|
697
|
+
> contract.
|
|
698
|
+
|
|
699
|
+
1. **Gather Decomposition Context**:
|
|
700
|
+
|
|
701
|
+
```bash
|
|
702
|
+
node .agents/scripts/epic-plan-decompose.js --epic [Epic_ID] --emit-context > temp/epic-[Epic_ID]/decomposer-context.json
|
|
703
|
+
```
|
|
704
|
+
|
|
705
|
+
2. **Activate the `epic-plan-decompose-author` skill**: Read
|
|
706
|
+
[`<agentRoot>/skills/core/epic-plan-decompose-author/SKILL.md`](../skills/core/epic-plan-decompose-author/SKILL.md)
|
|
707
|
+
via the `Read` tool (resolve `<agentRoot>` from
|
|
708
|
+
`project.paths.agentRoot` — default `.agents`) and execute its
|
|
709
|
+
procedure with `[Epic_ID]` as input. The skill reads
|
|
710
|
+
`temp/epic-[Epic_ID]/decomposer-context.json` (PRD body, Tech Spec
|
|
711
|
+
body, risk heuristics, `maxTickets` cap, `contextMode`), applies its
|
|
712
|
+
embedded decomposer system prompt + ticket schema, and writes the
|
|
713
|
+
ticket array to `temp/epic-[Epic_ID]/tickets.json`. Do **not** inline
|
|
714
|
+
the JSON authoring in the workflow body.
|
|
715
|
+
|
|
716
|
+
The `maxTickets` cap (`planning.maxTickets` in
|
|
717
|
+
`.agentrc.json`; framework default in
|
|
718
|
+
`.agents/scripts/lib/config/limits.js`) is a **reviewability budget**,
|
|
719
|
+
not a hard authoring ceiling: a draft over budget warns at authoring
|
|
720
|
+
time and is rejected at persist unless rerun with `--allow-over-budget`
|
|
721
|
+
(after confirming the over-budget rationale on the Epic). The
|
|
722
|
+
`epic-plan-decompose.js` script also logs the resolved budget to stderr
|
|
723
|
+
so a misconfigured key surfaces immediately. The skill body is the
|
|
724
|
+
authoritative source of the decomposer prompt; the `systemPrompt`
|
|
725
|
+
field on the emit envelope is a backstop for legacy callers.
|
|
726
|
+
|
|
727
|
+
When the Tech Spec carries a `## Delivery Slicing` section (authored by
|
|
728
|
+
`epic-plan-spec-author` in Phase 7), the decompose-author skill authors
|
|
729
|
+
toward the Architect's proposed shippable-Story clusters; it degrades
|
|
730
|
+
gracefully when the section is absent.
|
|
731
|
+
|
|
732
|
+
3. **Phase 8.3 — Holistic Consolidation (HITL diff gate)**: After the
|
|
733
|
+
draft `temp/epic-[Epic_ID]/tickets.json` exists and **before** the persist
|
|
734
|
+
call below, activate the
|
|
735
|
+
[`epic-plan-consolidate`](../skills/core/epic-plan-consolidate/SKILL.md)
|
|
736
|
+
skill with `[Epic_ID]` as input. This is a **separate critic pass with
|
|
737
|
+
fresh context** (not a self-review appended to the author skill): it reads
|
|
738
|
+
the draft array plus the PRD / Tech Spec, reconciles the draft against the
|
|
739
|
+
Tech Spec `## Delivery Slicing` target, and emits a **consolidated**
|
|
740
|
+
`tickets.json` plus a human-readable
|
|
741
|
+
`temp/epic-[Epic_ID]/consolidation-report.md`. Its operations are
|
|
742
|
+
scope-preserving only — **merge Stories, collapse single-Story Features
|
|
743
|
+
into siblings, re-parent, rewire `depends_on`** — and it MUST NOT add scope
|
|
744
|
+
or invent tickets; it resolves single-Story Features by **collapsing**
|
|
745
|
+
them, never by splitting a lone Story. It runs **before** the deterministic
|
|
746
|
+
validator (step 4), so the validator re-checks its output and the critic
|
|
747
|
+
cannot emit an invalid plan.
|
|
748
|
+
|
|
749
|
+
**Show the operator the consolidation report (the before/after diff +
|
|
750
|
+
rationale) before persisting.** Consolidation is never auto-applied without
|
|
751
|
+
review: on operator approval, persist the consolidated `tickets.json`; on
|
|
752
|
+
rejection, persist the draft instead. This is a sub-step of Phase 8 — it
|
|
753
|
+
does **not** renumber the top-level lifecycle phases (9–12).
|
|
754
|
+
|
|
755
|
+
4. **Persist to GitHub**: Run the decompose CLI's persist half. It
|
|
756
|
+
validates the ticket array (`validateAndNormalizeTickets`), creates
|
|
757
|
+
the Feature/Story issues, flips the Epic to `agent::ready`, and
|
|
758
|
+
writes the `epic-plan-state` checkpoint.
|
|
759
|
+
|
|
760
|
+
```bash
|
|
761
|
+
# Normal decomposition
|
|
762
|
+
node .agents/scripts/epic-plan-decompose.js --epic [Epic_ID] \
|
|
763
|
+
--tickets temp/epic-[Epic_ID]/tickets.json
|
|
764
|
+
|
|
765
|
+
# Re-planning (close old tickets first)
|
|
766
|
+
node .agents/scripts/epic-plan-decompose.js --epic [Epic_ID] \
|
|
767
|
+
--tickets temp/epic-[Epic_ID]/tickets.json --force
|
|
768
|
+
```
|
|
769
|
+
|
|
770
|
+
5. **Cross-Validation**:
|
|
771
|
+
- Hierarchy completeness, dependency-DAG acyclicity, and `risk::high`
|
|
772
|
+
labelling are deterministic invariants enforced by
|
|
773
|
+
`validateAndNormalizeTickets` in
|
|
774
|
+
[`lib/orchestration/ticket-validator.js`](../scripts/lib/orchestration/ticket-validator.js);
|
|
775
|
+
its output during decomposition is the canonical proof — no manual
|
|
776
|
+
re-check needed.
|
|
777
|
+
- **File-assumption gate (Story #2636)**: Each Story's `body.changes`
|
|
778
|
+
and `body.references` entries declare an explicit `assumption` ∈
|
|
779
|
+
`creates | refactors-existing | exists | deletes`. The validator
|
|
780
|
+
probes the base branch for every declared path and rejects the
|
|
781
|
+
decompose when the declaration contradicts reality:
|
|
782
|
+
- `creates` + path **exists** at base → error.
|
|
783
|
+
- `refactors-existing` / `exists` / `deletes` + path **absent** at
|
|
784
|
+
base → error.
|
|
785
|
+
Errors are batched per-Story into the validator's `errors` envelope
|
|
786
|
+
so the decompose loop surfaces every mismatch in a single re-prompt
|
|
787
|
+
rather than one at a time.
|
|
788
|
+
- **Scope-overlap check (docs/runbook downstream of config work)**:
|
|
789
|
+
Scan for Stories whose scope is "docs update", "runbook", or
|
|
790
|
+
"README" that land downstream of an earlier "config + runbook"
|
|
791
|
+
Story in the same Epic. If the earlier Story's AC already covers
|
|
792
|
+
the same document, the downstream Story's deliverable is likely
|
|
793
|
+
absorbed. Append a "Scope verification note" to the downstream
|
|
794
|
+
Story body pointing the executor to `git diff main -- <path>`
|
|
795
|
+
against the upstream Story branch so they can confirm whether a
|
|
796
|
+
substantive edit is still required (or only a cross-reference
|
|
797
|
+
remains). The decomposer system prompt emits this flag
|
|
798
|
+
automatically where it can detect the pattern — this checklist
|
|
799
|
+
item is the human/host-LLM backstop.
|
|
800
|
+
- **Action**: Fix any scope-overlap exceptions or validator failures by
|
|
801
|
+
re-running the scripted force path so the change is recorded in tooling
|
|
802
|
+
rather than hand-applied:
|
|
803
|
+
|
|
804
|
+
```bash
|
|
805
|
+
node .agents/scripts/epic-plan-decompose.js \
|
|
806
|
+
--epic [Epic_ID] \
|
|
807
|
+
--tickets temp/epic-[Epic_ID]/tickets.json \
|
|
808
|
+
--force
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
6. **Audit**:
|
|
812
|
+
- Check the Epic's comment thread to ensure the backlog summary was posted.
|
|
813
|
+
- Verify that at least one `type::feature` and `type::story` issue
|
|
814
|
+
was created.
|
|
815
|
+
|
|
816
|
+
7. **Cleanup**: The wrapper script (`epic-plan-decompose.js`) deletes the
|
|
817
|
+
Phase 8 temp files automatically on success — no operator action required.
|
|
818
|
+
The cleanup contract lives in
|
|
819
|
+
[`lib/plan-phase-cleanup.js`](../scripts/lib/plan-phase-cleanup.js).
|
|
820
|
+
|
|
821
|
+
## Phase 9: Execution Roadmap (Story Dispatch)
|
|
822
|
+
|
|
823
|
+
1. **Generate Roadmap**: Automatically invoke the dispatcher in dry-run mode to
|
|
824
|
+
calculate execution waves and model recommendations:
|
|
825
|
+
|
|
826
|
+
```bash
|
|
827
|
+
node .agents/scripts/dispatcher.js [Epic_ID] --dry-run
|
|
828
|
+
```
|
|
829
|
+
|
|
830
|
+
2. **Verify Output**:
|
|
831
|
+
- Confirm the **Story Dispatch Table** is printed.
|
|
832
|
+
- Check for any stories in **Wave 0** — these are ready for immediate
|
|
833
|
+
execution.
|
|
834
|
+
|
|
835
|
+
> **Manifest persistence (v5.9.0):** the dispatcher also posts the manifest
|
|
836
|
+
> as a `dispatch-manifest` structured comment on the Epic (idempotent —
|
|
837
|
+
> re-runs replace the prior comment). That comment is the source of truth for
|
|
838
|
+
> the Wave Completeness Gate in `/epic-deliver` Step 0.5 and for any external
|
|
839
|
+
> wave-tracking tooling.
|
|
840
|
+
|
|
841
|
+
3. **Handoff**: Provide the user with the recommended next step:
|
|
842
|
+
|
|
843
|
+
> "Planning is complete. Run `/epic-deliver #[Epic ID]` to start the wave
|
|
844
|
+
> loop, or pick a single Story from Wave 0 and run `/story-deliver #[Story
|
|
845
|
+
> ID]` to drive it directly."
|
|
846
|
+
|
|
847
|
+
## Phase 10: Readiness Health Check
|
|
848
|
+
|
|
849
|
+
Run the post-plan health check to validate the backlog before handing off to
|
|
850
|
+
`/epic-deliver`. The default mode runs only the cheap checks
|
|
851
|
+
(config + git remote) and targets sub-2-second turnaround. The script itself
|
|
852
|
+
always exits 0; the structured JSON on stdout reports findings.
|
|
853
|
+
|
|
854
|
+
```bash
|
|
855
|
+
node .agents/scripts/epic-plan-healthcheck.js --epic [Epic_ID]
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
**The healthcheck is a blocking exit condition for `agent::ready`.**
|
|
859
|
+
Story #2921 (Epic #2880 F7) wired the persist half of
|
|
860
|
+
`epic-plan-decompose.js` to re-run the same default check before
|
|
861
|
+
flipping the Epic to `agent::ready`.
|
|
862
|
+
When the inline run reports `ok: false`, the persist phase **refuses the
|
|
863
|
+
flip** and throws with the failing check's `reason`. The Epic stays on its
|
|
864
|
+
prior label (`agent::review-spec` in the normal flow) until either the
|
|
865
|
+
underlying check passes on a rerun, or the operator applies the
|
|
866
|
+
`planning::healthcheck-waived` label to the Epic and reruns the persist
|
|
867
|
+
phase. See `.agents/docs/SDLC.md` § "`agent::ready` exit conditions" for the
|
|
868
|
+
full handoff contract and the waiver scope.
|
|
869
|
+
|
|
870
|
+
The script emits a single line of JSON to stdout:
|
|
871
|
+
|
|
872
|
+
```json
|
|
873
|
+
{
|
|
874
|
+
"ok": true,
|
|
875
|
+
"degraded": false,
|
|
876
|
+
"reason": null,
|
|
877
|
+
"checks": [
|
|
878
|
+
{ "name": "config", "ok": true, "durationMs": 12, "detail": "..." },
|
|
879
|
+
{ "name": "git-remote", "ok": true, "durationMs": 234, "detail": "..." }
|
|
880
|
+
]
|
|
881
|
+
}
|
|
882
|
+
```
|
|
883
|
+
|
|
884
|
+
Modes (additive — the fast checks always run):
|
|
885
|
+
|
|
886
|
+
- **(default)** — config validation + git remote check only.
|
|
887
|
+
- **`--paranoid`** — adds ticket-hierarchy revalidation. Requires `--epic`.
|
|
888
|
+
Use this when you want the full backlog audit before execution.
|
|
889
|
+
- **`--prime-install`** — adds the pnpm content-addressable-store prime
|
|
890
|
+
(`pnpm install --frozen-lockfile`, up to 300s). Run only when
|
|
891
|
+
`nodeModulesStrategy: 'pnpm-store'` is configured and you want subsequent
|
|
892
|
+
worktree installs to be near-instant instead of fetching from scratch.
|
|
893
|
+
|
|
894
|
+
If `ok` is `false`, review the entries in `checks[]`, resolve the failing
|
|
895
|
+
check(s), and rerun the persist phase. Apply `planning::healthcheck-waived`
|
|
896
|
+
to the Epic only when the failure is environmental and the operator has
|
|
897
|
+
triaged it (e.g. a known `origin` outage during a maintenance window).
|
|
898
|
+
|
|
899
|
+
## Phase 11: Plan Comprehension Gate
|
|
900
|
+
|
|
901
|
+
An **opt-in, advisory** gate that offers the operator a guided walkthrough of
|
|
902
|
+
the freshly planned backlog before they hand off to `/epic-deliver`. The plan
|
|
903
|
+
is the moment the operator authorizes an autonomous fan-out of subagents — this
|
|
904
|
+
phase exists so they can *understand and endorse* the approach while it is
|
|
905
|
+
still free to change, not after the code lands.
|
|
906
|
+
|
|
907
|
+
> **Non-blocking by construction.** This phase runs **after** Phase 10 has
|
|
908
|
+
> already flipped the Epic to `agent::ready`. It never gates that flip, never
|
|
909
|
+
> blocks the handoff, and the operator can decline or stop it at any point.
|
|
910
|
+
> `risk::high` remains planning metadata and `agent::blocked` remains the only
|
|
911
|
+
> mandatory runtime pause — this gate adds neither.
|
|
912
|
+
|
|
913
|
+
### 1. Decide whether to offer the walkthrough (LM judgment)
|
|
914
|
+
|
|
915
|
+
There is **no `--flag`**. Evaluate the plan with judgment and **default to
|
|
916
|
+
skipping silently**. Offer the walkthrough only when the plan is genuinely
|
|
917
|
+
worth one. Signals that warrant offering:
|
|
918
|
+
|
|
919
|
+
- The roadmap spans **multiple waves** or a **large Story count**.
|
|
920
|
+
- Any Story or the Epic carries **`risk::high`**, or the plan matches the
|
|
921
|
+
`planning.riskHeuristics` in `.agentrc.json` (destructive/irreversible
|
|
922
|
+
changes, shared auth/security, CI/CD gate changes, monorepo-wide rewrites,
|
|
923
|
+
destructive migrations).
|
|
924
|
+
- The Tech Spec introduces a **novel architectural decision** or a wide
|
|
925
|
+
**blast radius** across subsystems.
|
|
926
|
+
|
|
927
|
+
A small, single-wave, low-risk plan proceeds straight to Phase 12 with no
|
|
928
|
+
prompt. When in doubt on a borderline plan, make a one-line offer rather than
|
|
929
|
+
forcing the walkthrough.
|
|
930
|
+
|
|
931
|
+
### 2. Run the walkthrough (when offered and accepted)
|
|
932
|
+
|
|
933
|
+
Activate the
|
|
934
|
+
[`core/knowledge-transfer`](../skills/core/knowledge-transfer/SKILL.md) skill
|
|
935
|
+
with the **plan** as the subject — the Epic body, the linked PRD / Tech Spec
|
|
936
|
+
context tickets, the decomposition (Features/Stories with inline
|
|
937
|
+
`acceptance[]` / `verify[]`), and the Phase 9 wave roadmap. The skill owns the
|
|
938
|
+
method (restate-first, the why-ladder, mastery gates, depth levels, optional
|
|
939
|
+
quizzing, the persistent `temp/comprehension-*.md` checklist).
|
|
940
|
+
|
|
941
|
+
**Interruptible at every checkpoint.** Each step MUST offer an explicit
|
|
942
|
+
"I'm good — proceed to `/epic-deliver`" exit. The instant the operator takes
|
|
943
|
+
it, stop the walkthrough and advance to Phase 12. Never trap the operator in
|
|
944
|
+
the loop.
|
|
945
|
+
|
|
946
|
+
### 3. Advance
|
|
947
|
+
|
|
948
|
+
Whether the walkthrough was skipped, declined, completed, or stopped early,
|
|
949
|
+
proceed to Phase 12. This gate produces no label transition and no blocking
|
|
950
|
+
condition.
|
|
951
|
+
|
|
952
|
+
## Phase 12: Notification & Handoff
|
|
953
|
+
|
|
954
|
+
1. **Notify Operator (INFO)**:
|
|
955
|
+
- Post a summary comment on the Epic issue with work breakdown stats.
|
|
956
|
+
- @mention the operator (informational — no webhook for planning) by running
|
|
957
|
+
the notification script:
|
|
958
|
+
|
|
959
|
+
```bash
|
|
960
|
+
node .agents/scripts/notify.js [Epic_ID] "Planning complete, review tickets. Backlog decomposition complete. Epic is ready for /epic-deliver." --action
|
|
961
|
+
```
|
|
962
|
+
|
|
963
|
+
## Troubleshooting
|
|
964
|
+
|
|
965
|
+
- If `epic-plan-spec.js --emit-context` fails, confirm the Epic exists and
|
|
966
|
+
has a body with enough initial context.
|
|
967
|
+
- If `epic-plan-decompose.js` rejects the tickets file, re-read the
|
|
968
|
+
validator's error message — the most common causes are a Story with no
|
|
969
|
+
`parent_slug`, a Story whose `parent_slug` does not point at a Feature, or a
|
|
970
|
+
dependency cycle in the Story `depends_on` graph.
|
|
971
|
+
- If decomposition persisted the tickets but the Epic is not on `agent::ready`,
|
|
972
|
+
you likely called `runDecomposePhase` from `epic-plan-decompose.js`
|
|
973
|
+
directly without completing the persist flow — only the CLI surface
|
|
974
|
+
(`node epic-plan-decompose.js --tickets ...`) drives the full
|
|
975
|
+
reconciler pipeline and flips the lifecycle label. Apply `agent::ready`
|
|
976
|
+
by hand and re-run via the CLI next time.
|
|
977
|
+
- **Secondary rate limit on large Epics**: For backlogs over ~60 tickets,
|
|
978
|
+
GitHub's secondary rate limit (HTTP 403, body contains "secondary rate
|
|
979
|
+
limit") can trip mid-decomposition after ~80 issue creations. The
|
|
980
|
+
http-client retries automatically with a 30–120s backoff and the
|
|
981
|
+
decomposer drops `concurrencyCap` to 1 for the rest of the run on the
|
|
982
|
+
first observation. If the run still aborts (network drop, exhausted
|
|
983
|
+
retries, etc.), resume from the partial backlog with:
|
|
984
|
+
|
|
985
|
+
```bash
|
|
986
|
+
node .agents/scripts/epic-plan-decompose.js --epic [Epic_ID] \
|
|
987
|
+
--tickets temp/epic-[Epic_ID]/tickets.json --resume
|
|
988
|
+
```
|
|
989
|
+
|
|
990
|
+
`--resume` is idempotent: the reconciler recovers the slug→issue map
|
|
991
|
+
from `temp/epic-[Epic_ID]/[Epic_ID].state.json`, and when that file is
|
|
992
|
+
missing or incomplete it **reseeds the map from live GitHub state** by
|
|
993
|
+
matching each spec slug against the open children of the Epic by title.
|
|
994
|
+
Slugs that resolve to an existing open child diff as Updates/no-ops;
|
|
995
|
+
only the genuinely-missing children are created — the existing tree is
|
|
996
|
+
never duplicated. To force-throttle from the first call on a known-large
|
|
997
|
+
Epic, set `(framework constant: decomposer concurrency): 1` in
|
|
998
|
+
`.agentrc.json`.
|