mandrel 1.94.0 → 2.0.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 +59 -73
- package/.agents/agents/story-worker.md +12 -13
- package/.agents/docs/SDLC.md +489 -1285
- package/.agents/docs/agentrc-reference.json +177 -67
- package/.agents/docs/configuration.md +104 -138
- package/.agents/docs/execution-reference.md +17 -20
- package/.agents/docs/quality-gates.md +13 -19
- package/.agents/docs/workflows.md +3 -3
- package/.agents/instructions.md +70 -81
- package/.agents/rules/ci-remediation.md +8 -12
- package/.agents/rules/git-conventions-reference.md +6 -7
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +54 -214
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/risk-verdict.schema.json +0 -13
- package/.agents/scripts/analyze-execution.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/check-lifecycle-lint.js +6 -9
- package/.agents/scripts/check-prepush-recovery.js +1 -1
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- 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 +5 -5
- 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 -4
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
- package/.agents/scripts/lib/checks/index.js +2 -1
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +16 -7
- package/.agents/scripts/lib/close-validation/gates.js +2 -2
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +45 -29
- package/.agents/scripts/lib/config/explain.js +55 -36
- package/.agents/scripts/lib/config/limits.js +17 -58
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +1 -1
- package/.agents/scripts/lib/config/runners.js +17 -50
- package/.agents/scripts/lib/config/temp-paths.js +19 -14
- 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 +24 -148
- package/.agents/scripts/lib/config-settings-schema-quality.js +8 -14
- package/.agents/scripts/lib/config-settings-schema.js +52 -38
- 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 +211 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +5 -5
- package/.agents/scripts/lib/framework-version.js +2 -3
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
- package/.agents/scripts/lib/git-utils.js +32 -6
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/label-constants.js +10 -23
- package/.agents/scripts/lib/label-taxonomy.js +9 -43
- package/.agents/scripts/lib/observability/active-story-env.js +1 -1
- package/.agents/scripts/lib/observability/hook-heartbeat.js +20 -52
- package/.agents/scripts/lib/observability/source-classifier.js +3 -3
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +8 -5
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +83 -20
- package/.agents/scripts/lib/orchestration/code-review.js +20 -268
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- 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/lifecycle/emit-loop-tick.js +8 -8
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
- 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 +13 -13
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
- 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/phases/code-review.js +15 -12
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
- package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
- package/.agents/scripts/lib/orchestration/ticket-validator.js +2 -7
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
- package/.agents/scripts/lib/planning-corpus.js +16 -11
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/story-adjacency.js +11 -14
- package/.agents/scripts/lib/story-body/story-body.js +124 -70
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
- package/.agents/scripts/lib/validation-evidence.js +1 -1
- package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
- 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 +64 -74
- package/.agents/scripts/plan-persist.js +121 -280
- package/.agents/scripts/plan-run-epilogue.js +97 -0
- package/.agents/scripts/providers/github/issues.js +17 -33
- package/.agents/scripts/providers/github/mappers.js +0 -12
- package/.agents/scripts/providers/github/tickets.js +2 -5
- package/.agents/scripts/resolve-plan-run.js +117 -0
- package/.agents/scripts/signals-view.js +24 -19
- package/.agents/scripts/single-story-close.js +11 -14
- package/.agents/scripts/single-story-confirm-merge.js +39 -23
- package/.agents/scripts/single-story-init.js +29 -20
- package/.agents/scripts/stories-wave-tick.js +6 -6
- package/.agents/scripts/story-plan.js +26 -47
- package/.agents/scripts/update-ticket-state.js +6 -15
- package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
- package/.agents/skills/core/idea-refinement/SKILL.md +6 -6
- package/.agents/skills/core/scope-triage/SKILL.md +28 -172
- package/.agents/skills/skills.index.json +3 -43
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +3 -3
- package/.agents/workflows/audit-clean-code.md +3 -3
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +5 -5
- package/.agents/workflows/audit-lighthouse.md +3 -3
- package/.agents/workflows/audit-navigability.md +3 -2
- package/.agents/workflows/audit-performance.md +3 -3
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +3 -3
- package/.agents/workflows/audit-security.md +3 -3
- package/.agents/workflows/audit-seo.md +3 -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 +3 -3
- package/.agents/workflows/deliver.md +122 -174
- package/.agents/workflows/git-cleanup.md +3 -4
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +16 -29
- package/.agents/workflows/helpers/code-review.md +70 -193
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
- package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/parallel-tooling.md +1 -1
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
- package/.agents/workflows/mandrel-update.md +2 -1
- package/.agents/workflows/plan.md +112 -145
- package/.agents/workflows/qa-assist.md +24 -30
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -2
- package/README.md +9 -8
- package/docs/CHANGELOG.md +30 -0
- package/lib/migrations/index.js +6 -5
- 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-spec.schema.json +0 -153
- 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/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- 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/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/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/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/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/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/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/post-merge-pipeline.js +0 -205
- 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-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/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/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js
DELETED
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* gate-failure.js — phase 4 of baseline-attribution.
|
|
3
|
-
*
|
|
4
|
-
* The per-failure classifier wired between the close-validation gate chain
|
|
5
|
-
* and the rest of the baseline-attribution pipeline:
|
|
6
|
-
*
|
|
7
|
-
* - `handleBaselineGateFailure` — given a baseline-style gate name and
|
|
8
|
-
* its projected regressions, classify the drift against the Story's
|
|
9
|
-
* diff and either refresh-and-retry, post a friction comment, or
|
|
10
|
-
* rethrow.
|
|
11
|
-
*
|
|
12
|
-
* The bounded retry driver that wraps this classifier
|
|
13
|
-
* (`runPreMergeGatesWithAttribution`) lives in the sibling
|
|
14
|
-
* `pre-merge-attribution.js` (split out under refs #3685 so each module
|
|
15
|
-
* scores at or above the maintainability floor).
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import fs from 'node:fs';
|
|
19
|
-
import { refreshBaseline as defaultRefreshBaseline } from '../../../../baselines/refresh-service.js';
|
|
20
|
-
import { gitSpawn as defaultGitSpawn } from '../../../../git-utils.js';
|
|
21
|
-
import { upsertStructuredComment as defaultUpsertStructuredComment } from '../../../ticketing.js';
|
|
22
|
-
import { classifyBaselineDrift as defaultClassifyBaselineDrift } from '../../baseline-attribution.js';
|
|
23
|
-
import { renderBaselineFrictionBody as defaultRenderBaselineFrictionBody } from '../../baseline-friction-body.js';
|
|
24
|
-
import { buildKindScorer, runRefreshCommit } from './refresh-commit.js';
|
|
25
|
-
import { computeStoryDiffPaths } from './scope-discovery.js';
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Map gate names → metadata used to project regressions and refresh the
|
|
29
|
-
* baseline. Only baseline-style gates appear here; non-baseline gates
|
|
30
|
-
* (typecheck, lint, test, format) fall through and the orchestrator
|
|
31
|
-
* re-throws the original gate error.
|
|
32
|
-
*
|
|
33
|
-
* Story #2205 — the `refreshCmd` shell-out is gone. Each gate now declares
|
|
34
|
-
* the `kind` (matching `refreshBaseline`'s supported kinds) and the
|
|
35
|
-
* timeout block is retained as informational metadata only.
|
|
36
|
-
*/
|
|
37
|
-
export const DEFAULT_GATE_REGISTRY = {
|
|
38
|
-
'check-maintainability': {
|
|
39
|
-
kind: 'maintainability',
|
|
40
|
-
baselineHint: 'maintainability',
|
|
41
|
-
timeoutBlockKey: 'maintainability',
|
|
42
|
-
},
|
|
43
|
-
'check-crap': {
|
|
44
|
-
kind: 'crap',
|
|
45
|
-
baselineHint: 'crap',
|
|
46
|
-
timeoutBlockKey: 'crap',
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
/** Gate names that fan out to per-kind refreshers via `_gateKind` tags. */
|
|
51
|
-
const COMPOSITE_GATE_KINDS = new Set(['check-baselines']);
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Resolve the refresh metadata + the regression subset a single failure
|
|
55
|
-
* cycle should act on.
|
|
56
|
-
*
|
|
57
|
-
* A direct per-kind gate (`check-maintainability` / `check-crap`) maps
|
|
58
|
-
* straight through. The unified `check-baselines` gate is a **composite**:
|
|
59
|
-
* its projected regressions are tagged with `_gateKind`, and each attribution
|
|
60
|
-
* cycle picks the first regressed kind not already refreshed this cycle
|
|
61
|
-
* (`cycleState.refreshedKinds`), scoping classify + refresh to that one kind.
|
|
62
|
-
* The retry loop re-drives for any remaining kinds — so a close that regresses
|
|
63
|
-
* both maintainability and CRAP converges in two cycles instead of dead-ending
|
|
64
|
-
* on an unrecognised gate name (framework-gap #4377).
|
|
65
|
-
*
|
|
66
|
-
* @returns {{ meta: object, regressions: Array } | null}
|
|
67
|
-
*/
|
|
68
|
-
export function resolveGateMeta({
|
|
69
|
-
gateName,
|
|
70
|
-
regressions,
|
|
71
|
-
cycleState = null,
|
|
72
|
-
gateRegistry = DEFAULT_GATE_REGISTRY,
|
|
73
|
-
}) {
|
|
74
|
-
if (!Array.isArray(regressions) || regressions.length === 0) return null;
|
|
75
|
-
|
|
76
|
-
const direct = gateRegistry[gateName];
|
|
77
|
-
if (direct) return { meta: direct, regressions };
|
|
78
|
-
|
|
79
|
-
if (COMPOSITE_GATE_KINDS.has(gateName)) {
|
|
80
|
-
const refreshed = cycleState?.refreshedKinds ?? new Set();
|
|
81
|
-
for (const row of regressions) {
|
|
82
|
-
const kind = row?._gateKind;
|
|
83
|
-
const subMeta = kind ? gateRegistry[`check-${kind}`] : null;
|
|
84
|
-
if (subMeta && !refreshed.has(subMeta.kind)) {
|
|
85
|
-
return {
|
|
86
|
-
meta: subMeta,
|
|
87
|
-
regressions: regressions.filter((r) => r?._gateKind === kind),
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Top-level: handle a baseline gate failure by classifying drift and
|
|
97
|
-
* either auto-refreshing (attributable-only) or posting friction (any
|
|
98
|
-
* non-attributable). Non-baseline gates short-circuit with `{ action:
|
|
99
|
-
* 'rethrow' }` and the caller re-throws the original gate error so
|
|
100
|
-
* compile/lint/test failures still hard-fail the close.
|
|
101
|
-
*
|
|
102
|
-
* @param {object} input
|
|
103
|
-
* @param {string} input.gateName
|
|
104
|
-
* @param {Array<{ path?: string, file?: string }>} input.regressions
|
|
105
|
-
* @param {string} input.cwd Worktree path (where refresh + commit run).
|
|
106
|
-
* @param {string} input.epicBranch e.g. `epic/1114` (no `origin/` prefix).
|
|
107
|
-
* @param {string} input.storyBranch e.g. `story-1124`.
|
|
108
|
-
* @param {number|string} input.storyId
|
|
109
|
-
* @param {number|string} input.epicId
|
|
110
|
-
* @param {object} input.provider Ticketing provider for friction post.
|
|
111
|
-
* @param {{ refreshedKinds?: Set<string>, lastRefreshSha?: string|null } | null} [input.cycleState]
|
|
112
|
-
* @param {object} [input.gateRegistry]
|
|
113
|
-
* @param {object} [input.deps] Injected seams for tests.
|
|
114
|
-
* @returns {Promise<{
|
|
115
|
-
* action: 'refreshed' | 'blocked' | 'rethrow',
|
|
116
|
-
* sha?: string,
|
|
117
|
-
* skipped?: boolean,
|
|
118
|
-
* nonAttributable?: Array,
|
|
119
|
-
* commentId?: number|string|null,
|
|
120
|
-
* }>}
|
|
121
|
-
*/
|
|
122
|
-
export async function handleBaselineGateFailure({
|
|
123
|
-
gateName,
|
|
124
|
-
regressions,
|
|
125
|
-
cwd,
|
|
126
|
-
epicBranch,
|
|
127
|
-
storyBranch,
|
|
128
|
-
storyId,
|
|
129
|
-
epicId,
|
|
130
|
-
config,
|
|
131
|
-
provider,
|
|
132
|
-
cycleState = null,
|
|
133
|
-
gateRegistry = DEFAULT_GATE_REGISTRY,
|
|
134
|
-
deps = {},
|
|
135
|
-
} = {}) {
|
|
136
|
-
const resolved = resolveGateMeta({
|
|
137
|
-
gateName,
|
|
138
|
-
regressions,
|
|
139
|
-
cycleState,
|
|
140
|
-
gateRegistry,
|
|
141
|
-
});
|
|
142
|
-
if (!resolved) return { action: 'rethrow' };
|
|
143
|
-
const { meta, regressions: scopedRegressions } = resolved;
|
|
144
|
-
|
|
145
|
-
const classify = deps.classifyBaselineDrift ?? defaultClassifyBaselineDrift;
|
|
146
|
-
const renderBody =
|
|
147
|
-
deps.renderBaselineFrictionBody ?? defaultRenderBaselineFrictionBody;
|
|
148
|
-
const upsertComment =
|
|
149
|
-
deps.upsertStructuredComment ?? defaultUpsertStructuredComment;
|
|
150
|
-
const gitRunner = deps.gitRunner ?? { gitSpawn: defaultGitSpawn };
|
|
151
|
-
const refreshBaseline = deps.refreshBaseline ?? defaultRefreshBaseline;
|
|
152
|
-
const scorerBuilder = deps.scorerBuilder ?? buildKindScorer;
|
|
153
|
-
const fsImpl = deps.fsImpl ?? fs;
|
|
154
|
-
const computePaths = deps.computeStoryDiffPaths ?? computeStoryDiffPaths;
|
|
155
|
-
|
|
156
|
-
const storyDiffPaths = computePaths({
|
|
157
|
-
cwd,
|
|
158
|
-
epicBranch,
|
|
159
|
-
storyBranch,
|
|
160
|
-
gitRunner,
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
const epicRef = `origin/${epicBranch}`;
|
|
164
|
-
const { attributable, nonAttributable } = classify({
|
|
165
|
-
regressions: scopedRegressions,
|
|
166
|
-
storyDiffPaths,
|
|
167
|
-
epicRef,
|
|
168
|
-
cwd,
|
|
169
|
-
gitRunner,
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
if (nonAttributable.length > 0) {
|
|
173
|
-
const body = renderBody({ rows: nonAttributable, epicId, storyId });
|
|
174
|
-
let commentId = null;
|
|
175
|
-
try {
|
|
176
|
-
const res = await upsertComment(provider, storyId, 'friction', body);
|
|
177
|
-
commentId = res?.commentId ?? null;
|
|
178
|
-
} catch (err) {
|
|
179
|
-
deps.logger?.warn?.(
|
|
180
|
-
`[baseline-attribution-wiring] failed to upsert friction comment: ${err?.message ?? err}`,
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
return { action: 'blocked', nonAttributable, commentId };
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
if (attributable.length === 0) return { action: 'rethrow' };
|
|
187
|
-
|
|
188
|
-
const refresh = await runRefreshCommit({
|
|
189
|
-
cwd,
|
|
190
|
-
kind: meta.kind,
|
|
191
|
-
storyId,
|
|
192
|
-
epicBranch,
|
|
193
|
-
storyBranch,
|
|
194
|
-
config,
|
|
195
|
-
cycleState,
|
|
196
|
-
refreshBaseline,
|
|
197
|
-
scorerBuilder,
|
|
198
|
-
fsImpl,
|
|
199
|
-
gitRunner,
|
|
200
|
-
logger: deps.logger,
|
|
201
|
-
});
|
|
202
|
-
if (!refresh.ok) {
|
|
203
|
-
return { action: 'rethrow', error: refresh.error };
|
|
204
|
-
}
|
|
205
|
-
return {
|
|
206
|
-
action: 'refreshed',
|
|
207
|
-
sha: refresh.sha,
|
|
208
|
-
skipped: refresh.skipped === true,
|
|
209
|
-
reason: refresh.reason,
|
|
210
|
-
};
|
|
211
|
-
}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pre-merge-attribution.js — phase 4 (retry driver) of baseline-attribution.
|
|
3
|
-
*
|
|
4
|
-
* Houses `runPreMergeGatesWithAttribution`, the public wrapper around
|
|
5
|
-
* `runPreMergeGates` that drives the bounded retry loop. Extracted from
|
|
6
|
-
* `gate-failure.js` (refs #3685) so the per-failure classifier
|
|
7
|
-
* (`handleBaselineGateFailure`) and the retry driver each live in a
|
|
8
|
-
* file that scores at or above the restored maintainability floor; the
|
|
9
|
-
* two were previously fused in a single module whose aggregate volume
|
|
10
|
-
* sat below 70.
|
|
11
|
-
*
|
|
12
|
-
* The retry loop wears a single mutable `cycleState` object so the
|
|
13
|
-
* idempotency token enforces AC-9 (one refresh commit per kind per close
|
|
14
|
-
* cycle).
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { COVERAGE_TIMEOUT_EXIT_CODE } from '../../../../coverage-capture.js';
|
|
18
|
-
import { Logger as DefaultLogger } from '../../../../Logger.js';
|
|
19
|
-
import { runPreMergeGates as defaultRunPreMergeGates } from '../../pre-merge-validation.js';
|
|
20
|
-
import { handleBaselineGateFailure } from './gate-failure.js';
|
|
21
|
-
import { projectRegressionsForGate } from './regression-projection.js';
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Wrap `runPreMergeGates` with the Story #1124 baseline-attribution flow.
|
|
25
|
-
*
|
|
26
|
-
* On a baseline-gate failure we project the regressions, classify them
|
|
27
|
-
* against the Story's diff vs `epic/<id>`, and either refresh-and-retry,
|
|
28
|
-
* post a friction comment, or rethrow.
|
|
29
|
-
*
|
|
30
|
-
* Story #2205 — the retry-loop wears a single mutable `cycleState` object
|
|
31
|
-
* carrying `refreshedKinds` (the idempotency token enforcing AC-9). Each
|
|
32
|
-
* `runRefreshCommit` call short-circuits when its kind is already in that
|
|
33
|
-
* set, so a fail-then-pass sequence emits at most one
|
|
34
|
-
* `chore(baselines): refresh <kind> for story-<id>` commit per cycle.
|
|
35
|
-
*
|
|
36
|
-
* @returns {Promise<
|
|
37
|
-
* | { status: 'ok' }
|
|
38
|
-
* | { status: 'blocked', nonAttributable: Array, commentId: string|number|null }
|
|
39
|
-
* >}
|
|
40
|
-
*/
|
|
41
|
-
export async function runPreMergeGatesWithAttribution({
|
|
42
|
-
cwd,
|
|
43
|
-
worktreePath,
|
|
44
|
-
epicBranch,
|
|
45
|
-
storyBranch,
|
|
46
|
-
config,
|
|
47
|
-
storyId,
|
|
48
|
-
epicId,
|
|
49
|
-
useEvidence,
|
|
50
|
-
phaseTimer,
|
|
51
|
-
provider,
|
|
52
|
-
bus = null,
|
|
53
|
-
runPreMergeGates = defaultRunPreMergeGates,
|
|
54
|
-
handleBaselineGateFailureFn = handleBaselineGateFailure,
|
|
55
|
-
projectRegressionsFn = projectRegressionsForGate,
|
|
56
|
-
logger = DefaultLogger,
|
|
57
|
-
maxAttempts = 2,
|
|
58
|
-
cycleState: cycleStateParam = null,
|
|
59
|
-
} = {}) {
|
|
60
|
-
let attempt = 0;
|
|
61
|
-
const gateCwd = worktreePath || cwd;
|
|
62
|
-
// Story #2205: single mutable cycle state object — `refreshedKinds`
|
|
63
|
-
// gates the idempotency token enforcing AC-9 (one refresh commit per
|
|
64
|
-
// kind per close cycle). Story #4017: the caller may thread the close
|
|
65
|
-
// cycle's shared object so the post-gates auto-refresh sees the kinds
|
|
66
|
-
// already refreshed by this retry loop and never re-scores them.
|
|
67
|
-
const cycleState = cycleStateParam ?? {
|
|
68
|
-
refreshedKinds: new Set(),
|
|
69
|
-
lastRefreshSha: null,
|
|
70
|
-
};
|
|
71
|
-
while (attempt < maxAttempts) {
|
|
72
|
-
attempt += 1;
|
|
73
|
-
try {
|
|
74
|
-
await runPreMergeGates({
|
|
75
|
-
cwd,
|
|
76
|
-
worktreePath,
|
|
77
|
-
epicBranch,
|
|
78
|
-
config,
|
|
79
|
-
storyId,
|
|
80
|
-
epicId,
|
|
81
|
-
useEvidence,
|
|
82
|
-
phaseTimer,
|
|
83
|
-
bus,
|
|
84
|
-
logger,
|
|
85
|
-
});
|
|
86
|
-
return { status: 'ok' };
|
|
87
|
-
} catch (err) {
|
|
88
|
-
// Story #2136 / Task #2143 — short-circuit when coverage-capture
|
|
89
|
-
// tripped the bounded-timeout watchdog (exit 124).
|
|
90
|
-
const errGateName = err?.gateName ?? null;
|
|
91
|
-
const errExitCode = err?.exitCode ?? null;
|
|
92
|
-
if (
|
|
93
|
-
errGateName === 'coverage-capture' &&
|
|
94
|
-
errExitCode === COVERAGE_TIMEOUT_EXIT_CODE
|
|
95
|
-
) {
|
|
96
|
-
return {
|
|
97
|
-
status: 'blocked-timeout',
|
|
98
|
-
gateName: errGateName,
|
|
99
|
-
exitCode: errExitCode,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
const m = /failed at "([^"]+)"/.exec(err?.message ?? '');
|
|
103
|
-
const gateName = m ? m[1] : null;
|
|
104
|
-
const regressions = projectRegressionsFn({
|
|
105
|
-
gateName,
|
|
106
|
-
cwd: gateCwd,
|
|
107
|
-
epicBranch,
|
|
108
|
-
storyBranch,
|
|
109
|
-
config,
|
|
110
|
-
});
|
|
111
|
-
const outcome = await handleBaselineGateFailureFn({
|
|
112
|
-
gateName,
|
|
113
|
-
regressions,
|
|
114
|
-
cwd: gateCwd,
|
|
115
|
-
epicBranch,
|
|
116
|
-
storyBranch,
|
|
117
|
-
storyId,
|
|
118
|
-
epicId,
|
|
119
|
-
config,
|
|
120
|
-
provider,
|
|
121
|
-
cycleState,
|
|
122
|
-
});
|
|
123
|
-
if (outcome.action === 'refreshed') {
|
|
124
|
-
const verb = outcome.skipped
|
|
125
|
-
? `baseline-refresh skipped (${outcome.reason ?? 'no drift'})`
|
|
126
|
-
: 'baseline-refresh committed';
|
|
127
|
-
logger.info?.(
|
|
128
|
-
`[baseline-attribution-wiring] ${verb} (${outcome.sha}); re-running pre-merge gates.`,
|
|
129
|
-
);
|
|
130
|
-
continue;
|
|
131
|
-
}
|
|
132
|
-
if (outcome.action === 'blocked') {
|
|
133
|
-
return {
|
|
134
|
-
status: 'blocked',
|
|
135
|
-
nonAttributable: outcome.nonAttributable ?? [],
|
|
136
|
-
commentId: outcome.commentId ?? null,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
// 'rethrow' — and any unexpected action — surfaces the original error.
|
|
140
|
-
throw err;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
// maxAttempts exhausted → re-run so the throw propagates with the
|
|
144
|
-
// canonical hint.
|
|
145
|
-
await runPreMergeGates({
|
|
146
|
-
cwd,
|
|
147
|
-
worktreePath,
|
|
148
|
-
epicBranch,
|
|
149
|
-
config,
|
|
150
|
-
storyId,
|
|
151
|
-
epicId,
|
|
152
|
-
useEvidence,
|
|
153
|
-
phaseTimer,
|
|
154
|
-
bus,
|
|
155
|
-
logger,
|
|
156
|
-
});
|
|
157
|
-
return { status: 'ok' };
|
|
158
|
-
}
|