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
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* auto-merge completes *asynchronously* after the close script exits, so
|
|
11
11
|
* the `agent::done` flip (which closes the issue) is deferred to this
|
|
12
12
|
* confirmation step, invoked by the CI-watch loop in
|
|
13
|
-
* `
|
|
13
|
+
* `helpers/deliver-story.md` once `pr-watch-with-update.js` exits.
|
|
14
14
|
*
|
|
15
15
|
* The script:
|
|
16
16
|
* 1. Resolves the PR number (`--pr <n>`, or probes
|
|
@@ -32,17 +32,30 @@
|
|
|
32
32
|
*
|
|
33
33
|
* Exit codes: 0 ok (merged, pending, or noop), 1 error.
|
|
34
34
|
*
|
|
35
|
-
* @see .agents/workflows/helpers/
|
|
35
|
+
* @see .agents/workflows/helpers/deliver-story.md
|
|
36
36
|
*/
|
|
37
37
|
|
|
38
38
|
import { parseArgs } from 'node:util';
|
|
39
|
+
import { parseSprintArgs } from './lib/cli-args.js';
|
|
39
40
|
import { runAsCli } from './lib/cli-utils.js';
|
|
40
41
|
import { resolveConfig } from './lib/config-resolver.js';
|
|
42
|
+
import { formatCliError } from './lib/error-redactor.js';
|
|
41
43
|
import { gh as defaultGh } from './lib/gh-exec.js';
|
|
42
44
|
import { getStoryBranch } from './lib/git-utils.js';
|
|
43
45
|
import { Logger } from './lib/Logger.js';
|
|
46
|
+
import { emitTerminalFriction } from './lib/observability/runtime-friction.js';
|
|
47
|
+
import { MERGED_FLIP_FAILED_BLOCK_CLASS } from './lib/orchestration/lifecycle/emit-merge-flip-failed.js';
|
|
44
48
|
import { parsePrNumber } from './lib/orchestration/single-story-close/phases/code-review.js';
|
|
49
|
+
import { runConfirmMergePhase as defaultRunConfirmMergePhase } from './lib/orchestration/single-story-close/phases/confirm-merge.js';
|
|
45
50
|
import { parseCloseOptions } from './lib/orchestration/single-story-close/phases/options.js';
|
|
51
|
+
import { runPostLandTail } from './lib/orchestration/single-story-close/phases/post-land.js';
|
|
52
|
+
import {
|
|
53
|
+
buildTerminalEnvelope,
|
|
54
|
+
emitTerminalEnvelope,
|
|
55
|
+
exitCodeForTerminal,
|
|
56
|
+
NEXT_COMMANDS,
|
|
57
|
+
terminalFromWaitOutcome,
|
|
58
|
+
} from './lib/orchestration/story-deliver-terminal.js';
|
|
46
59
|
import { createProvider } from './lib/provider-factory.js';
|
|
47
60
|
import { confirmStoryMerged } from './lib/single-story/confirm-merge.js';
|
|
48
61
|
|
|
@@ -70,6 +83,28 @@ function readPrFlag() {
|
|
|
70
83
|
}
|
|
71
84
|
}
|
|
72
85
|
|
|
86
|
+
/**
|
|
87
|
+
* `--wait`: resume the bounded merge wait rather than probing once.
|
|
88
|
+
*
|
|
89
|
+
* This CLI serves two callers behind one command string. `confirmMerge` wants
|
|
90
|
+
* a fast idempotent flip for a merge that ALREADY happened (an operator-merge
|
|
91
|
+
* flow, or a `merged-flip-failed` retry) and must not stall. `resumeLand`
|
|
92
|
+
* wants to pick up a merge wait the close handed off at its per-invocation
|
|
93
|
+
* bound — that one must actually wait, and must be able to give up.
|
|
94
|
+
*/
|
|
95
|
+
function readWaitFlag() {
|
|
96
|
+
try {
|
|
97
|
+
const { values } = parseArgs({
|
|
98
|
+
args: process.argv.slice(2),
|
|
99
|
+
options: { wait: { type: 'boolean', default: false } },
|
|
100
|
+
strict: false,
|
|
101
|
+
});
|
|
102
|
+
return values.wait === true;
|
|
103
|
+
} catch {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
73
108
|
/**
|
|
74
109
|
* Resolve the PR number for the Story branch when one was not passed on
|
|
75
110
|
* the CLI. Probes `gh pr list --head <branch> --state all` (the merged PR
|
|
@@ -98,6 +133,118 @@ async function resolvePrNumber({ cwd, storyBranch, gh }) {
|
|
|
98
133
|
}
|
|
99
134
|
}
|
|
100
135
|
|
|
136
|
+
/**
|
|
137
|
+
* Story #4578 — async so the runtime-derived friction emit can be awaited.
|
|
138
|
+
* This CLI is the resume path for a parked worker (`--wait`), so a `pending`
|
|
139
|
+
* terminal here means a bounded wait expired again with the PR still in
|
|
140
|
+
* flight: the exact observable the retro was blind to. The emit is
|
|
141
|
+
* best-effort and cannot throw; awaiting it matters because `runAsCli`
|
|
142
|
+
* exits via `process.exit` the moment `main` resolves.
|
|
143
|
+
*/
|
|
144
|
+
async function logConfirmResult(result, terminal, config) {
|
|
145
|
+
// Human-facing dump stays level-gated; the envelope is the machine
|
|
146
|
+
// contract and must survive AGENT_LOG_LEVEL=silent.
|
|
147
|
+
Logger.info(
|
|
148
|
+
`\n--- CONFIRM MERGE RESULT ---\n${JSON.stringify(result, null, 2)}\n--- END RESULT ---\n`,
|
|
149
|
+
);
|
|
150
|
+
emitTerminalEnvelope(terminal);
|
|
151
|
+
await emitTerminalFriction({ envelope: terminal, config });
|
|
152
|
+
return { success: terminal.status !== 'failed', result, terminal };
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Map a `confirmStoryMerged` envelope onto the shared terminal envelope
|
|
157
|
+
* (Story #4543) so this CLI and the in-close land path report one shape.
|
|
158
|
+
*
|
|
159
|
+
* The three confirm outcomes map cleanly:
|
|
160
|
+
* - `done` / `noop` (already-done) → `landed`. Both mean the merge is on
|
|
161
|
+
* the base branch and the Story is `agent::done`.
|
|
162
|
+
* - `pending` (`pr-open` / `no-pr`) → `pending`. Re-run once the merge
|
|
163
|
+
* lands; nothing is wrong.
|
|
164
|
+
* - `flip-failed` → `blocked` with the shared `merged-flip-failed` class:
|
|
165
|
+
* the merge landed, so this is a label-write fault, and the remedy is
|
|
166
|
+
* re-running this very command (it is idempotent).
|
|
167
|
+
* - `pr-not-merged` (closed without merging) → `blocked`. The PR is gone;
|
|
168
|
+
* a re-run cannot fix it, so it needs a human.
|
|
169
|
+
*/
|
|
170
|
+
function buildConfirmTerminal({
|
|
171
|
+
storyId,
|
|
172
|
+
storyBranch,
|
|
173
|
+
baseBranch,
|
|
174
|
+
prNumber,
|
|
175
|
+
confirmation,
|
|
176
|
+
tail,
|
|
177
|
+
elapsedSeconds,
|
|
178
|
+
}) {
|
|
179
|
+
// `pr-not-merged` means the PR is CLOSED — reporting it as OPEN put a
|
|
180
|
+
// fact in the envelope that the blocked reason directly contradicts.
|
|
181
|
+
const prState = confirmation.merged
|
|
182
|
+
? 'MERGED'
|
|
183
|
+
: confirmation.reason === 'pr-not-merged'
|
|
184
|
+
? 'CLOSED'
|
|
185
|
+
: 'OPEN';
|
|
186
|
+
const pr =
|
|
187
|
+
Number.isInteger(prNumber) && prNumber > 0
|
|
188
|
+
? { number: prNumber, state: prState }
|
|
189
|
+
: null;
|
|
190
|
+
const common = { storyId, storyBranch, baseBranch, pr, elapsedSeconds };
|
|
191
|
+
|
|
192
|
+
if (confirmation.action === 'done' || confirmation.action === 'noop') {
|
|
193
|
+
return buildTerminalEnvelope({
|
|
194
|
+
...common,
|
|
195
|
+
status: 'landed',
|
|
196
|
+
phase: tail ? 'post-land' : 'done',
|
|
197
|
+
tail,
|
|
198
|
+
nextCommand: null,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
if (confirmation.action === 'flip-failed') {
|
|
202
|
+
return buildTerminalEnvelope({
|
|
203
|
+
...common,
|
|
204
|
+
status: 'blocked',
|
|
205
|
+
phase: 'confirm-merge',
|
|
206
|
+
blocked: {
|
|
207
|
+
blockClass: MERGED_FLIP_FAILED_BLOCK_CLASS,
|
|
208
|
+
reason:
|
|
209
|
+
'merge confirmed but the agent::closing → agent::done label write failed',
|
|
210
|
+
frictionCommentId: null,
|
|
211
|
+
},
|
|
212
|
+
nextCommand: NEXT_COMMANDS.confirmMerge(storyId),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
if (confirmation.reason === 'pr-not-merged') {
|
|
216
|
+
return buildTerminalEnvelope({
|
|
217
|
+
...common,
|
|
218
|
+
status: 'blocked',
|
|
219
|
+
phase: 'confirm-merge',
|
|
220
|
+
blocked: {
|
|
221
|
+
blockClass: 'api-race-other',
|
|
222
|
+
reason: 'the PR was closed without merging (state=CLOSED)',
|
|
223
|
+
frictionCommentId: null,
|
|
224
|
+
},
|
|
225
|
+
nextCommand: NEXT_COMMANDS.recover(storyId),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return buildTerminalEnvelope({
|
|
229
|
+
...common,
|
|
230
|
+
status: 'pending',
|
|
231
|
+
phase: 'confirm-merge',
|
|
232
|
+
nextCommand:
|
|
233
|
+
confirmation.reason === 'no-pr'
|
|
234
|
+
? NEXT_COMMANDS.recover(storyId)
|
|
235
|
+
: NEXT_COMMANDS.confirmMerge(storyId),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
async function resolveConfirmPrNumber({ prParam, cwd, storyBranch, gh }) {
|
|
240
|
+
const rawPr = prParam ?? readPrFlag();
|
|
241
|
+
let prNumber = Number.parseInt(String(rawPr ?? ''), 10);
|
|
242
|
+
if (!Number.isInteger(prNumber) || prNumber <= 0) {
|
|
243
|
+
prNumber = await resolvePrNumber({ cwd, storyBranch, gh });
|
|
244
|
+
}
|
|
245
|
+
return Number.isInteger(prNumber) && prNumber > 0 ? prNumber : null;
|
|
246
|
+
}
|
|
247
|
+
|
|
101
248
|
/**
|
|
102
249
|
* Confirm a standalone Story's merge. Exported for testing.
|
|
103
250
|
*/
|
|
@@ -105,11 +252,13 @@ export async function runConfirmMerge({
|
|
|
105
252
|
storyId: storyIdParam,
|
|
106
253
|
cwd: cwdParam,
|
|
107
254
|
pr: prParam,
|
|
255
|
+
wait: waitParam,
|
|
108
256
|
injectedProvider,
|
|
109
257
|
injectedConfig,
|
|
110
258
|
injectedGh,
|
|
111
259
|
injectedNotify,
|
|
112
260
|
injectedReadPrMergeState,
|
|
261
|
+
runConfirmMergePhaseFn = defaultRunConfirmMergePhase,
|
|
113
262
|
} = {}) {
|
|
114
263
|
const { storyId, cwd } = parseCloseOptions({
|
|
115
264
|
storyIdParam,
|
|
@@ -118,41 +267,107 @@ export async function runConfirmMerge({
|
|
|
118
267
|
|
|
119
268
|
if (!storyId) {
|
|
120
269
|
throw new Error(
|
|
121
|
-
'Usage: node single-story-confirm-merge.js --story <STORY_ID> [--pr <n>] [--cwd <main-repo>]',
|
|
270
|
+
'Usage: node single-story-confirm-merge.js --story <STORY_ID> [--pr <n>] [--wait] [--cwd <main-repo>]',
|
|
122
271
|
);
|
|
123
272
|
}
|
|
273
|
+
const wait = waitParam ?? readWaitFlag();
|
|
124
274
|
|
|
275
|
+
const startedAtMs = Date.now();
|
|
125
276
|
const config = injectedConfig || resolveConfig({ cwd });
|
|
126
277
|
const provider = injectedProvider || createProvider(config);
|
|
127
278
|
const gh = injectedGh ?? defaultGh;
|
|
128
|
-
const storyBranch = getStoryBranch(
|
|
279
|
+
const storyBranch = getStoryBranch(storyId);
|
|
280
|
+
const baseBranch = config.project?.baseBranch ?? 'main';
|
|
129
281
|
|
|
130
282
|
progress('INIT', `Confirming merge for standalone Story #${storyId}...`);
|
|
131
283
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if (!Number.isInteger(prNumber) || prNumber <= 0) {
|
|
284
|
+
const prNumber = await resolveConfirmPrNumber({
|
|
285
|
+
prParam,
|
|
286
|
+
cwd,
|
|
287
|
+
storyBranch,
|
|
288
|
+
gh,
|
|
289
|
+
});
|
|
290
|
+
if (prNumber == null) {
|
|
141
291
|
progress(
|
|
142
292
|
'CONFIRM',
|
|
143
293
|
`⚠️ No PR found for ${storyBranch}; cannot confirm merge. Story stays at agent::closing.`,
|
|
144
294
|
);
|
|
145
|
-
const
|
|
295
|
+
const noPr = {
|
|
146
296
|
storyId,
|
|
147
297
|
standalone: true,
|
|
148
298
|
action: 'pending',
|
|
149
299
|
reason: 'no-pr',
|
|
150
300
|
merged: false,
|
|
151
301
|
};
|
|
152
|
-
|
|
153
|
-
|
|
302
|
+
return await logConfirmResult(
|
|
303
|
+
noPr,
|
|
304
|
+
buildConfirmTerminal({
|
|
305
|
+
storyId,
|
|
306
|
+
storyBranch,
|
|
307
|
+
baseBranch,
|
|
308
|
+
prNumber: null,
|
|
309
|
+
confirmation: noPr,
|
|
310
|
+
tail: null,
|
|
311
|
+
elapsedSeconds: Math.round((Date.now() - startedAtMs) / 1000),
|
|
312
|
+
}),
|
|
313
|
+
config,
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// `--wait` (what `NEXT_COMMANDS.resumeLand` passes): resume the merge wait
|
|
318
|
+
// the close handed off at its per-invocation bound, by running the SAME
|
|
319
|
+
// phase the in-close path runs. Without this the resume was a single probe
|
|
320
|
+
// that reported `pending` and exited, so the cumulative `maxBudgetSeconds`
|
|
321
|
+
// give-up — the only thing that ever emits `merge.unlanded` and flips a
|
|
322
|
+
// wedged Story to `agent::blocked` — was reachable ONLY inside the original
|
|
323
|
+
// close invocation. A PR that wedged after the close returned could be
|
|
324
|
+
// resumed forever, always answering `pending`, never escalating to anyone.
|
|
325
|
+
//
|
|
326
|
+
// The phase anchors its cumulative budget at the PR's `createdAt`, so the
|
|
327
|
+
// resume does not restart the clock — exactly what the envelope's
|
|
328
|
+
// `waitBudget` contract already promised.
|
|
329
|
+
if (wait) {
|
|
330
|
+
const waitOutcome = await runConfirmMergePhaseFn({
|
|
331
|
+
cwd,
|
|
332
|
+
storyId,
|
|
333
|
+
storyBranch,
|
|
334
|
+
baseBranch,
|
|
335
|
+
prNumber,
|
|
336
|
+
prUrl: `${storyBranch} PR #${prNumber}`,
|
|
337
|
+
// The close already armed it; this CLI is resuming that wait, not
|
|
338
|
+
// deciding whether to arm.
|
|
339
|
+
autoMergeEnabled: true,
|
|
340
|
+
provider,
|
|
341
|
+
config,
|
|
342
|
+
progress,
|
|
343
|
+
injectedGh: gh,
|
|
344
|
+
injectedNotify,
|
|
345
|
+
readPrMergeStateFn: injectedReadPrMergeState,
|
|
346
|
+
});
|
|
347
|
+
const terminal = terminalFromWaitOutcome({
|
|
348
|
+
waitOutcome,
|
|
349
|
+
storyId,
|
|
350
|
+
storyBranch,
|
|
351
|
+
baseBranch,
|
|
352
|
+
prNumber,
|
|
353
|
+
prUrl: null,
|
|
354
|
+
autoMergeEnabled: true,
|
|
355
|
+
// This CLI runs no close gates, so it reports none — `gates` is
|
|
356
|
+
// "each gate this invocation was responsible for".
|
|
357
|
+
gates: undefined,
|
|
358
|
+
elapsedSeconds: Math.round((Date.now() - startedAtMs) / 1000),
|
|
359
|
+
});
|
|
360
|
+
return await logConfirmResult(
|
|
361
|
+
{
|
|
362
|
+
storyId,
|
|
363
|
+
standalone: true,
|
|
364
|
+
action: waitOutcome.terminal,
|
|
365
|
+
resumed: true,
|
|
366
|
+
tail: waitOutcome.tail ?? null,
|
|
367
|
+
},
|
|
368
|
+
terminal,
|
|
369
|
+
config,
|
|
154
370
|
);
|
|
155
|
-
return { success: true, result };
|
|
156
371
|
}
|
|
157
372
|
|
|
158
373
|
const confirmation = await confirmStoryMerged({
|
|
@@ -168,16 +383,90 @@ export async function runConfirmMerge({
|
|
|
168
383
|
readPrMergeStateFn: injectedReadPrMergeState,
|
|
169
384
|
});
|
|
170
385
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
386
|
+
// Story #4543 — reach the SAME shared land tail the in-close path reaches
|
|
387
|
+
// (`phases/post-land.js`), rather than this CLI's own follow-ups-only
|
|
388
|
+
// wrapper. That wrapper was the whole reason the two landing surfaces
|
|
389
|
+
// diverged: it captured follow-ups and nothing else, while the resync and
|
|
390
|
+
// cleanup steps lived in prose the caller had to remember to run.
|
|
391
|
+
//
|
|
392
|
+
// Gated on `merged`, NOT on `action === 'done'`. `done` means "this run
|
|
393
|
+
// flipped the label"; a Story already at `agent::done` returns
|
|
394
|
+
// `action: 'noop', merged: true`, and gating on `done` skipped the tail for
|
|
395
|
+
// exactly that case — the belated-manual-confirm backfill this tail exists
|
|
396
|
+
// to make possible (see `story-follow-ups.js`, which documents the gap).
|
|
397
|
+
// Re-running is safe: every step is idempotent (the follow-ups comment is
|
|
398
|
+
// an upsert, ref cleanup and base fast-forward no-op when already done).
|
|
399
|
+
const tail =
|
|
400
|
+
confirmation.merged === true
|
|
401
|
+
? await runPostLandTail({
|
|
402
|
+
storyId,
|
|
403
|
+
storyBranch,
|
|
404
|
+
baseBranch,
|
|
405
|
+
cwd,
|
|
406
|
+
provider,
|
|
407
|
+
config,
|
|
408
|
+
progress,
|
|
409
|
+
})
|
|
410
|
+
: null;
|
|
411
|
+
|
|
412
|
+
const terminal = buildConfirmTerminal({
|
|
413
|
+
storyId,
|
|
414
|
+
storyBranch,
|
|
415
|
+
baseBranch,
|
|
416
|
+
prNumber,
|
|
417
|
+
confirmation,
|
|
418
|
+
tail,
|
|
419
|
+
elapsedSeconds: Math.round((Date.now() - startedAtMs) / 1000),
|
|
420
|
+
});
|
|
421
|
+
if (confirmation.action === 'done') {
|
|
422
|
+
progress('DONE', `✅ Story #${storyId} → agent::done (merged).`);
|
|
423
|
+
}
|
|
424
|
+
return await logConfirmResult(
|
|
425
|
+
{ ...confirmation, standalone: true, tail },
|
|
426
|
+
terminal,
|
|
427
|
+
config,
|
|
174
428
|
);
|
|
175
|
-
|
|
176
|
-
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* CLI entry — mirrors `single-story-close.js`: the exit code comes from the
|
|
433
|
+
* terminal envelope's status, so a caller can tell `pending` (the PR has not
|
|
434
|
+
* merged yet; re-run me) from `landed` without parsing stdout.
|
|
435
|
+
*
|
|
436
|
+
* The catch mirrors close's for the same reason: `confirmStoryMerged`'s PR
|
|
437
|
+
* read is a live `gh` call that throws on a transient API error, and this CLI
|
|
438
|
+
* is a *landing surface* — the one `pending` tells the operator to re-run. If
|
|
439
|
+
* a flaked read exited 1 with no envelope, the surface would be silent exactly
|
|
440
|
+
* where the envelope is the contract. Both landing surfaces emit one envelope
|
|
441
|
+
* or none at all; "none at all" is what Story #4543 removes.
|
|
442
|
+
*/
|
|
443
|
+
async function main() {
|
|
444
|
+
try {
|
|
445
|
+
const outcome = await runConfirmMerge();
|
|
446
|
+
return exitCodeForTerminal(outcome?.terminal ?? { status: 'failed' });
|
|
447
|
+
} catch (err) {
|
|
448
|
+
const storyId = Number(parseSprintArgs().storyId);
|
|
449
|
+
// No story id → a usage error; there is nothing to report an envelope
|
|
450
|
+
// about, so let runAsCli surface it as a plain fatal.
|
|
451
|
+
if (!Number.isInteger(storyId) || storyId <= 0) throw err;
|
|
452
|
+
const terminal = buildTerminalEnvelope({
|
|
453
|
+
storyId,
|
|
454
|
+
status: 'failed',
|
|
455
|
+
phase: 'confirm-merge',
|
|
456
|
+
failure: { reason: String(err?.message ?? err) },
|
|
457
|
+
nextCommand: NEXT_COMMANDS.recover(storyId),
|
|
458
|
+
elapsedSeconds: 0,
|
|
459
|
+
});
|
|
460
|
+
Logger.error(
|
|
461
|
+
`[single-story-confirm-merge] Fatal error: ${formatCliError(err)}`,
|
|
462
|
+
);
|
|
463
|
+
emitTerminalEnvelope(terminal);
|
|
464
|
+
await emitTerminalFriction({ envelope: terminal });
|
|
465
|
+
return exitCodeForTerminal(terminal);
|
|
177
466
|
}
|
|
178
|
-
return { success: true, result };
|
|
179
467
|
}
|
|
180
468
|
|
|
181
|
-
runAsCli(import.meta.url,
|
|
469
|
+
runAsCli(import.meta.url, main, {
|
|
182
470
|
source: 'single-story-confirm-merge',
|
|
471
|
+
propagateExitCode: true,
|
|
183
472
|
});
|
|
@@ -2,14 +2,12 @@
|
|
|
2
2
|
/* node:coverage ignore file */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* single-story-init.js — Initialize a
|
|
5
|
+
* single-story-init.js — Initialize a Story for v2 `/deliver`.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* that applies to a standalone Story — a top-level work unit that branches
|
|
12
|
-
* directly from `main` and opens its PR straight to `main`.
|
|
7
|
+
* Seeds `story-<id>` from `project.baseBranch` (default `main`), materialises
|
|
8
|
+
* the per-Story worktree when isolation is enabled, upserts a `story-init`
|
|
9
|
+
* structured comment, and flips the Story to `agent::executing`. There is no
|
|
10
|
+
* Epic parent, epic branch, or dispatch-manifest gate.
|
|
13
11
|
*
|
|
14
12
|
* What this script does:
|
|
15
13
|
* 1. Validate the Story (type::story, not closed).
|
|
@@ -22,17 +20,14 @@
|
|
|
22
20
|
* `standalone: true`.
|
|
23
21
|
* 6. Flip the Story to `agent::executing`.
|
|
24
22
|
*
|
|
25
|
-
* What this script does NOT do
|
|
26
|
-
* -
|
|
27
|
-
*
|
|
28
|
-
* blocker chain doesn't fit.
|
|
29
|
-
* - Skips child-Task transitions — a standalone Story is treated as
|
|
30
|
-
* atomic (one branch, one commit-set, one PR).
|
|
23
|
+
* What this script does NOT do:
|
|
24
|
+
* - Child-Task transitions — a Story is atomic (one branch, one
|
|
25
|
+
* commit-set, one PR to `main`).
|
|
31
26
|
*
|
|
32
27
|
* Usage: `node single-story-init.js --story <STORY_ID> [--dry-run]`
|
|
33
28
|
* Exit codes: 0 ok, 1 error.
|
|
34
29
|
*
|
|
35
|
-
* @see .agents/workflows/helpers/
|
|
30
|
+
* @see .agents/workflows/helpers/deliver-story.md
|
|
36
31
|
*/
|
|
37
32
|
|
|
38
33
|
import { existsSync } from 'node:fs';
|
|
@@ -61,6 +56,7 @@ import {
|
|
|
61
56
|
} from './lib/orchestration/git-cleanup/phases/fast-forward.js';
|
|
62
57
|
import { verifyRemote } from './lib/orchestration/remote-verifier.js';
|
|
63
58
|
import { acquireStoryLease } from './lib/orchestration/single-story-lease-guard.js';
|
|
59
|
+
import { handleRemoteVerificationFailure } from './lib/orchestration/story-init-remote.js';
|
|
64
60
|
import {
|
|
65
61
|
STATE_LABELS,
|
|
66
62
|
transitionTicketState,
|
|
@@ -74,6 +70,7 @@ import { buildProtectionCtx } from './lib/single-story-sweep/protection-ctx.js';
|
|
|
74
70
|
// friendly "run npm install" message.
|
|
75
71
|
import { WorktreeManager } from './lib/worktree-manager.js';
|
|
76
72
|
|
|
73
|
+
export { handleRemoteVerificationFailure } from './lib/orchestration/story-init-remote.js';
|
|
77
74
|
// `makeGhRunner` moved to the shared `single-story-sweep/protection-ctx.js`
|
|
78
75
|
// module (Story #4373) so the three boot callers build an identical
|
|
79
76
|
// protection ctx. Re-exported here to preserve its existing import path.
|
|
@@ -114,12 +111,20 @@ const progress = Logger.createProgress('single-story-init', { stderr: true });
|
|
|
114
111
|
export function assertDeliverableStory(story, storyId) {
|
|
115
112
|
if (!story.labels.includes(TYPE_LABELS.STORY)) {
|
|
116
113
|
throw new Error(
|
|
117
|
-
`Issue #${storyId} is not a Story (labels: ${story.labels.join(', ')}).
|
|
114
|
+
`Issue #${storyId} is not a Story (labels: ${story.labels.join(', ')}). ` +
|
|
115
|
+
'v2 /deliver accepts type::story tickets only.',
|
|
118
116
|
);
|
|
119
117
|
}
|
|
120
118
|
if (story.state === 'closed') {
|
|
121
119
|
throw new Error(`Story #${storyId} is already closed.`);
|
|
122
120
|
}
|
|
121
|
+
const body = typeof story.body === 'string' ? story.body : '';
|
|
122
|
+
if (/\b(?:Epic|Parent):\s*#\d+/i.test(body)) {
|
|
123
|
+
throw new Error(
|
|
124
|
+
`Story #${storyId} still declares an Epic/Parent footer. ` +
|
|
125
|
+
'v2 delivery is Story-only — re-plan as a standalone Story before /deliver.',
|
|
126
|
+
);
|
|
127
|
+
}
|
|
123
128
|
}
|
|
124
129
|
|
|
125
130
|
/**
|
|
@@ -218,12 +223,10 @@ export async function reapMergedStoryBranches({
|
|
|
218
223
|
/**
|
|
219
224
|
* Fetch remote refs, reap merged story branches, and fast-forward the local
|
|
220
225
|
* base branch so new story branches seed from origin's tip. Exported for
|
|
221
|
-
* testing (owns the fast-forward cascade
|
|
222
|
-
* `ensureEpicBranch` in `branch-initializer.js`).
|
|
226
|
+
* testing (owns the fast-forward cascade).
|
|
223
227
|
*
|
|
224
|
-
* Routes the `origin` fetch through `cachedGitFetch` so concurrent
|
|
225
|
-
*
|
|
226
|
-
* stories get via `branch-initializer.js#fetchMainRefs`. Pass `fetchFn` to
|
|
228
|
+
* Routes the `origin` fetch through `cachedGitFetch` so concurrent Story
|
|
229
|
+
* waves share a per-process fetch-coalescing window. Pass `fetchFn` to
|
|
227
230
|
* inject a stub in tests without touching real git.
|
|
228
231
|
*
|
|
229
232
|
* @param {object} opts
|
|
@@ -408,12 +411,10 @@ export async function provisionWorktree({
|
|
|
408
411
|
}
|
|
409
412
|
|
|
410
413
|
try {
|
|
411
|
-
//
|
|
412
|
-
//
|
|
413
|
-
//
|
|
414
|
-
// standalone-trace branch on CC_EPIC_ID being absent.
|
|
414
|
+
// v2 Stories are standalone — no parent Epic. The helper omits
|
|
415
|
+
// CC_EPIC_ID from env + file; the trace hook keys its standalone-trace
|
|
416
|
+
// branch on CC_EPIC_ID being absent.
|
|
415
417
|
setActiveStoryEnv({
|
|
416
|
-
epicId: null,
|
|
417
418
|
storyId,
|
|
418
419
|
workCwd,
|
|
419
420
|
logger: {
|
|
@@ -478,9 +479,7 @@ export async function runSingleStoryInit({
|
|
|
478
479
|
const provider = injectedProvider || createProvider(config);
|
|
479
480
|
|
|
480
481
|
const baseBranch = config.project?.baseBranch ?? 'main';
|
|
481
|
-
|
|
482
|
-
// numeric-validation guard.
|
|
483
|
-
const storyBranch = getStoryBranch(0, storyId);
|
|
482
|
+
const storyBranch = getStoryBranch(storyId);
|
|
484
483
|
|
|
485
484
|
const runtime = resolveRuntime({ config });
|
|
486
485
|
progress(
|
|
@@ -489,8 +488,8 @@ export async function runSingleStoryInit({
|
|
|
489
488
|
);
|
|
490
489
|
progress('INIT', `Initializing standalone Story #${storyId}...`);
|
|
491
490
|
|
|
492
|
-
// Issue #4483 — deterministic remote evidence at the
|
|
493
|
-
// seam (
|
|
491
|
+
// Issue #4483 — deterministic remote evidence at the v2 `/deliver` entry
|
|
492
|
+
// seam (`single-story-init.js`). The
|
|
494
493
|
// probe is read-only, so it runs under --dry-run too. The CLI records
|
|
495
494
|
// the fact; the workflow owns the `agent::blocked` transition on
|
|
496
495
|
// `remoteVerified: false` — inline delivery to local `main` is never a
|
|
@@ -505,6 +504,12 @@ export async function runSingleStoryInit({
|
|
|
505
504
|
|
|
506
505
|
const story = await provider.getTicket(storyId);
|
|
507
506
|
assertDeliverableStory(story, storyId);
|
|
507
|
+
await handleRemoteVerificationFailure({
|
|
508
|
+
provider,
|
|
509
|
+
storyId,
|
|
510
|
+
remote,
|
|
511
|
+
dryRun,
|
|
512
|
+
});
|
|
508
513
|
|
|
509
514
|
progress(
|
|
510
515
|
'CONTEXT',
|