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,295 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Run smart change-set audits at Epic finalize. Consumes the epic-audit-prepare
|
|
4
|
+
envelope, dispatches each selected lens inline via runAuditSuite, and posts
|
|
5
|
+
an audit-results structured comment back onto the Epic ticket.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Epic Audit (helper)
|
|
9
|
+
|
|
10
|
+
> **Helper module.** Not a slash command. Invoked automatically from
|
|
11
|
+
> `/epic-deliver` Phase 4 once the wave loop completes (all Stories at
|
|
12
|
+
> `agent::done`). To run an audit directly, use `/epic-deliver [Epic_ID]` — it
|
|
13
|
+
> delegates here (or pass `--skip-epic-audit` to bypass).
|
|
14
|
+
|
|
15
|
+
This helper runs the **change-set-aware audit pass** on an Epic branch
|
|
16
|
+
before the code-review helper opens its review. Unlike code-review (which
|
|
17
|
+
walks the full diff against `main` through six fixed pillars), epic-audit
|
|
18
|
+
asks the [`selectAudits`](../../scripts/lib/audit-suite/index.js) SDK which
|
|
19
|
+
lenses are actually relevant to **this** Epic's change set, then dispatches
|
|
20
|
+
only the matching audit workflows. Docs-only Epics select zero lenses and
|
|
21
|
+
exit cleanly.
|
|
22
|
+
|
|
23
|
+
In addition to the change-set selection, `epic-audit-prepare.js` unions in
|
|
24
|
+
the **risk-routed lenses** (Story #3889): it reads the Epic's model-judged
|
|
25
|
+
`planningRisk` envelope off the `epic-plan-state` checkpoint and routes each
|
|
26
|
+
high-risk axis to its mapped lens via
|
|
27
|
+
[`resolveAuditLenses`](../../scripts/lib/orchestration/code-review.js)
|
|
28
|
+
(`security` → `audit-security`, `public-api` → `audit-architecture`). A
|
|
29
|
+
high-risk Epic therefore auto-runs its mapped lenses even when the change
|
|
30
|
+
set alone did not select them; a low-risk Epic adds nothing beyond the
|
|
31
|
+
change-set selection. Both lens sources fire through the **same**
|
|
32
|
+
`runAuditSuite` dispatch below — no new audit machinery.
|
|
33
|
+
|
|
34
|
+
> **When to run**: After Phase 3 close-validation passes and before Phase 5
|
|
35
|
+
> code-review. `/epic-deliver` invokes this automatically once the wave loop
|
|
36
|
+
> completes and all Stories reach `agent::done`.
|
|
37
|
+
>
|
|
38
|
+
> **Persona**: `architect` · **Skills**: `core/code-review-and-quality`,
|
|
39
|
+
> `core/security-and-hardening`
|
|
40
|
+
|
|
41
|
+
## Step 0 — Resolve Context
|
|
42
|
+
|
|
43
|
+
1. Resolve `[EPIC_ID]` — the GitHub Issue number of the Epic under audit.
|
|
44
|
+
2. Resolve `[EPIC_BRANCH]` — `epic/<epicId>`.
|
|
45
|
+
3. Resolve `[BASE_BRANCH]` from `baseBranch` in `.agentrc.json` (default:
|
|
46
|
+
`main`).
|
|
47
|
+
4. Fetch the Epic ticket and identify linked context tickets:
|
|
48
|
+
- **PRD** — the `context::prd` ticket linked in the Epic body.
|
|
49
|
+
- **Tech Spec** — the `context::tech-spec` ticket linked in the Epic
|
|
50
|
+
body.
|
|
51
|
+
5. Read both the PRD and Tech Spec fully to understand the intended scope,
|
|
52
|
+
selected lenses, and acceptance criteria.
|
|
53
|
+
|
|
54
|
+
## Step 1 — Prepare (`epic-audit-prepare.js`)
|
|
55
|
+
|
|
56
|
+
Run the prepare CLI to compute the change-set, ask `selectAudits` which
|
|
57
|
+
lenses fire at `gate3` (the Epic close gate), and emit the helper-consumable
|
|
58
|
+
JSON envelope on stdout:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
node .agents/scripts/epic-audit-prepare.js \
|
|
62
|
+
--epic [EPIC_ID] --base-branch [BASE_BRANCH] --gate gate3
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The CLI is thin glue around the audit-suite SDK and is fully described in
|
|
66
|
+
[`epic-audit-prepare.js`](../../scripts/epic-audit-prepare.js). Capture the
|
|
67
|
+
envelope:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"epicId": 2586,
|
|
72
|
+
"epicBranch": "epic/2586",
|
|
73
|
+
"depth": "deep",
|
|
74
|
+
"selectedAudits": ["audit-security", "audit-privacy"],
|
|
75
|
+
"changeSetAudits": ["audit-privacy"],
|
|
76
|
+
"riskRoutedAudits": ["audit-security"],
|
|
77
|
+
"changedFiles": ["src/api/admin/users.ts", "..."],
|
|
78
|
+
"changedFilesCount": 47,
|
|
79
|
+
"substitutionsPayload": "src/api/admin/users.ts\n..."
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`selectedAudits` is the de-duplicated **union** of `changeSetAudits` (the
|
|
84
|
+
change-set selection) and `riskRoutedAudits` (the model-judged risk-routed
|
|
85
|
+
lenses). The two source arrays are surfaced for observability so the
|
|
86
|
+
operator can see why each lens fired. Dispatch the `selectedAudits` union
|
|
87
|
+
in Step 2.
|
|
88
|
+
|
|
89
|
+
### The `depth` field (Story #3939)
|
|
90
|
+
|
|
91
|
+
`depth` is `light`, `standard`, or `deep` — an **orthogonal** signal that
|
|
92
|
+
tells you how thorough each **selected** lens should be on this Epic. It is
|
|
93
|
+
resolved by the shared `resolveDepth` resolver from the Epic's model-judged
|
|
94
|
+
risk envelope (`overallLevel` off the `epic-plan-state` checkpoint) folded
|
|
95
|
+
with `changedFilesCount`: a high-risk **or** wide-footprint Epic resolves to
|
|
96
|
+
`deep`, a low-risk small one to `light`, and everything else — including an
|
|
97
|
+
Epic that skipped `/epic-plan` and has no checkpoint — to `standard`.
|
|
98
|
+
|
|
99
|
+
Depth changes **how deeply** each lens runs, never **which** lenses fire:
|
|
100
|
+
|
|
101
|
+
- **`light`** — run each selected lens against the **changed surface only**
|
|
102
|
+
and report **only Critical/High** findings. Skip the Medium/Suggestion
|
|
103
|
+
sweep. Light **never skips a selected lens** — including the alwaysRun
|
|
104
|
+
floor (`audit-clean-code`, `audit-architecture`) — it only **shrinks the
|
|
105
|
+
selected lens's sweep**. An easy, low-risk Epic still runs its audits;
|
|
106
|
+
they just run lighter.
|
|
107
|
+
- **`standard`** — today's behavior: walk each selected lens's full
|
|
108
|
+
procedure over the changed surface at every severity.
|
|
109
|
+
- **`deep`** — run the full lens procedure over the changed surface **plus
|
|
110
|
+
the modules it directly touches**, at every severity.
|
|
111
|
+
|
|
112
|
+
Depth never changes the severity taxonomy, the findings-report shape, or the
|
|
113
|
+
Phase 4 halting rule below (a 🔴 Critical Blocker halts at every depth;
|
|
114
|
+
everything else logs). Thread the resolved `depth` into each lens walk in
|
|
115
|
+
Step 2 — it scopes the sweep, it does not gate the roster.
|
|
116
|
+
|
|
117
|
+
### Outcomes
|
|
118
|
+
|
|
119
|
+
- **`selectedAudits` is non-empty** — continue to Step 2.
|
|
120
|
+
- **`selectedAudits` is empty** (docs-only or no-lens change set, and no
|
|
121
|
+
high-risk axis routed a lens) — skip Step 2 and write the docs-only
|
|
122
|
+
marker described in Step 4.
|
|
123
|
+
- **`degraded: true`** — the selector aborted. Possible `reason` codes:
|
|
124
|
+
`GIT_DIFF_TIMEOUT` (git-diff timed out), `HEAD_REF_UNRESOLVED` (the
|
|
125
|
+
Epic's branch `refs/heads/epic/<id>` is not present in this checkout),
|
|
126
|
+
or `EPIC_REF_MISMATCH` (the selector diffed a ref other than the
|
|
127
|
+
requested Epic's branch — the cross-epic-leak guard from Story #3362).
|
|
128
|
+
Surface the `reason`/`detail` fields to the operator, post a friction
|
|
129
|
+
comment on the Epic, and STOP. Do not fall back to running the full lens
|
|
130
|
+
roster — that defeats the change-set scoping, and an unresolved/mismatched
|
|
131
|
+
ref means the change set would belong to the wrong Epic.
|
|
132
|
+
|
|
133
|
+
## Step 2 — Walk Selected Lenses (`runAuditSuite`)
|
|
134
|
+
|
|
135
|
+
> **Execution model — the host LLM is the executor, not the CLI.**
|
|
136
|
+
> `run-audit-suite.js` is a **prompt-assembly runner**, not a findings
|
|
137
|
+
> generator. It resolves each lens to its workflow markdown, applies
|
|
138
|
+
> the `{{ticketId}}` / `{{baseBranch}}` / `{{changedFiles}}` (and any
|
|
139
|
+
> per-audit) substitutions, and returns one *workflow descriptor* per
|
|
140
|
+
> lens. Its return envelope intentionally carries `findings: []` and
|
|
141
|
+
> `summary: { critical:0, high:0, medium:0, low:0 }` because no lens
|
|
142
|
+
> has been *executed* yet — the host LLM walks each workflow's
|
|
143
|
+
> procedure inline against the substitution payload, severity-rates
|
|
144
|
+
> what it finds, and assembles the aggregate report in Step 4. If you
|
|
145
|
+
> expected `findings[]` to be populated by the CLI, the rest of this
|
|
146
|
+
> helper will surprise you; stop and re-read this paragraph.
|
|
147
|
+
|
|
148
|
+
For each lens name in `selectedAudits`, invoke
|
|
149
|
+
[`runAuditSuite`](../../scripts/lib/audit-suite/index.js) (or its CLI
|
|
150
|
+
wrapper) with the prepare envelope as the substitution source. The
|
|
151
|
+
runner loads the matching `.agents/workflows/audit-<lens>.md` file,
|
|
152
|
+
applies the substitutions, and — when `--run-id` is supplied — writes
|
|
153
|
+
the substituted body to a per-lens artifact at
|
|
154
|
+
`<auditOutputDir>/audit-<run-id>-<lens>.md` (default `auditOutputDir`
|
|
155
|
+
is `temp/audits/`):
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
node .agents/scripts/run-audit-suite.js \
|
|
159
|
+
--audits audit-security,audit-privacy \
|
|
160
|
+
--ticket [EPIC_ID] \
|
|
161
|
+
--base-branch [BASE_BRANCH] \
|
|
162
|
+
--substitution changedFiles="[substitutionsPayload]" \
|
|
163
|
+
--run-id epic-[EPIC_ID]
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
CLI shape notes:
|
|
167
|
+
|
|
168
|
+
- `--audits` is **comma-separated**, not space-separated. Passing each
|
|
169
|
+
lens as a separate positional arg only captures the first one.
|
|
170
|
+
- `--substitution` is **repeatable** (`key=value` per occurrence); the
|
|
171
|
+
legacy `--substitutions '<json>'` flag is not supported.
|
|
172
|
+
- `--run-id` is the per-lens artifact prefix (the legacy
|
|
173
|
+
`--artifact-prefix` flag is not supported). When omitted, no
|
|
174
|
+
artifact is written and the host LLM must walk the workflow body in
|
|
175
|
+
memory.
|
|
176
|
+
|
|
177
|
+
After the runner returns:
|
|
178
|
+
|
|
179
|
+
1. **Read the descriptor stream** — confirm every requested lens
|
|
180
|
+
appears in `metadata.auditsRun`, then walk each entry in
|
|
181
|
+
`workflows[]` (or each on-disk artifact when `--run-id` was set).
|
|
182
|
+
2. **Execute the lens inline at the run's `depth`.** Open the lens
|
|
183
|
+
workflow at `path` (or the per-lens artifact file when `--run-id`
|
|
184
|
+
produced one) and follow its procedure verbatim against the
|
|
185
|
+
substituted change set, scoping the sweep to the envelope's `depth`
|
|
186
|
+
(see "The `depth` field" above): `light` walks the changed surface and
|
|
187
|
+
reports only 🔴/🟠 findings, `standard` walks the full procedure at
|
|
188
|
+
every severity, and `deep` extends the sweep to the directly-touched
|
|
189
|
+
modules. Depth scopes the sweep only — never skip a selected lens.
|
|
190
|
+
Each lens declares its own pillars, severity rubric, and remediation
|
|
191
|
+
prose; treat its body as the canonical execution contract for that
|
|
192
|
+
pass.
|
|
193
|
+
3. **Aggregate** by severity (🔴 Critical Blocker / 🟠 High /
|
|
194
|
+
🟡 Medium / 🟢 Suggestion). Hold the aggregate for Step 3
|
|
195
|
+
(auto-fix) and Step 4 (the `audit-results` structured comment).
|
|
196
|
+
|
|
197
|
+
If a future Story lifts per-lens execution out of the host-LLM walk
|
|
198
|
+
into the CLI itself, the runner will populate `findings[]` and this
|
|
199
|
+
section will collapse to a "read the structured findings off the
|
|
200
|
+
envelope" bullet. Until then, the host LLM is the gate.
|
|
201
|
+
|
|
202
|
+
## Step 3 — Remediation Routing (host LLM, no automated loop)
|
|
203
|
+
|
|
204
|
+
There is **no runtime auto-fix function** at this phase. The host LLM is
|
|
205
|
+
the executor: it inspects the aggregated 🔴 / 🟠 findings from Step 2 and
|
|
206
|
+
either applies a focused fix on the Epic branch or escalates the finding
|
|
207
|
+
to the operator via the `audit-results` comment in Step 4.
|
|
208
|
+
|
|
209
|
+
For each 🔴 / 🟠 finding, the host LLM MUST decide between two paths:
|
|
210
|
+
|
|
211
|
+
1. **Apply a focused fix on `[EPIC_BRANCH]`.** Permitted only when the
|
|
212
|
+
finding is unambiguously *fixable* (clean remediation, no scope creep,
|
|
213
|
+
no spec deviation, no secret exposure):
|
|
214
|
+
- Call [`assert-branch.js`](../../scripts/assert-branch.js) with
|
|
215
|
+
`--expected [EPIC_BRANCH]` before touching the working tree.
|
|
216
|
+
- Stage explicit paths only (never `git add .`).
|
|
217
|
+
- Make one focused conventional commit per finding
|
|
218
|
+
(`fix(<scope>): <description> (audit finding)`).
|
|
219
|
+
- Re-run the owning lens (re-invoke `run-audit-suite.js` for that
|
|
220
|
+
single lens) and confirm the finding is gone before moving on.
|
|
221
|
+
- Run the lens-appropriate validation subset (`npm run lint` plus the
|
|
222
|
+
relevant `npm test` slice) to confirm the fix did not regress
|
|
223
|
+
anything.
|
|
224
|
+
- If the rescan still surfaces the same finding, or validation
|
|
225
|
+
regresses, **stop fixing** — route the finding to escalation
|
|
226
|
+
(path 2) and record the attempt context in Step 4.
|
|
227
|
+
2. **Escalate to the operator via Step 4.** Required when the finding
|
|
228
|
+
falls into any of the following classes:
|
|
229
|
+
- `spec-deviation` — the change diverges from the PRD/Tech Spec.
|
|
230
|
+
- `secrets` — credentials, tokens, or PII surfaced in the diff.
|
|
231
|
+
- `test-deletion` — coverage was removed without an explicit
|
|
232
|
+
decision in the spec.
|
|
233
|
+
- `scope-exceeded` — the remediation would touch more files than the
|
|
234
|
+
change set warrants.
|
|
235
|
+
- Any finding the host LLM cannot remediate after one focused
|
|
236
|
+
attempt (the equivalent of the prior loop's
|
|
237
|
+
`validation-regression` / `thrash-detected` exits).
|
|
238
|
+
|
|
239
|
+
Do not invent a programmatic retry budget. The host LLM applies *at most
|
|
240
|
+
one* focused-fix attempt per finding before escalating; any further
|
|
241
|
+
remediation is the operator's call after reading the `audit-results`
|
|
242
|
+
comment.
|
|
243
|
+
|
|
244
|
+
Escalated findings flow through to Step 4 unchanged with their
|
|
245
|
+
escalation reason recorded — the audit pass does not delete them, it
|
|
246
|
+
just stops trying to fix them automatically. Surface the escalation
|
|
247
|
+
reason for each in the `audit-results` comment so the operator sees
|
|
248
|
+
exactly why the finding was not auto-remediated.
|
|
249
|
+
|
|
250
|
+
## Step 4 — Post `audit-results` Structured Comment
|
|
251
|
+
|
|
252
|
+
Persist the findings as an `audit-results` structured comment on the Epic
|
|
253
|
+
issue. The comment is idempotent — re-runs replace the prior one. Build the
|
|
254
|
+
body in a temp file under `[TEMP_ROOT]/epic-[EPIC_ID]/audit-results.md`,
|
|
255
|
+
then upsert via [`post-structured-comment.js`](../../scripts/post-structured-comment.js):
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
node .agents/scripts/post-structured-comment.js \
|
|
259
|
+
--ticket [EPIC_ID] \
|
|
260
|
+
--marker audit-results \
|
|
261
|
+
--body-file [TEMP_ROOT]/epic-[EPIC_ID]/audit-results.md
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
The body MUST include:
|
|
265
|
+
|
|
266
|
+
- the `selectedAudits` roster (or `Lenses applied: none (docs-only)` when
|
|
267
|
+
the prepare envelope returned an empty list),
|
|
268
|
+
- the per-severity counts (🔴 critical / 🟠 high / 🟡 medium / 🟢 suggestion),
|
|
269
|
+
- the per-lens findings grouped under the lens name, each carrying file
|
|
270
|
+
path + line range + pillar + recommended fix,
|
|
271
|
+
- a link to the per-lens artifact files under `<auditOutputDir>` so the
|
|
272
|
+
operator (and downstream retro) can re-read the full prompt body.
|
|
273
|
+
|
|
274
|
+
### Severity gating
|
|
275
|
+
|
|
276
|
+
- **Any 🔴 Critical Blocker** → STOP. Relay to the operator and let
|
|
277
|
+
`/epic-deliver` Phase 4 record a manual intervention.
|
|
278
|
+
- **Only 🟠/🟡/🟢** → log as non-blocking and return to `/epic-deliver`
|
|
279
|
+
Phase 5 (code-review).
|
|
280
|
+
|
|
281
|
+
## Constraints
|
|
282
|
+
|
|
283
|
+
- **Always** diff against `[BASE_BRANCH]`, not against individual Story
|
|
284
|
+
branches. The audit examines the cumulative effect of the entire Epic.
|
|
285
|
+
- **Always** read the PRD and Tech Spec before walking lenses. Findings
|
|
286
|
+
without spec context are noise.
|
|
287
|
+
- **Always** cap focused fixes at one attempt per finding (Step 3). The
|
|
288
|
+
host LLM is the executor; there is no shared retry/anti-thrash module
|
|
289
|
+
to call. Any finding that does not resolve cleanly on the first attempt
|
|
290
|
+
routes to escalation in Step 4.
|
|
291
|
+
- **Never** widen the lens roster past `selectedAudits`. The whole point of
|
|
292
|
+
the change-set selector is to avoid running irrelevant audits on a
|
|
293
|
+
scoped Epic — running extras defeats the gate.
|
|
294
|
+
- **Always** propagate `degraded` envelopes verbatim. Do not paper over a
|
|
295
|
+
selector failure with a full-roster fallback.
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Helper — not a slash command. Execute one Epic-attached Story end-to-end on
|
|
4
|
+
behalf of `/epic-deliver`. Calls `story-init.js`, `cd`s into the worktree,
|
|
5
|
+
runs the Story-implementation phase against the inline acceptance[] /
|
|
6
|
+
verify[] arrays, writes a `story-run-progress` snapshot per transition, and
|
|
7
|
+
finally calls `story-close.js` to merge into the Epic branch and reap the
|
|
8
|
+
worktree.
|
|
9
|
+
caller: epic-deliver.md
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# helpers/epic-deliver-story — Epic-attached Story worker
|
|
13
|
+
|
|
14
|
+
> **Not a slash command.** This file lives in `helpers/` and is not projected
|
|
15
|
+
> into the mandrel plugin command tree. It is invoked exclusively by the
|
|
16
|
+
> [`/epic-deliver`](../epic-deliver.md) per-wave fan-out via an `Agent` tool
|
|
17
|
+
> call (`subagent_type: general-purpose`). Run `/epic-deliver <epicId>` from
|
|
18
|
+
> the operator surface, not this helper directly.
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
`epic-deliver-story` is the **single-Story worker** for Epic-attached Stories.
|
|
23
|
+
It sits below [`/epic-deliver`](../epic-deliver.md) (which fans out one Story
|
|
24
|
+
sub-agent per slot, per wave) and runs one Story from init to close in one
|
|
25
|
+
invocation.
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
/epic-deliver <epicId>
|
|
29
|
+
→ for each wave N:
|
|
30
|
+
Agent tool × concurrencyCap parallel calls (one assistant turn):
|
|
31
|
+
helpers/epic-deliver-story <storyId>
|
|
32
|
+
→ story-init.js
|
|
33
|
+
→ single Story-implementation phase using inline
|
|
34
|
+
acceptance[] / verify[] from the Story body
|
|
35
|
+
→ story-close.js
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The argument is always a **Story ID** (`type::story`). Epic IDs go through
|
|
39
|
+
[`/epic-deliver`](../epic-deliver.md).
|
|
40
|
+
|
|
41
|
+
**Standalone Stories** (no `Epic: #N` in body) use
|
|
42
|
+
[`/story-deliver`](../story-deliver.md) instead — that workflow's helper
|
|
43
|
+
branches from `main`, opens its PR directly to `main`, and skips the
|
|
44
|
+
Epic-scoped machinery (cascade, dispatch manifest, dashboard regen). This
|
|
45
|
+
helper requires a parent Epic and will refuse to initialize a Story that lacks
|
|
46
|
+
the `Epic: #N` reference.
|
|
47
|
+
|
|
48
|
+
> **Worktree isolation.** When `delivery.worktreeIsolation.enabled` is
|
|
49
|
+
> `true`, Step 0 creates a worktree at `.worktrees/story-<id>/` and prints
|
|
50
|
+
> its absolute path as `workCwd`. You **must** `cd` into that path before
|
|
51
|
+
> Step 1. The main checkout's HEAD is never moved. See
|
|
52
|
+
> [`worktree-lifecycle.md`](worktree-lifecycle.md) for node_modules
|
|
53
|
+
> strategies, Windows notes, and escape hatches.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Non-interactive execution contract
|
|
58
|
+
|
|
59
|
+
`epic-deliver-story` runs as a sub-agent of `/epic-deliver`'s per-wave fan-out
|
|
60
|
+
(common case) or interactively for a single Story. Sub-agent runs share
|
|
61
|
+
the parent's permissions but have **no input channel** mid-run.
|
|
62
|
+
|
|
63
|
+
- **Never** ask clarifying questions as a sub-agent. Pick the narrowest
|
|
64
|
+
reasonable interpretation that satisfies the Story's AC. If you cannot
|
|
65
|
+
proceed, transition to `agent::blocked`, post a `friction` comment with
|
|
66
|
+
the decision needed and the default assumption, and exit non-zero.
|
|
67
|
+
- **Never** assume tool-permission prompts will be auto-approved. Treat a
|
|
68
|
+
blocking prompt as a harness condition and transition to `agent::blocked`.
|
|
69
|
+
- **Always** write `story-run-progress` snapshots at every phase
|
|
70
|
+
transition so the parent aggregator never falls back to label
|
|
71
|
+
re-derivation.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Step 0 — Initialize (`story-init.js`)
|
|
76
|
+
|
|
77
|
+
Run from the **main checkout** (the worktree does not exist yet):
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
node .agents/scripts/story-init.js --story <storyId>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
> **Execution mode (sub-agents must read).** This command typically takes
|
|
84
|
+
> 3–6 minutes when the worktree's per-tree install runs. Invoke it
|
|
85
|
+
> **synchronously** with the Bash tool's maximum timeout
|
|
86
|
+
> (`Bash(timeout: 600000)`). Do **not** use `run_in_background` + `Monitor`
|
|
87
|
+
> here: `Monitor`'s return is not equivalent to script exit, and a sub-agent
|
|
88
|
+
> that exits during a `Monitor` wait kills `story-init.js` mid-batch — the
|
|
89
|
+
> worktree is left half-initialized (no `story-init` comment, no Story-level
|
|
90
|
+
> `agent::*` label flip) and the parent
|
|
91
|
+
> wave aggregator records the Story as failed. The script is idempotent on
|
|
92
|
+
> partial state, so the recovery is to re-run it synchronously, but
|
|
93
|
+
> prevention is cheaper: just give Bash the 10-minute timeout and block.
|
|
94
|
+
|
|
95
|
+
The script validates `type::story`, checks blockers, traces the
|
|
96
|
+
Feature → Epic → PRD/Tech-Spec hierarchy, seeds `story-<id>` from the
|
|
97
|
+
Epic branch, and (when worktree isolation is on) runs `git worktree add`
|
|
98
|
+
at `.worktrees/story-<id>/`. The Story flips to `agent::executing`. A
|
|
99
|
+
`story-init` structured comment is upserted with the Story's inline
|
|
100
|
+
`acceptance[]` and `verify[]` arrays from the body.
|
|
101
|
+
|
|
102
|
+
Capture `workCwd`, `dependenciesInstalled` (tri-state), and
|
|
103
|
+
`context.{prdId,techSpecId,acceptance,verify}`. Add `--dry-run` to check
|
|
104
|
+
status without git or ticket changes.
|
|
105
|
+
|
|
106
|
+
### Step 0.5 — `cd` into the workCwd
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
cd "<workCwd from Step 0 result>"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
All subsequent commands run from this directory. The `dependenciesInstalled`
|
|
113
|
+
tri-state carries one of three values:
|
|
114
|
+
|
|
115
|
+
| Value | Meaning | Action |
|
|
116
|
+
| --------- | ---------------------------------------------------------------------------------- | --------------------------------------------------- |
|
|
117
|
+
| `true` | Per-worktree install ran and succeeded. | Proceed. |
|
|
118
|
+
| `false` | Install was attempted and failed. | The next CLI runs the install before proceeding. |
|
|
119
|
+
| `skipped` | No per-worktree install (single-tree, reused worktree, `symlink`, `pnpm-store`). | Trust the strategy. |
|
|
120
|
+
|
|
121
|
+
### Step 0.6 — Initial `story-run-progress` snapshot
|
|
122
|
+
|
|
123
|
+
Re-read the `story-init` comment, apply the install tri-state, and upsert
|
|
124
|
+
the initial snapshot (`phase: "init"`):
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
node .agents/scripts/story-deliver-prepare.js --story <storyId> --cwd .
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The CLI runs the install command when `dependenciesInstalled === 'false'`
|
|
131
|
+
(default `npm ci`; override with `--install-cmd "<cmd>"`).
|
|
132
|
+
|
|
133
|
+
The CLI's stdout JSON envelope carries a `renderedBody` field — the markdown
|
|
134
|
+
body that was upserted onto the Story ticket. **Relay it verbatim to chat**
|
|
135
|
+
so operators see the initial progress block before the first commit lands.
|
|
136
|
+
Do the same after every transition in Step 1 / Step 3 (the body is the
|
|
137
|
+
Story-level rollup the parent `/epic-deliver` aggregator reads).
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Step 1 — Story implementation
|
|
142
|
+
|
|
143
|
+
Run a single Story-implementation phase against the inline `acceptance[]`
|
|
144
|
+
/ `verify[]` arrays on the Story body.
|
|
145
|
+
|
|
146
|
+
1. Flip the snapshot to the `implementing` phase:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
node .agents/scripts/story-phase.js \
|
|
150
|
+
--story <storyId> --phase implementing
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
2. Read the Story body's inline `acceptance[]` and `verify[]` arrays
|
|
154
|
+
from the `story-init` structured comment (`context.acceptance`,
|
|
155
|
+
`context.verify`). Treat the acceptance items as the contract and
|
|
156
|
+
the verify items as the canonical at-keyboard checks.
|
|
157
|
+
|
|
158
|
+
3. Implement the work as one or more commits on `story-<storyId>`.
|
|
159
|
+
Author commits directly with the project's editor / `git commit`,
|
|
160
|
+
following
|
|
161
|
+
[`.agents/rules/git-conventions.md`](../../rules/git-conventions.md):
|
|
162
|
+
- Conventional Commit subject (`feat:`, `fix:`, …).
|
|
163
|
+
- Reference the parent Story via `(refs #<storyId>)` in the subject
|
|
164
|
+
or body.
|
|
165
|
+
- The `commit-msg` Husky hook enforces commitlint locally.
|
|
166
|
+
|
|
167
|
+
4. After the final commit lands, run the **bounded acceptance self-eval
|
|
168
|
+
loop** (Step 1a below) **before** flipping to `closing`. The
|
|
169
|
+
`verify[]` commands are consumed inside that loop as **required
|
|
170
|
+
evidence** — they are no longer optional advisory pre-flight.
|
|
171
|
+
|
|
172
|
+
5. Once the eval loop returns `proceed`, flip the snapshot to `closing`
|
|
173
|
+
and proceed to Step 3:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
node .agents/scripts/story-phase.js \
|
|
177
|
+
--story <storyId> --phase closing
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
6. If blocked (including by the eval loop reaching its round cap with
|
|
181
|
+
criteria still unmet — Step 1a), flip the snapshot to `blocked`,
|
|
182
|
+
transition the Story to `agent::blocked`, post a `friction` comment,
|
|
183
|
+
and exit non-zero:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
node .agents/scripts/story-phase.js \
|
|
187
|
+
--story <storyId> --phase blocked
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Step 1a — Bounded acceptance self-eval loop (**required, not optional**)
|
|
191
|
+
|
|
192
|
+
After the implementation commits land and **before** the snapshot flips to
|
|
193
|
+
`closing`, run the bounded acceptance self-eval loop. The per-round critic
|
|
194
|
+
mechanic (fresh-context critic, `verify[]`-as-evidence, the verdict schema, and
|
|
195
|
+
the proceed / redraft / block decision) is the single-homed include
|
|
196
|
+
[`acceptance-self-eval.md`](acceptance-self-eval.md) — read it and follow it.
|
|
197
|
+
The critic reads the Story's inline `acceptance[]` / `verify[]` arrays from the
|
|
198
|
+
`story-init` comment (`context.acceptance` / `context.verify`).
|
|
199
|
+
|
|
200
|
+
Epic-attached specifics for this path:
|
|
201
|
+
|
|
202
|
+
- **Gate invocation** (pass `--epic <epicId>` so the per-criterion signal lands
|
|
203
|
+
on the Epic-scoped stream):
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
node .agents/scripts/acceptance-eval.js \
|
|
207
|
+
--story <storyId> --epic <epicId> --verdict <verdict-path>
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
- **On `decision: "proceed"`** → flip the snapshot to `closing` (item 5 above).
|
|
211
|
+
- **On `decision: "block"`** → take the blocked path (item 6 above): post a
|
|
212
|
+
`friction` comment naming the unmet criteria and their evidence, flip the
|
|
213
|
+
snapshot to `blocked`, and exit non-zero. Never silently proceed to close.
|
|
214
|
+
|
|
215
|
+
The resume guard is expressed at the Story level: re-entering a
|
|
216
|
+
partially-implemented Story picks up from whatever commits are already
|
|
217
|
+
on `story-<storyId>`; the agent inspects `git log` to decide what work
|
|
218
|
+
remains.
|
|
219
|
+
|
|
220
|
+
After each `story-phase.js` call, **relay the envelope's
|
|
221
|
+
`renderedBody` to chat** as the Story's progress update. Skip chat
|
|
222
|
+
relay only when running in a non-interactive sub-agent context where
|
|
223
|
+
the parent will aggregate.
|
|
224
|
+
|
|
225
|
+
> Rebase pauses on conflicts → follow
|
|
226
|
+
> [`_merge-conflict-template.md`](_merge-conflict-template.md).
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Step 2 — Validate (deferred to close)
|
|
231
|
+
|
|
232
|
+
`story-close.js` runs the canonical close-validation chain (typecheck,
|
|
233
|
+
lint, test, format, maintainability, coverage, crap) before it merges —
|
|
234
|
+
**do not** pre-run those gates here unless interactively iterating on a
|
|
235
|
+
fix. (Interactively, `npm run typecheck && npm run lint && npm test` is
|
|
236
|
+
fine as advisory pre-flight.)
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Step 3 — Close (`story-close.js`)
|
|
241
|
+
|
|
242
|
+
Flip the snapshot to the closing phase, then invoke close. Pass the
|
|
243
|
+
main-checkout path via `--cwd` so the merge and branch deletion run
|
|
244
|
+
against the main repo (branches checked out in a worktree cannot be
|
|
245
|
+
deleted from themselves):
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
node .agents/scripts/story-phase.js \
|
|
249
|
+
--story <storyId> --phase closing
|
|
250
|
+
|
|
251
|
+
node <main-repo>/.agents/scripts/story-close.js --story <storyId> --cwd <main-repo>
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
In single-tree mode, `--cwd` defaults to `PROJECT_ROOT`. The script merges
|
|
255
|
+
into `epic/<epicId>` (`--no-ff`), pushes the Epic branch, deletes the
|
|
256
|
+
Story branch, reaps the worktree via `WorktreeManager.reap`, closes the
|
|
257
|
+
Story to `agent::done`, runs `cascadeCompletion()`, and regenerates the
|
|
258
|
+
Epic dispatch manifest (`--skip-dashboard` to suppress). Output is JSON
|
|
259
|
+
with `ticketsClosed[]`, `cascadedTo[]`, and reap status.
|
|
260
|
+
|
|
261
|
+
> **Why not GitHub auto-close?** `Closes #N` only fires on default-branch
|
|
262
|
+
> merges; close fires the state writer explicitly.
|
|
263
|
+
|
|
264
|
+
After close, upsert a terminal snapshot:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
node .agents/scripts/story-phase.js \
|
|
268
|
+
--story <storyId> --phase done
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Step 4 — Return contract (sub-agent path)
|
|
274
|
+
|
|
275
|
+
When run as a sub-agent, return one JSON object:
|
|
276
|
+
|
|
277
|
+
```json
|
|
278
|
+
{
|
|
279
|
+
"storyId": <number>,
|
|
280
|
+
"status": "done" | "blocked" | "failed",
|
|
281
|
+
"phase": "init|implementing|closing|blocked|done",
|
|
282
|
+
"branchDeleted": <boolean>,
|
|
283
|
+
"blockerCommentId": <string|null>,
|
|
284
|
+
"detail": <string|undefined>,
|
|
285
|
+
"renderedBody": <string|undefined>
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
`status === 'done'` requires the Story closed and
|
|
290
|
+
`branchDeleted: true`.
|
|
291
|
+
|
|
292
|
+
> **Handoff discipline — report state, not process.** Populate the return
|
|
293
|
+
> object with essential terminal state only: the Story branch, the closing
|
|
294
|
+
> commit SHA, what changed, and what was verified (this maps onto the
|
|
295
|
+
> existing `storyId` / `branchDeleted` / `phase` / `detail` /
|
|
296
|
+
> `renderedBody` fields — do **not** add new envelope fields). Do not
|
|
297
|
+
> narrate the steps you took to get there, and do not prescribe how
|
|
298
|
+
> `/epic-deliver`'s aggregator should do its job downstream. The parent
|
|
299
|
+
> reads structured state from this envelope and the `story-run-progress`
|
|
300
|
+
> snapshot; prose process commentary only bloats the hydrated prompt
|
|
301
|
+
> (`delivery.maxTokenBudget` elision).
|
|
302
|
+
|
|
303
|
+
`branchDeleted` is sourced from the `branchDeleted` field of the
|
|
304
|
+
`story-close.js` result envelope, which is `branchCleanup.localDeleted &&
|
|
305
|
+
branchCleanup.remoteDeleted`. It is **independent** of `worktreeReap.status`.
|
|
306
|
+
Specifically, when `worktreeReap.status === 'stale-registry-entry'` — a
|
|
307
|
+
Windows-only outcome where the worktree directory was removed and the local
|
|
308
|
+
branch was deleted but `git worktree list` still shows the entry — the
|
|
309
|
+
close still reports `branchDeleted: true` because the branch was honestly
|
|
310
|
+
deleted; a pending-cleanup entry is recorded so the next post-close drain
|
|
311
|
+
(or the next plan-time sweep) clears the stale `.git/worktrees/<name>/`
|
|
312
|
+
registry entry. Treat `stale-registry-entry` as operationally complete
|
|
313
|
+
when computing your return contract: `status: 'done'` is appropriate when
|
|
314
|
+
all Tasks are closed and `branchDeleted: true`, regardless of whether
|
|
315
|
+
`worktreeReap.status` is `'removed'`, `'removed-after-drain'`, or
|
|
316
|
+
`'stale-registry-entry'`.
|
|
317
|
+
|
|
318
|
+
`renderedBody` is the **most recent** `renderedBody` returned by
|
|
319
|
+
`story-phase.js` (typically the `phase: 'done'` snapshot at close,
|
|
320
|
+
or the `phase: 'blocked'` snapshot on a blocker). The parent
|
|
321
|
+
`/epic-deliver` may inline a digest of this in its wave-level Notable
|
|
322
|
+
section. When run interactively (no parent), omit it — the chat already
|
|
323
|
+
has the latest body relayed during Step 1 / Step 3.
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## Idempotence
|
|
328
|
+
|
|
329
|
+
`story-init.js` re-prints the same `workCwd` without recreating the
|
|
330
|
+
worktree. `story-run-progress` is upserted in place. `story-close.js`
|
|
331
|
+
short-circuits when the Story branch is already merged and deleted. Re-
|
|
332
|
+
running this helper against an already-closed Story is safe.
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## Constraints
|
|
337
|
+
|
|
338
|
+
- **MUST merge into `epic/<epicId>`, never `main`.** The Story branch's
|
|
339
|
+
only integration target is the parent Epic's integration branch. If
|
|
340
|
+
`story-close.js` short-circuits, no-ops, or otherwise fails to merge,
|
|
341
|
+
**do NOT** fall back to `gh pr create --base main`, **do NOT** invoke
|
|
342
|
+
`/story-deliver` on the same Story, and **do NOT** open a PR by
|
|
343
|
+
hand against `main`. Such a PR orphans the change on `main` and forces
|
|
344
|
+
a manual `git merge origin/main` back into `epic/<id>` to recover (the
|
|
345
|
+
Epic #2880 wave-5 / Story #2960 friction note). The framework refuses
|
|
346
|
+
these PRs via the `pr-base-guard` helper wired into every
|
|
347
|
+
`createPullRequest` surface; a raw shell `gh pr create` is the only
|
|
348
|
+
way to bypass it, and you must not. Diagnose the no-op (was the
|
|
349
|
+
branch already merged? is the ticket already closed? is the worktree
|
|
350
|
+
on the wrong HEAD?) and re-run close, or transition the Story to
|
|
351
|
+
`agent::blocked` with a `friction` comment so the operator can
|
|
352
|
+
resolve it.
|
|
353
|
+
- **Never** push the Story branch directly to `main`. `story-close.js` is
|
|
354
|
+
the only writer that integrates upstream, and only into `epic/<epicId>`.
|
|
355
|
+
- **Never** merge across Story branches; cross-Story dependencies are
|
|
356
|
+
resolved by wave ordering via `blocked by`.
|
|
357
|
+
- **Always** `cd` into the `workCwd` returned by Step 0 before editing, and
|
|
358
|
+
prefix every path-based Edit/Write/Read with that absolute `workCwd` root —
|
|
359
|
+
the Edit tools ignore the shell cwd. The worktree pins the branch to
|
|
360
|
+
`story-<storyId>`, so there is no need to re-check `git branch` before each
|
|
361
|
+
commit.
|
|
362
|
+
- **Always** upsert a `story-run-progress` snapshot at every phase
|
|
363
|
+
transition. The wave aggregator depends on this comment, not labels.
|
|
364
|
+
- **Always** pass `--cwd <main-repo>` to `story-close.js` when invoking
|
|
365
|
+
from inside a worktree.
|
|
366
|
+
- **Label transitions**: drive every `agent::*` state change through
|
|
367
|
+
`node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
|
|
368
|
+
This CLI is the authoritative mechanism — there is no separate
|
|
369
|
+
state-mutation MCP server to degrade from (see
|
|
370
|
+
[`.agents/instructions.md` § 1.D](../../instructions.md)).
|