mandrel 1.94.0 → 2.1.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 +116 -99
- package/.agents/agents/acceptance-critic.md +9 -7
- package/.agents/agents/story-worker.md +45 -51
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +498 -1287
- package/.agents/docs/agentrc-reference.json +185 -80
- package/.agents/docs/configuration.md +132 -190
- package/.agents/docs/execution-reference.md +51 -25
- package/.agents/docs/quality-gates.md +25 -33
- package/.agents/docs/workflows.md +8 -8
- package/.agents/instructions.md +113 -139
- package/.agents/rules/ci-remediation.md +11 -15
- package/.agents/rules/git-conventions-reference.md +48 -58
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +83 -254
- package/.agents/schemas/audit-rules.json +59 -1
- package/.agents/schemas/audit-rules.schema.json +33 -1
- package/.agents/schemas/lifecycle/README.md +1 -2
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
- package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
- package/.agents/schemas/signal-event.schema.json +3 -3
- package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +22 -66
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/bootstrap.js +3 -3
- package/.agents/scripts/check-dead-exports.js +43 -104
- package/.agents/scripts/check-doc-links.js +2 -2
- package/.agents/scripts/check-lifecycle-lint.js +7 -10
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/deliver-recover.js +122 -0
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +20 -50
- package/.agents/scripts/generate-skills-index.js +17 -1
- package/.agents/scripts/generate-workflows-doc.js +4 -4
- package/.agents/scripts/lib/ITicketingProvider.js +1 -19
- package/.agents/scripts/lib/Logger.js +6 -10
- package/.agents/scripts/lib/audit-suite/runner.js +2 -2
- package/.agents/scripts/lib/audit-suite/selector.js +328 -28
- package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
- package/.agents/scripts/lib/baselines/kernel.js +206 -18
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
- package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
- package/.agents/scripts/lib/checks/index.js +3 -2
- package/.agents/scripts/lib/checks/loop-health.js +12 -11
- package/.agents/scripts/lib/checks/state.js +17 -248
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +39 -9
- package/.agents/scripts/lib/close-validation/gates.js +15 -15
- package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
- package/.agents/scripts/lib/close-validation/runner.js +13 -21
- package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +52 -35
- package/.agents/scripts/lib/config/explain.js +61 -48
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +29 -80
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +12 -15
- package/.agents/scripts/lib/config/runners.js +20 -66
- package/.agents/scripts/lib/config/temp-paths.js +30 -63
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +2 -7
- package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
- package/.agents/scripts/lib/config-settings-schema.js +100 -60
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +2 -2
- package/.agents/scripts/lib/duplicate-search.js +242 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +23 -14
- package/.agents/scripts/lib/format-generated-json.js +97 -0
- package/.agents/scripts/lib/framework-version.js +19 -190
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
- package/.agents/scripts/lib/git-utils.js +32 -20
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +10 -38
- package/.agents/scripts/lib/label-taxonomy.js +10 -55
- package/.agents/scripts/lib/observability/active-story-env.js +44 -165
- package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
- package/.agents/scripts/lib/observability/signal-validator.js +4 -4
- package/.agents/scripts/lib/observability/signals-writer.js +6 -82
- package/.agents/scripts/lib/observability/source-classifier.js +5 -5
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
- package/.agents/scripts/lib/orchestration/code-review.js +78 -436
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
- package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
- package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
- package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
- package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
- package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
- package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
- package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
- package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
- package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
- package/.agents/scripts/lib/planning-corpus.js +12 -281
- package/.agents/scripts/lib/preflight-runner.js +4 -4
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
- package/.agents/scripts/lib/signals/index.js +4 -17
- package/.agents/scripts/lib/signals/read.js +35 -35
- package/.agents/scripts/lib/signals/schema.js +8 -11
- package/.agents/scripts/lib/signals/span-tree.js +7 -7
- package/.agents/scripts/lib/signals/write.js +0 -1
- package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +17 -19
- package/.agents/scripts/lib/story-body/story-body.js +130 -75
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
- package/.agents/scripts/lib/validation-evidence.js +32 -60
- package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- package/.agents/scripts/lint-issue-body.js +71 -40
- package/.agents/scripts/mandrel-update-preflight.js +1 -1
- package/.agents/scripts/notify.js +4 -3
- package/.agents/scripts/plan-context.js +102 -80
- package/.agents/scripts/plan-persist.js +230 -279
- package/.agents/scripts/plan-run-epilogue.js +142 -0
- package/.agents/scripts/post-structured-comment.js +0 -38
- package/.agents/scripts/pr-watch-with-update.js +43 -22
- package/.agents/scripts/providers/github/compose.js +0 -1
- package/.agents/scripts/providers/github/errors.js +0 -19
- package/.agents/scripts/providers/github/issues.js +13 -39
- package/.agents/scripts/providers/github/mappers.js +5 -12
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -156
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/resolve-stories.js +236 -0
- package/.agents/scripts/run-coverage.js +4 -1
- package/.agents/scripts/run-lint.js +2 -2
- package/.agents/scripts/run-verify.js +31 -2
- package/.agents/scripts/signals-view.js +25 -21
- package/.agents/scripts/single-story-close.js +178 -26
- package/.agents/scripts/single-story-confirm-merge.js +313 -24
- package/.agents/scripts/single-story-init.js +35 -30
- package/.agents/scripts/stories-wave-tick.js +85 -10
- package/.agents/scripts/story-plan.js +28 -49
- package/.agents/scripts/update-ticket-state.js +14 -65
- package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
- package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
- package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
- package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
- package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
- package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
- package/.agents/skills/core/scope-triage/SKILL.md +31 -172
- package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
- package/.agents/skills/core/security-and-hardening/reference.md +375 -0
- package/.agents/skills/skills.index.json +3 -53
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +6 -7
- package/.agents/workflows/audit-clean-code.md +7 -7
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +9 -10
- package/.agents/workflows/audit-lighthouse.md +11 -3
- package/.agents/workflows/audit-navigability.md +13 -2
- package/.agents/workflows/audit-performance.md +5 -6
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +11 -12
- package/.agents/workflows/audit-security.md +4 -5
- package/.agents/workflows/audit-seo.md +13 -3
- package/.agents/workflows/audit-sre.md +3 -3
- package/.agents/workflows/audit-to-stories.md +20 -20
- package/.agents/workflows/audit-ux-ui.md +10 -3
- package/.agents/workflows/deliver.md +177 -176
- package/.agents/workflows/git-cleanup.md +5 -6
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
- package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
- package/.agents/workflows/helpers/code-review.md +75 -196
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
- package/.agents/workflows/helpers/deliver-story.md +606 -0
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/parallel-tooling.md +3 -3
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
- package/.agents/workflows/mandrel-update.md +2 -1
- package/.agents/workflows/plan.md +277 -145
- package/.agents/workflows/qa-assist.md +27 -33
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -6
- package/README.md +9 -8
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +70 -0
- package/lib/cli/registry.js +262 -19
- package/lib/cli/sync-agents.js +157 -0
- package/lib/cli/sync-commands.js +115 -6
- package/lib/cli/sync.js +168 -6
- package/lib/cli/update.js +105 -8
- package/lib/cli/version-helpers.js +131 -0
- package/lib/migrations/README.md +7 -5
- package/lib/migrations/index.js +12 -8
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
- package/package.json +2 -2
- package/.agents/agents/retro.md +0 -42
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer.md +0 -33
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/security-engineer.md +0 -111
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
- package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
- package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -66
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -852
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
- package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
- package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
- package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
- package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
- package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
- package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
- package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
- package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
- package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
- package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
- package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/slice-phase.js +0 -361
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -464
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
- package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
- package/.agents/workflows/helpers/deliver-epic.md +0 -998
- package/.agents/workflows/helpers/deliver-stories.md +0 -450
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -353
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- package/.agents/workflows/helpers/single-story-deliver.md +0 -557
|
@@ -1,557 +0,0 @@
|
|
|
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
|
-
> **Runtime core.** This file is the always-ingested standalone-Story path:
|
|
11
|
-
> step flow, commands, gate contracts, and the return contract. The lease /
|
|
12
|
-
> sweep mechanics, the worktree-scope safety warning, the CI-recovery
|
|
13
|
-
> procedures, and the Status-column reconciliation live in the sibling
|
|
14
|
-
> [`single-story-deliver-reference.md`](single-story-deliver-reference.md);
|
|
15
|
-
> each moved procedure keeps a one-line pointer at its trigger point below.
|
|
16
|
-
> The reference is not projected to `.claude/commands/` — it is consulted on
|
|
17
|
-
> demand.
|
|
18
|
-
|
|
19
|
-
## Overview
|
|
20
|
-
|
|
21
|
-
`/single-story-deliver` is the standalone counterpart to
|
|
22
|
-
[`/deliver`](deliver-stories.md). Use it for a Story that is **not**
|
|
23
|
-
attached to an Epic — refactors carved out of closed Epics, framework
|
|
24
|
-
maintenance, or any work small enough that the Epic-Centric ceremony
|
|
25
|
-
(sectioned Epic body + decomposition + dispatch manifest + cascade) would be
|
|
26
|
-
overhead rather than help.
|
|
27
|
-
|
|
28
|
-
```text
|
|
29
|
-
/single-story-deliver <storyId>
|
|
30
|
-
→ single-story-init.js (branch from main, worktree, agent::executing)
|
|
31
|
-
→ agent implements + commits (operator works in the worktree)
|
|
32
|
-
→ single-story-close.js (gates, push, gh pr create → main, agent::closing)
|
|
33
|
-
→ CI watch + fix loop (until all required checks pass + PR is merged)
|
|
34
|
-
→ single-story-confirm-merge.js (PR merged → agent::done, issue closes)
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
**When to use `/single-story-deliver` vs. `/deliver`:**
|
|
38
|
-
|
|
39
|
-
| Trait | `/single-story-deliver` | `/deliver` |
|
|
40
|
-
| ----------------------------- | ---------------------------------------------------- | ------------------------------------------------------- |
|
|
41
|
-
| Parent Epic | None (no `Epic: #N` in body) | Required (`Epic: #N` in body) |
|
|
42
|
-
| Branch base | `project.baseBranch` (default `main`) | `epic/<epicId>` |
|
|
43
|
-
| Merge target | `main` via PR | `epic/<epicId>` via `--no-ff` merge |
|
|
44
|
-
| Epic-branch integration | No | Yes — merged into `epic/<epicId>` at close |
|
|
45
|
-
| Dispatch manifest interaction | None | Read at init, regenerated at close |
|
|
46
|
-
| Story scope | Inline `acceptance[]` / `verify[]` on the Story body | Inline `acceptance[]` / `verify[]` on the Story body |
|
|
47
|
-
|
|
48
|
-
If the Story has an `Epic: #N` reference, use `/deliver`. If it
|
|
49
|
-
doesn't, use this workflow (or `/deliver` for several standalone
|
|
50
|
-
Stories at once).
|
|
51
|
-
|
|
52
|
-
## Prerequisites
|
|
53
|
-
|
|
54
|
-
1. A GitHub Issue with the `type::story` label and **no** `Epic: #N`
|
|
55
|
-
reference in its body.
|
|
56
|
-
2. `GITHUB_TOKEN` or `gh auth status` clean — `gh pr create` runs at close.
|
|
57
|
-
3. The base branch (`project.baseBranch`, default `main`) exists on
|
|
58
|
-
both local and `origin`.
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Step 0 — Initialize (`single-story-init.js`)
|
|
63
|
-
|
|
64
|
-
Run from the **main checkout** (the worktree does not exist yet):
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
node .agents/scripts/single-story-init.js --story <storyId>
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Flags: `--dry-run` (no git/ticket mutation), `--steal` (forcibly transfer a
|
|
71
|
-
foreign Story lease to this operator — see the lease note below).
|
|
72
|
-
|
|
73
|
-
> **Execution mode.** Like `story-init.js`, this command can take 3–6
|
|
74
|
-
> minutes when the worktree's per-tree install runs. Invoke synchronously
|
|
75
|
-
> with `Bash(timeout: 600000)`. Do **not** use `run_in_background` +
|
|
76
|
-
> `Monitor` — a sub-agent that exits mid-install leaves the worktree
|
|
77
|
-
> half-bootstrapped.
|
|
78
|
-
|
|
79
|
-
The script validates `type::story`, **acquires the Story lease**, fetches
|
|
80
|
-
`origin`, seeds `story-<id>` from `baseBranch`, materializes a worktree
|
|
81
|
-
(when `delivery.worktreeIsolation.enabled` is true), upserts a
|
|
82
|
-
`story-init` structured comment carrying `standalone: true`, and flips
|
|
83
|
-
the Story to `agent::executing`. It also reuses an existing `story-<id>`
|
|
84
|
-
branch (idempotent re-init) and runs a **merged-`story-*` sweep** between
|
|
85
|
-
fetch and branch-seed.
|
|
86
|
-
|
|
87
|
-
> **Lease preflight, branch reuse, and merged-sweep.** The standalone lease
|
|
88
|
-
> **fails closed** on a foreign assignee (there is no Epic-scoped
|
|
89
|
-
> heartbeat ledger to judge staleness) — coordinate or pass `--steal`. The
|
|
90
|
-
> sweep is guarded (per-candidate protection + cross-session lock) and
|
|
91
|
-
> never blocks init. See
|
|
92
|
-
> [`single-story-deliver-reference.md` § Step 0 — Lease preflight and merged-sweep](single-story-deliver-reference.md#step-0--lease-preflight-and-merged-sweep)
|
|
93
|
-
> for the fail-closed outcomes, the `--steal` contract, and the sweep
|
|
94
|
-
> hardening layers.
|
|
95
|
-
|
|
96
|
-
Capture `workCwd` from the result envelope. Add `--dry-run` to inspect
|
|
97
|
-
the planned actions without git or ticket mutations (dry-run also skips
|
|
98
|
-
the lease and the sweep).
|
|
99
|
-
|
|
100
|
-
**Remote evidence — land or block (issue #4483).** The envelope also
|
|
101
|
-
carries `remoteVerified` + `remoteProbe` (`git remote get-url origin` +
|
|
102
|
-
bounded `git ls-remote origin HEAD`). When `remoteVerified` is `false`,
|
|
103
|
-
transition the Story to `agent::blocked` quoting `remoteProbe.detail` and
|
|
104
|
-
stop. Implementing the Story inline outside the worktree/branch/PR path
|
|
105
|
-
and/or committing it to local `main` is expressly forbidden — the close
|
|
106
|
-
pipeline's push is the only sanctioned landing.
|
|
107
|
-
|
|
108
|
-
### Step 0.5 — `cd` into the workCwd
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
cd "<workCwd from Step 0 result>"
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
All subsequent commands run from this directory.
|
|
115
|
-
|
|
116
|
-
> **Worktree scope is not just the Bash cwd.** `cd <workCwd>` steers the
|
|
117
|
-
> Bash tool's cwd but does **not** scope the path-based Edit/Write/Read
|
|
118
|
-
> tools — you MUST prefix every such path with the absolute `workCwd` root or
|
|
119
|
-
> risk silently editing the main checkout. Close's wrong-tree guard (Story
|
|
120
|
-
> #3364) is a backstop, not a substitute. See
|
|
121
|
-
> [`single-story-deliver-reference.md` § Worktree scope is not just the Bash cwd](single-story-deliver-reference.md#worktree-scope-is-not-just-the-bash-cwd).
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## Step 1 — Implementation
|
|
126
|
-
|
|
127
|
-
A standalone Story is **atomic** — no wave dispatch and no Epic-scoped
|
|
128
|
-
cascade. Work happens in one or more commits on the `story-<id>`
|
|
129
|
-
branch, against the inline `acceptance[]` / `verify[]` arrays on the
|
|
130
|
-
Story body.
|
|
131
|
-
|
|
132
|
-
Operator/agent responsibilities while in the worktree:
|
|
133
|
-
|
|
134
|
-
1. Read the Story body. Treat its acceptance criteria as the contract.
|
|
135
|
-
|
|
136
|
-
**Docs context — digest-first.** A standalone Story has no parent Epic,
|
|
137
|
-
so there is usually no per-Epic docs digest to read. If the caller
|
|
138
|
-
provides a `docsDigestPath` (the per-Epic docs digest at
|
|
139
|
-
`temp/epic-<epicId>/docs-digest.md`), read that compact outline instead
|
|
140
|
-
of re-reading the full `project.docsContextFiles` set, and pull
|
|
141
|
-
individual docs files on demand (jump to the section at the line number
|
|
142
|
-
the digest names). When no digest path is provided, read a full doc
|
|
143
|
-
only when the Story's own context points you at one — do not ingest the
|
|
144
|
-
whole docs set up front. See
|
|
145
|
-
[`.agents/instructions.md` § 3](../../instructions.md).
|
|
146
|
-
|
|
147
|
-
**Write-time audit checklists.** The write-time local-lens checklist
|
|
148
|
-
threading (Story #4410) is wired on the Epic delivery path via
|
|
149
|
-
`epic-deliver-prepare.js`, which threads a per-Story `checklistPath` into
|
|
150
|
-
the maker prompt. When a standalone caller provides a `checklistPath`
|
|
151
|
-
(the repo-relative path to this Story's footprint-matched **local**-lens
|
|
152
|
-
authoring checklists, matched via `resolveLensTier(lens) === 'local'` +
|
|
153
|
-
`matchesAnyFilePattern` against the Story's predicted footprint — never
|
|
154
|
-
`selectAudits`, so no provider or git diff runs), read it before you
|
|
155
|
-
write and self-check your change against each listed concern as you
|
|
156
|
-
author it. When no `checklistPath` is provided, there is nothing extra to
|
|
157
|
-
read — the lens-aware coverage still runs maker-blind at Story-scope
|
|
158
|
-
review inside the close subprocess.
|
|
159
|
-
2. Implement the changes.
|
|
160
|
-
3. Commit on the Story branch. Conventional-commit format is encouraged
|
|
161
|
-
but not enforced — the PR title carries the canonical summary.
|
|
162
|
-
4. Iterate (read tests, run targeted gates, edit, commit) until the
|
|
163
|
-
acceptance criteria are met.
|
|
164
|
-
5. Run the **bounded acceptance self-eval loop** (Step 1a below) before
|
|
165
|
-
proceeding to close.
|
|
166
|
-
|
|
167
|
-
Recommended quick gates while iterating (each is fast enough to run on
|
|
168
|
-
save):
|
|
169
|
-
|
|
170
|
-
```bash
|
|
171
|
-
npm run typecheck
|
|
172
|
-
npm run lint
|
|
173
|
-
npm test -- --grep "<scope>"
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
The full close-validation chain runs in Step 3; the gates above are
|
|
177
|
-
advisory pre-flight.
|
|
178
|
-
|
|
179
|
-
> Conflict with `main` mid-implementation → resolve as you would any
|
|
180
|
-
> branch rebase. There is no `epic/<id>` intermediate, so the rebase
|
|
181
|
-
> base is `main` directly.
|
|
182
|
-
|
|
183
|
-
### Step 1a — Bounded acceptance self-eval loop (**required, not optional**)
|
|
184
|
-
|
|
185
|
-
After the implementation commits land and **before** you proceed to close, run
|
|
186
|
-
the bounded acceptance self-eval loop. The per-round critic mechanic (fresh-
|
|
187
|
-
context critic, `verify[]`-as-evidence, the verdict schema, and the
|
|
188
|
-
proceed / redraft / block decision) is the single-homed include
|
|
189
|
-
[`acceptance-self-eval.md`](acceptance-self-eval.md) — read it and follow it.
|
|
190
|
-
|
|
191
|
-
Standalone specifics for this path:
|
|
192
|
-
|
|
193
|
-
- **Critic evidence-share** (Story #4250). When the critic runs a `verify[]`
|
|
194
|
-
command that is byte-identical to a close gate (`lint` / `typecheck`), it
|
|
195
|
-
records the pass into the standalone evidence keyspace via `--standalone`
|
|
196
|
-
(no parent Epic to key on) so Step 3's close short-circuits the gate at
|
|
197
|
-
unchanged HEAD. Run it in the **Story worktree** (`workCwd` from Step 0):
|
|
198
|
-
|
|
199
|
-
```bash
|
|
200
|
-
node <main-repo>/.agents/scripts/evidence-gate.js \
|
|
201
|
-
--standalone --scope-id <storyId> --gate lint \
|
|
202
|
-
--worktree <workCwd> -- npm run lint
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
- **Gate invocation** (omit `--epic` — there is no parent Epic):
|
|
206
|
-
|
|
207
|
-
```bash
|
|
208
|
-
node <main-repo>/.agents/scripts/acceptance-eval.js \
|
|
209
|
-
--story <storyId> --verdict <verdict-path>
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
- **On `decision: "proceed"`** → proceed to Step 3 (close).
|
|
213
|
-
- **On `decision: "block"`** → **do not proceed to close.** Post a `friction`
|
|
214
|
-
comment naming the unmet criteria, then transition the Story to
|
|
215
|
-
`agent::blocked`:
|
|
216
|
-
|
|
217
|
-
```bash
|
|
218
|
-
node .agents/scripts/diagnose-friction.js --story <storyId> \
|
|
219
|
-
--cmd node .agents/scripts/acceptance-eval.js --story <storyId> --verdict <verdict-path>
|
|
220
|
-
node .agents/scripts/update-ticket-state.js --ticket <storyId> --state agent::blocked
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
---
|
|
224
|
-
|
|
225
|
-
## Step 2 — Validate (deferred to close)
|
|
226
|
-
|
|
227
|
-
`single-story-close.js` runs the canonical close-validation chain
|
|
228
|
-
(typecheck, lint, test, format, maintainability, coverage, crap) before
|
|
229
|
-
it pushes. Do **not** pre-run those gates here unless interactively
|
|
230
|
-
iterating on a fix.
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## Step 3 — Close (`single-story-close.js`)
|
|
235
|
-
|
|
236
|
-
Invoke from the main checkout (or pass `--cwd <main-repo>` from inside
|
|
237
|
-
the worktree):
|
|
238
|
-
|
|
239
|
-
```bash
|
|
240
|
-
node <main-repo>/.agents/scripts/single-story-close.js --story <storyId> --cwd <main-repo>
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
The script runs the close-validation gates against `baseBranch`, syncs the
|
|
244
|
-
Story branch from `origin/<baseBranch>` (Story #2580 — the parallel-race
|
|
245
|
-
defence), pushes `story-<id>`, opens (or reuses) a PR against `baseBranch`
|
|
246
|
-
with a `Closes #<storyId>` footer, enables GitHub native auto-merge
|
|
247
|
-
(`--auto --squash --delete-branch`) **when `delivery.ci.autoMerge` is
|
|
248
|
-
`"trust-ci"` (the default)**, flips the Story to **`agent::closing`**
|
|
249
|
-
(NOT `agent::done` — the issue stays OPEN until Step 5 confirms the merge,
|
|
250
|
-
Story #3385), reaps the worktree, and releases the Story lease.
|
|
251
|
-
|
|
252
|
-
> **`delivery.ci.autoMerge` policy (shared with the Epic path).** The
|
|
253
|
-
> standalone close honours the same config knob the Epic Phase 8.5 gate
|
|
254
|
-
> reads. Under the default `"trust-ci"`, GitHub native auto-merge is armed
|
|
255
|
-
> and the PR squash-merges once its **required** checks pass (GitHub's
|
|
256
|
-
> `--auto` is the required-check gate — no client-side predicate is needed
|
|
257
|
-
> here, unlike the Epic path, because a standalone Story runs no
|
|
258
|
-
> audit/review/retro phase to gate on). Under `"strict"`, the close **does
|
|
259
|
-
> not arm auto-merge** — the PR opens and waits for an **operator merge**,
|
|
260
|
-
> exactly as `--no-auto-merge` does per-run. This lets a consumer who tightens
|
|
261
|
-
> Epic merges with `"strict"` get the same operator-in-the-loop behaviour for
|
|
262
|
-
> standalone Stories.
|
|
263
|
-
|
|
264
|
-
Flags:
|
|
265
|
-
|
|
266
|
-
- `--skip-validation` — bypass the gates (Step 1). Use only when re-running
|
|
267
|
-
close after a fixed gate failure that's already known to pass.
|
|
268
|
-
- `--skip-sync` — bypass the base-sync (Story #2580). Use only after a
|
|
269
|
-
hand-resolved sync, or in tests.
|
|
270
|
-
- `--no-auto-merge` — disable auto-merge. Use when the PR materially changes
|
|
271
|
-
behaviour and warrants a pre-merge eyeball; the operator then merges via
|
|
272
|
-
the GitHub UI.
|
|
273
|
-
- `--wait-merge` — **headless must-land** (Story #4428, Epic #4425). Pass
|
|
274
|
-
this flag when driving `single-story-close.js` from an unattended /
|
|
275
|
-
headless context (no operator available to run Step 5 by hand — a CI
|
|
276
|
-
job, a scheduled `/loop`, or any wrapper that cannot rely on a human to
|
|
277
|
-
invoke `single-story-confirm-merge.js` later). Instead of resting at
|
|
278
|
-
`agent::closing` after arming, close polls the armed PR to merge
|
|
279
|
-
confirmation on the `delivery.mergeWatch.*` cadence (reusing the same
|
|
280
|
-
`confirmStoryMerged` flip logic Step 5 calls) and flips `agent::done`
|
|
281
|
-
itself. If the arm fails, the PR closes without merging, or the poll
|
|
282
|
-
budget is exhausted first, close classifies the block
|
|
283
|
-
(`checks-pending-timeout` \| `branch-protection-human-required` \|
|
|
284
|
-
`arm-failure` \| `api-race-other`), emits a `merge.unlanded` lifecycle
|
|
285
|
-
event, posts a `friction` comment, transitions the Story to
|
|
286
|
-
`agent::blocked`, and exits non-zero — never a silent `agent::closing`
|
|
287
|
-
rest. **Attended runs must not pass this flag** — the default (no flag)
|
|
288
|
-
preserves the exit-at-`agent::closing` behaviour documented in Step 3
|
|
289
|
-
and Step 5 below.
|
|
290
|
-
- `--no-wait-merge` — explicit opt-out that always wins over `--wait-merge`
|
|
291
|
-
(including for a caller that otherwise defaults to headless mode). Use
|
|
292
|
-
when a headless wrapper still wants to manage merge confirmation itself
|
|
293
|
-
(e.g. via its own `single-story-confirm-merge.js` invocation) rather than
|
|
294
|
-
have close block the turn.
|
|
295
|
-
|
|
296
|
-
> **Full close pipeline (base-sync outcomes, `agent::closing` rationale,
|
|
297
|
-
> lease release).** For the numbered close pipeline, the base-sync outcome
|
|
298
|
-
> table (no-op / conflict → `agent::blocked` / fetch-failed), and why the
|
|
299
|
-
> issue stays OPEN at `agent::closing`, see
|
|
300
|
-
> [`single-story-deliver-reference.md` § Step 3 — Close pipeline detail](single-story-deliver-reference.md#step-3--close-pipeline-detail).
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
## Step 4 — CI watch + fix loop (**required, not optional**)
|
|
305
|
-
|
|
306
|
-
> **Headless (`--wait-merge`) runs skip Steps 4 and 5.** When Step 3 passed
|
|
307
|
-
> `--wait-merge`, `single-story-close.js` already polled the PR to a
|
|
308
|
-
> confirmed merge (flipping `agent::done` itself) or exited non-zero after
|
|
309
|
-
> transitioning the Story to `agent::blocked` with a `merge.unlanded`
|
|
310
|
-
> event — there is no separate CI-watch turn or manual confirm step to run.
|
|
311
|
-
> Proceed straight to Step 5.5. Attended runs (the default) still own
|
|
312
|
-
> Steps 4 and 5 as documented below.
|
|
313
|
-
|
|
314
|
-
The Story is **not done** when `single-story-close.js` returns. Auto-merge
|
|
315
|
-
only fires when every required CI check turns green. Local close-validation
|
|
316
|
-
gates pass on the dev host's environment; CI runs on a different OS and
|
|
317
|
-
concurrency, and coverage rounding, platform-conditional branches, and
|
|
318
|
-
timing-sensitive tests routinely drift between the two. The agent owns the
|
|
319
|
-
green-CI outcome, not just the push.
|
|
320
|
-
|
|
321
|
-
> **The auto-merge wait is an internally-blocking step, not a reason to end
|
|
322
|
-
> your turn.** `pr-watch-with-update.js` blocks the current turn until CI
|
|
323
|
-
> resolves — that IS how you wait. Keep the turn alive: watch → (fix +
|
|
324
|
-
> push + re-watch on red) → confirm the merge (Step 5) → flip
|
|
325
|
-
> `agent::done` → post-merge steps → return the terminal JSON contract.
|
|
326
|
-
> Ending the turn with prose and an unconfirmed merge is a contract
|
|
327
|
-
> violation (the Story #1553 / PR #1554 failure mode). See
|
|
328
|
-
> [`single-story-deliver-reference.md` § The auto-merge wait is an internally-blocking step](single-story-deliver-reference.md#the-auto-merge-wait-is-an-internally-blocking-step).
|
|
329
|
-
|
|
330
|
-
After `single-story-close.js` succeeds, enter the watch + fix loop. Drive
|
|
331
|
-
`pr-watch-with-update.js` — the **single CI-watch mechanism** shared with
|
|
332
|
-
the Epic Phase 8 path (Story #4358). It polls the required checks to a
|
|
333
|
-
terminal state and auto-recovers from `mergeStateStatus: BEHIND`; do
|
|
334
|
-
**not** fall back to a bare `gh pr checks` watch invocation:
|
|
335
|
-
|
|
336
|
-
```bash
|
|
337
|
-
node <agentRoot>/scripts/pr-watch-with-update.js --pr <prNumber>
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
Poll cadence and caps come from `delivery.ci.watch.*`
|
|
341
|
-
(`pollIntervalMs`, `maxPolls`, `maxResumes`); pass `--poll-interval-ms`,
|
|
342
|
-
`--max-polls`, or `--max-resumes` to override for one run.
|
|
343
|
-
|
|
344
|
-
When the watch exits, branch on the exit code:
|
|
345
|
-
|
|
346
|
-
- **Exit 0 (all checks ✓)** — auto-merge will fire (or has already). The
|
|
347
|
-
Story is still at `agent::closing` with its issue OPEN. **Proceed to
|
|
348
|
-
Step 5 within the same turn** — green CI is the *start* of the
|
|
349
|
-
merge-confirm sequence, not a terminal state.
|
|
350
|
-
- **Exit 1 (a check genuinely failed)** — diagnose, fix, and push a new
|
|
351
|
-
commit on `story-<storyId>`, then re-watch. Auto-merge stays enabled
|
|
352
|
-
across retries; no need to re-arm it. The Story stays at
|
|
353
|
-
`agent::closing` throughout, so a failed/abandoned PR never strands a
|
|
354
|
-
CLOSED issue. If the same failure class recurs, hand convergence off to a
|
|
355
|
-
self-paced host loop (`/loop`) that re-runs the failing check and applies
|
|
356
|
-
the smallest fix until it exits green.
|
|
357
|
-
- **Exit 2 (still-running — slow CI, not red)** — the poll cap fired with
|
|
358
|
-
checks still pending and the watcher exhausted its resume budget with
|
|
359
|
-
nothing red. This is **never** a failure. Hand the wait off to the
|
|
360
|
-
host's interval loop rather than ending your turn: `/loop 5m` polling
|
|
361
|
-
`gh pr checks` until the checks settle.
|
|
362
|
-
|
|
363
|
-
> **Triage authority.** How to classify and remediate a red (or repeatedly
|
|
364
|
-
> slow) check — the root-cause-only decision tree for infra/transient and
|
|
365
|
-
> flaky failures (reproduce → check `main` → bisect env vs code → fix in-scope
|
|
366
|
-
> or file a `meta::framework-gap` issue), the never-rerun / never-quarantine
|
|
367
|
-
> prohibitions, and the escalation criteria (three-strikes, the 30-minute
|
|
368
|
-
> wall-clock timebox, and the clearly-environmental fast path) — is defined
|
|
369
|
-
> once in [`.agents/rules/ci-remediation.md`](../../rules/ci-remediation.md).
|
|
370
|
-
> Read it before remediating a red check above.
|
|
371
|
-
>
|
|
372
|
-
> **CI recovery procedures.** For resurrecting the worktree after
|
|
373
|
-
> `reapOnSuccess`, pulling the failing job log, fixing coverage/CRAP
|
|
374
|
-
> baselines without re-running close-validation, and the when-to-stop
|
|
375
|
-
> Anti-Thrashing rules, see
|
|
376
|
-
> [`single-story-deliver-reference.md` § Step 4 — CI watch + fix recovery](single-story-deliver-reference.md#step-4--ci-watch--fix-recovery).
|
|
377
|
-
|
|
378
|
-
---
|
|
379
|
-
|
|
380
|
-
## Step 5 — Merge confirmation + `agent::done` flip (**required, not optional**)
|
|
381
|
-
|
|
382
|
-
With auto-merge enabled (default), GitHub squash-merges the PR when
|
|
383
|
-
every required check turns green and the `Closes #<id>` footer
|
|
384
|
-
auto-closes the Story issue.
|
|
385
|
-
|
|
386
|
-
Confirm the merge landed:
|
|
387
|
-
|
|
388
|
-
```bash
|
|
389
|
-
gh pr view <prNumber> --json state,mergedAt,mergeCommit
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
Expect `state: "MERGED"`. With `--no-auto-merge`, the PR is the merge
|
|
393
|
-
gate — the operator reviews and merges via the GitHub UI; the same
|
|
394
|
-
`Closes #<id>` auto-close fires when the merge lands on `main`.
|
|
395
|
-
|
|
396
|
-
**Then flip the Story to `agent::done`.** Step 3 deferred this flip
|
|
397
|
-
(Story #3385); now that the merge is confirmed, drive the
|
|
398
|
-
`agent::closing → agent::done` transition (which closes the issue) via:
|
|
399
|
-
|
|
400
|
-
```bash
|
|
401
|
-
node .agents/scripts/single-story-confirm-merge.js --story <storyId> --cwd <main-repo>
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
> **Confirmation outcomes.** `single-story-confirm-merge.js` re-reads the
|
|
405
|
-
> live PR state and flips to `agent::done` only on a confirmed `MERGED` PR;
|
|
406
|
-
> it is idempotent and safe to re-run while the PR is still open (returns
|
|
407
|
-
> `pending`). See
|
|
408
|
-
> [`single-story-deliver-reference.md` § Step 5 — Merge confirmation detail](single-story-deliver-reference.md#step-5--merge-confirmation-detail).
|
|
409
|
-
|
|
410
|
-
---
|
|
411
|
-
|
|
412
|
-
## Step 5.5 — Re-assert Status column (**required, not optional**)
|
|
413
|
-
|
|
414
|
-
GitHub Projects v2 built-in workflows fire minutes *after* auto-merge lands
|
|
415
|
-
and clobber the `Done` Status the confirm step set, stranding closed
|
|
416
|
-
Stories at `In Progress` on the board (reproduced on Story #2813).
|
|
417
|
-
Re-assert authority once the merge confirms:
|
|
418
|
-
|
|
419
|
-
```bash
|
|
420
|
-
node .agents/scripts/resync-status-column.js --story <storyId>
|
|
421
|
-
```
|
|
422
|
-
|
|
423
|
-
The helper re-fires the `ColumnSync` mutation and **polls for ~15 s** to win
|
|
424
|
-
the race against the bot's late write (Story #2876). It is idempotent and
|
|
425
|
-
no-op-safe (`no-project` / `not-on-project` exit 0). Skip Step 5.5 only when
|
|
426
|
-
the operator opted out of auto-merge AND has not yet merged the PR — run it
|
|
427
|
-
after the manual merge instead.
|
|
428
|
-
|
|
429
|
-
> **Status-column detail + tuning flags + operator fix.** For the poll-loop
|
|
430
|
-
> flags (`--poll-attempts`, `--poll-delay-ms`), the `attempts` / `drifted`
|
|
431
|
-
> envelope semantics, and the canonical
|
|
432
|
-
> `--reap-conflicting-workflows` operator fix, see
|
|
433
|
-
> [`single-story-deliver-reference.md` § Step 5.5 — Re-assert Status column detail](single-story-deliver-reference.md#step-55--re-assert-status-column-detail).
|
|
434
|
-
|
|
435
|
-
---
|
|
436
|
-
|
|
437
|
-
## Step 6 — Local branch cleanup (**required, not optional**)
|
|
438
|
-
|
|
439
|
-
GitHub deletes the **remote** branch on auto-merge, but the **local**
|
|
440
|
-
`story-<storyId>` ref lingers in the main checkout until something prunes
|
|
441
|
-
it. After Step 5 confirms `state: "MERGED"`, prune the story ref **and**
|
|
442
|
-
fast-forward local `main` (or `project.baseBranch`):
|
|
443
|
-
|
|
444
|
-
```bash
|
|
445
|
-
node .agents/scripts/git-cleanup.js \
|
|
446
|
-
--execute \
|
|
447
|
-
--remote \
|
|
448
|
-
--yes \
|
|
449
|
-
--fast-forward-main \
|
|
450
|
-
--branches \
|
|
451
|
-
--include "story-<storyId>"
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
`--fast-forward-main` brings local `main` current (the next init seeds from
|
|
455
|
-
it), `--branches` + `--include` reap only this Story's ref, and
|
|
456
|
-
`--execute --remote --yes` run the deletes non-interactively. The sweep is
|
|
457
|
-
idempotent and safe to run before `MERGED` confirms. Skip Step 6 only when
|
|
458
|
-
the operator opted out via `--no-auto-merge` AND has not yet merged the PR —
|
|
459
|
-
run the cleanup after the manual merge lands.
|
|
460
|
-
|
|
461
|
-
> **Why local `main` goes stale + per-flag behaviour.** For the stale-`main`
|
|
462
|
-
> mechanism and the full `--fast-forward-main` / `--branches` / `--include`
|
|
463
|
-
> flag semantics, see
|
|
464
|
-
> [`single-story-deliver-reference.md` § Step 6 — Local branch cleanup detail](single-story-deliver-reference.md#step-6--local-branch-cleanup-detail).
|
|
465
|
-
|
|
466
|
-
---
|
|
467
|
-
|
|
468
|
-
## Step 7 — Return contract (**required when dispatched as a sub-agent**) {#return-contract}
|
|
469
|
-
|
|
470
|
-
When this workflow runs as a per-Story sub-agent (dispatched by `/deliver`
|
|
471
|
-
via [`deliver-stories.md` § 2a/2c](deliver-stories.md)), the **only**
|
|
472
|
-
acceptable way to end your turn is to **return a single terminal JSON status
|
|
473
|
-
object** — never free-form prose:
|
|
474
|
-
|
|
475
|
-
```json
|
|
476
|
-
{
|
|
477
|
-
"storyId": <number>,
|
|
478
|
-
"status": "done" | "blocked" | "failed",
|
|
479
|
-
"phase": "init|implementing|closing|blocked|done",
|
|
480
|
-
"branchDeleted": <boolean>,
|
|
481
|
-
"blockerCommentId": <string|null>,
|
|
482
|
-
"detail": "<one-liner: what changed + what was verified, e.g. PR #N merged>",
|
|
483
|
-
"renderedBody": "<terminal Story body>"
|
|
484
|
-
}
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
This is the same envelope [`deliver-stories.md` § 2c](deliver-stories.md)
|
|
488
|
-
mandates; this section is its single-homed restatement for the standalone
|
|
489
|
-
worker so the contract is self-contained when this workflow is the entry
|
|
490
|
-
point.
|
|
491
|
-
|
|
492
|
-
There is **no fourth "pending" status** — the CI/auto-merge wait is handled
|
|
493
|
-
internally by blocking on `pr-watch-with-update.js` (Step 4) and confirming
|
|
494
|
-
the merge (Step 5). Return **only** on a confirmed `MERGED` PR (`status: "done"`),
|
|
495
|
-
an `agent::blocked` transition (`status: "blocked"`), or an unrecoverable
|
|
496
|
-
failure (`status: "failed"`).
|
|
497
|
-
|
|
498
|
-
> **No-park rule + per-status contract + handoff discipline.** For the full
|
|
499
|
-
> terminal-status contract (what each status requires), why a prose hand-off
|
|
500
|
-
> with an unconfirmed merge is the very bug this workflow prevents, and the
|
|
501
|
-
> report-state-not-process handoff discipline, see
|
|
502
|
-
> [`single-story-deliver-reference.md` § Step 7 — Return-contract detail](single-story-deliver-reference.md#step-7--return-contract-detail).
|
|
503
|
-
|
|
504
|
-
---
|
|
505
|
-
|
|
506
|
-
## Idempotence
|
|
507
|
-
|
|
508
|
-
- `single-story-init.js` re-prints the same `workCwd` without recreating
|
|
509
|
-
the worktree when one already exists for `story-<id>`.
|
|
510
|
-
- `single-story-close.js` short-circuits when the Story is already
|
|
511
|
-
closed (returns `{ action: 'noop', reason: 'already-closed' }`).
|
|
512
|
-
- `single-story-confirm-merge.js` short-circuits when the Story already
|
|
513
|
-
carries `agent::done` or the issue is already closed (returns
|
|
514
|
-
`{ action: 'noop', reason: 'already-done' }`), and is safe to re-run
|
|
515
|
-
while the PR is still open (returns `{ action: 'pending', ... }` without
|
|
516
|
-
mutating the Story).
|
|
517
|
-
- The PR probe (`gh pr list --head <branch> --state open`) reuses an
|
|
518
|
-
existing open PR rather than opening a duplicate.
|
|
519
|
-
|
|
520
|
-
Re-running `/single-story-deliver` against an already-closed Story is
|
|
521
|
-
safe.
|
|
522
|
-
|
|
523
|
-
---
|
|
524
|
-
|
|
525
|
-
## Constraints
|
|
526
|
-
|
|
527
|
-
- **Never** push the Story branch directly to `main`. The PR is the only
|
|
528
|
-
merge surface.
|
|
529
|
-
- **Always** `cd` into the `workCwd` returned by Step 0 before editing,
|
|
530
|
-
**and** prefix every path-based Edit/Write/Read with that absolute
|
|
531
|
-
`workCwd` root — the `cd` alone does not scope the path-based tools (see
|
|
532
|
-
Step 0.5). Editing a bare main-checkout path lands the change in the wrong
|
|
533
|
-
tree; close's wrong-tree guard (Story #3364) aborts when it detects this.
|
|
534
|
-
- **Handoff discipline — report state, not process.** When you hand back to
|
|
535
|
-
your caller (the `/deliver` aggregator or the interactive operator),
|
|
536
|
-
report essential terminal state only: the Story branch, the closing commit
|
|
537
|
-
SHA, what changed, and what was verified. Mirror the fields the close
|
|
538
|
-
pipeline already emits (`single-story-close.js` / `story-phase.js`
|
|
539
|
-
envelopes, the `story-run-progress` snapshot) rather than inventing a new
|
|
540
|
-
contract. Do not narrate the steps you took, and do not prescribe how the
|
|
541
|
-
next stage should do its work. Prose process commentary only bloats the
|
|
542
|
-
hydrated prompt (`delivery.maxTokenBudget` elision).
|
|
543
|
-
- **Label transitions**: drive every `agent::*` state change through
|
|
544
|
-
`node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
|
|
545
|
-
This CLI is the authoritative mechanism — there is no separate
|
|
546
|
-
state-mutation MCP server to degrade from (see
|
|
547
|
-
[`.agents/instructions.md` § 1.D](../../instructions.md)).
|
|
548
|
-
|
|
549
|
-
---
|
|
550
|
-
|
|
551
|
-
## See also
|
|
552
|
-
|
|
553
|
-
- [`/deliver`](deliver-stories.md) — several standalone Stories at
|
|
554
|
-
once (dependency-aware waves).
|
|
555
|
-
- [`/deliver`](deliver-epic.md) — full Epic wave loop.
|
|
556
|
-
- [`single-story-deliver-reference.md`](single-story-deliver-reference.md) —
|
|
557
|
-
lease, sweep, CI-recovery, and Status-column reference detail.
|