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
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
Execute one Story end-to-end. Creates story-<id> from main, implements in a
|
|
4
|
+
worktree (optional ## Slicing checkpoints), runs derived-level ceremony,
|
|
5
|
+
opens a PR against main, and lands.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /deliver-story #[Story ID]
|
|
9
|
+
|
|
10
|
+
> **Runtime core.** Always-ingested per-Story delivery path. Lease / sweep /
|
|
11
|
+
> CI-recovery detail lives in
|
|
12
|
+
> [`deliver-story-reference.md`](deliver-story-reference.md); consult on demand.
|
|
13
|
+
> Invoked by [`/deliver`](../deliver.md) for every Story (N=1 and N>1).
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
`/deliver-story` is the **one** delivery engine in v2. Every Story — trivial or
|
|
18
|
+
large — uses the same machinery:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
/deliver <storyId> [<storyId> ...] (each Story runs through this engine)
|
|
22
|
+
→ single-story-init.js (branch from main, worktree, agent::executing)
|
|
23
|
+
→ agent implements + commits (optional ## Slicing intra-session checkpoints)
|
|
24
|
+
→ derived-level ceremony (acceptance critics · review depth)
|
|
25
|
+
→ single-story-close.js (gates, push, gh pr create → main, agent::closing)
|
|
26
|
+
→ CI watch + fix loop (until required checks pass + PR merged)
|
|
27
|
+
→ single-story-confirm-merge.js (PR merged → agent::done + follow-ups)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| Trait | v2 `/deliver-story` |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| Ticket type | `type::story` only |
|
|
33
|
+
| Branch | `story-<id>` seeded from `project.baseBranch` (`main`) |
|
|
34
|
+
| Merge target | `main` via PR (squash + required checks) |
|
|
35
|
+
| Epic integration branch | **None** — no `epic/<id>`, no `--no-ff` wave merge |
|
|
36
|
+
| Spec / slices | Folded `## Spec` + optional `## Slicing` checkpoints in-session |
|
|
37
|
+
| Ceremony | Per-Story, routed off the derived change level via `ceremony-routing.js` |
|
|
38
|
+
|
|
39
|
+
If the Story still carries an `Epic: #N` reference, **stop** — that is a v1
|
|
40
|
+
Epic-attached ticket; re-plan as a v2 Story or finish it on a pre-v2 checkout.
|
|
41
|
+
|
|
42
|
+
## Prerequisites
|
|
43
|
+
|
|
44
|
+
1. A GitHub Issue with the `type::story` label and **no** `Epic: #N`
|
|
45
|
+
reference in its body.
|
|
46
|
+
2. `GITHUB_TOKEN` or `gh auth status` clean — `gh pr create` runs at close.
|
|
47
|
+
3. The base branch (`project.baseBranch`, default `main`) exists on
|
|
48
|
+
both local and `origin`.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Step 0 — Initialize (`single-story-init.js`)
|
|
53
|
+
|
|
54
|
+
Run from the **main checkout** (the worktree does not exist yet):
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
node .agents/scripts/single-story-init.js --story <storyId>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Flags: `--dry-run` (no git/ticket mutation), `--steal` (forcibly transfer a
|
|
61
|
+
foreign Story lease to this operator — see the lease note below).
|
|
62
|
+
|
|
63
|
+
> **Execution mode.** `single-story-init.js` can take 3–6 minutes when the
|
|
64
|
+
> worktree's per-tree install runs. Invoke synchronously with
|
|
65
|
+
> `Bash(timeout: 600000)`. Do **not** use `run_in_background` + `Monitor` —
|
|
66
|
+
> a sub-agent that exits mid-install leaves the worktree half-bootstrapped.
|
|
67
|
+
|
|
68
|
+
The script validates `type::story`, **acquires the Story lease**, fetches
|
|
69
|
+
`origin`, seeds `story-<id>` from `baseBranch`, materializes a worktree
|
|
70
|
+
(when `delivery.worktreeIsolation.enabled` is true), upserts a
|
|
71
|
+
`story-init` structured comment carrying `standalone: true`, and flips
|
|
72
|
+
the Story to `agent::executing`. It also reuses an existing `story-<id>`
|
|
73
|
+
branch (idempotent re-init) and runs a **merged-`story-*` sweep** between
|
|
74
|
+
fetch and branch-seed.
|
|
75
|
+
|
|
76
|
+
> **Lease preflight, branch reuse, and merged-sweep.** The standalone lease
|
|
77
|
+
> **fails closed** on a foreign assignee (there is no Epic-scoped
|
|
78
|
+
> heartbeat ledger to judge staleness) — coordinate or pass `--steal`. The
|
|
79
|
+
> sweep is guarded (per-candidate protection + cross-session lock) and
|
|
80
|
+
> never blocks init. See
|
|
81
|
+
> [`deliver-story-reference.md` § Step 0 — Lease preflight and merged-sweep](deliver-story-reference.md#step-0--lease-preflight-and-merged-sweep)
|
|
82
|
+
> for the fail-closed outcomes, the `--steal` contract, and the sweep
|
|
83
|
+
> hardening layers.
|
|
84
|
+
|
|
85
|
+
Capture `workCwd` from the result envelope. Add `--dry-run` to inspect
|
|
86
|
+
the planned actions without git or ticket mutations (dry-run also skips
|
|
87
|
+
the lease and the sweep).
|
|
88
|
+
|
|
89
|
+
**Remote evidence — land or block (issue #4483).** The envelope also
|
|
90
|
+
carries `remoteVerified` + `remoteProbe` (`git remote get-url origin` +
|
|
91
|
+
bounded `git ls-remote origin HEAD`). When `remoteVerified` is `false`,
|
|
92
|
+
transition the Story to `agent::blocked` quoting `remoteProbe.detail` and
|
|
93
|
+
stop. Implementing the Story inline outside the worktree/branch/PR path
|
|
94
|
+
and/or committing it to local `main` is expressly forbidden — the close
|
|
95
|
+
pipeline's push is the only sanctioned landing.
|
|
96
|
+
|
|
97
|
+
### Step 0.5 — `cd` into the workCwd
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
cd "<workCwd from Step 0 result>"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
All subsequent commands run from this directory.
|
|
104
|
+
|
|
105
|
+
> **Worktree scope is not just the Bash cwd.** `cd <workCwd>` steers the
|
|
106
|
+
> Bash tool's cwd but does **not** scope the path-based Edit/Write/Read
|
|
107
|
+
> tools — you MUST prefix every such path with the absolute `workCwd` root or
|
|
108
|
+
> risk silently editing the main checkout. Close's wrong-tree guard (Story
|
|
109
|
+
> #3364) is a backstop, not a substitute. See
|
|
110
|
+
> [`deliver-story-reference.md` § Worktree scope is not just the Bash cwd](deliver-story-reference.md#worktree-scope-is-not-just-the-bash-cwd).
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Step 1 — Implementation
|
|
115
|
+
|
|
116
|
+
A Story is **atomic** — one `story-<id>` branch, one PR to `main`. Work
|
|
117
|
+
happens in one or more commits against the inline `acceptance[]` /
|
|
118
|
+
`verify[]` arrays (and the folded `## Spec` when present).
|
|
119
|
+
|
|
120
|
+
Operator/agent responsibilities while in the worktree:
|
|
121
|
+
|
|
122
|
+
1. Read the Story body. Treat its acceptance criteria as the contract.
|
|
123
|
+
|
|
124
|
+
**Docs context — digest-first.** Read a full doc only when the Story's
|
|
125
|
+
own context points you at one — do not ingest the whole
|
|
126
|
+
`project.docsContextFiles` set up front. If the caller provides a
|
|
127
|
+
`docsDigestPath`, prefer that compact outline and pull individual files
|
|
128
|
+
on demand. See [`.agents/instructions.md` § 3](../../instructions.md).
|
|
129
|
+
|
|
130
|
+
**Write-time audit checklists.** When the caller provides a
|
|
131
|
+
`checklistPath` (footprint-matched **local**-lens authoring checklists),
|
|
132
|
+
read it before you write and self-check as you author. When absent,
|
|
133
|
+
lens-aware coverage still runs maker-blind at Story-scope review inside
|
|
134
|
+
the close subprocess.
|
|
135
|
+
2. Implement the changes. When the body has a `## Slicing` / Delivery
|
|
136
|
+
Slicing table, walk rows as **intra-session checkpoints** (commit +
|
|
137
|
+
flip each row when done) — never as sibling tickets.
|
|
138
|
+
3. Commit on the Story branch. Conventional-commit format is encouraged
|
|
139
|
+
but not enforced — the PR title carries the canonical summary.
|
|
140
|
+
4. Iterate (read tests, run targeted gates, edit, commit) until the
|
|
141
|
+
acceptance criteria are met.
|
|
142
|
+
5. Run the **bounded acceptance self-eval loop** (Step 1a below) before
|
|
143
|
+
ceremony / close.
|
|
144
|
+
|
|
145
|
+
Recommended quick gates while iterating (each is fast enough to run on
|
|
146
|
+
save):
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npm run typecheck
|
|
150
|
+
npm run lint
|
|
151
|
+
npm test -- --grep "<scope>"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
The full close-validation chain runs in Step 3; the gates above are
|
|
155
|
+
advisory pre-flight.
|
|
156
|
+
|
|
157
|
+
> Conflict with `main` mid-implementation → resolve as you would any
|
|
158
|
+
> branch rebase. There is no `epic/<id>` intermediate, so the rebase
|
|
159
|
+
> base is `main` directly.
|
|
160
|
+
|
|
161
|
+
### Step 1a — Bounded acceptance self-eval loop (**required, not optional**)
|
|
162
|
+
|
|
163
|
+
After the implementation commits land and **before** you proceed to close, run
|
|
164
|
+
the bounded acceptance self-eval loop. The per-round critic mechanic (fresh-
|
|
165
|
+
context critic, `verify[]`-as-evidence, the verdict schema, and the
|
|
166
|
+
proceed / redraft / block decision) is the single-homed include
|
|
167
|
+
[`acceptance-self-eval.md`](acceptance-self-eval.md) — read it and follow it.
|
|
168
|
+
|
|
169
|
+
Story-path specifics:
|
|
170
|
+
|
|
171
|
+
- **Critic evidence-share** (Story #4250). When the critic runs a `verify[]`
|
|
172
|
+
command that is byte-identical to a close gate (`lint` / `typecheck`), it
|
|
173
|
+
records the pass into the Story evidence keyspace via `--standalone` so
|
|
174
|
+
Step 3's close short-circuits the gate at unchanged HEAD. Run it in the
|
|
175
|
+
**Story worktree** (`workCwd` from Step 0):
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
node <main-repo>/.agents/scripts/evidence-gate.js \
|
|
179
|
+
--standalone --scope-id <storyId> --gate lint \
|
|
180
|
+
--worktree <workCwd> -- npm run lint
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
- **Gate invocation** (omit `--epic`):
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
node <main-repo>/.agents/scripts/acceptance-eval.js \
|
|
187
|
+
--story <storyId> --verdict <verdict-path>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
- **On `decision: "proceed"`** → proceed to Step 2 (ceremony) then Step 3.
|
|
191
|
+
- **On `decision: "block"`** → **do not proceed to close.** Post a `friction`
|
|
192
|
+
comment naming the unmet criteria, then transition the Story to
|
|
193
|
+
`agent::blocked`:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
node .agents/scripts/diagnose-friction.js --story <storyId> \
|
|
197
|
+
--cmd node .agents/scripts/acceptance-eval.js --story <storyId> --verdict <verdict-path>
|
|
198
|
+
node .agents/scripts/update-ticket-state.js --ticket <storyId> --state agent::blocked
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Step 2 — Ceremony (profile + derived level)
|
|
204
|
+
|
|
205
|
+
Per-Story ceremony is selected by `delivery.routing.ceremonyProfile`
|
|
206
|
+
(`minimal` | `standard` | `strict`, default `standard`) and the Story's
|
|
207
|
+
**derived change level** — not a planner-authored verdict (Story #4542 retired
|
|
208
|
+
that). Derive the level with
|
|
209
|
+
[`deriveChangeLevel`](../../scripts/lib/orchestration/review-depth.js) over the
|
|
210
|
+
Story's changed files (`git diff --name-only main...story-<id>`): a diff
|
|
211
|
+
touching a sensitive path registered in `.agents/schemas/audit-rules.json`
|
|
212
|
+
derives `high`, one touching none derives `low`, and an unenumerable diff
|
|
213
|
+
derives `null`.
|
|
214
|
+
|
|
215
|
+
Resolve fresh-vs-inline acceptance critics per AC-cluster with
|
|
216
|
+
[`resolveCeremonyForRisk`](../../scripts/lib/orchestration/ceremony-routing.js)
|
|
217
|
+
(`minimal` → always inline; `strict` → always fresh; `standard` →
|
|
218
|
+
`high`/`null` → `fresh`, `low` → `inline` unless the `freshCriticSampleRate`
|
|
219
|
+
floor forces `fresh`). Review depth reads the same derived level via
|
|
220
|
+
`review-depth.js` inside close, so the two decisions cannot disagree.
|
|
221
|
+
|
|
222
|
+
Hard gates (lint / test / format / coverage / CRAP / maintainability) always
|
|
223
|
+
run in Step 3 — the derived level never disables them. Do **not** pre-run the
|
|
224
|
+
full close-validation chain here unless interactively iterating on a fix.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Step 3 — Close and land (`single-story-close.js`)
|
|
229
|
+
|
|
230
|
+
Invoke from the main checkout (or pass `--cwd <main-repo>` from inside
|
|
231
|
+
the worktree):
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
node <main-repo>/.agents/scripts/single-story-close.js --story <storyId> --cwd <main-repo>
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**This step is the whole delivery tail.** Close owns the gates, the PR, the
|
|
238
|
+
merge wait, the `agent::done` flip, and the post-land tail (follow-up
|
|
239
|
+
capture, status-column resync, local ref cleanup, base fast-forward) in one
|
|
240
|
+
process. Your job is to run it and **branch on the terminal envelope's
|
|
241
|
+
`status`** — nothing more (Story #4543).
|
|
242
|
+
|
|
243
|
+
### Branch on the terminal envelope
|
|
244
|
+
|
|
245
|
+
Every invocation emits exactly one schema-validated envelope
|
|
246
|
+
([`story-deliver-terminal.schema.json`](../../schemas/story-deliver-terminal.schema.json))
|
|
247
|
+
between `--- STORY DELIVER TERMINAL ---` markers, and the exit code mirrors
|
|
248
|
+
its `status`:
|
|
249
|
+
|
|
250
|
+
| `status` | Exit | What it means | What you do |
|
|
251
|
+
| --- | --- | --- | --- |
|
|
252
|
+
| `landed` | 0 | PR merged, Story `agent::done`, tail ran. `tail.*` booleans expose any partial degradation — a `false` there does **not** demote the land. | Go to Step 7 and relay the envelope. Nothing else. |
|
|
253
|
+
| `pending` | 3 | **Resumable, not a failure.** The per-invocation merge wait expired with the PR healthy and in flight, or the operator owns the merge. No label was mutated; no `merge.unlanded` was emitted. | Run the envelope's `nextCommand`. Repeat until it resolves. Relay `pending` only once you have exhausted your own budget. |
|
|
254
|
+
| `blocked` | 1 | A classified hard block. Story carries `agent::blocked`; `blocked.blockClass` names the class and `blocked.frictionCommentId` points at the remediation. | `checks-failed` → fix the red check and push (Step 4). Otherwise go to Step 7 and relay the envelope. |
|
|
255
|
+
| `failed` | 1 | A phase crashed; `phase` names which. | Diagnose, fix, re-run close. |
|
|
256
|
+
|
|
257
|
+
Do **not** re-sequence the post-close steps by hand. Steps 4–6 below are
|
|
258
|
+
**recovery-only** — reached from a `blocked`/`pending` envelope, never as
|
|
259
|
+
routine choreography.
|
|
260
|
+
|
|
261
|
+
### What close does internally
|
|
262
|
+
|
|
263
|
+
The script runs the close-validation gates against `baseBranch`, syncs the
|
|
264
|
+
Story branch from `origin/<baseBranch>` (Story #2580 — the parallel-race
|
|
265
|
+
defence), pushes `story-<id>`, opens (or reuses) a PR against `baseBranch`
|
|
266
|
+
with a `Closes #<storyId>` footer, enables GitHub native auto-merge
|
|
267
|
+
(`--auto --squash --delete-branch`) **when `delivery.ci.autoMerge` is
|
|
268
|
+
`"trust-ci"` (the default)**, flips the Story to `agent::closing`, reaps the
|
|
269
|
+
worktree, releases the lease, then **waits for the merge** and — on a
|
|
270
|
+
confirmed merge — flips `agent::done` and runs the post-land tail.
|
|
271
|
+
|
|
272
|
+
### The merge wait is bounded and resumable
|
|
273
|
+
|
|
274
|
+
Two budgets, deliberately separate (`delivery.mergeWatch.*`):
|
|
275
|
+
|
|
276
|
+
- **`maxWaitSeconds`** (default 300) bounds **one invocation**, sized to fit
|
|
277
|
+
inside a single host tool invocation (~10 min ceiling) alongside the gates
|
|
278
|
+
that precede it. Expiry → `pending`. Pass `--max-wait-seconds <n>` to raise
|
|
279
|
+
it when your host has no such ceiling and you want to land in one block.
|
|
280
|
+
- **`maxBudgetSeconds`** (default 3600) bounds the **cumulative** wait across
|
|
281
|
+
resumes, anchored at the PR's `createdAt` so resuming does not restart the
|
|
282
|
+
clock. Exhausting *this* is the genuine give-up → `blocked`.
|
|
283
|
+
|
|
284
|
+
The wait probes the checks every poll: a red required check fails fast as
|
|
285
|
+
`checks-failed` instead of burning the budget, and a PR that falls behind its
|
|
286
|
+
base is brought up to date within `updateAttempts` tries.
|
|
287
|
+
|
|
288
|
+
> **`delivery.ci.autoMerge` policy.** Under the default `"trust-ci"`, GitHub
|
|
289
|
+
> native auto-merge is armed and the PR squash-merges once its **required**
|
|
290
|
+
> checks pass. Under `"strict"`, the close **does not arm auto-merge** — the
|
|
291
|
+
> PR opens and waits for an **operator merge**, exactly as `--no-auto-merge`
|
|
292
|
+
> does per-run.
|
|
293
|
+
|
|
294
|
+
Flags:
|
|
295
|
+
|
|
296
|
+
- `--skip-validation` — bypass the gates (Step 1). Use only when re-running
|
|
297
|
+
close after a fixed gate failure that's already known to pass.
|
|
298
|
+
- `--skip-sync` — bypass the base-sync (Story #2580). Use only after a
|
|
299
|
+
hand-resolved sync, or in tests.
|
|
300
|
+
- `--no-auto-merge` — disable auto-merge. Use when the PR materially changes
|
|
301
|
+
behaviour and warrants a pre-merge eyeball; the operator then merges via
|
|
302
|
+
the GitHub UI.
|
|
303
|
+
- `--wait-merge` — **close-and-land** (Story #4428). Forces close to poll
|
|
304
|
+
the armed PR to merge confirmation and flip `agent::done` itself. When
|
|
305
|
+
neither land flag is passed, close defaults from
|
|
306
|
+
`delivery.routing.closeAndLand` (**true**): attended and headless delivers
|
|
307
|
+
share the land-in-one-close happy path.
|
|
308
|
+
- `--no-wait-merge` — explicit opt-out that always wins. Use when the
|
|
309
|
+
operator wants the PR left at `agent::closing` for a human land (or a
|
|
310
|
+
wrapper that will invoke `single-story-confirm-merge.js` itself). Reports
|
|
311
|
+
`pending` — the work is not done, nothing is broken, and one named command
|
|
312
|
+
finishes it.
|
|
313
|
+
- `--max-wait-seconds <n>` — raise the merge wait's per-invocation bound for
|
|
314
|
+
this run (Story #4543). Use from a headless caller with no host
|
|
315
|
+
tool-invocation ceiling to keep single-block semantics without editing the
|
|
316
|
+
consumer's config.
|
|
317
|
+
|
|
318
|
+
> **Full close pipeline (base-sync outcomes, `agent::closing` rationale,
|
|
319
|
+
> lease release).** For the numbered close pipeline, the base-sync outcome
|
|
320
|
+
> table (no-op / conflict → `agent::blocked` / fetch-failed), and why the
|
|
321
|
+
> issue stays OPEN at `agent::closing`, see
|
|
322
|
+
> [`deliver-story-reference.md` § Step 3 — Close pipeline detail](deliver-story-reference.md#step-3--close-pipeline-detail).
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## Step 4 — CI fix loop (**recovery-only**)
|
|
327
|
+
|
|
328
|
+
> **Steps 4, 5, 5.5, and 6 are recovery paths, not routine choreography
|
|
329
|
+
> (Story #4543).** On the default path Step 3 already polled the PR to a
|
|
330
|
+
> confirmed merge, flipped `agent::done`, and ran the whole post-land tail —
|
|
331
|
+
> follow-up capture, status resync, ref cleanup, base fast-forward — in one
|
|
332
|
+
> process. A `landed` envelope means all of it ran; go straight to Step 7.
|
|
333
|
+
>
|
|
334
|
+
> Enter this step **only** when Step 3 returned `blocked` with
|
|
335
|
+
> `blockClass: "checks-failed"` (a required check went red), or when a
|
|
336
|
+
> `--no-wait-merge` run left the PR for you to shepherd.
|
|
337
|
+
|
|
338
|
+
When a required check is red, the agent owns the green-CI outcome, not just
|
|
339
|
+
the push. Local close-validation gates pass on the dev host's environment;
|
|
340
|
+
CI runs on a different OS and concurrency, and coverage rounding,
|
|
341
|
+
platform-conditional branches, and timing-sensitive tests routinely drift
|
|
342
|
+
between the two.
|
|
343
|
+
|
|
344
|
+
Fix the failure and push a new commit on `story-<storyId>` — auto-merge stays
|
|
345
|
+
armed across retries, so you do not re-arm — then resume the land with the
|
|
346
|
+
envelope's `nextCommand`.
|
|
347
|
+
|
|
348
|
+
> **A watch is an internally-blocking step, not a reason to end your turn.**
|
|
349
|
+
> `pr-watch-with-update.js` blocks the current turn until CI resolves — that
|
|
350
|
+
> IS how you wait. Ending the turn with prose and an unconfirmed merge is a
|
|
351
|
+
> contract violation (the Story #1553 / PR #1554 failure mode). See
|
|
352
|
+
> [`deliver-story-reference.md` § The auto-merge wait is an internally-blocking step](deliver-story-reference.md#the-auto-merge-wait-is-an-internally-blocking-step).
|
|
353
|
+
|
|
354
|
+
To watch the checks on the red path, drive
|
|
355
|
+
`pr-watch-with-update.js` — the **single CI-watch mechanism**
|
|
356
|
+
(Story #4358). It polls the required checks to a
|
|
357
|
+
terminal state and auto-recovers from `mergeStateStatus: BEHIND`; do
|
|
358
|
+
**not** fall back to a bare `gh pr checks` watch invocation:
|
|
359
|
+
|
|
360
|
+
```bash
|
|
361
|
+
node <agentRoot>/scripts/pr-watch-with-update.js --pr <prNumber> --story <storyId>
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
`--story` is what keys the red-path CI digest
|
|
365
|
+
(`temp/story-<id>-ci-digest.{json,md}` — failing check name, run id, and a
|
|
366
|
+
`gh run view --log-failed` tail). Omit it and a red check writes no digest.
|
|
367
|
+
|
|
368
|
+
Poll cadence and caps come from `delivery.ci.watch.*`
|
|
369
|
+
(`pollIntervalMs`, `maxPolls`, `maxResumes`); pass `--poll-interval-ms`,
|
|
370
|
+
`--max-polls`, or `--max-resumes` to override for one run.
|
|
371
|
+
|
|
372
|
+
When the watch exits, branch on the exit code:
|
|
373
|
+
|
|
374
|
+
- **Exit 0 (all checks ✓)** — auto-merge will fire (or has already). The
|
|
375
|
+
Story is still at `agent::closing` with its issue OPEN. **Proceed to
|
|
376
|
+
Step 5 within the same turn** — green CI is the *start* of the
|
|
377
|
+
merge-confirm sequence, not a terminal state.
|
|
378
|
+
- **Exit 1 (a check genuinely failed)** — diagnose, fix, and push a new
|
|
379
|
+
commit on `story-<storyId>`, then re-watch. Auto-merge stays enabled
|
|
380
|
+
across retries; no need to re-arm it. The Story stays at
|
|
381
|
+
`agent::closing` throughout, so a failed/abandoned PR never strands a
|
|
382
|
+
CLOSED issue. If the same failure class recurs, hand convergence off to a
|
|
383
|
+
self-paced host loop (`/loop`) that re-runs the failing check and applies
|
|
384
|
+
the smallest fix until it exits green.
|
|
385
|
+
- **Exit 2 (still-running — slow CI, not red)** — the poll cap fired with
|
|
386
|
+
checks still pending and the watcher exhausted its resume budget with
|
|
387
|
+
nothing red. This is **never** a failure. Hand the wait off to the
|
|
388
|
+
host's interval loop rather than ending your turn: `/loop 5m` polling
|
|
389
|
+
`gh pr checks` until the checks settle.
|
|
390
|
+
|
|
391
|
+
> **Triage authority.** How to classify and remediate a red (or repeatedly
|
|
392
|
+
> slow) check — the root-cause-only decision tree for infra/transient and
|
|
393
|
+
> flaky failures (reproduce → check `main` → bisect env vs code → fix in-scope
|
|
394
|
+
> or file a `meta::framework-gap` issue), the never-rerun / never-quarantine
|
|
395
|
+
> prohibitions, and the escalation criteria (three-strikes, the 30-minute
|
|
396
|
+
> wall-clock timebox, and the clearly-environmental fast path) — is defined
|
|
397
|
+
> once in [`.agents/rules/ci-remediation.md`](../../rules/ci-remediation.md).
|
|
398
|
+
> Read it before remediating a red check above.
|
|
399
|
+
>
|
|
400
|
+
> **CI recovery procedures.** For resurrecting the worktree after
|
|
401
|
+
> `reapOnSuccess`, pulling the failing job log, fixing coverage/CRAP
|
|
402
|
+
> baselines without re-running close-validation, and the when-to-stop
|
|
403
|
+
> Anti-Thrashing rules, see
|
|
404
|
+
> [`deliver-story-reference.md` § Step 4 — CI watch + fix recovery](deliver-story-reference.md#step-4--ci-watch--fix-recovery).
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## Step 5 — Merge confirmation + land tail (**recovery-only**)
|
|
409
|
+
|
|
410
|
+
> On the default path Step 3 already did this. Run it only to resume a
|
|
411
|
+
> `pending` envelope, to finish a `--no-wait-merge` run, or to rescue a
|
|
412
|
+
> merged-but-mislabelled Story.
|
|
413
|
+
|
|
414
|
+
```bash
|
|
415
|
+
node .agents/scripts/single-story-confirm-merge.js --story <storyId> --cwd <main-repo>
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
This is the **same** shared land path Step 3 reaches: it flips
|
|
419
|
+
`agent::closing → agent::done` on a confirmed merge (closing the issue) and
|
|
420
|
+
runs the **same** post-land tail — so the two surfaces cannot diverge. It is
|
|
421
|
+
idempotent, emits the same terminal envelope, and is safe to re-run while
|
|
422
|
+
the PR is still open (returns `pending`).
|
|
423
|
+
|
|
424
|
+
> **Confirmation outcomes.** `single-story-confirm-merge.js` re-reads the
|
|
425
|
+
> live PR state and flips to `agent::done` only on a confirmed `MERGED` PR;
|
|
426
|
+
> it is idempotent and safe to re-run while the PR is still open (returns
|
|
427
|
+
> `pending`). See
|
|
428
|
+
> [`deliver-story-reference.md` § Step 5 — Merge confirmation detail](deliver-story-reference.md#step-5--merge-confirmation-detail).
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
## Step 5.5 — Re-assert Status column (**recovery-only**)
|
|
433
|
+
|
|
434
|
+
> **The land tail already ran this** (Story #4543) — it is `tail.statusResync`
|
|
435
|
+
> in the terminal envelope. Run it by hand only when that step reported
|
|
436
|
+
> `false`, or after a manual merge on a `--no-wait-merge` run.
|
|
437
|
+
|
|
438
|
+
GitHub Projects v2 built-in workflows fire minutes *after* auto-merge lands
|
|
439
|
+
and clobber the `Done` Status the confirm step set, stranding closed
|
|
440
|
+
Stories at `In Progress` on the board (reproduced on Story #2813).
|
|
441
|
+
Re-assert authority:
|
|
442
|
+
|
|
443
|
+
```bash
|
|
444
|
+
node .agents/scripts/resync-status-column.js --story <storyId>
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
The helper re-fires the `ColumnSync` mutation and **polls for ~15 s** to win
|
|
448
|
+
the race against the bot's late write (Story #2876). It is idempotent and
|
|
449
|
+
no-op-safe (`no-project` / `not-on-project` exit 0).
|
|
450
|
+
|
|
451
|
+
> **Status-column detail + tuning flags + operator fix.** For the poll-loop
|
|
452
|
+
> flags (`--poll-attempts`, `--poll-delay-ms`), the `attempts` / `drifted`
|
|
453
|
+
> envelope semantics, and the canonical
|
|
454
|
+
> `--reap-conflicting-workflows` operator fix, see
|
|
455
|
+
> [`deliver-story-reference.md` § Step 5.5 — Re-assert Status column detail](deliver-story-reference.md#step-55--re-assert-status-column-detail).
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
## Step 6 — Local branch cleanup (**recovery-only**)
|
|
460
|
+
|
|
461
|
+
> **The land tail already ran this** (Story #4543) — it is `tail.refCleanup`
|
|
462
|
+
> and `tail.baseFastForward` in the terminal envelope, done in-process
|
|
463
|
+
> against the same planners this command drives. Run it by hand only when
|
|
464
|
+
> either step reported `false` (a dirty shared checkout is the common,
|
|
465
|
+
> benign cause), or after a manual merge on a `--no-wait-merge` run.
|
|
466
|
+
|
|
467
|
+
GitHub deletes the **remote** branch on auto-merge, but the **local**
|
|
468
|
+
`story-<storyId>` ref lingers in the main checkout until something prunes
|
|
469
|
+
it. To prune the story ref **and** fast-forward local `main` (or
|
|
470
|
+
`project.baseBranch`):
|
|
471
|
+
|
|
472
|
+
```bash
|
|
473
|
+
node .agents/scripts/git-cleanup.js \
|
|
474
|
+
--execute \
|
|
475
|
+
--remote \
|
|
476
|
+
--yes \
|
|
477
|
+
--fast-forward-main \
|
|
478
|
+
--branches \
|
|
479
|
+
--include "story-<storyId>"
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
`--fast-forward-main` brings local `main` current (the next init seeds from
|
|
483
|
+
it), `--branches` + `--include` reap only this Story's ref, and
|
|
484
|
+
`--execute --remote --yes` run the deletes non-interactively. The sweep is
|
|
485
|
+
idempotent and safe to run before `MERGED` confirms. Skip Step 6 only when
|
|
486
|
+
the operator opted out via `--no-auto-merge` AND has not yet merged the PR —
|
|
487
|
+
run the cleanup after the manual merge lands.
|
|
488
|
+
|
|
489
|
+
> **Why local `main` goes stale + per-flag behaviour.** For the stale-`main`
|
|
490
|
+
> mechanism and the full `--fast-forward-main` / `--branches` / `--include`
|
|
491
|
+
> flag semantics, see
|
|
492
|
+
> [`deliver-story-reference.md` § Step 6 — Local branch cleanup detail](deliver-story-reference.md#step-6--local-branch-cleanup-detail).
|
|
493
|
+
|
|
494
|
+
---
|
|
495
|
+
|
|
496
|
+
## Step 7 — Return contract (**required when dispatched as a sub-agent**) {#return-contract}
|
|
497
|
+
|
|
498
|
+
The return contract is the shipped schema
|
|
499
|
+
[`story-deliver-terminal.schema.json`](../../schemas/story-deliver-terminal.schema.json)
|
|
500
|
+
— **the single source of truth for every field, and the only place they are
|
|
501
|
+
defined** (Story #4543). Do not restate its fields here or anywhere else:
|
|
502
|
+
this section and
|
|
503
|
+
[`agents/story-worker.md`](../../agents/story-worker.md) each used to define
|
|
504
|
+
their own divergent shape, neither validated by anything, which is exactly
|
|
505
|
+
how they drifted apart.
|
|
506
|
+
|
|
507
|
+
When this workflow runs as a per-Story sub-agent (dispatched by
|
|
508
|
+
[`/deliver`](../deliver.md)), the **only** acceptable way to end your turn is
|
|
509
|
+
to return a single terminal JSON object conforming to that schema — never
|
|
510
|
+
free-form prose. `single-story-close.js` already emits a validated one
|
|
511
|
+
between its `--- STORY DELIVER TERMINAL ---` markers; **relay that envelope**
|
|
512
|
+
rather than composing a new object by hand.
|
|
513
|
+
|
|
514
|
+
Its `status` is one of exactly four values, and the no-park rule follows
|
|
515
|
+
directly from them:
|
|
516
|
+
|
|
517
|
+
- `landed` — the PR merged, the Story is `agent::done`, and the tail was
|
|
518
|
+
attempted. Terminal; you are done.
|
|
519
|
+
- `pending` — **resumable**, and the only sanctioned way to end a turn
|
|
520
|
+
without a merge. It carries the `nextCommand` that resumes it. Return this
|
|
521
|
+
only when you have exhausted your own budget, not as a way to avoid
|
|
522
|
+
waiting: the wait is internally blocking (Step 4).
|
|
523
|
+
- `blocked` — the Story carries `agent::blocked` and `blocked.blockClass`
|
|
524
|
+
names the class.
|
|
525
|
+
- `failed` — a phase crashed; `phase` names it.
|
|
526
|
+
|
|
527
|
+
Ending the turn with prose and an unconfirmed merge is a contract violation
|
|
528
|
+
(the Story #1553 / PR #1554 failure mode).
|
|
529
|
+
|
|
530
|
+
> **No-park rule + handoff discipline.** For why a prose hand-off with an
|
|
531
|
+
> unconfirmed merge is the very bug this workflow prevents, and the
|
|
532
|
+
> report-state-not-process handoff discipline, see
|
|
533
|
+
> [`deliver-story-reference.md` § Step 7 — Return-contract detail](deliver-story-reference.md#step-7--return-contract-detail).
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
537
|
+
## Recovering a stranded Story {#recover}
|
|
538
|
+
|
|
539
|
+
When a Story is in an unclear state — a killed run, a `pending` envelope you
|
|
540
|
+
no longer have, a Story a `/deliver` re-run refuses — do not guess and do not
|
|
541
|
+
re-run the pipeline hoping it converges. Probe it:
|
|
542
|
+
|
|
543
|
+
```bash
|
|
544
|
+
node .agents/scripts/deliver-recover.js --story <storyId>
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
It is **read-only**: it probes the labels, lease, branch, worktree, and PR
|
|
548
|
+
(state + checks), then prints the **one** next command with the evidence it
|
|
549
|
+
was derived from — never a menu.
|
|
550
|
+
|
|
551
|
+
It is the only automated way out of the **merged-but-label-stale** strand: a
|
|
552
|
+
`/deliver` re-run refuses that Story outright, because `single-story-init.js`
|
|
553
|
+
hard-errors on an already-closed one.
|
|
554
|
+
|
|
555
|
+
---
|
|
556
|
+
|
|
557
|
+
## Idempotence
|
|
558
|
+
|
|
559
|
+
- `single-story-init.js` re-prints the same `workCwd` without recreating
|
|
560
|
+
the worktree when one already exists for `story-<id>`.
|
|
561
|
+
- `single-story-close.js` short-circuits when the Story is already
|
|
562
|
+
closed (returns `{ action: 'noop', reason: 'already-closed' }`).
|
|
563
|
+
- `single-story-confirm-merge.js` short-circuits when the Story already
|
|
564
|
+
carries `agent::done` or the issue is already closed (returns
|
|
565
|
+
`{ action: 'noop', reason: 'already-done' }`), and is safe to re-run
|
|
566
|
+
while the PR is still open (returns `{ action: 'pending', ... }` without
|
|
567
|
+
mutating the Story).
|
|
568
|
+
- The PR probe (`gh pr list --head <branch> --state open`) reuses an
|
|
569
|
+
existing open PR rather than opening a duplicate.
|
|
570
|
+
|
|
571
|
+
Re-running `/deliver-story` against an already-closed Story is
|
|
572
|
+
safe.
|
|
573
|
+
|
|
574
|
+
---
|
|
575
|
+
|
|
576
|
+
## Constraints
|
|
577
|
+
|
|
578
|
+
- **Never** push the Story branch directly to `main`. The PR is the only
|
|
579
|
+
merge surface.
|
|
580
|
+
- **Always** `cd` into the `workCwd` returned by Step 0 before editing,
|
|
581
|
+
**and** prefix every path-based Edit/Write/Read with that absolute
|
|
582
|
+
`workCwd` root — the `cd` alone does not scope the path-based tools (see
|
|
583
|
+
Step 0.5). Editing a bare main-checkout path lands the change in the wrong
|
|
584
|
+
tree; close's wrong-tree guard (Story #3364) aborts when it detects this.
|
|
585
|
+
- **Handoff discipline — report state, not process.** When you hand back to
|
|
586
|
+
your caller (the `/deliver` aggregator or the interactive operator),
|
|
587
|
+
report essential terminal state only: the Story branch, the closing commit
|
|
588
|
+
SHA, what changed, and what was verified. Mirror the fields the close
|
|
589
|
+
pipeline already emits (the `single-story-close.js` terminal envelope)
|
|
590
|
+
rather than inventing a new contract. Do not narrate the steps you took, and do not prescribe how the
|
|
591
|
+
next stage should do its work. Prose process commentary only bloats the
|
|
592
|
+
hydrated prompt.
|
|
593
|
+
- **Label transitions**: drive every `agent::*` state change through
|
|
594
|
+
`node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
|
|
595
|
+
This CLI is the authoritative mechanism — there is no separate
|
|
596
|
+
state-mutation MCP server to degrade from (see
|
|
597
|
+
[`.agents/instructions.md` § 1.D](../../instructions.md)).
|
|
598
|
+
|
|
599
|
+
---
|
|
600
|
+
|
|
601
|
+
## See also
|
|
602
|
+
|
|
603
|
+
- [`/deliver`](../deliver.md) — unified entry point (`<storyId...>`;
|
|
604
|
+
sequences via `depends_on`, resolved from live state).
|
|
605
|
+
- [`deliver-story-reference.md`](deliver-story-reference.md) —
|
|
606
|
+
lease, sweep, CI-recovery, and Status-column reference detail.
|
|
@@ -9,7 +9,7 @@ description: >-
|
|
|
9
9
|
|
|
10
10
|
> **Helper, not a slash command.** Files under `workflows/helpers/` are not
|
|
11
11
|
> projected into the mandrel plugin command tree. The same `lib/checks/` registry runs
|
|
12
|
-
> automatically as preflight inside `/deliver`,
|
|
12
|
+
> automatically as preflight inside `/deliver`, `single-story-close`, and
|
|
13
13
|
> `npm test` — this viewer exists only for ad-hoc inspection. Invoke the
|
|
14
14
|
> backing script directly: `node .agents/scripts/diagnose.js [args]`.
|
|
15
15
|
|
|
@@ -18,8 +18,8 @@ description: >-
|
|
|
18
18
|
`diagnose.js` runs the checks registry assembled under
|
|
19
19
|
`.agents/scripts/lib/checks/` in read-only mode and surfaces every
|
|
20
20
|
finding declared on the requested scope. It is the operator-facing read
|
|
21
|
-
of the same registry that preflight guards (
|
|
22
|
-
`story-close`), the retro hook, and `npm test` consult — but with
|
|
21
|
+
of the same registry that preflight guards (`/deliver`,
|
|
22
|
+
`single-story-close`), the retro hook, and `npm test` consult — but with
|
|
23
23
|
`autoFix: false` always, no remote GitHub writes, and no commits.
|
|
24
24
|
|
|
25
25
|
It is distinct from `diagnose-friction.js` (the per-Task signal capture
|
|
@@ -37,7 +37,7 @@ node .agents/scripts/diagnose.js [--scope <scope>] [--fail-on-blocker] [--json]
|
|
|
37
37
|
|
|
38
38
|
| Flag | Default | Description |
|
|
39
39
|
| -------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
40
|
-
| `--scope <s>` | `diagnose` | Filter checks by declared scope. Use `all` to disable the filter and run every registered check. Other surface scopes (`
|
|
40
|
+
| `--scope <s>` | `diagnose` | Filter checks by declared scope. Use `all` to disable the filter and run every registered check. Other surface scopes (`deliver`, `single-story-close`, `retro`) are accepted verbatim — checks whose `scope[]` includes the value will fire. |
|
|
41
41
|
| `--fail-on-blocker` | off | Exit `2` when at least one finding has `severity === 'blocker'`. Without this flag the command always exits `0` even when blockers are present (it is by default an advisory read). |
|
|
42
42
|
| `--json` | off | Emit a single line of JSON shaped as `{ scope, findings: [...] }` to stdout in place of the human table. Findings preserve the registry's `Finding` shape (id, severity, scope, summary, fixCommand, detail?, autoCorrectable). |
|
|
43
43
|
|
|
@@ -59,7 +59,7 @@ node .agents/scripts/diagnose.js
|
|
|
59
59
|
node .agents/scripts/diagnose.js --scope all --json
|
|
60
60
|
|
|
61
61
|
# Use inside a preflight script that should block on a blocker.
|
|
62
|
-
node .agents/scripts/diagnose.js --scope story-close --fail-on-blocker
|
|
62
|
+
node .agents/scripts/diagnose.js --scope single-story-close --fail-on-blocker
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
## Output shape
|
|
@@ -80,12 +80,12 @@ Exactly one line. Schema:
|
|
|
80
80
|
"scope": "diagnose",
|
|
81
81
|
"findings": [
|
|
82
82
|
{
|
|
83
|
-
"id": "stale-origin-
|
|
83
|
+
"id": "stale-origin-main",
|
|
84
84
|
"severity": "blocker",
|
|
85
|
-
"scope": "story-close",
|
|
86
|
-
"summary": "Local
|
|
87
|
-
"detail": "
|
|
88
|
-
"fixCommand": "git
|
|
85
|
+
"scope": "single-story-close",
|
|
86
|
+
"summary": "Local main is behind origin/main",
|
|
87
|
+
"detail": "Fast-forward main before re-running single-story-close.",
|
|
88
|
+
"fixCommand": "git fetch origin main; git merge --ff-only origin/main",
|
|
89
89
|
"autoCorrectable": false
|
|
90
90
|
}
|
|
91
91
|
]
|