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,864 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Drive an Epic from `agent::ready` to a merged pull request against `main`.
|
|
4
|
+
The ten-phase flow runs the wave loop, close-validation, epic-audit,
|
|
5
|
+
code-review, retro, finalize, watch-and-iterate, conditional auto-merge,
|
|
6
|
+
and local branch cleanup. When the run is end-to-end clean (zero manual
|
|
7
|
+
interventions, zero 🔴/🟠 review findings, compact retro) the PR
|
|
8
|
+
auto-merges via `gh pr merge --squash --delete-branch`; otherwise the
|
|
9
|
+
workflow falls back to the operator-merges-button path so a human
|
|
10
|
+
inspects the surface area.
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# /epic-deliver #[Epic ID]
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
`/epic-deliver` is the **single SDL execution command** in the 5.40 surface.
|
|
18
|
+
It opens a PR against `main` and auto-merges when every signal certifies a
|
|
19
|
+
clean run; otherwise it falls back to the operator-merges-button path.
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
/epic-deliver <epicId>
|
|
23
|
+
→ Phase 1 — prepare (epic-deliver-prepare.js)
|
|
24
|
+
→ Phase 2 — wave loop (wave-tick.js + Agent fan-out × concurrencyCap)
|
|
25
|
+
→ Phase 3 — close-validation (lint + test + ratchets on epic/<id>)
|
|
26
|
+
→ Phase 4 — epic-audit (helpers/epic-audit.md — change-set audits via selectAudits)
|
|
27
|
+
→ Phase 5 — code-review (helpers/code-review.md with scope: epic)
|
|
28
|
+
→ Phase 6 — retro (.agents/scripts/lib/orchestration/retro-runner.js)
|
|
29
|
+
→ Phase 7 — finalize (lifecycle-emit → epic.close.end → open PR to main)
|
|
30
|
+
→ Phase 8 — watch-and-iterate (poll `gh pr checks`; fix locally until green)
|
|
31
|
+
→ Phase 8.5 — auto-merge gate (lifecycle-emit → epic.automerge.start)
|
|
32
|
+
→ Phase 9 — cleanup (BranchCleaner + Cleaner lifecycle listeners on epic.cleanup.start / epic.merge.armed; fire via lifecycle-emit → epic.merge.armed)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The argument is always an Epic ID (`type::epic`). Story IDs go to
|
|
36
|
+
[`/story-deliver`](story-deliver.md) (standalone) or the
|
|
37
|
+
[`helpers/epic-deliver-story`](helpers/epic-deliver-story.md) helper
|
|
38
|
+
(Epic-attached, invoked by this workflow's fan-out); Tasks are not directly
|
|
39
|
+
executable.
|
|
40
|
+
Story dispatch is in-session via the Agent tool — no subprocess is
|
|
41
|
+
spawned.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Arguments
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
/epic-deliver <epicId> [--skip-epic-audit] [--skip-code-review] [--skip-retro] [--full-retro]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- `epicId` — must carry `type::epic`. Otherwise STOP and tell the operator
|
|
52
|
+
to use `/story-deliver <id>` (standalone Story) or open the parent Epic.
|
|
53
|
+
- `--skip-epic-audit` — skip Phase 4 (log the override). Use only when the
|
|
54
|
+
change-set audits are known to be irrelevant (e.g., docs-only Epic).
|
|
55
|
+
- `--skip-code-review` — skip Phase 5 (log the override).
|
|
56
|
+
- `--skip-retro` — skip Phase 6 (use sparingly).
|
|
57
|
+
- `--full-retro` — force the six-section retro regardless of manifest
|
|
58
|
+
cleanliness. `--skip-retro` wins over `--full-retro`.
|
|
59
|
+
|
|
60
|
+
Every other runtime modifier is sourced from the Epic's labels or from
|
|
61
|
+
`delivery.deliverRunner` in `.agentrc.json`.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Contract
|
|
66
|
+
|
|
67
|
+
- **Idempotent by checkpoint.** Re-runs resume from `epic-run-state`.
|
|
68
|
+
- **Single pause point.** Only `agent::blocked` halts execution. No
|
|
69
|
+
clarifying questions — if stuck, flip to `agent::blocked`, post a
|
|
70
|
+
friction comment, park.
|
|
71
|
+
- **Two-level dispatch.** Host LLM fans out per-Story Agent calls
|
|
72
|
+
directly with `subagent_type: general-purpose`. Sub-agents do not
|
|
73
|
+
carry the `Agent` tool, so this stays flat.
|
|
74
|
+
- **Operator-merges-PR exit.** Phase 7 opens the PR; the workflow
|
|
75
|
+
never merges to `main` itself. Phase 8.5 may fire auto-merge when
|
|
76
|
+
every signal is clean.
|
|
77
|
+
- **Lifecycle bus is the runner model.** Phase transitions, ticket
|
|
78
|
+
state flips, structured comments, and notifications are emitted as
|
|
79
|
+
typed events on the in-session lifecycle bus; a fixed roster of
|
|
80
|
+
listeners performs the side effects. Phase 7, 8.5, and 9 each fire
|
|
81
|
+
exactly one lifecycle event via the generic
|
|
82
|
+
[`lifecycle-emit.js`](../scripts/lifecycle-emit.js) CLI
|
|
83
|
+
(`--event epic.close.end` / `--event epic.automerge.start` /
|
|
84
|
+
`--event epic.merge.armed`); the matching listener chain runs the
|
|
85
|
+
bus-driven side effects (acceptance reconcile, automerge-armer,
|
|
86
|
+
branch cleanup). PR open + planning-artifact close are
|
|
87
|
+
operator-/host-LLM-driven in the current wiring — see Phase 7.1 for
|
|
88
|
+
the canonical manual sequence and `finalizer.js` for the listener's
|
|
89
|
+
no-op disclaimer. The append-only NDJSON ledger at
|
|
90
|
+
`temp/epic-<id>/lifecycle.ndjson` is the resume target. See
|
|
91
|
+
[`docs/LIFECYCLE.md`](../../docs/LIFECYCLE.md) for the bus
|
|
92
|
+
contract, event taxonomy, ledger format, and listener model.
|
|
93
|
+
|
|
94
|
+
> **Hierarchy.** `/epic-deliver` operates over the 3-tier hierarchy
|
|
95
|
+
> (Epic → Feature → Story). The fan-out is one `Agent` tool call per
|
|
96
|
+
> Story per wave (§ 2b); Story branches merge into `epic/<id>` with
|
|
97
|
+
> `--no-ff` via `story-close.js`; the close-validation chain
|
|
98
|
+
> (Phase 3), epic-audit, code-review, retro, finalize, and auto-merge
|
|
99
|
+
> gates all operate on Story-level units.
|
|
100
|
+
> [`helpers/epic-deliver-story`](helpers/epic-deliver-story.md) runs a
|
|
101
|
+
> single Story-implementation phase per Story against the Story's
|
|
102
|
+
> inline `acceptance[]` / `verify[]` fields. See
|
|
103
|
+
> [`.agents/instructions.md` § 5.D](../instructions.md) and
|
|
104
|
+
> [`.agents/docs/SDLC.md` § Ticket hierarchy](../docs/SDLC.md) for the full
|
|
105
|
+
> contract.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Phase 1 — Prepare the Epic run
|
|
110
|
+
|
|
111
|
+
### Phase 1 prelude — Delivery preflight (Story #2899 / F13)
|
|
112
|
+
|
|
113
|
+
Before `epic-deliver-prepare.js` seeds the wave plan, run
|
|
114
|
+
`epic-deliver-preflight.js` so the operator (and any reviewer reading the
|
|
115
|
+
Epic ticket) sees the estimated Story count, install cost, wave count,
|
|
116
|
+
GitHub API request volume, and Claude Max quota burn for the run that is
|
|
117
|
+
about to fan out. **Preflight always runs before Story fan-out.**
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
node .agents/scripts/epic-deliver-preflight.js --epic <epicId> --post
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The CLI upserts a `delivery-preflight` structured comment on the Epic
|
|
124
|
+
(idempotent across re-runs) and prints a JSON envelope on stdout with
|
|
125
|
+
the canonical metric keys `storyCount`, `installCostSeconds`,
|
|
126
|
+
`waveCount`, `githubApiRequests`, `claudeQuotaTokens`, plus a `breaches`
|
|
127
|
+
array describing any `delivery.preflight.max*` thresholds the estimate
|
|
128
|
+
exceeds.
|
|
129
|
+
|
|
130
|
+
**Breach handling.** When `breaches` is non-empty, the workflow MUST
|
|
131
|
+
flip the Epic to `agent::blocked`, surface the envelope in chat for the
|
|
132
|
+
operator, and halt before Phase 1's `epic-deliver-prepare.js` call.
|
|
133
|
+
Resume after the operator unblocks (raising the threshold in
|
|
134
|
+
`.agentrc.json`, splitting the Epic, or accepting the cost) by re-running
|
|
135
|
+
`/epic-deliver <epicId>` — the preflight is idempotent and the second
|
|
136
|
+
run upserts the same comment in place.
|
|
137
|
+
|
|
138
|
+
Threshold defaults live in `delivery.preflight.*` in `.agentrc.json`
|
|
139
|
+
(all keys default to "no cap" — the gate is opt-in until an operator
|
|
140
|
+
configures `maxStories` etc.). The CI-firehose mitigation
|
|
141
|
+
(`delivery.ci.skipForStoryPushes: true`) and these threshold keys are
|
|
142
|
+
the two operator-tunable knobs F13 ships.
|
|
143
|
+
|
|
144
|
+
### Phase 1 main — Seed the wave plan
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
node .agents/scripts/epic-deliver-prepare.js --epic <epicId> [--steal] [--as <handle>]
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Validates `type::epic`, enumerates `type::story` descendants, parses
|
|
151
|
+
`blocked by #N` plus explicit `dependencies`, runs `Graph.computeWaves()`,
|
|
152
|
+
and upserts the `epic-run-state` checkpoint. Treat the printed JSON as
|
|
153
|
+
`state`: `{ epicId, totalWaves, concurrencyCap, plan, checkpointInitializedAt }`.
|
|
154
|
+
`plan[N]` is the Stories assigned to wave `N`. Flip the Epic to
|
|
155
|
+
`agent::executing` (idempotent) after the CLI returns.
|
|
156
|
+
|
|
157
|
+
> **Preflight guards (Story #3482 / F-workflow-guards).** Before the
|
|
158
|
+
> snapshot phase runs — and before any worktree is created — prepare runs
|
|
159
|
+
> two **fail-closed** guards
|
|
160
|
+
> ([`lib/orchestration/epic-deliver-lease-guard.js`](../scripts/lib/orchestration/epic-deliver-lease-guard.js)):
|
|
161
|
+
>
|
|
162
|
+
> 1. **Checkout safety.** Prepare refuses to start when the working tree is
|
|
163
|
+
> dirty or HEAD is on a branch other than the expected one (`epic/<id>`
|
|
164
|
+
> on a resume, or the project base branch on a fresh run). It will
|
|
165
|
+
> **not** check `epic/<id>` out over your work — the historic
|
|
166
|
+
> HEAD-yank footgun. Remediation: commit/stash/clean the tree, or
|
|
167
|
+
> switch to the expected branch, then re-run.
|
|
168
|
+
> 2. **Epic lease.** Prepare acquires the assignee-as-lease on the Epic
|
|
169
|
+
> ticket (`ticket-lease.acquireLease`). On a **live foreign claim**
|
|
170
|
+
> (a teammate's run with a fresh `story.heartbeat` within
|
|
171
|
+
> `delivery.lease.ttlMs`) it exits non-zero and names the current owner;
|
|
172
|
+
> a **stale** claim is silently reclaimed. The operator identity is
|
|
173
|
+
> resolved from `--as <handle>` → `github.operatorHandle` →
|
|
174
|
+
> `git config user.email`. Pass `--steal` to forcibly transfer a live
|
|
175
|
+
> foreign claim (the takeover is logged for auditability). The committed
|
|
176
|
+
> `github.operatorHandle` is the non-personal `@[USERNAME]` placeholder,
|
|
177
|
+
> which resolves to null — so when none of the three sources yields a real
|
|
178
|
+
> identity the guard **fails closed** (throws after the checkout guard
|
|
179
|
+
> runs) rather than driving an ownerless, unguarded delivery. Set your own
|
|
180
|
+
> handle in `.agentrc.local.json`, pass `--as <handle>`, or configure
|
|
181
|
+
> `git user.email`. The lease is the cross-clone coordination layer, while
|
|
182
|
+
> `epic-merge-lock.js` continues to serialize same-machine sessions.
|
|
183
|
+
>
|
|
184
|
+
> Both guards throw on failure, which `runAsCli` maps to `process.exit(1)`
|
|
185
|
+
> per [`orchestration-error-handling.md`](../rules/orchestration-error-handling.md).
|
|
186
|
+
|
|
187
|
+
Once the preflight guards pass, the snapshot phase applies one more gate:
|
|
188
|
+
|
|
189
|
+
> **Acceptance-spec start gate.** Before the wave loop fans out, the
|
|
190
|
+
> snapshot phase
|
|
191
|
+
> ([`lib/orchestration/epic-runner/phases/snapshot.js`](../scripts/lib/orchestration/epic-runner/phases/snapshot.js))
|
|
192
|
+
> asserts that the Epic either carries the `acceptance::n-a` waiver
|
|
193
|
+
> label **or** has a linked `context::acceptance-spec` ticket. The
|
|
194
|
+
> ticket's GitHub state (open / closed) is **not** checked —
|
|
195
|
+
> presence is sufficient, matching the PRD and Tech Spec contract.
|
|
196
|
+
> The reviewer's OK during `/epic-plan` Phase 7 is the approval
|
|
197
|
+
> signal, not a manual ticket-close action. Neither condition met →
|
|
198
|
+
> the snapshot throws a clear error
|
|
199
|
+
> (`[epic-deliver] Epic #<id> cannot launch: …`) and `runAsCli`
|
|
200
|
+
> maps it to `process.exit(1)`. Operator remediation: either run
|
|
201
|
+
> `/epic-plan` Phase 7 to author the spec, or apply the
|
|
202
|
+
> `acceptance::n-a` label to opt out.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Phase 2 — Wave loop
|
|
207
|
+
|
|
208
|
+
The wave-loop state machine lives in
|
|
209
|
+
[`lib/wave-runner/tick.js`](../scripts/lib/wave-runner/tick.js) — one
|
|
210
|
+
stateless `tick({ epic })` call returns one `WaveTickResult` describing
|
|
211
|
+
the next action. The slash command's job is to call `tick()` via its CLI
|
|
212
|
+
shim, dispatch from `nextAction.stories` via the Agent tool, persist the
|
|
213
|
+
outcome, and loop until terminal.
|
|
214
|
+
|
|
215
|
+
### 2a. Tick — plan the next action
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
node .agents/scripts/wave-tick.js --epic <epicId>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Stdout is one `WaveTickResult` envelope:
|
|
222
|
+
|
|
223
|
+
```json
|
|
224
|
+
{
|
|
225
|
+
"nextAction":
|
|
226
|
+
{ "kind": "dispatch", "stories": [{ "id": <n>, "title": "…", "worktree"?: "…" }, ...] }
|
|
227
|
+
| { "kind": "observe", "waitingOn": [<storyId>, ...] }
|
|
228
|
+
| { "kind": "wave-complete", "index": <n> }
|
|
229
|
+
| { "kind": "epic-complete" },
|
|
230
|
+
"blockedStories": [{ "storyId": <n>, "reason": "…", "detail"?: "…" }, ...],
|
|
231
|
+
"gateFailures": [{ "storyId": <n>, "gate": "…", "detail"?: "…" }, ...],
|
|
232
|
+
"currentWave": <n>,
|
|
233
|
+
"totalWaves": <n>
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
The CLI is a planner: it returns the `nextAction` envelope above. Wave
|
|
238
|
+
progress is durable on two operator-facing surfaces — the `epic-run-state`
|
|
239
|
+
checkpoint (resume) and the `epic-run-progress` rollup comment, both written
|
|
240
|
+
by `epic-execute-record-wave.js` at the wave boundary. The CLI itself emits
|
|
241
|
+
only the two wave-window forensics signals that have a live consumer —
|
|
242
|
+
`wave-start` and `wave-complete`, which the perf-aggregator brackets into the
|
|
243
|
+
`waveParallelism` report (and `wave-start` anchors span-tree Story spans).
|
|
244
|
+
Story #3909 retired the write-only wave events with no reader (`wave-tick`,
|
|
245
|
+
`epic-complete`) — they duplicated the checkpoint + rollup. The
|
|
246
|
+
[`signals` helper](helpers/signals.md) (`node .agents/scripts/signals-view.js`)
|
|
247
|
+
renders the forensics signals in the span-tree view.
|
|
248
|
+
|
|
249
|
+
### 2b. Dispatch — fan out per-Story Agent calls
|
|
250
|
+
|
|
251
|
+
*You* (the LLM running this skill) are the wave dispatcher; you never
|
|
252
|
+
invoke `helpers/epic-deliver-story` yourself. Emit **one `Agent` tool call per
|
|
253
|
+
Story** in `nextAction.stories` (even when `length === 1` — the
|
|
254
|
+
parent-child boundary keeps the return-parser uniform). The *children*
|
|
255
|
+
run [`helpers/epic-deliver-story`](helpers/epic-deliver-story.md). Use
|
|
256
|
+
`subagent_type: general-purpose`.
|
|
257
|
+
|
|
258
|
+
Emit **one assistant turn** with **N parallel `Agent` calls** where
|
|
259
|
+
`N === min(nextAction.stories.length, concurrencyCap)`. When the wave
|
|
260
|
+
exceeds `concurrencyCap`, dispatch the first `concurrencyCap` Stories
|
|
261
|
+
as background calls (`run_in_background: true`) and refill from
|
|
262
|
+
`nextAction.stories` immediately as each child returns — never exceed
|
|
263
|
+
the cap, never wait for a whole batch before refilling.
|
|
264
|
+
|
|
265
|
+
> **Throughput tradeoff.** The default `concurrencyCap` of 3 is
|
|
266
|
+
> intentionally conservative — it keeps host-quota consumption low on
|
|
267
|
+
> Epics with small waves and avoids flooding the GitHub API. For
|
|
268
|
+
> wide-wave Epics (many Stories per wave) where the host has adequate
|
|
269
|
+
> parallel-agent quota, raising `delivery.deliverRunner.concurrencyCap`
|
|
270
|
+
> in `.agentrc.json` reduces wall-clock time proportionally to the
|
|
271
|
+
> extra concurrency. The safe default is left in place; this is a
|
|
272
|
+
> deliberate operator-tuning knob, not a hidden performance ceiling.
|
|
273
|
+
> See `agentrc-reference.json` `delivery.deliverRunner.concurrencyCap` for
|
|
274
|
+
> the configuration surface.
|
|
275
|
+
|
|
276
|
+
**Ledger the dispatch BEFORE the Agent call.** Immediately before each
|
|
277
|
+
per-Story `Agent` tool call (one shell-out per Story, every attempt —
|
|
278
|
+
including retries from a refill), invoke
|
|
279
|
+
[`lifecycle-emit-story-dispatch.js`](../scripts/lifecycle-emit-story-dispatch.js)
|
|
280
|
+
so the lifecycle ledger durably records the dispatch attempt. The
|
|
281
|
+
emit must happen **before** the Agent call fires — never after — so
|
|
282
|
+
that a host-process crash mid-Agent leaves a `story.dispatch.start`
|
|
283
|
+
record that `wave-tick.js` (see § 2a) can surface under
|
|
284
|
+
`nextAction['in-flight']` on the next tick:
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
node .agents/scripts/lifecycle-emit-story-dispatch.js \
|
|
288
|
+
--epic <epicId> --story <storyId> \
|
|
289
|
+
--wave <currentWave> --attempt <attempt>
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
`<attempt>` starts at 1 for the Story's first dispatch in this wave
|
|
293
|
+
and increments on each retry/refill. The CLI appends exactly one
|
|
294
|
+
NDJSON line to `temp/epic-<epicId>/lifecycle.ndjson`; the matching
|
|
295
|
+
`story.dispatch.end` record is appended later by
|
|
296
|
+
`epic-execute-record-wave.js` (via `emit-story-dispatch-end.js`, Story #3900)
|
|
297
|
+
after the Agent return is recorded in § 2c.
|
|
298
|
+
|
|
299
|
+
Each Agent call's prompt must (1) name the Story + Epic ids, (2)
|
|
300
|
+
instruct the child to invoke `helpers/epic-deliver-story <storyId>`, (3) state the
|
|
301
|
+
**return contract** below, (4) remind the child of the
|
|
302
|
+
**non-interactive contract** (no clarifying questions; transition to
|
|
303
|
+
`agent::blocked` and exit if stuck), (5) ask the child to suppress
|
|
304
|
+
per-Story chat relay and include its **terminal** `renderedBody` in the
|
|
305
|
+
JSON return, and (6) require the child to emit a `story.heartbeat`
|
|
306
|
+
lifecycle event at least once per Story-level phase transition via
|
|
307
|
+
`node .agents/scripts/story-phase.js` (or whenever it stalls on a
|
|
308
|
+
long-running step), and if it cannot make progress to transition
|
|
309
|
+
to `agent::blocked` rather than fall silent. The pairing of
|
|
310
|
+
`story.heartbeat` and `agent::blocked` is what lets the §2e Idle
|
|
311
|
+
Watchdog distinguish a working child from a dead one; a silent child
|
|
312
|
+
with no recent heartbeat and no blocker label is the failure mode the
|
|
313
|
+
watchdog is built to catch.
|
|
314
|
+
|
|
315
|
+
```json
|
|
316
|
+
{
|
|
317
|
+
"storyId": <number>,
|
|
318
|
+
"status": "done" | "blocked" | "failed",
|
|
319
|
+
"phase": "init|implementing|closing|blocked|done",
|
|
320
|
+
"branchDeleted": <boolean>,
|
|
321
|
+
"blockerCommentId": <string|null>,
|
|
322
|
+
"detail": <string|undefined>,
|
|
323
|
+
"renderedBody": <string|undefined>
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**Sub-agent dispatch.** `Agent` calls emit no `model:` argument by
|
|
328
|
+
default — children inherit from the `general-purpose` sub-agent
|
|
329
|
+
definition and the parent's worktree context. No
|
|
330
|
+
`--dangerously-skip-permissions` (no subprocess is spawned). If a
|
|
331
|
+
specific call needs to override the inherited model, pass `model:` as a
|
|
332
|
+
per-call literal at the `Agent(...)` site.
|
|
333
|
+
|
|
334
|
+
### 2c. Record the wave outcome
|
|
335
|
+
|
|
336
|
+
Once every dispatched Story has returned, persist via
|
|
337
|
+
`epic-execute-record-wave.js`:
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
# Mode A — host LLM already parsed each child return.
|
|
341
|
+
node .agents/scripts/epic-execute-record-wave.js \
|
|
342
|
+
--epic <epicId> --wave <N> [--concurrency-cap <N>] \
|
|
343
|
+
--results @<file>|<inline-json>
|
|
344
|
+
|
|
345
|
+
# Mode B — pipe the raw per-Story sub-agent return texts directly.
|
|
346
|
+
node .agents/scripts/epic-execute-record-wave.js \
|
|
347
|
+
--epic <epicId> --wave <N> [--concurrency-cap <N>] \
|
|
348
|
+
--returns @<file>|<inline-json>
|
|
349
|
+
# `<inline-json>` shape: [{ "storyId": <n>, "returnText": "<raw text>" }]
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**Prefer mode B** when the host LLM can't fully verify every child's
|
|
353
|
+
return is a parseable envelope. The CLI reconciles parse failures from
|
|
354
|
+
GitHub, aggregates terminal status, appends to `state.waves[]`,
|
|
355
|
+
re-renders `epic-run-progress`, and prints
|
|
356
|
+
`{ status, nextAction, renderedBody, ... }`. Print `renderedBody`
|
|
357
|
+
verbatim, then optionally append a short **Notable** section (0–5
|
|
358
|
+
bullets on newly blocked / failed / slow Stories, friction,
|
|
359
|
+
elapsed-time surprises).
|
|
360
|
+
|
|
361
|
+
> **Crash recovery — empty mode-B returns (Story #3907).** If the host
|
|
362
|
+
> crashed *after* this wave's children finished but *before* `record-wave`
|
|
363
|
+
> ran, no return text survives. Re-run mode B with an **empty** returns
|
|
364
|
+
> array (`--returns '[]'`): the CLI reconciles **every** Story in
|
|
365
|
+
> `plan[<N>]` directly from GitHub (label + `state`) and records the wave
|
|
366
|
+
> from that live state instead of recording a falsely-`complete` empty
|
|
367
|
+
> wave. This is what lets `currentWave` advance after a crash — only
|
|
368
|
+
> `record-wave` advances it, so without this path the loop would return
|
|
369
|
+
> `wave-complete` for the same index forever.
|
|
370
|
+
|
|
371
|
+
### 2d. Loop on `nextAction`
|
|
372
|
+
|
|
373
|
+
After `2c`, re-run `wave-tick.js`. Branch on the new envelope:
|
|
374
|
+
|
|
375
|
+
- `dispatch` → repeat 2b/2c for the same wave (refill) or the next wave.
|
|
376
|
+
- `observe` → poll the Epic (children may still be in flight, or some
|
|
377
|
+
are `agent::blocked`). If `blockedStories` is non-empty, post a
|
|
378
|
+
friction comment, flip Epic to `agent::blocked`, park.
|
|
379
|
+
- `wave-complete` → loop to the next wave.
|
|
380
|
+
- `epic-complete` → proceed to Phase 3.
|
|
381
|
+
|
|
382
|
+
### 2e. Idle Watchdog
|
|
383
|
+
|
|
384
|
+
A Story's implementation loop can run for many minutes between
|
|
385
|
+
`story.dispatch.start` and the post-merge `story.merged` record. While
|
|
386
|
+
`observe` keeps the host LLM polling the Epic, it does **not** flag a
|
|
387
|
+
sub-agent that has gone silent (host crash, mid-Story stall, lost
|
|
388
|
+
return). The Idle Watchdog closes that gap.
|
|
389
|
+
|
|
390
|
+
**Cadence.** While any wave is in flight (i.e. `nextAction.kind` is
|
|
391
|
+
`observe` or the most recent dispatch's `in-flight` list is non-empty),
|
|
392
|
+
re-tick every **30 minutes** with the watchdog flag:
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
node .agents/scripts/wave-tick.js --epic <epicId> --check-idle 30
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
> **Why 30, not 10 (Story #3900).** Heartbeats fire only at Story-level
|
|
399
|
+
> phase transitions, and `implementing → closing` routinely exceeds 10
|
|
400
|
+
> minutes for a healthy Story. A 10-minute threshold therefore tripped the
|
|
401
|
+
> watchdog on every long-running Story, whose prescribed remediation —
|
|
402
|
+
> re-dispatch — put two agents on one `story-<id>` branch (the worst
|
|
403
|
+
> failure mode in the system). The threshold is widened to 30 minutes and
|
|
404
|
+
> the staleness test now also consults a deterministic branch-commit
|
|
405
|
+
> signal (below), so a Story still gaining commits is never flagged.
|
|
406
|
+
|
|
407
|
+
The `--check-idle <minutes>` mode scans the per-Epic lifecycle ledger
|
|
408
|
+
(`temp/epic-<epicId>/lifecycle.ndjson`) for Stories that carry a
|
|
409
|
+
`story.dispatch.start` without a matching `story.dispatch.end` (the
|
|
410
|
+
canonical in-flight list — see § 2a's `nextAction['in-flight']`), and
|
|
411
|
+
compares each in-flight Story's most recent ledger event (any
|
|
412
|
+
`story.*` event, notably the `story.heartbeat` records emitted by
|
|
413
|
+
`story-phase.js` at each Story-level phase transition) against the
|
|
414
|
+
threshold. **Before flagging a stall, it also checks the last commit on
|
|
415
|
+
`story-<id>` via `git log` (Story #3900): a Story whose branch carries a
|
|
416
|
+
commit newer than the threshold is making forward progress and is left
|
|
417
|
+
in-flight, never stalled — deterministic protection against the
|
|
418
|
+
false-positive re-dispatch hazard even when no heartbeat has landed.**
|
|
419
|
+
The CLI emits one envelope on stdout and exits non-zero when at least
|
|
420
|
+
one in-flight Story has been silent for ≥ the threshold:
|
|
421
|
+
|
|
422
|
+
```json
|
|
423
|
+
{
|
|
424
|
+
"kind": "wave-stall",
|
|
425
|
+
"epicId": <n>,
|
|
426
|
+
"thresholdMinutes": <n>,
|
|
427
|
+
"checkedAt": "<ISO-8601>",
|
|
428
|
+
"stalled": [{ "storyId": <n>, "lastEventAt": "<ISO-8601>", "idleMinutes": <n> }],
|
|
429
|
+
"inFlight": [<storyId>, ...]
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
**On a stall.** When the watchdog exits non-zero, post the envelope
|
|
434
|
+
verbatim as a `wave-stall` structured comment on the Epic (use
|
|
435
|
+
[`post-structured-comment.js`](../scripts/post-structured-comment.js)
|
|
436
|
+
with `--kind wave-stall`), then re-evaluate the affected Stories: if a
|
|
437
|
+
child sub-agent has crashed (no `story.dispatch.end`, no recent
|
|
438
|
+
heartbeat, no commit on `story-<id>`), re-dispatch the Story per § 2b
|
|
439
|
+
incrementing the `--attempt` counter; if the child is alive but
|
|
440
|
+
genuinely blocked, flip the Story to `agent::blocked` and proceed per
|
|
441
|
+
§ 2d's `observe` branch.
|
|
442
|
+
|
|
443
|
+
Stop the watchdog cadence once `wave-tick.js` returns
|
|
444
|
+
`wave-complete` or `epic-complete` — there are no in-flight Stories
|
|
445
|
+
left to monitor.
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## Phase 3 — Close-validation
|
|
450
|
+
|
|
451
|
+
Run lint + test + ratchets against `epic/<epicId>` before opening the PR:
|
|
452
|
+
|
|
453
|
+
```bash
|
|
454
|
+
node .agents/scripts/evidence-gate.js \
|
|
455
|
+
--epic-id <epicId> --scope-id <epicId> --gate lint -- npm run lint
|
|
456
|
+
node .agents/scripts/evidence-gate.js \
|
|
457
|
+
--epic-id <epicId> --scope-id <epicId> --gate test -- npm test
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
If either gate fails: STOP, fix on a hotfix branch, merge back to the
|
|
461
|
+
Epic branch, restart this phase.
|
|
462
|
+
|
|
463
|
+
### 3.1 Refresh ratcheted baselines
|
|
464
|
+
|
|
465
|
+
Inspect the scripts in `.husky/pre-push` (typecheck, lint, maintainability,
|
|
466
|
+
design tokens, dependency audits, bundle-size budgets). Run each against
|
|
467
|
+
the Epic branch; if any drifts, refresh and commit
|
|
468
|
+
`chore(baselines): refresh <name> for Epic #<epicId>`.
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
## Phase 4 — Epic audit (change-set lenses)
|
|
473
|
+
|
|
474
|
+
Skip when `--skip-epic-audit`. Otherwise auto-invoke
|
|
475
|
+
[`helpers/epic-audit.md`](helpers/epic-audit.md) inline. The helper runs
|
|
476
|
+
[`epic-audit-prepare.js`](../scripts/epic-audit-prepare.js) to ask the
|
|
477
|
+
[`selectAudits`](../scripts/lib/audit-suite/index.js) SDK which lenses fire
|
|
478
|
+
at the `gate3` close gate, **unions in the model-judged risk-routed lenses**
|
|
479
|
+
(Story #3889 — `epic-audit-prepare.js` reads the Epic's `planningRisk`
|
|
480
|
+
envelope off the `epic-plan-state` checkpoint and maps each high-risk axis to
|
|
481
|
+
its lens via `resolveAuditLenses`), then dispatches each selected lens through
|
|
482
|
+
[`runAuditSuite`](../scripts/lib/audit-suite/index.js). A high-risk Epic
|
|
483
|
+
therefore auto-runs its mapped lenses (e.g. a `security`-axis Epic runs
|
|
484
|
+
`audit-security`) even when the change set alone did not select them; a
|
|
485
|
+
low-risk Epic adds nothing. Findings are persisted as an `audit-results`
|
|
486
|
+
structured comment on the Epic.
|
|
487
|
+
|
|
488
|
+
- **Any 🔴 Critical Blocker** — STOP. Relay to the operator.
|
|
489
|
+
- **Only 🟠/🟡/🟢** — log as non-blocking and continue.
|
|
490
|
+
- **Selector reports `degraded: true`** — STOP. Propagate the
|
|
491
|
+
`reason`/`detail`, post a friction comment, do not fall back to a
|
|
492
|
+
full-roster audit.
|
|
493
|
+
- **`selectedAudits` is empty** (docs-only change set) — log the
|
|
494
|
+
short-circuit and continue to Phase 5.
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
## Phase 5 — Code review
|
|
499
|
+
|
|
500
|
+
Skip when `--skip-code-review`. Otherwise resolve the **risk-derived review
|
|
501
|
+
depth** for this Epic, then auto-invoke
|
|
502
|
+
[`helpers/code-review.md`](helpers/code-review.md) inline (read-only audit)
|
|
503
|
+
with the argument envelope `{ scope: 'epic', ticketId: <epicId>, baseRef:
|
|
504
|
+
'main', headRef: 'epic/<epicId>', depth: <reviewDepth> }`. The helper
|
|
505
|
+
persists findings as a `code-review` structured comment on the Epic.
|
|
506
|
+
|
|
507
|
+
The `depth` is the live epic-scope producer for Story #3876's review-depth
|
|
508
|
+
lever (Story #3937). Resolve it from the Epic's judged risk envelope the same
|
|
509
|
+
best-effort way Phase 4 routes audit lenses — via
|
|
510
|
+
[`resolveReviewDepthForEpic`](../scripts/lib/orchestration/code-review.js),
|
|
511
|
+
which reads `planningRisk.overallLevel` off the Epic's `epic-plan-state`
|
|
512
|
+
checkpoint and maps it: `high` → `deep`, `low` → `light`, everything else
|
|
513
|
+
(including a missing/unparseable checkpoint, or an Epic that skipped
|
|
514
|
+
`/epic-plan`) → `standard`. The helper threads `depth` into `runCodeReview`,
|
|
515
|
+
which forwards it to every provider's `runReview` input; the LLM-backed
|
|
516
|
+
providers (codex, security-review, ultrareview) render it into the prompt they
|
|
517
|
+
emit so a high-risk Epic gets a deeper adversarial pass and a low-risk one a
|
|
518
|
+
lighter one. Depth is **input-only** — it never changes the findings envelope
|
|
519
|
+
or the posted comment shape.
|
|
520
|
+
|
|
521
|
+
- **Any 🔴 Critical Blocker** — STOP. Relay to the operator.
|
|
522
|
+
- **Only 🟠/🟡/🟢** — log as non-blocking and continue.
|
|
523
|
+
|
|
524
|
+
---
|
|
525
|
+
|
|
526
|
+
## Phase 6 — Retro
|
|
527
|
+
|
|
528
|
+
Skip when `--skip-retro`. Otherwise post the `epic-perf-report` via
|
|
529
|
+
`node .agents/scripts/analyze-execution.js --epic <epicId>` (failure →
|
|
530
|
+
warn and continue; the retro runner falls back). Then invoke the retro
|
|
531
|
+
runner via its CLI wrapper:
|
|
532
|
+
|
|
533
|
+
```bash
|
|
534
|
+
node .agents/scripts/retro-run.js --epic <epicId>
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
[`retro-run.js`](../scripts/retro-run.js) resolves the config/provider,
|
|
538
|
+
constructs a lifecycle bus with a `LedgerWriter` (so the run's
|
|
539
|
+
`retro.start` / `retro.end` boundaries land in
|
|
540
|
+
`temp/epic-<epicId>/lifecycle.ndjson`), and calls `runRetro` — the
|
|
541
|
+
canonical compose-and-post surface at
|
|
542
|
+
[`.agents/scripts/lib/orchestration/retro-runner.js`](../scripts/lib/orchestration/retro-runner.js).
|
|
543
|
+
Propagate `--full-retro` to bypass the compact-path heuristic.
|
|
544
|
+
|
|
545
|
+
Retro fires here (before the PR opens) so it stays in the operator's
|
|
546
|
+
local session with full env access (env vars, credentials, MCP).
|
|
547
|
+
|
|
548
|
+
After the GitHub upsert succeeds, the retro body is also **mirrored
|
|
549
|
+
locally** to the per-Epic temp tree at `temp/epic-<epicId>/retro.md`
|
|
550
|
+
(path resolved via
|
|
551
|
+
[`lib/config/temp-paths.js`](../scripts/lib/config/temp-paths.js)'s
|
|
552
|
+
`epicRetroMirrorPath`, which honours `project.paths.tempRoot`).
|
|
553
|
+
Operators can read the retro without re-fetching from GitHub. GitHub
|
|
554
|
+
remains the source of truth — a mirror-write failure only logs a warn
|
|
555
|
+
and never fails the phase.
|
|
556
|
+
|
|
557
|
+
---
|
|
558
|
+
|
|
559
|
+
## Phase 7 — Finalize (open PR to main)
|
|
560
|
+
|
|
561
|
+
### 7.0 — Sync Epic branch from `main` (Story #2580)
|
|
562
|
+
|
|
563
|
+
Before firing the close-tail emit, sync the Epic branch with
|
|
564
|
+
`origin/main` so the PR opens with the latest base commits already
|
|
565
|
+
integrated. The Epic branch may be behind `main` if other PRs merged
|
|
566
|
+
during the wave loop; without this step, the Epic→`main` PR opens
|
|
567
|
+
"behind base" and (with branch-protection's `up-to-date branch` rule)
|
|
568
|
+
stalls at the merge gate.
|
|
569
|
+
|
|
570
|
+
```bash
|
|
571
|
+
git checkout epic/<epicId>
|
|
572
|
+
node .agents/scripts/sync-branch-from-base.js \
|
|
573
|
+
--branch epic/<epicId> --base main
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
Outcomes:
|
|
577
|
+
|
|
578
|
+
- **`fast-forward` / `merge-commit` / `noop-already-current`** → push
|
|
579
|
+
the resulting tip and continue to Phase 7.1: `git push origin epic/<epicId>`.
|
|
580
|
+
- **`conflict`** → resolve in the Epic checkout (`git merge --no-edit
|
|
581
|
+
origin/main`, fix conflicts, `git commit --no-edit`), then re-run the
|
|
582
|
+
sync command. Once it exits 0, continue. Operator-recoverable; not an
|
|
583
|
+
agent loop.
|
|
584
|
+
- **`fetch-failed`** → re-check network / `origin` access and re-run.
|
|
585
|
+
|
|
586
|
+
This is a workflow-level step (operator-driven), not part of the
|
|
587
|
+
close-tail listener chain. The sync runs from the main checkout so
|
|
588
|
+
the resulting tip lands on `epic/<epicId>` before Phase 7.1 fires
|
|
589
|
+
the bus-driven close-tail.
|
|
590
|
+
|
|
591
|
+
### 7.1 — Fire the close-tail emit
|
|
592
|
+
|
|
593
|
+
```bash
|
|
594
|
+
node .agents/scripts/lifecycle-emit.js --epic <epicId> --event epic.close.end
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
Emits `epic.close.end` onto the lifecycle bus. **Every close-time
|
|
598
|
+
responsibility below runs inside the listener chain — the operator
|
|
599
|
+
shells nothing manually. The `Finalizer` listener (Story #2894 —
|
|
600
|
+
bus-owned finalize) composes three helpers under
|
|
601
|
+
`.agents/scripts/lib/orchestration/finalize/` and emits the canonical
|
|
602
|
+
chain.** Treat this section as a runtime contract — `/epic-deliver`
|
|
603
|
+
just fires the emit and reads the resulting ledger.
|
|
604
|
+
|
|
605
|
+
1. **Acceptance-spec reconciliation — bus-driven.** The
|
|
606
|
+
`AcceptanceReconciler` listener invokes
|
|
607
|
+
[`acceptance-spec-reconciler.js`](../scripts/acceptance-spec-reconciler.js)
|
|
608
|
+
to diff the AC IDs declared in the linked `context::acceptance-spec`
|
|
609
|
+
body against `@ac-*` / `@pending` tags in `tests/features/**`. A
|
|
610
|
+
non-OK reconciliation throws (per
|
|
611
|
+
[`rules/orchestration-error-handling.md`](../rules/orchestration-error-handling.md)),
|
|
612
|
+
aborting finalize **before** any PR is opened or planning artifacts
|
|
613
|
+
are closed — so the PRD, Tech Spec, and Acceptance Spec stay open
|
|
614
|
+
until the AC coverage gap is fixed. The reconciler returns
|
|
615
|
+
`status: 'waived'` without scanning features when the Epic carries
|
|
616
|
+
`acceptance::n-a`, and defends against direct CLI invocation by
|
|
617
|
+
refusing to run when no spec is linked and no waiver is set (the
|
|
618
|
+
start gate in Phase 1 would normally catch that first).
|
|
619
|
+
2. **PR open — bus-driven (Story #2894).** On
|
|
620
|
+
`acceptance.reconcile.ok` the `Finalizer` listener invokes
|
|
621
|
+
[`openOrLocatePr`](../scripts/lib/orchestration/finalize/open-or-locate-pr.js)
|
|
622
|
+
with `{ epicId, headBranch: 'epic/<id>', baseBranch: 'main' }`.
|
|
623
|
+
The helper probes for an existing open PR on the head branch
|
|
624
|
+
first (idempotent locate path — a re-run of `/epic-deliver`
|
|
625
|
+
on the same branch short-circuits without opening a duplicate)
|
|
626
|
+
and only opens a new PR when none exists. The listener then
|
|
627
|
+
emits `pr.created` → `epic.finalize.end` and **stops** (Story
|
|
628
|
+
#3367). It does **not** emit `epic.merge.ready`: that event is
|
|
629
|
+
the sole `AutomergeArmer` trigger, and emitting it from finalize
|
|
630
|
+
would cascade `epic.close.end` synchronously through the arm →
|
|
631
|
+
`MergeWatcher` → `Cleaner` → `BranchCleaner` reap, deleting the
|
|
632
|
+
`epic/<id>` branch before the PR merged and bypassing the
|
|
633
|
+
`AutomergePredicate` disqualification gate. The auto-merge arm is
|
|
634
|
+
driven later from the gated watch path (`pr.created` → `Watcher`
|
|
635
|
+
→ `epic.watch.end` → `AutomergePredicate` → `epic.merge.ready` →
|
|
636
|
+
`AutomergeArmer`) re-entered in Phase 8.5. The merge-lockout rule
|
|
637
|
+
in [`check-lifecycle-lint.js`](../scripts/check-lifecycle-lint.js)
|
|
638
|
+
keeps `gh pr merge --auto --squash --delete-branch` confined to
|
|
639
|
+
`AutomergeArmer` — Phase 7 never shells the merge command.
|
|
640
|
+
3. **Planning-artifact close + hand-off — bus-driven (Story
|
|
641
|
+
#2894).** After `openOrLocatePr` returns, the `Finalizer` chains
|
|
642
|
+
[`closePlanningTickets`](../scripts/lib/orchestration/finalize/close-planning-tickets.js)
|
|
643
|
+
to close the three planning context tickets
|
|
644
|
+
(`context::prd`, `context::tech-spec`, `context::acceptance-spec`)
|
|
645
|
+
so the Epic's `Closes #<id>` auto-close path is not blocked by
|
|
646
|
+
open sub-issues, then
|
|
647
|
+
[`postHandoffComment`](../scripts/lib/orchestration/finalize/post-handoff-comment.js)
|
|
648
|
+
to upsert the canonical `epic-handoff` structured comment naming
|
|
649
|
+
the PR URL. Both helpers are idempotent — already-closed tickets
|
|
650
|
+
are counted under `alreadyClosed`, and the handoff comment is
|
|
651
|
+
edited in place via `upsertStructuredComment` rather than
|
|
652
|
+
appending a duplicate. When the `acceptance::n-a` waiver is set
|
|
653
|
+
and no Acceptance Spec ticket was ever opened, the third
|
|
654
|
+
planning-ticket close is recorded as `skipped`.
|
|
655
|
+
|
|
656
|
+
Branch cleanup is out-of-band (Phase 9 reaps local refs after merge; the
|
|
657
|
+
rare "scrap and reset" case for an unmerged Epic is handled manually).
|
|
658
|
+
|
|
659
|
+
---
|
|
660
|
+
|
|
661
|
+
## Phase 8 — Watch-and-iterate until CI is green
|
|
662
|
+
|
|
663
|
+
The host LLM owns the green-bar loop until the operator merges. Use
|
|
664
|
+
the shared watch-and-recover helper, which wraps `gh pr checks --watch`
|
|
665
|
+
and additionally auto-recovers from `mergeStateStatus: BEHIND` by
|
|
666
|
+
calling `gh pr update-branch` once every required check is green
|
|
667
|
+
(branch-protection rules requiring "up to date before merging"
|
|
668
|
+
otherwise park the PR until the operator clicks **Update branch**
|
|
669
|
+
manually):
|
|
670
|
+
|
|
671
|
+
```bash
|
|
672
|
+
node <agentRoot>/scripts/pr-watch-with-update.js --pr <prNumber>
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
`<agentRoot>` resolves from `project.paths.agentRoot` (default
|
|
676
|
+
`.agents`). Pass `--max-updates N` (default 3) to cap update-branch
|
|
677
|
+
calls per session and `--poll-interval-ms MS` (default 10000) to
|
|
678
|
+
override the polling cadence.
|
|
679
|
+
|
|
680
|
+
Exit 0 → proceed to Phase 8.5. Non-zero → remediate (below) and re-run
|
|
681
|
+
the helper. Auto-merge stays armed across retries; the
|
|
682
|
+
`epic.automerge.start` emit in Phase 8.5 re-runs the `AutomergeArmer`
|
|
683
|
+
listener, which re-checks `mergeStateStatus` before firing merge, so a
|
|
684
|
+
second BEHIND that arrives between the helper exiting clean and Phase
|
|
685
|
+
8.5 starting is also caught.
|
|
686
|
+
|
|
687
|
+
### 8.1 Remediation
|
|
688
|
+
|
|
689
|
+
For each failed required check: fetch the log
|
|
690
|
+
(`gh run view <runId> --log-failed`), classify and fix:
|
|
691
|
+
|
|
692
|
+
- **lint / format** → `npm run lint` + `npx biome check --apply` (or
|
|
693
|
+
`format --write`); commit, push.
|
|
694
|
+
- **maintainability / crap baseline drift** → re-run the ratcheted
|
|
695
|
+
script. Refresh the baseline only when drift is justified by the
|
|
696
|
+
diff; otherwise fix at source.
|
|
697
|
+
- **test failure** → reproduce with `npm test`, fix source or test.
|
|
698
|
+
- **coverage threshold** → add tests (preferred); refresh baseline only
|
|
699
|
+
when the diff demonstrably can't be covered.
|
|
700
|
+
- **anything else** → read the log, fix at source.
|
|
701
|
+
|
|
702
|
+
Push to `epic/<epicId>` and re-run
|
|
703
|
+
`node <agentRoot>/scripts/pr-watch-with-update.js --pr <prNumber>`.
|
|
704
|
+
|
|
705
|
+
### 8.2 When to halt
|
|
706
|
+
|
|
707
|
+
Three consecutive iterations on the same failure class without
|
|
708
|
+
convergence → friction comment, flip to `agent::blocked`, park. Unknown
|
|
709
|
+
failure class on first encounter → attempt source-level fix; log
|
|
710
|
+
friction if diagnosis takes more than one round.
|
|
711
|
+
|
|
712
|
+
### 8.3 Hard prohibitions
|
|
713
|
+
|
|
714
|
+
**Never** `gh pr merge` from Phase 8 (Phase 8.5 is the only merge
|
|
715
|
+
site). **Never** force-push to `main`. **Never** push empty commits or
|
|
716
|
+
refresh baselines to dodge a red check.
|
|
717
|
+
|
|
718
|
+
---
|
|
719
|
+
|
|
720
|
+
## Phase 8.5 — Auto-merge gate
|
|
721
|
+
|
|
722
|
+
After Phase 8 exits 0, evaluate the auto-merge predicate by emitting
|
|
723
|
+
`epic.automerge.start`:
|
|
724
|
+
|
|
725
|
+
```bash
|
|
726
|
+
node .agents/scripts/lifecycle-emit.js --epic <epicId> \
|
|
727
|
+
--event epic.automerge.start --pr-url <prUrl>
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
`AutomergePredicate` subscribes to `epic.automerge.start` (Story #3901 —
|
|
731
|
+
before that this event had **zero** subscribers and the entire Phase 8.5
|
|
732
|
+
gate was a dead wire). It evaluates the structured-signal verdict and
|
|
733
|
+
emits `epic.merge.ready` on a clean verdict or `epic.merge.blocked`
|
|
734
|
+
otherwise. The CI-freshness gate is skipped on this event because Phase 8
|
|
735
|
+
already polled every required check to green — `epic.automerge.start`
|
|
736
|
+
carries `prUrl` but no `checkOutcomes`.
|
|
737
|
+
|
|
738
|
+
The `AutomergeArmer` listener subscribes to the downstream
|
|
739
|
+
`epic.merge.ready` outcome and fires `gh pr merge --auto --squash
|
|
740
|
+
--delete-branch` only when `clean: true`. `clean: true` requires
|
|
741
|
+
**all** of:
|
|
742
|
+
|
|
743
|
+
- `state.manualInterventions[]` is empty;
|
|
744
|
+
- every wave's `status === "complete"`;
|
|
745
|
+
- no story envelope carries a `blockerCommentId` or non-`done` status;
|
|
746
|
+
- code-review reports `0` 🔴 + `0` 🟠 findings;
|
|
747
|
+
- the retro's machine-readable `automerge-verdict` trailer reports
|
|
748
|
+
`cleanSprint: true` (Story #3901 — the predicate reads the parsed JSON
|
|
749
|
+
trailer `retro-run.js` writes into the retro body, **not** an emoji
|
|
750
|
+
string-match on the human-facing "🟢 Clean sprint" prose).
|
|
751
|
+
|
|
752
|
+
When clean, the listener fires `gh pr merge --squash --delete-branch`.
|
|
753
|
+
Otherwise the listener records disqualifying reasons via
|
|
754
|
+
`epic.merge.blocked` and exits without merging — operator merges
|
|
755
|
+
manually.
|
|
756
|
+
|
|
757
|
+
Close the phase wrapper by emitting `epic.automerge.end` (records the
|
|
758
|
+
arm outcome on the ledger; `merged: true` once GitHub completes the
|
|
759
|
+
squash, `merged: false` with a reason for predicate-blocked or
|
|
760
|
+
armed-but-pending):
|
|
761
|
+
|
|
762
|
+
```bash
|
|
763
|
+
node .agents/scripts/lifecycle-emit.js --epic <epicId> \
|
|
764
|
+
--event epic.automerge.end --pr-url <prUrl> --merged <true|false>
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
### Recording manual interventions
|
|
768
|
+
|
|
769
|
+
Whenever you step outside the happy path during a delivery, record it
|
|
770
|
+
(each entry disqualifies auto-merge):
|
|
771
|
+
|
|
772
|
+
```bash
|
|
773
|
+
node .agents/scripts/epic-deliver-note-intervention.js \
|
|
774
|
+
--epic <epicId> --reason "<one-line description>"
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
Triggers: `AskUserQuestion` mid-run; `git restore`/`reset` against the
|
|
778
|
+
tree; child-reported `--no-ff` recovery, stash dance, or out-of-band
|
|
779
|
+
merge surgery; child closes via `--skipValidation`; force-pushing or
|
|
780
|
+
empty-committing to dodge CI diagnosis.
|
|
781
|
+
|
|
782
|
+
---
|
|
783
|
+
|
|
784
|
+
## Phase 9 — Local branch cleanup
|
|
785
|
+
|
|
786
|
+
Phase 9 runs **automatically** inside the lifecycle bus once auto-merge
|
|
787
|
+
arms: the `BranchCleaner` listener subscribes to `epic.cleanup.start`
|
|
788
|
+
and reaps local refs before `Cleaner` archives the `temp/epic-<id>/`
|
|
789
|
+
tree. No operator step is required on the auto-merge path.
|
|
790
|
+
|
|
791
|
+
What gets reaped (in order, all in-process):
|
|
792
|
+
|
|
793
|
+
1. The main checkout is switched off `epic/<id>` to `baseBranch` when
|
|
794
|
+
needed (otherwise `git branch -D epic/<id>` is refused).
|
|
795
|
+
2. Every `story-<id>` listed in the `epic-run-state` checkpoint, plus
|
|
796
|
+
`epic/<id>`. Attached worktrees are removed with the standard
|
|
797
|
+
`git worktree remove` → `--force` → filesystem-rm fallback (the
|
|
798
|
+
last step covers Windows file-locks).
|
|
799
|
+
3. `git remote prune <remote>` drops stale `<remote>/...` tracking
|
|
800
|
+
refs left behind by `gh pr merge --delete-branch`.
|
|
801
|
+
4. The `wt-branch` scratch ref left by `story-close.js`'s internal
|
|
802
|
+
merge worktree is deleted when no worktree still points at it.
|
|
803
|
+
|
|
804
|
+
Per-branch failures aggregate into the listener's classification log
|
|
805
|
+
(`reaped` / `failed` / `no-state` / `skipped-duplicate`) and are
|
|
806
|
+
visible in `temp/epic-<id>/lifecycle.ndjson`. They do not block the
|
|
807
|
+
rest of cleanup.
|
|
808
|
+
|
|
809
|
+
For out-of-band cleanup re-entry (resume after a crash, or operator
|
|
810
|
+
override), fire `epic.merge.armed` via the lifecycle-emit helper:
|
|
811
|
+
|
|
812
|
+
```bash
|
|
813
|
+
node .agents/scripts/lifecycle-emit.js --epic <epicId> \
|
|
814
|
+
--event epic.merge.armed --pr-url <prUrl>
|
|
815
|
+
```
|
|
816
|
+
|
|
817
|
+
If Phase 8.5 fell back to the operator-merges-button path (`gh pr
|
|
818
|
+
merge --auto` was declined), the `epic.merge.armed` event never fires
|
|
819
|
+
inside this run and Phase 9 will not run automatically. After the
|
|
820
|
+
operator merges the PR, `epic/<epicId>` and each `story-<id>` ref can
|
|
821
|
+
be reaped manually:
|
|
822
|
+
|
|
823
|
+
```bash
|
|
824
|
+
git checkout main
|
|
825
|
+
git pull --ff-only origin main
|
|
826
|
+
git branch -D epic/<epicId>
|
|
827
|
+
git branch -D story-<id1> story-<id2> ...
|
|
828
|
+
git remote prune origin
|
|
829
|
+
```
|
|
830
|
+
|
|
831
|
+
Note that `git-cleanup.js` alone will not catch `story-<id>` refs in
|
|
832
|
+
this case because the epic PR squash-merges break the `git branch
|
|
833
|
+
--merged main` signal and the stories never had their own PRs. Wiring
|
|
834
|
+
a CLI surface that drives the BranchCleaner listener for this
|
|
835
|
+
fallback is tracked as follow-up to Story #2398.
|
|
836
|
+
|
|
837
|
+
---
|
|
838
|
+
|
|
839
|
+
## Idempotence and resume
|
|
840
|
+
|
|
841
|
+
Re-runs pick up at the next undispatched wave (in-flight Stories finish
|
|
842
|
+
via `helpers/epic-deliver-story`'s own checkpointing). The PR from Phase 7 is
|
|
843
|
+
updated in place on subsequent runs. The authoritative live view is
|
|
844
|
+
the `epic-run-progress` structured comment.
|
|
845
|
+
|
|
846
|
+
---
|
|
847
|
+
|
|
848
|
+
## Constraints
|
|
849
|
+
|
|
850
|
+
- **Never** merge `epic/<epicId>` to `main` outside Phase 8.5.
|
|
851
|
+
- **Never** dispatch more than one wave at a time; concurrency lives
|
|
852
|
+
inside a single wave's fan-out, capped at `concurrencyCap`.
|
|
853
|
+
- **Never** flip Story-level labels from this skill; **never** invoke
|
|
854
|
+
`helpers/epic-deliver-story` yourself (children run it via Agent fan-out,
|
|
855
|
+
even for single-Story waves); **never** spawn a subprocess for dispatch.
|
|
856
|
+
- **Always** checkpoint via `epic-deliver-prepare.js` /
|
|
857
|
+
`epic-execute-record-wave.js`; never write run state elsewhere.
|
|
858
|
+
- **Always** post a friction structured comment before a non-`complete`
|
|
859
|
+
outcome.
|
|
860
|
+
- **Always** auto-invoke the epic-audit, code-review, and retro helpers
|
|
861
|
+
(Phases 4–6) when their artefacts aren't already present.
|
|
862
|
+
- **Always** drive Phase 8 to green CI before returning control — the
|
|
863
|
+
host LLM owns the loop until the PR is mergeable or the Epic is
|
|
864
|
+
parked at `agent::blocked`.
|