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,636 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
Execute a standalone Story (no parent Epic) end-to-end. Creates a branch
|
|
4
|
+
from main, implements the changes in a worktree, runs gates, pushes, and
|
|
5
|
+
opens a PR directly against main.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /single-story-deliver #[Story ID]
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
`/single-story-deliver` is the standalone counterpart to
|
|
13
|
+
[`/story-deliver`](../story-deliver.md). Use it for a Story that is **not**
|
|
14
|
+
attached to an Epic — refactors carved out of closed Epics, framework
|
|
15
|
+
maintenance, or any work small enough that the Epic-Centric ceremony
|
|
16
|
+
(PRD + Tech Spec + decomposition + dispatch manifest + cascade) would be
|
|
17
|
+
overhead rather than help.
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
/single-story-deliver <storyId>
|
|
21
|
+
→ single-story-init.js (branch from main, worktree, agent::executing)
|
|
22
|
+
→ agent implements + commits (operator works in the worktree)
|
|
23
|
+
→ single-story-close.js (gates, push, gh pr create → main, agent::closing)
|
|
24
|
+
→ CI watch + fix loop (until all required checks pass + PR is merged)
|
|
25
|
+
→ single-story-confirm-merge.js (PR merged → agent::done, issue closes)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**When to use `/single-story-deliver` vs. `/epic-deliver`:**
|
|
29
|
+
|
|
30
|
+
| Trait | `/single-story-deliver` | `/epic-deliver` |
|
|
31
|
+
| ----------------------------- | ---------------------------------------------------- | ------------------------------------------------------- |
|
|
32
|
+
| Parent Epic | None (no `Epic: #N` in body) | Required (`Epic: #N` in body) |
|
|
33
|
+
| Branch base | `project.baseBranch` (default `main`) | `epic/<epicId>` |
|
|
34
|
+
| Merge target | `main` via PR | `epic/<epicId>` via `--no-ff` merge |
|
|
35
|
+
| Cascade up to Feature/Epic | No | Yes |
|
|
36
|
+
| Dispatch manifest interaction | None | Read at init, regenerated at close |
|
|
37
|
+
| Story scope | Inline `acceptance[]` / `verify[]` on the Story body | Inline `acceptance[]` / `verify[]` on the Story body |
|
|
38
|
+
|
|
39
|
+
If the Story has an `Epic: #N` reference, use `/epic-deliver`. If it
|
|
40
|
+
doesn't, use this workflow (or `/story-deliver` for several standalone
|
|
41
|
+
Stories at once).
|
|
42
|
+
|
|
43
|
+
## Prerequisites
|
|
44
|
+
|
|
45
|
+
1. A GitHub Issue with the `type::story` label and **no** `Epic: #N`
|
|
46
|
+
reference in its body.
|
|
47
|
+
2. `GITHUB_TOKEN` or `gh auth status` clean — `gh pr create` runs at close.
|
|
48
|
+
3. The base branch (`project.baseBranch`, default `main`) exists on
|
|
49
|
+
both local and `origin`.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Step 0 — Initialize (`single-story-init.js`)
|
|
54
|
+
|
|
55
|
+
Run from the **main checkout** (the worktree does not exist yet):
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
node .agents/scripts/single-story-init.js --story <storyId>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Flags: `--dry-run` (no git/ticket mutation), `--steal` (forcibly transfer a
|
|
62
|
+
foreign Story lease to this operator — see the fail-closed lease note below).
|
|
63
|
+
|
|
64
|
+
> **Execution mode.** Like `story-init.js`, this command can take 3–6
|
|
65
|
+
> minutes when the worktree's per-tree install runs. Invoke synchronously
|
|
66
|
+
> with `Bash(timeout: 600000)`. Do **not** use `run_in_background` +
|
|
67
|
+
> `Monitor` — a sub-agent that exits mid-install leaves the worktree
|
|
68
|
+
> half-bootstrapped.
|
|
69
|
+
|
|
70
|
+
The script validates `type::story`, **acquires the Story lease**, fetches
|
|
71
|
+
`origin`, seeds `story-<id>` from `baseBranch`, materializes a worktree
|
|
72
|
+
(when `delivery.worktreeIsolation.enabled` is true), upserts a
|
|
73
|
+
`story-init` structured comment carrying `standalone: true`, and flips
|
|
74
|
+
the Story to `agent::executing`.
|
|
75
|
+
|
|
76
|
+
> **Lease preflight (Story #3483).** Before any git mutation, init takes an
|
|
77
|
+
> exclusive, time-bounded **lease** on the Story ticket via the
|
|
78
|
+
> assignee-as-lease primitive (`lib/orchestration/ticket-lease.js`). The
|
|
79
|
+
> single assignee *is* the lease owner (resolved from
|
|
80
|
+
> `github.operatorHandle`). The standalone path has no Epic-scoped dispatch
|
|
81
|
+
> manifest to serialise two operators driving the same Story, so this lease
|
|
82
|
+
> is the only guard against a concurrent `single-story-init` clobbering an
|
|
83
|
+
> in-flight run.
|
|
84
|
+
>
|
|
85
|
+
> **Fail-closed (audit #3513).** Unlike `/epic-deliver`, the standalone path
|
|
86
|
+
> has **no Epic-scoped lifecycle ledger** to read a per-owner
|
|
87
|
+
> `story.heartbeat` from, so there is no live-heartbeat source to decide
|
|
88
|
+
> whether a foreign claim is stale. Rather than silently reclaim every
|
|
89
|
+
> foreign assignee (which would leave the guard inert), the standalone lease
|
|
90
|
+
> **fails closed**: a foreign assignee is treated as a *live* claim. Outcomes:
|
|
91
|
+
>
|
|
92
|
+
> - **Unclaimed / self-held** → init proceeds (a self-held claim is
|
|
93
|
+
> re-affirmed without re-writing assignees).
|
|
94
|
+
> - **Any foreign assignee** → init **exits non-zero** with a message naming
|
|
95
|
+
> the current owner. Coordinate with that operator, or pass **`--steal`** to
|
|
96
|
+
> forcibly transfer the claim once you have confirmed the other run is dead.
|
|
97
|
+
>
|
|
98
|
+
> `--dry-run` skips the lease (no assignee mutation). The matching release
|
|
99
|
+
> runs in `single-story-close.js` (Step 3).
|
|
100
|
+
|
|
101
|
+
Init is also idempotent on the Story branch itself:
|
|
102
|
+
|
|
103
|
+
> **Branch reuse (Story #3483).** When a `story-<id>` branch already exists
|
|
104
|
+
> locally, init **reuses** it rather than re-creating it (re-running
|
|
105
|
+
> `git branch` on an existing ref throws `branch already exists`). The
|
|
106
|
+
> seed decision (`reuse` / `fetch` / `create`) keys off local + remote ref
|
|
107
|
+
> presence, so re-running init on a partially-initialized Story is
|
|
108
|
+
> idempotent.
|
|
109
|
+
|
|
110
|
+
Between the fetch and the branch-seed step, the script also runs a
|
|
111
|
+
**merged-`story-*` sweep**: it invokes the same primitive as
|
|
112
|
+
`<agentRoot>/scripts/git-cleanup.js` (`<agentRoot>` resolves
|
|
113
|
+
from `project.paths.agentRoot`, default `.agents`) scoped to `story-*`
|
|
114
|
+
only, in `--execute --remote` mode, with the current run's
|
|
115
|
+
`story-<id>` branch excluded from the candidate list. Local refs, the
|
|
116
|
+
matching `origin/` ref, and stale tracking refs for any merged sibling
|
|
117
|
+
stories are reaped in one pass. The sweep never blocks init — failures
|
|
118
|
+
are logged and the new story is initialized regardless.
|
|
119
|
+
|
|
120
|
+
The sweep applies two hardening layers (Story #2011):
|
|
121
|
+
|
|
122
|
+
- **Per-candidate protection.** Each merged-PR candidate is filtered
|
|
123
|
+
through three guards before reaching `executeCleanup`:
|
|
124
|
+
- `unpushed-work` — branch HEAD SHA differs from the PR's
|
|
125
|
+
`headRefOid`, meaning the operator has commits the merge didn't
|
|
126
|
+
capture.
|
|
127
|
+
- `dirty-tree` — the attached worktree (if any) has uncommitted
|
|
128
|
+
changes.
|
|
129
|
+
- `ticket-not-done` — the parent Story ticket isn't closed and
|
|
130
|
+
doesn't carry `agent::done`.
|
|
131
|
+
Protected candidates are skipped, listed in the sweep result envelope
|
|
132
|
+
under `protected[]`, and named in the `CLEANUP` log line so the
|
|
133
|
+
operator can see what was preserved.
|
|
134
|
+
- **Cross-session lock.** The sweep acquires a process-scoped lockfile
|
|
135
|
+
at `<tempRoot>/single-story-sweep.lock` before planning. On
|
|
136
|
+
contention (another `/single-story-deliver` already in the sweep
|
|
137
|
+
step), this run's sweep is **skipped** with a warn log; init
|
|
138
|
+
continues normally. Stale lockfiles (mtime older than the timeout)
|
|
139
|
+
are treated as expired. The timeout defaults to 60 seconds and is
|
|
140
|
+
overridable via `delivery.worktreeIsolation.sweepLockMs` in
|
|
141
|
+
`.agentrc.json`.
|
|
142
|
+
|
|
143
|
+
Both layers are non-fatal — sweep failure / skip never blocks init, and
|
|
144
|
+
the new story is always created.
|
|
145
|
+
|
|
146
|
+
Capture `workCwd` from the result envelope. Add `--dry-run` to inspect
|
|
147
|
+
the planned actions without git or ticket mutations (dry-run also skips
|
|
148
|
+
the sweep).
|
|
149
|
+
|
|
150
|
+
### Step 0.5 — `cd` into the workCwd
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
cd "<workCwd from Step 0 result>"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
All subsequent commands run from this directory.
|
|
157
|
+
|
|
158
|
+
> **Worktree scope is not just the Bash cwd.** `cd <workCwd>` steers the
|
|
159
|
+
> **Bash** tool's working directory, but it does **not** scope the
|
|
160
|
+
> path-based **Edit/Write/Read** tools — those resolve **absolute paths**
|
|
161
|
+
> and ignore the shell cwd. On Windows especially, an agent whose shell
|
|
162
|
+
> sits in the worktree can still silently edit the **main checkout** if it
|
|
163
|
+
> resolves a main-checkout absolute path. To stay in the worktree you MUST
|
|
164
|
+
> prefix **every Edit/Write/Read path with the absolute worktree root**
|
|
165
|
+
> (the `workCwd` value from Step 0), not merely `cd` into it. Never edit
|
|
166
|
+
> files under the bare main-checkout root. `single-story-close.js` runs a
|
|
167
|
+
> **wrong-tree guard** (Story #3364) that aborts close and posts a
|
|
168
|
+
> `friction` comment if it finds uncommitted tracked-path edits in the main
|
|
169
|
+
> checkout while the worktree is the active work tree — but that is a
|
|
170
|
+
> backstop, not a substitute for prefixing paths correctly.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Step 1 — Implementation
|
|
175
|
+
|
|
176
|
+
A standalone Story is **atomic** — no wave dispatch and no Epic-scoped
|
|
177
|
+
cascade. Work happens in one or more commits on the `story-<id>`
|
|
178
|
+
branch, against the inline `acceptance[]` / `verify[]` arrays on the
|
|
179
|
+
Story body.
|
|
180
|
+
|
|
181
|
+
Operator/agent responsibilities while in the worktree:
|
|
182
|
+
|
|
183
|
+
1. Read the Story body. Treat its acceptance criteria as the contract.
|
|
184
|
+
2. Implement the changes.
|
|
185
|
+
3. Commit on the Story branch. Conventional-commit format is encouraged
|
|
186
|
+
but not enforced — the PR title carries the canonical summary.
|
|
187
|
+
4. Iterate (read tests, run targeted gates, edit, commit) until the
|
|
188
|
+
acceptance criteria are met.
|
|
189
|
+
5. Run the **bounded acceptance self-eval loop** (Step 1a below) before
|
|
190
|
+
proceeding to close.
|
|
191
|
+
|
|
192
|
+
Recommended quick gates while iterating (each is fast enough to run on
|
|
193
|
+
save):
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
npm run typecheck
|
|
197
|
+
npm run lint
|
|
198
|
+
npm test -- --grep "<scope>"
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
The full close-validation chain runs in Step 3; the gates above are
|
|
202
|
+
advisory pre-flight.
|
|
203
|
+
|
|
204
|
+
> Conflict with `main` mid-implementation → resolve as you would any
|
|
205
|
+
> branch rebase. There is no `epic/<id>` intermediate, so the rebase
|
|
206
|
+
> base is `main` directly.
|
|
207
|
+
|
|
208
|
+
### Step 1a — Bounded acceptance self-eval loop (**required, not optional**)
|
|
209
|
+
|
|
210
|
+
After the implementation commits land and **before** you proceed to close, run
|
|
211
|
+
the bounded acceptance self-eval loop. The per-round critic mechanic (fresh-
|
|
212
|
+
context critic, `verify[]`-as-evidence, the verdict schema, and the
|
|
213
|
+
proceed / redraft / block decision) is the single-homed include
|
|
214
|
+
[`acceptance-self-eval.md`](acceptance-self-eval.md) — read it and follow it.
|
|
215
|
+
|
|
216
|
+
Standalone specifics for this path:
|
|
217
|
+
|
|
218
|
+
- **Gate invocation** (omit `--epic` — there is no parent Epic):
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
node <main-repo>/.agents/scripts/acceptance-eval.js \
|
|
222
|
+
--story <storyId> --verdict <verdict-path>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
- **On `decision: "proceed"`** → proceed to Step 3 (close).
|
|
226
|
+
- **On `decision: "block"`** → **do not proceed to close.** Post a `friction`
|
|
227
|
+
comment naming the unmet criteria, then transition the Story to
|
|
228
|
+
`agent::blocked`:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
node .agents/scripts/diagnose-friction.js --story <storyId> \
|
|
232
|
+
--cmd node .agents/scripts/acceptance-eval.js --story <storyId> --verdict <verdict-path>
|
|
233
|
+
node .agents/scripts/update-ticket-state.js --ticket <storyId> --state agent::blocked
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Step 2 — Validate (deferred to close)
|
|
239
|
+
|
|
240
|
+
`single-story-close.js` runs the canonical close-validation chain
|
|
241
|
+
(typecheck, lint, test, format, maintainability, coverage, crap) before
|
|
242
|
+
it pushes. Do **not** pre-run those gates here unless interactively
|
|
243
|
+
iterating on a fix.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Step 3 — Close (`single-story-close.js`)
|
|
248
|
+
|
|
249
|
+
Invoke from the main checkout (or pass `--cwd <main-repo>` from inside
|
|
250
|
+
the worktree):
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
node <main-repo>/.agents/scripts/single-story-close.js --story <storyId> --cwd <main-repo>
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
The script:
|
|
257
|
+
|
|
258
|
+
1. Runs the close-validation gates against `baseBranch` as the baseline.
|
|
259
|
+
On any gate failure it throws — the operator fixes and re-runs close.
|
|
260
|
+
1a. **Syncs the Story branch from `origin/<baseBranch>`** before push
|
|
261
|
+
(Story #2580). Runs `git fetch origin <baseBranch>` followed by
|
|
262
|
+
`git merge --no-edit origin/<baseBranch>` inside the worktree. This
|
|
263
|
+
defends against the parallel-`/single-story-deliver` race: when
|
|
264
|
+
multiple sessions run in parallel, the Story that auto-merges first
|
|
265
|
+
bumps `baseBranch`, and without this sync the lagging Stories open
|
|
266
|
+
PRs that are "behind base" and stall against branch-protection's
|
|
267
|
+
`up-to-date branch` rule. Outcomes:
|
|
268
|
+
- **No-op / fast-forward / clean merge-commit** → close proceeds to
|
|
269
|
+
push.
|
|
270
|
+
- **Merge conflict** → the merge is aborted, a `friction` structured
|
|
271
|
+
comment is posted on the Story (conflicting file list + recovery
|
|
272
|
+
command set), the Story flips to `agent::blocked`, and close
|
|
273
|
+
throws. Resolve in the worktree (`git merge origin/<base>` + fix
|
|
274
|
+
conflicts + `git commit --no-edit`) and re-run
|
|
275
|
+
`/single-story-deliver`.
|
|
276
|
+
- **Fetch failed** → close throws with the git stderr; no label
|
|
277
|
+
transition.
|
|
278
|
+
|
|
279
|
+
Note: the merge queue (when enabled) re-tests each PR against the
|
|
280
|
+
queue tip before merging, so this sync + merge queue is the complete
|
|
281
|
+
defence against the parallel race. Without merge queue, the sync
|
|
282
|
+
closes the PR-open-time race but a residual race remains between PR
|
|
283
|
+
open and auto-merge fire.
|
|
284
|
+
2. Pushes `story-<id>` to `origin`.
|
|
285
|
+
3. Probes for an existing open PR with `head = story-<id>`. If none
|
|
286
|
+
exists, opens one via `gh pr create --base <baseBranch>`. The PR
|
|
287
|
+
body carries `Closes #<storyId>` so the GitHub merge auto-closes the
|
|
288
|
+
issue.
|
|
289
|
+
3a. **Enables GitHub native auto-merge by default** via
|
|
290
|
+
`gh pr merge <prNumber> --auto --squash --delete-branch`. Once CI's
|
|
291
|
+
required checks turn green, GitHub squash-merges the PR and deletes
|
|
292
|
+
the source branch — the operator does not need to babysit the merge
|
|
293
|
+
button. Mirrors the `/epic-deliver` finalize path. Failure is
|
|
294
|
+
non-fatal: the operator retains the manual merge surface in the
|
|
295
|
+
GitHub UI. Pass `--no-auto-merge` to opt out when the PR needs a
|
|
296
|
+
pre-merge eyeball.
|
|
297
|
+
4. Flips the Story to **`agent::closing`** (NOT `agent::done`) and leaves
|
|
298
|
+
the GitHub issue **OPEN** (Story #3385). Auto-merge completes
|
|
299
|
+
asynchronously *after* this script exits, so closing the issue here
|
|
300
|
+
would strand a CLOSED issue with no merged work if the PR later failed
|
|
301
|
+
CI, went `BEHIND` base, or was closed without merging. The Story rests
|
|
302
|
+
at `agent::closing` while the PR is open with auto-merge armed; the
|
|
303
|
+
`agent::done` flip (which closes the issue) is deferred to Step 5.5's
|
|
304
|
+
`single-story-confirm-merge.js`. This brings the standalone path to
|
|
305
|
+
parity with the epic path (#2155), where a Story only reaches
|
|
306
|
+
`agent::done` once its merge into `epic/<id>` is confirmed.
|
|
307
|
+
5. Reaps the worktree when `delivery.worktreeIsolation.reapOnSuccess`
|
|
308
|
+
is enabled.
|
|
309
|
+
6. **Releases the Story lease** (Story #3483). Clears the Story assignment
|
|
310
|
+
that init claimed so the next `/single-story-deliver` run sees an
|
|
311
|
+
unclaimed ticket. The release is a no-op when the operator no longer
|
|
312
|
+
holds the claim (a later run took over via reclaim/steal), so a late
|
|
313
|
+
close never yanks a live claim away from its current owner. Best-effort:
|
|
314
|
+
a release failure is logged but does not fail an otherwise-clean close —
|
|
315
|
+
the lease goes stale via TTL regardless. The close result carries
|
|
316
|
+
`leaseReleased: <boolean>`.
|
|
317
|
+
|
|
318
|
+
`--skip-validation` bypasses Step 1 (gates). Use only when re-running
|
|
319
|
+
close after a fixed gate failure that's already known to pass.
|
|
320
|
+
|
|
321
|
+
`--skip-sync` bypasses Step 1a (base-sync). Use only when re-running
|
|
322
|
+
close after a hand-resolved sync, or in tests.
|
|
323
|
+
|
|
324
|
+
`--no-auto-merge` disables Step 3a. Use when the PR materially changes
|
|
325
|
+
behaviour and warrants pre-merge review.
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## Step 4 — CI watch + fix loop (**required, not optional**)
|
|
330
|
+
|
|
331
|
+
The Story is **not done** when `single-story-close.js` returns. Auto-merge
|
|
332
|
+
only fires when every required CI check turns green. Local close-validation
|
|
333
|
+
gates pass on the dev host's environment (Windows, particular Node patch,
|
|
334
|
+
particular concurrency), but CI runs on a different OS and concurrency —
|
|
335
|
+
coverage rounding, platform-conditional branches, and timing-sensitive
|
|
336
|
+
tests routinely drift between the two. The agent owns the green-CI
|
|
337
|
+
outcome, not just the push.
|
|
338
|
+
|
|
339
|
+
After `single-story-close.js` succeeds, enter the watch + fix loop:
|
|
340
|
+
|
|
341
|
+
```bash
|
|
342
|
+
gh pr checks <prNumber> --watch
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
When the watch exits:
|
|
346
|
+
|
|
347
|
+
- **All checks ✓** — auto-merge will fire (or has already). The Story is
|
|
348
|
+
still at `agent::closing` with its issue OPEN at this point (Step 3
|
|
349
|
+
deferred the `agent::done` flip). The `Closes #<id>` footer closes the
|
|
350
|
+
Story issue when the merge lands; Step 5 confirms the merge and Step 5.5
|
|
351
|
+
flips the Story to `agent::done`. Proceed to Step 5.
|
|
352
|
+
- **Any check ✗** — diagnose, fix, and push a new commit on
|
|
353
|
+
`story-<storyId>`, then re-watch. Auto-merge stays enabled across
|
|
354
|
+
retries; no need to re-arm it. The Story stays at `agent::closing`
|
|
355
|
+
throughout, so a failed/abandoned PR never strands a CLOSED issue.
|
|
356
|
+
|
|
357
|
+
### Resurrecting the worktree after `reapOnSuccess`
|
|
358
|
+
|
|
359
|
+
`single-story-close.js` reaps the worktree on success when
|
|
360
|
+
`delivery.worktreeIsolation.reapOnSuccess` is enabled (the default). To
|
|
361
|
+
fix CI you must re-attach a worktree to the existing remote branch:
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
cd <main-repo>
|
|
365
|
+
git fetch origin story-<storyId>
|
|
366
|
+
git worktree add .worktrees/story-<storyId> story-<storyId>
|
|
367
|
+
cd .worktrees/story-<storyId>
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
Do **not** re-run `single-story-init.js` — it would reset the branch
|
|
371
|
+
state and lose the close commit's structured comment.
|
|
372
|
+
|
|
373
|
+
### Diagnosing the failure
|
|
374
|
+
|
|
375
|
+
Pull the failing job log via:
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
gh run view <runId> --repo <owner>/<repo> --log-failed
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
The `<runId>` is the run number that `gh pr checks` shows in the
|
|
382
|
+
failing row's URL. Read the bottom of the log — the gate that exited
|
|
383
|
+
non-zero is named there (e.g. `[Coverage] ❌ REGRESSION in …`).
|
|
384
|
+
|
|
385
|
+
### Fixing without re-running close-validation
|
|
386
|
+
|
|
387
|
+
For coverage / maintainability / CRAP regressions detected only on CI:
|
|
388
|
+
|
|
389
|
+
1. Update the relevant baseline file (`baselines/coverage.json`,
|
|
390
|
+
`baselines/maintainability.json`, `baselines/crap.json`) to absorb
|
|
391
|
+
CI's actual numbers. Edit by hand when CI's numbers are within the
|
|
392
|
+
tolerance you'd otherwise accept — don't re-run `npm run … :update`
|
|
393
|
+
locally, because Windows numbers will overwrite CI's Linux numbers
|
|
394
|
+
and the cycle repeats.
|
|
395
|
+
2. Commit the baseline delta with a `chore(baselines):` message that
|
|
396
|
+
names the CI run that produced the values.
|
|
397
|
+
3. `git push` to `origin/story-<storyId>` and re-watch.
|
|
398
|
+
|
|
399
|
+
For genuine test failures (a flaky test, a platform-conditional bug):
|
|
400
|
+
fix the code or test, commit, push, re-watch. Keep iterating until
|
|
401
|
+
the watch exits clean.
|
|
402
|
+
|
|
403
|
+
### When to stop iterating
|
|
404
|
+
|
|
405
|
+
- **Three consecutive failures with the same fix shape** — stop and
|
|
406
|
+
Re-Plan per Anti-Thrashing Protocol. The diagnosis is likely wrong.
|
|
407
|
+
- **Operator-blocking failure** (security scanner, branch-protection
|
|
408
|
+
rule the agent can't change) — transition the Story to
|
|
409
|
+
`agent::blocked`, summarize the blocker on the PR, and yield to the
|
|
410
|
+
operator.
|
|
411
|
+
|
|
412
|
+
### Idempotence of the loop
|
|
413
|
+
|
|
414
|
+
- The PR stays open across retries; `gh pr create` is a one-shot at
|
|
415
|
+
close, the loop only pushes new commits.
|
|
416
|
+
- Auto-merge stays armed across retries — pushing a new commit does
|
|
417
|
+
not disarm `gh pr merge --auto`.
|
|
418
|
+
- If the operator manually merges or disables auto-merge mid-loop,
|
|
419
|
+
exit the loop and report.
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
## Step 5 — Merge confirmation + `agent::done` flip (**required, not optional**)
|
|
424
|
+
|
|
425
|
+
With auto-merge enabled (default), GitHub squash-merges the PR when
|
|
426
|
+
every required check turns green and the `Closes #<id>` footer
|
|
427
|
+
auto-closes the Story issue.
|
|
428
|
+
|
|
429
|
+
Confirm the merge landed:
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
gh pr view <prNumber> --json state,mergedAt,mergeCommit
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
Expect `state: "MERGED"`. With `--no-auto-merge`, the PR is the merge
|
|
436
|
+
gate. The operator reviews and merges via the GitHub UI; the same
|
|
437
|
+
`Closes #<id>` auto-close fires when the merge lands on `main`.
|
|
438
|
+
|
|
439
|
+
**Then flip the Story to `agent::done`.** Step 3 deferred this flip
|
|
440
|
+
(Story #3385) so the Story rested at `agent::closing` with its issue OPEN
|
|
441
|
+
while the PR was open. Now that the merge is confirmed, drive the
|
|
442
|
+
`agent::closing → agent::done` transition (which closes the issue) via:
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
node .agents/scripts/single-story-confirm-merge.js --story <storyId> --cwd <main-repo>
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
The confirmation script re-reads the live PR state (`gh pr view --json
|
|
449
|
+
state,mergedAt`, probing `gh pr list --head story-<id> --state all` when
|
|
450
|
+
`--pr` is omitted) and:
|
|
451
|
+
|
|
452
|
+
- **PR `MERGED`** → flips `agent::closing → agent::done`, closing the
|
|
453
|
+
issue, and fires the `story-merged` notify. Prints
|
|
454
|
+
`{ action: 'done', merged: true, ... }`.
|
|
455
|
+
- **PR still open / closed-without-merge** → leaves the Story at
|
|
456
|
+
`agent::closing` (issue stays OPEN) and prints
|
|
457
|
+
`{ action: 'pending', reason: 'pr-open' | 'pr-not-merged' | 'no-pr' }`.
|
|
458
|
+
Re-run after the merge lands.
|
|
459
|
+
- **Story already `agent::done` / issue already closed** → idempotent
|
|
460
|
+
`{ action: 'noop', reason: 'already-done' }`.
|
|
461
|
+
|
|
462
|
+
This is the standalone counterpart to the epic path's post-merge
|
|
463
|
+
`agent::done` flip in `post-merge-close.js` (#2155): the issue closes
|
|
464
|
+
exactly when the work has merged, never at PR-open.
|
|
465
|
+
|
|
466
|
+
---
|
|
467
|
+
|
|
468
|
+
## Step 5.5 — Re-assert Status column (**required, not optional**)
|
|
469
|
+
|
|
470
|
+
The GitHub Projects v2 built-in workflows `Pull request merged` and
|
|
471
|
+
`Pull request linked to issue` are enabled by default on most boards
|
|
472
|
+
and fire ~minutes *after* auto-merge lands. They overwrite the Status
|
|
473
|
+
field as a side-effect, clobbering the `Done` value
|
|
474
|
+
`single-story-confirm-merge.js` set at the `agent::done` flip in Step 5
|
|
475
|
+
and leaving closed Stories stuck at `In Progress` on the board
|
|
476
|
+
(reproduced on Story #2813). The confirmation step has already exited by
|
|
477
|
+
then, so the bot gets the last write.
|
|
478
|
+
|
|
479
|
+
Re-assert authority once the merge confirms:
|
|
480
|
+
|
|
481
|
+
```bash
|
|
482
|
+
node .agents/scripts/resync-status-column.js --story <storyId>
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
What this does:
|
|
486
|
+
|
|
487
|
+
- Reads the ticket's current `agent::*` label set (now `agent::done`).
|
|
488
|
+
- Re-fires the same `ColumnSync` mutation `transitionTicketState` used
|
|
489
|
+
at close, overwriting the bot's late write.
|
|
490
|
+
- **Polls the live Status for ~15 s after the initial write** and
|
|
491
|
+
re-fires on drift (Story #2876). Without this loop, a one-shot
|
|
492
|
+
mutation routinely lost the race against the bot's asynchronous
|
|
493
|
+
fire (reproduced on Story #2871 / PR #2872).
|
|
494
|
+
- Prints a single-line JSON envelope:
|
|
495
|
+
`{ ticketId, status, column?, reason?, attempts? }`. `attempts > 1`
|
|
496
|
+
means the helper had to fight a bot overwrite; `status: 'drifted'`
|
|
497
|
+
means the bot won every attempt in the poll budget (rare; usually
|
|
498
|
+
signals operator should reap the conflicting workflows).
|
|
499
|
+
|
|
500
|
+
Tuning flags (rarely needed):
|
|
501
|
+
|
|
502
|
+
- `--poll-attempts <n>` — total mutation attempts including the
|
|
503
|
+
initial sync. Default `4`. Pass `1` to disable the poll loop
|
|
504
|
+
(fastest, matches pre-#2876 behaviour).
|
|
505
|
+
- `--poll-delay-ms <ms>` — delay between drift checks. Default `5000`.
|
|
506
|
+
|
|
507
|
+
Idempotent: re-running on a ticket whose Status already matches the
|
|
508
|
+
target returns the same envelope. No-op skips (`no-project`,
|
|
509
|
+
`no-meta`, `not-on-project`) exit 0 with the reason in the envelope
|
|
510
|
+
so the workflow can continue.
|
|
511
|
+
|
|
512
|
+
**Canonical operator fix:** run
|
|
513
|
+
`node .agents/scripts/agents-bootstrap-github.js --reap-conflicting-workflows`
|
|
514
|
+
once per project to delete the conflicting bot workflows entirely.
|
|
515
|
+
This eliminates the race source; the poll loop becomes pure
|
|
516
|
+
defense-in-depth against re-enabled or future workflows.
|
|
517
|
+
|
|
518
|
+
Skip Step 5.5 only when the operator opted out of auto-merge AND has
|
|
519
|
+
not yet merged the PR (no `agent::done` to re-assert yet) — run it
|
|
520
|
+
after the manual merge instead.
|
|
521
|
+
|
|
522
|
+
---
|
|
523
|
+
|
|
524
|
+
## Step 6 — Local branch cleanup (**required, not optional**)
|
|
525
|
+
|
|
526
|
+
GitHub deletes the **remote** branch on auto-merge (via the
|
|
527
|
+
`--delete-branch` flag `single-story-close.js` passes to `gh pr merge`).
|
|
528
|
+
The **local** `story-<storyId>` ref, however, lingers in the main
|
|
529
|
+
checkout until something prunes it — `single-story-init.js` runs a
|
|
530
|
+
merged-sweep at the start of every *subsequent* `/single-story-deliver`
|
|
531
|
+
invocation, but that's next-run cleanup, not end-of-run cleanup. Stale
|
|
532
|
+
local refs accumulate between sessions, clutter `git branch`, and shadow
|
|
533
|
+
the lessons the sweep is meant to surface.
|
|
534
|
+
|
|
535
|
+
**Why local `main` goes stale:** `single-story-init.js` seeds new
|
|
536
|
+
`story-<id>` branches from the **local** `baseBranch` ref (default
|
|
537
|
+
`main`). Auto-merge updates **`origin/main`** on GitHub; nothing in
|
|
538
|
+
close or the old Step 6 command updated **local `main`**. The next init
|
|
539
|
+
then forked from a tip six merges behind until you manually pulled.
|
|
540
|
+
`single-story-init` also attempts the same fast-forward after `git fetch`
|
|
541
|
+
when the main checkout is clean (defense in depth if Step 6 was skipped).
|
|
542
|
+
Step 6 must still run `--fast-forward-main` so local `main` is current
|
|
543
|
+
before the next session — init may skip when the tree is dirty or the
|
|
544
|
+
operator is mid-checkout on another branch.
|
|
545
|
+
|
|
546
|
+
After Step 5 confirms `state: "MERGED"`, prune the story ref **and**
|
|
547
|
+
fast-forward local `main` (or `project.baseBranch`):
|
|
548
|
+
|
|
549
|
+
```bash
|
|
550
|
+
node .agents/scripts/git-cleanup.js \
|
|
551
|
+
--execute \
|
|
552
|
+
--remote \
|
|
553
|
+
--yes \
|
|
554
|
+
--fast-forward-main \
|
|
555
|
+
--branches \
|
|
556
|
+
--include "story-<storyId>"
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
What this does:
|
|
560
|
+
|
|
561
|
+
- **`--fast-forward-main`** fetches `origin/<baseBranch>` and
|
|
562
|
+
`git merge --ff-only` on the main checkout when the tree is clean and
|
|
563
|
+
the local base is strictly behind remote. Skipped when already current,
|
|
564
|
+
dirty, or diverged (see `/git-cleanup`).
|
|
565
|
+
- **`--branches`** reaps the merged `story-<storyId>` ref (worktree,
|
|
566
|
+
local branch, stale `origin/` tracking ref). Does not run
|
|
567
|
+
`--prune-remotes` or `--stashes` unless you add those flags.
|
|
568
|
+
- **`--include "story-<storyId>"`** scopes the branch reap to this
|
|
569
|
+
Story's ref only — sibling stories in flight are untouched.
|
|
570
|
+
- **`--execute --remote --yes`** actually deletes the local ref, prunes
|
|
571
|
+
the matching `origin/` tracking ref, and runs non-interactively.
|
|
572
|
+
|
|
573
|
+
The sweep is idempotent. It is safe to run before `state: "MERGED"`
|
|
574
|
+
confirms (it will skip a not-yet-merged branch), and safe to re-run
|
|
575
|
+
after a successful cleanup (it reports "no merged branches to clean
|
|
576
|
+
up").
|
|
577
|
+
|
|
578
|
+
Skip Step 6 only when the operator has explicitly opted out via
|
|
579
|
+
`--no-auto-merge` AND has not yet merged the PR — in that case, leave
|
|
580
|
+
the branch in place until the manual merge lands, then run the
|
|
581
|
+
cleanup.
|
|
582
|
+
|
|
583
|
+
---
|
|
584
|
+
|
|
585
|
+
## Idempotence
|
|
586
|
+
|
|
587
|
+
- `single-story-init.js` re-prints the same `workCwd` without recreating
|
|
588
|
+
the worktree when one already exists for `story-<id>`.
|
|
589
|
+
- `single-story-close.js` short-circuits when the Story is already
|
|
590
|
+
closed (returns `{ action: 'noop', reason: 'already-closed' }`).
|
|
591
|
+
- `single-story-confirm-merge.js` short-circuits when the Story already
|
|
592
|
+
carries `agent::done` or the issue is already closed (returns
|
|
593
|
+
`{ action: 'noop', reason: 'already-done' }`), and is safe to re-run
|
|
594
|
+
while the PR is still open (returns `{ action: 'pending', ... }` without
|
|
595
|
+
mutating the Story).
|
|
596
|
+
- The PR probe (`gh pr list --head <branch> --state open`) reuses an
|
|
597
|
+
existing open PR rather than opening a duplicate.
|
|
598
|
+
|
|
599
|
+
Re-running `/single-story-deliver` against an already-closed Story is
|
|
600
|
+
safe.
|
|
601
|
+
|
|
602
|
+
---
|
|
603
|
+
|
|
604
|
+
## Constraints
|
|
605
|
+
|
|
606
|
+
- **Never** push the Story branch directly to `main`. The PR is the only
|
|
607
|
+
merge surface.
|
|
608
|
+
- **Always** `cd` into the `workCwd` returned by Step 0 before editing,
|
|
609
|
+
**and** prefix every path-based Edit/Write/Read with that absolute
|
|
610
|
+
`workCwd` root — the `cd` alone does not scope the path-based tools (see
|
|
611
|
+
Step 0.5). Editing a bare main-checkout path lands the change in the wrong
|
|
612
|
+
tree; close's wrong-tree guard (Story #3364) aborts when it detects this.
|
|
613
|
+
- **Always** pass `--cwd <main-repo>` to `single-story-close.js` when
|
|
614
|
+
invoking from inside a worktree (worktree-local branch deletion fails
|
|
615
|
+
when run from inside the worktree).
|
|
616
|
+
- **Handoff discipline — report state, not process.** When you hand back to
|
|
617
|
+
your caller (the `/story-deliver` aggregator or the interactive operator),
|
|
618
|
+
report essential terminal state only: the Story branch, the closing commit
|
|
619
|
+
SHA, what changed, and what was verified. Mirror the fields the close
|
|
620
|
+
pipeline already emits (`single-story-close.js` / `story-phase.js`
|
|
621
|
+
envelopes, the `story-run-progress` snapshot) rather than inventing a new
|
|
622
|
+
contract. Do not narrate the steps you took, and do not prescribe how the
|
|
623
|
+
next stage should do its work. Prose process commentary only bloats the
|
|
624
|
+
hydrated prompt (`delivery.maxTokenBudget` elision).
|
|
625
|
+
- **Label transitions**: drive every `agent::*` state change through
|
|
626
|
+
`node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
|
|
627
|
+
This CLI is the authoritative mechanism — there is no separate
|
|
628
|
+
state-mutation MCP server to degrade from (see
|
|
629
|
+
[`.agents/instructions.md` § 1.D](../../instructions.md)).
|
|
630
|
+
|
|
631
|
+
---
|
|
632
|
+
|
|
633
|
+
## See also
|
|
634
|
+
|
|
635
|
+
- [`/story-deliver`](../story-deliver.md) — Epic-attached Story execution.
|
|
636
|
+
- [`/epic-deliver`](../epic-deliver.md) — full Epic wave loop.
|