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
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* story-init-not-backgrounded — refuse-and-print check.
|
|
3
3
|
*
|
|
4
|
-
* Detects orchestration call sites that invoke `story-init.js` via
|
|
5
|
-
* Bash tool's `run_in_background: true` mode (with subsequent `Monitor`
|
|
4
|
+
* Detects orchestration call sites that invoke `single-story-init.js` via
|
|
5
|
+
* the Bash tool's `run_in_background: true` mode (with subsequent `Monitor`
|
|
6
6
|
* waiting on completion) instead of a synchronous Bash call with a
|
|
7
7
|
* 10-minute timeout. This guards the failure mode where `Monitor`'s wait
|
|
8
8
|
* is not equivalent to script exit — a sub-agent that exits during a
|
|
9
|
-
* Monitor wait kills `story-init.js` mid-
|
|
10
|
-
* worktree
|
|
9
|
+
* Monitor wait kills `single-story-init.js` mid-run, leaving a
|
|
10
|
+
* half-initialized worktree.
|
|
11
11
|
*
|
|
12
12
|
* Scope: 'epic-deliver', 'story-close', 'retro'. The check runs at every
|
|
13
|
-
* preflight surface that has the opportunity to invoke
|
|
14
|
-
* primarily
|
|
13
|
+
* preflight surface that has the opportunity to invoke Story init —
|
|
14
|
+
* primarily `/deliver`'s init step — and surfaces as a retro audit
|
|
15
15
|
* signal if the failure mode resurfaces during a sprint.
|
|
16
16
|
*
|
|
17
17
|
* The check is `refuse-and-print`. Auto-rewriting an orchestration call
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
* synchronous-call replacement pattern so they can apply it deliberately.
|
|
21
21
|
*
|
|
22
22
|
* Implementation note: we scan `.agents/` (markdown + js) for the
|
|
23
|
-
* juxtaposition of a `story-init.js` reference
|
|
23
|
+
* juxtaposition of a `story-init.js` reference (which also matches
|
|
24
|
+
* `single-story-init.js` as a suffix) and a backgrounding token
|
|
24
25
|
* (`run_in_background: true`, the literal `Monitor` tool name as a
|
|
25
26
|
* fan-out target, or `&` shell backgrounding) within a small line window.
|
|
26
27
|
*/
|
|
@@ -39,7 +40,8 @@ const WINDOW_LINES = 20;
|
|
|
39
40
|
* - `run_in_background: true` — Bash tool's backgrounding flag.
|
|
40
41
|
* - `detached: true` — child_process.spawn options that detach the
|
|
41
42
|
* subprocess from the parent's lifecycle, equivalent to backgrounding.
|
|
42
|
-
* - `story-init.js &` — POSIX shell ampersand backgrounding
|
|
43
|
+
* - `single-story-init.js &` — POSIX shell ampersand backgrounding
|
|
44
|
+
* (the pattern matches the `story-init.js` suffix of both names).
|
|
43
45
|
*/
|
|
44
46
|
const BACKGROUND_TOKENS = [
|
|
45
47
|
/run_in_background\s*:\s*true/,
|
|
@@ -85,12 +87,12 @@ function walkSources(dir) {
|
|
|
85
87
|
|
|
86
88
|
/**
|
|
87
89
|
* For one file, return an array of `{ line, kind }` offences: every line
|
|
88
|
-
* referencing `story-init.js` that has
|
|
89
|
-
* ±WINDOW_LINES window.
|
|
90
|
+
* referencing `story-init.js` (including `single-story-init.js`) that has
|
|
91
|
+
* a backgrounding token in the same ±WINDOW_LINES window.
|
|
90
92
|
*
|
|
91
|
-
* The check explicitly excludes the `story-init.js` file itself and
|
|
92
|
-
* dedicated check module (this file): the source-of-truth
|
|
93
|
-
* legitimately mentions itself.
|
|
93
|
+
* The check explicitly excludes the `single-story-init.js` file itself and
|
|
94
|
+
* any dedicated check module (this file): the source-of-truth
|
|
95
|
+
* implementation legitimately mentions itself.
|
|
94
96
|
*
|
|
95
97
|
* @param {string} file
|
|
96
98
|
* @param {string} src
|
|
@@ -100,12 +102,12 @@ function scanFile(file, src) {
|
|
|
100
102
|
const offences = [];
|
|
101
103
|
// Don't flag the actual story-init script, self-references, or the
|
|
102
104
|
// parallel-tooling helper — the helper documents both Rule 2
|
|
103
|
-
// (run_in_background) and the story-init
|
|
104
|
-
// bullets, which collides with the scanner's ±20-line window
|
|
105
|
-
// though there is no real invocation in the prose.
|
|
105
|
+
// (run_in_background) and the story-init backgrounding anti-pattern in
|
|
106
|
+
// adjacent bullets, which collides with the scanner's ±20-line window
|
|
107
|
+
// even though there is no real invocation in the prose.
|
|
106
108
|
const basename = path.basename(file);
|
|
107
109
|
if (
|
|
108
|
-
basename === 'story-init.js' ||
|
|
110
|
+
basename === 'single-story-init.js' ||
|
|
109
111
|
basename === 'story-init-not-backgrounded.js' ||
|
|
110
112
|
basename === 'story-init-not-backgrounded.test.js' ||
|
|
111
113
|
basename === 'parallel-tooling.md'
|
|
@@ -129,13 +131,13 @@ function scanFile(file, src) {
|
|
|
129
131
|
}
|
|
130
132
|
|
|
131
133
|
const FIX_COMMAND = [
|
|
132
|
-
'# Invoke story-init.js synchronously with a 10-minute timeout.
|
|
133
|
-
'# script is idempotent on partial state, so re-running after a',
|
|
134
|
+
'# Invoke single-story-init.js synchronously with a 10-minute timeout.',
|
|
135
|
+
'# The script is idempotent on partial state, so re-running after a',
|
|
134
136
|
'# half-initialized worktree is safe — but blocking on the Bash call',
|
|
135
137
|
'# is what prevents the half-init state in the first place.',
|
|
136
138
|
'#',
|
|
137
139
|
'# Replacement pattern (Bash tool):',
|
|
138
|
-
'# Bash(timeout: 600000, command: "node .agents/scripts/story-init.js --story <id>")',
|
|
140
|
+
'# Bash(timeout: 600000, command: "node .agents/scripts/single-story-init.js --story <id>")',
|
|
139
141
|
'#',
|
|
140
142
|
'# Do NOT use:',
|
|
141
143
|
'# Bash(run_in_background: true, ...) + Monitor(...)',
|
|
@@ -177,7 +179,7 @@ export default {
|
|
|
177
179
|
id: 'story-init-not-backgrounded',
|
|
178
180
|
severity: 'blocker',
|
|
179
181
|
scope: state?.scope ?? 'epic-deliver',
|
|
180
|
-
summary: `${offences.length} orchestration call site(s) invoke story-init.js with Monitor backgrounding`,
|
|
182
|
+
summary: `${offences.length} orchestration call site(s) invoke single-story-init.js with Monitor backgrounding`,
|
|
181
183
|
detail,
|
|
182
184
|
fixCommand: FIX_COMMAND,
|
|
183
185
|
autoCorrectable: false,
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
*
|
|
14
14
|
* Contract
|
|
15
15
|
* --------
|
|
16
|
-
* parseStandardCliArgs(argv, schema?) → { values, positionals }
|
|
17
16
|
* parseStandardCliArgs({ argv, schema?, extras? }) → { values, positionals }
|
|
18
17
|
*
|
|
19
18
|
* - `argv` — `process.argv.slice(2)` shape; the helper does NOT strip
|
|
@@ -99,24 +98,20 @@ function camelCase(name) {
|
|
|
99
98
|
}
|
|
100
99
|
|
|
101
100
|
/**
|
|
102
|
-
*
|
|
103
|
-
* `(argv, schema
|
|
104
|
-
* `({ argv, schema, extras })`.
|
|
101
|
+
* Validate the call signature. Only the object form
|
|
102
|
+
* `({ argv, schema, extras })` is accepted.
|
|
105
103
|
*
|
|
106
|
-
* @param {unknown}
|
|
107
|
-
* @param {unknown} maybeSchema
|
|
104
|
+
* @param {unknown} opts
|
|
108
105
|
* @returns {{ argv: string[], schema: object | undefined, extras: object | undefined }}
|
|
109
106
|
*/
|
|
110
|
-
function normaliseCallSignature(
|
|
111
|
-
if (
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
) {
|
|
116
|
-
const { argv, schema, extras } = argvOrOpts;
|
|
117
|
-
return { argv: argv ?? [], schema, extras };
|
|
107
|
+
function normaliseCallSignature(opts) {
|
|
108
|
+
if (opts === null || typeof opts !== 'object' || Array.isArray(opts)) {
|
|
109
|
+
throw new Error(
|
|
110
|
+
'parseStandardCliArgs: options must be a plain object ({ argv, schema?, extras? })',
|
|
111
|
+
);
|
|
118
112
|
}
|
|
119
|
-
|
|
113
|
+
const { argv, schema, extras } = opts;
|
|
114
|
+
return { argv: argv ?? [], schema, extras };
|
|
120
115
|
}
|
|
121
116
|
|
|
122
117
|
/**
|
|
@@ -313,15 +308,11 @@ function normaliseValues(raw, extras) {
|
|
|
313
308
|
* Parse the dispatcher's shared CLI flag surface. See module docstring
|
|
314
309
|
* for the full contract.
|
|
315
310
|
*
|
|
316
|
-
* @param {
|
|
317
|
-
* @param {Record<string, { required?: boolean }>} [maybeSchema]
|
|
311
|
+
* @param {{ argv?: string[], schema?: object, extras?: object }} [opts]
|
|
318
312
|
* @returns {{ values: Record<string, unknown>, positionals: string[] }}
|
|
319
313
|
*/
|
|
320
|
-
export function parseStandardCliArgs(
|
|
321
|
-
const { argv, schema, extras } = normaliseCallSignature(
|
|
322
|
-
argvOrOpts,
|
|
323
|
-
maybeSchema,
|
|
324
|
-
);
|
|
314
|
+
export function parseStandardCliArgs(opts = {}) {
|
|
315
|
+
const { argv, schema, extras } = normaliseCallSignature(opts);
|
|
325
316
|
if (!Array.isArray(argv)) {
|
|
326
317
|
throw new Error('parseStandardCliArgs: argv must be an array');
|
|
327
318
|
}
|
|
@@ -40,6 +40,12 @@ function coerceBooleanFlag(value) {
|
|
|
40
40
|
return Boolean(value);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
/** Like coerceBooleanFlag, but preserves `undefined` (flag absent). */
|
|
44
|
+
function optionalBooleanFlag(value) {
|
|
45
|
+
if (value === undefined) return undefined;
|
|
46
|
+
return coerceBooleanFlag(value);
|
|
47
|
+
}
|
|
48
|
+
|
|
43
49
|
/**
|
|
44
50
|
* Standardized CLI argument parser for sprint scripts.
|
|
45
51
|
* Supports options like --epic, --story, --dry-run, --skip-dashboard.
|
|
@@ -58,7 +64,8 @@ export function parseSprintArgs(args = process.argv) {
|
|
|
58
64
|
'skip-sync': { type: 'boolean', default: false },
|
|
59
65
|
'no-auto-merge': { type: 'boolean', default: false },
|
|
60
66
|
'no-full-scope-crap': { type: 'boolean', default: false },
|
|
61
|
-
|
|
67
|
+
// No default — absent means "use delivery.routing.closeAndLand".
|
|
68
|
+
'wait-merge': { type: 'boolean' },
|
|
62
69
|
'no-wait-merge': { type: 'boolean', default: false },
|
|
63
70
|
executor: { type: 'string' },
|
|
64
71
|
cwd: { type: 'string' },
|
|
@@ -81,11 +88,11 @@ export function parseSprintArgs(args = process.argv) {
|
|
|
81
88
|
skipSync: coerceBooleanFlag(values['skip-sync']),
|
|
82
89
|
noAutoMerge: coerceBooleanFlag(values['no-auto-merge']),
|
|
83
90
|
noFullScopeCrap: coerceBooleanFlag(values['no-full-scope-crap']),
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
waitForMerge:
|
|
91
|
+
// Close-and-land: `--wait-merge` forces land-in-close; `--no-wait-merge`
|
|
92
|
+
// opts out. When neither flag is present (`undefined`),
|
|
93
|
+
// `parseCloseOptions` applies `delivery.routing.closeAndLand` (default
|
|
94
|
+
// true) so attended and headless delivers share the same happy path.
|
|
95
|
+
waitForMerge: optionalBooleanFlag(values['wait-merge']),
|
|
89
96
|
noWaitForMerge: coerceBooleanFlag(values['no-wait-merge']),
|
|
90
97
|
executor: values.executor ?? null,
|
|
91
98
|
// Resolve worktree cwd from flag or env. Empty string/whitespace → null.
|
|
@@ -95,7 +102,9 @@ export function parseSprintArgs(args = process.argv) {
|
|
|
95
102
|
null,
|
|
96
103
|
recutOf: parseTicketId(values['recut-of']),
|
|
97
104
|
// Story #4253: pre-resolved Epic linkage threaded by the /deliver
|
|
98
|
-
// fan-out so `story-init.js` can skip
|
|
105
|
+
// fan-out so `single-story-init.js` can skip redundant Epic lookups when
|
|
106
|
+
// the parent already threaded Epic context (pre-v2; field retained for
|
|
107
|
+
// CLI compatibility).
|
|
99
108
|
resume: values.resume ?? false,
|
|
100
109
|
restart: values.restart ?? false,
|
|
101
110
|
noEvidence: values['no-evidence'] ?? false,
|
|
@@ -146,7 +146,7 @@ function enabledBaselineKinds(config) {
|
|
|
146
146
|
* `delivery.quality.requireBaselines: true`. Default false — a consumer that
|
|
147
147
|
* enables baseline gates but has not committed baseline artifacts gets a
|
|
148
148
|
* clean skip (see `probeBaselinesGate`) rather than a deterministic first-try
|
|
149
|
-
* close failure.
|
|
149
|
+
* close failure. Fail-closed baseline posture (#4495).
|
|
150
150
|
*
|
|
151
151
|
* @param {object|undefined|null} config
|
|
152
152
|
* @returns {boolean}
|
|
@@ -379,7 +379,7 @@ export function buildDefaultGates({
|
|
|
379
379
|
/**
|
|
380
380
|
* Default gate list resolved with no consumer config — uses the
|
|
381
381
|
* `npm run typecheck` fallback for the typecheck gate. Call sites that have a
|
|
382
|
-
* resolved config object in scope (e.g. `story-close.js`) should
|
|
382
|
+
* resolved config object in scope (e.g. `single-story-close.js`) should
|
|
383
383
|
* prefer `buildDefaultGates({ config })` so a configured
|
|
384
384
|
* `project.commands.typecheck` is honoured.
|
|
385
385
|
*
|
|
@@ -1,30 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `delivery.ci` accessor + framework defaults — Story #
|
|
3
|
-
* and Story #4356 (Epic #4355).
|
|
2
|
+
* `delivery.ci` accessor + framework defaults — Story #4356 (Epic #4355).
|
|
4
3
|
*
|
|
5
|
-
* `
|
|
6
|
-
* commits append a `[skip ci]` trailer out of the box. The Epic-branch merge
|
|
7
|
-
* commit produced by `story-close.js`'s merge runner never carries the
|
|
8
|
-
* marker — that path is the one consumers actually want CI to evaluate.
|
|
9
|
-
*
|
|
10
|
-
* Story #4356 adds the CI-aware delivery knobs: `earlyPr` (default `true`)
|
|
11
|
-
* gates whether /deliver opens the Epic PR early so CI warms while later
|
|
12
|
-
* waves run; `watch` tunes the merge/CI watch poll loop; and `autoMerge`
|
|
4
|
+
* Surviving knobs: `watch` tunes the merge/CI watch poll loop; `autoMerge`
|
|
13
5
|
* (default `"trust-ci"`) selects the merge posture — `"trust-ci"` merges once
|
|
14
6
|
* required checks pass, `"strict"` additionally requires a clean review gate.
|
|
15
7
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* checks as policy opts into it explicitly instead of the framework blocking
|
|
20
|
-
* implicitly.
|
|
8
|
+
* Retired (no production readers on v2 Story-only delivery): `earlyPr`
|
|
9
|
+
* (Epic early-PR warmup) and `requireChecks` (AutomergePredicate escape hatch
|
|
10
|
+
* whose listener was never landed).
|
|
21
11
|
*/
|
|
22
12
|
|
|
23
13
|
export const CI_DELIVERY_DEFAULTS = Object.freeze({
|
|
24
|
-
skipForStoryPushes: true,
|
|
25
|
-
earlyPr: true,
|
|
26
14
|
autoMerge: 'trust-ci',
|
|
27
|
-
requireChecks: false,
|
|
28
15
|
});
|
|
29
16
|
|
|
30
17
|
/**
|
|
@@ -35,27 +22,15 @@ export const CI_DELIVERY_DEFAULTS = Object.freeze({
|
|
|
35
22
|
* defaults; only the scalar knobs carry framework defaults here.
|
|
36
23
|
*
|
|
37
24
|
* @param {object | null | undefined} config
|
|
38
|
-
* @returns {{
|
|
25
|
+
* @returns {{ autoMerge: 'trust-ci' | 'strict', watch: object | undefined }}
|
|
39
26
|
*/
|
|
40
27
|
export function getCiDelivery(config) {
|
|
41
28
|
const ci = config?.delivery?.ci ?? config?.ci ?? config ?? {};
|
|
42
29
|
return {
|
|
43
|
-
skipForStoryPushes:
|
|
44
|
-
typeof ci.skipForStoryPushes === 'boolean'
|
|
45
|
-
? ci.skipForStoryPushes
|
|
46
|
-
: CI_DELIVERY_DEFAULTS.skipForStoryPushes,
|
|
47
|
-
earlyPr:
|
|
48
|
-
typeof ci.earlyPr === 'boolean'
|
|
49
|
-
? ci.earlyPr
|
|
50
|
-
: CI_DELIVERY_DEFAULTS.earlyPr,
|
|
51
30
|
autoMerge:
|
|
52
31
|
ci.autoMerge === 'trust-ci' || ci.autoMerge === 'strict'
|
|
53
32
|
? ci.autoMerge
|
|
54
33
|
: CI_DELIVERY_DEFAULTS.autoMerge,
|
|
55
|
-
requireChecks:
|
|
56
|
-
typeof ci.requireChecks === 'boolean'
|
|
57
|
-
? ci.requireChecks
|
|
58
|
-
: CI_DELIVERY_DEFAULTS.requireChecks,
|
|
59
34
|
watch:
|
|
60
35
|
ci.watch && typeof ci.watch === 'object' ? { ...ci.watch } : undefined,
|
|
61
36
|
};
|
|
@@ -1,31 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `delivery.routing` accessor + framework defaults — Epic #
|
|
3
|
-
* the single-delivery-as-default foundation, plus Epic #4478 (M7-B), the
|
|
2
|
+
* `delivery.routing` accessor + framework defaults — Epic #4478 (M7-B), the
|
|
4
3
|
* role-scoped-boot-context flip and the maker-checker sampling floor.
|
|
5
4
|
*
|
|
6
|
-
* `delivery.routing.singleDelivery`
|
|
7
|
-
* single-
|
|
8
|
-
*
|
|
9
|
-
* `deliver.md` router's single verdict currently falls through to the
|
|
10
|
-
* fan-out helper, so flipping this knob has no observable effect until
|
|
11
|
-
* M4-B wires `deliver-epic-single.md`.
|
|
12
|
-
*
|
|
13
|
-
* When set to `false`, `resolveEpicDeliveryRoute` forces EVERY Epic — even
|
|
14
|
-
* one carrying the `delivery::single` label or a `decompose.shape:"single"`
|
|
15
|
-
* checkpoint — down the fan-out path. This is the instant, per-consumer
|
|
16
|
-
* global revert that ships BEFORE the default flips: no code rollback, no
|
|
17
|
-
* re-plan, just a config edit.
|
|
5
|
+
* Stage 6 dropped `delivery.routing.singleDelivery` (the v1 epic
|
|
6
|
+
* single-vs-fan-out kill-switch). v2 has one Story delivery path; routing
|
|
7
|
+
* here is only about spawn boot context and critic sampling.
|
|
18
8
|
*
|
|
19
9
|
* `delivery.routing.roleScopedAgents` is the **kill-switch for the role-scoped
|
|
20
|
-
* boot contexts** (Epic #4478, M7-B). It
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
10
|
+
* boot contexts** (Epic #4478, M7-B). It defaults to `true`: a converted spawn
|
|
11
|
+
* (`story-worker`, `acceptance-critic`) boots on its own
|
|
12
|
+
* `.claude/agents/<role>.md` system prompt instead of re-paying the full
|
|
13
|
+
* `CLAUDE.md` @-import closure, which is the whole payoff of the context diet
|
|
14
|
+
* (≈50KB → ≈8KB per spawn). When set to `false`, every converted spawn falls
|
|
15
|
+
* back to `subagent_type: general-purpose` — the instant, code-rollback-free
|
|
16
|
+
* per-consumer revert, and the universal escape for hosts that ignore
|
|
17
|
+
* `.claude/agents/`. Flipping it off never drops a gate: the fallback is the
|
|
18
|
+
* full-closure agent that ran before M7-B.
|
|
29
19
|
*
|
|
30
20
|
* `delivery.routing.freshCriticSampleRate` is the **maker-checker sampling
|
|
31
21
|
* floor** (Epic #4478, M7-B, Part 2). Risk-routed ceremony sends a low-risk
|
|
@@ -40,9 +30,16 @@
|
|
|
40
30
|
*/
|
|
41
31
|
|
|
42
32
|
export const DELIVERY_ROUTING_DEFAULTS = Object.freeze({
|
|
43
|
-
singleDelivery: true,
|
|
44
33
|
roleScopedAgents: true,
|
|
45
34
|
freshCriticSampleRate: 0.2,
|
|
35
|
+
/** @type {'minimal'|'standard'|'strict'} */
|
|
36
|
+
ceremonyProfile: 'standard',
|
|
37
|
+
/**
|
|
38
|
+
* When true (default), attended `/deliver` lands through merge in one
|
|
39
|
+
* close (`--wait-merge` semantics) instead of stopping at `agent::closing`.
|
|
40
|
+
* Operators opt out per-run with `--no-wait-merge`.
|
|
41
|
+
*/
|
|
42
|
+
closeAndLand: true,
|
|
46
43
|
});
|
|
47
44
|
|
|
48
45
|
/**
|
|
@@ -62,6 +59,19 @@ function clampSampleRate(value) {
|
|
|
62
59
|
return value;
|
|
63
60
|
}
|
|
64
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Normalize ceremony profile; unknown values → `standard`.
|
|
64
|
+
*
|
|
65
|
+
* @param {unknown} value
|
|
66
|
+
* @returns {'minimal'|'standard'|'strict'}
|
|
67
|
+
*/
|
|
68
|
+
function normalizeCeremonyProfile(value) {
|
|
69
|
+
if (value === 'minimal' || value === 'standard' || value === 'strict') {
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
return DELIVERY_ROUTING_DEFAULTS.ceremonyProfile;
|
|
73
|
+
}
|
|
74
|
+
|
|
65
75
|
/**
|
|
66
76
|
* Read the merged `delivery.routing` block, applying framework defaults for
|
|
67
77
|
* any field the operator omitted. Accepts the full resolved config, the bare
|
|
@@ -69,19 +79,25 @@ function clampSampleRate(value) {
|
|
|
69
79
|
* tolerant unwrap so callers can pass whichever shape they hold.
|
|
70
80
|
*
|
|
71
81
|
* @param {object | null | undefined} config
|
|
72
|
-
* @returns {{
|
|
82
|
+
* @returns {{
|
|
83
|
+
* roleScopedAgents: boolean,
|
|
84
|
+
* freshCriticSampleRate: number,
|
|
85
|
+
* ceremonyProfile: 'minimal'|'standard'|'strict',
|
|
86
|
+
* closeAndLand: boolean,
|
|
87
|
+
* }}
|
|
73
88
|
*/
|
|
74
89
|
export function getDeliveryRouting(config) {
|
|
75
90
|
const routing = config?.delivery?.routing ?? config?.routing ?? config ?? {};
|
|
76
91
|
return {
|
|
77
|
-
singleDelivery:
|
|
78
|
-
typeof routing.singleDelivery === 'boolean'
|
|
79
|
-
? routing.singleDelivery
|
|
80
|
-
: DELIVERY_ROUTING_DEFAULTS.singleDelivery,
|
|
81
92
|
roleScopedAgents:
|
|
82
93
|
typeof routing.roleScopedAgents === 'boolean'
|
|
83
94
|
? routing.roleScopedAgents
|
|
84
95
|
: DELIVERY_ROUTING_DEFAULTS.roleScopedAgents,
|
|
85
96
|
freshCriticSampleRate: clampSampleRate(routing.freshCriticSampleRate),
|
|
97
|
+
ceremonyProfile: normalizeCeremonyProfile(routing.ceremonyProfile),
|
|
98
|
+
closeAndLand:
|
|
99
|
+
typeof routing.closeAndLand === 'boolean'
|
|
100
|
+
? routing.closeAndLand
|
|
101
|
+
: DELIVERY_ROUTING_DEFAULTS.closeAndLand,
|
|
86
102
|
};
|
|
87
103
|
}
|
|
@@ -90,6 +90,8 @@ const KEY_MEANINGS = Object.freeze({
|
|
|
90
90
|
'github.projectOwner': 'Owner of the GitHub Projects board.',
|
|
91
91
|
'github.operatorHandle':
|
|
92
92
|
'GitHub @handle mentioned when a run needs operator attention.',
|
|
93
|
+
'github.defaultTimeoutMs':
|
|
94
|
+
'Default timeout (ms) for GitHub CLI / API calls when a caller does not supply one.',
|
|
93
95
|
'github.branchProtection.enforce':
|
|
94
96
|
'Whether the framework applies branch-protection rules.',
|
|
95
97
|
'github.branchProtection.requiredChecks':
|
|
@@ -126,28 +128,28 @@ const KEY_MEANINGS = Object.freeze({
|
|
|
126
128
|
'How many recent commits the snapshot summarizes.',
|
|
127
129
|
'planning.riskHeuristics':
|
|
128
130
|
'Phrases that flag a Story as high-risk for HITL escalation.',
|
|
129
|
-
'planning.taskSizing.softAcceptanceCount':
|
|
130
|
-
'Acceptance-criteria count above which a Story is flagged as large (advisory-only — there is no hard acceptance ceiling).',
|
|
131
|
-
'planning.taskSizing.softFiles':
|
|
132
|
-
'Touched-file count above which a Story is flagged as large.',
|
|
133
|
-
'planning.taskSizing.hardFiles':
|
|
134
|
-
'Touched-file count above which a Story is rejected unless it declares `wide` with a reason.',
|
|
135
131
|
'planning.failOnSharedEditors':
|
|
136
132
|
'Whether shared-editor conflict findings are promoted to hard errors.',
|
|
137
133
|
'planning.requireExplicitCrossStoryDeps':
|
|
138
134
|
'Whether implicit cross-Story dependencies are promoted to hard errors.',
|
|
135
|
+
'planning.failOnRegistryConflicts':
|
|
136
|
+
'Whether cross-cutting registry conflict findings are promoted to hard errors.',
|
|
137
|
+
'planning.failOnLargeFanOut':
|
|
138
|
+
'Whether large fan-out findings are promoted to hard errors.',
|
|
139
|
+
'planning.largeFanOutThreshold':
|
|
140
|
+
'Story count above which a plan is flagged as a large fan-out.',
|
|
141
|
+
'planning.crossCuttingRegistries':
|
|
142
|
+
'Glob patterns naming cross-cutting registry files the planner conflict-checks.',
|
|
143
|
+
'planning.navigation.routeGlobs':
|
|
144
|
+
'Glob patterns marking paths that add a user-facing route (plan-time reachability gate).',
|
|
145
|
+
'planning.navigation.navRegistry':
|
|
146
|
+
'Tokens identifying the nav-registry SSOT a route-adding Story is expected to reference.',
|
|
139
147
|
|
|
140
148
|
// delivery.*
|
|
141
149
|
'delivery.execution.timeoutMs':
|
|
142
150
|
'Per-execution timeout for orchestrated delivery steps.',
|
|
143
|
-
'delivery.maxTokenBudget':
|
|
144
|
-
'Cap on the hydrated task-prompt size handed to an agent.',
|
|
145
151
|
'delivery.lease.ttlMs':
|
|
146
152
|
'Time-to-live for the Epic lease before a stale claim is reclaimable.',
|
|
147
|
-
'delivery.ci.skipForStoryPushes':
|
|
148
|
-
'Whether Story-branch pushes carry a [skip ci] trailer.',
|
|
149
|
-
'delivery.ci.earlyPr':
|
|
150
|
-
'Whether /deliver opens the Epic PR early so CI warms during later waves.',
|
|
151
153
|
'delivery.ci.watch.pollIntervalMs':
|
|
152
154
|
'Poll cadence (ms) for the merge/CI watch loop.',
|
|
153
155
|
'delivery.ci.watch.maxPolls':
|
|
@@ -156,22 +158,10 @@ const KEY_MEANINGS = Object.freeze({
|
|
|
156
158
|
'Maximum times the CI watch may resume after a transient stall.',
|
|
157
159
|
'delivery.ci.autoMerge':
|
|
158
160
|
'Merge posture: trust-ci merges on green checks; strict also requires a clean review gate.',
|
|
159
|
-
'delivery.preflight.maxStories':
|
|
160
|
-
'Pre-dispatch ceiling on estimated Story count (no cap when unset).',
|
|
161
|
-
'delivery.preflight.maxWaves':
|
|
162
|
-
'Pre-dispatch ceiling on estimated wave count.',
|
|
163
|
-
'delivery.preflight.maxInstallCostSeconds':
|
|
164
|
-
'Pre-dispatch ceiling on estimated dependency-install seconds.',
|
|
165
|
-
'delivery.preflight.maxGithubApiRequests':
|
|
166
|
-
'Pre-dispatch ceiling on estimated GitHub API request volume.',
|
|
167
|
-
'delivery.preflight.maxClaudeQuotaTokens':
|
|
168
|
-
'Pre-dispatch ceiling on estimated Claude quota-token burn.',
|
|
169
161
|
'delivery.docsFreshness.paths':
|
|
170
162
|
'Docs whose freshness is checked at delivery time.',
|
|
171
163
|
'delivery.deliverRunner.concurrencyCap':
|
|
172
164
|
'Maximum Stories dispatched in parallel within one wave. Default 3 — conservative by design to keep host-quota consumption predictable. Operators running wide-wave Epics with adequate parallel-agent quota should raise this to reduce wall-clock time proportionally.',
|
|
173
|
-
'delivery.deliverRunner.progressReportIntervalSec':
|
|
174
|
-
'Cadence for delivery progress reporting.',
|
|
175
165
|
'delivery.deliverRunner.verifyConcurrencyCap':
|
|
176
166
|
'Maximum verify steps run in parallel.',
|
|
177
167
|
'delivery.worktreeIsolation.enabled':
|
|
@@ -179,17 +169,19 @@ const KEY_MEANINGS = Object.freeze({
|
|
|
179
169
|
'delivery.worktreeIsolation.root':
|
|
180
170
|
'Directory under which per-Story worktrees are created.',
|
|
181
171
|
'delivery.worktreeIsolation.nodeModulesStrategy':
|
|
182
|
-
'How node_modules is provisioned per worktree.',
|
|
172
|
+
'How node_modules is provisioned per worktree (default clone on darwin/linux; per-worktree on win32).',
|
|
183
173
|
'delivery.worktreeIsolation.primeFromPath':
|
|
184
174
|
'Source path a worktree primes its node_modules from.',
|
|
185
175
|
'delivery.worktreeIsolation.allowSymlinkOnWindows':
|
|
186
176
|
'Whether symlink node_modules strategy is allowed on Windows.',
|
|
187
177
|
'delivery.worktreeIsolation.reapOnSuccess':
|
|
188
178
|
'Whether a worktree is removed after a Story closes cleanly.',
|
|
189
|
-
'delivery.worktreeIsolation.reapOnCancel':
|
|
190
|
-
'Whether a worktree is removed after a cancelled run.',
|
|
191
179
|
'delivery.worktreeIsolation.bootstrapFiles':
|
|
192
|
-
'Files copied into each new worktree (e.g. .env, .mcp.json).',
|
|
180
|
+
'Files copied into each new worktree (e.g. .env, .mcp.json, local overrides).',
|
|
181
|
+
'delivery.mergeWatch.intervalSeconds':
|
|
182
|
+
'Poll cadence (seconds) for MergeWatcher after epic.merge.armed.',
|
|
183
|
+
'delivery.mergeWatch.maxBudgetSeconds':
|
|
184
|
+
'Wall-clock budget (seconds) before MergeWatcher surfaces budget-exceeded.',
|
|
193
185
|
'delivery.codeReview.providers':
|
|
194
186
|
'Ordered provider chain the code-review phase consults.',
|
|
195
187
|
'delivery.codeReview.maxFixAttempts':
|
|
@@ -198,8 +190,28 @@ const KEY_MEANINGS = Object.freeze({
|
|
|
198
190
|
'Maximum files an auto-fix may touch in one attempt.',
|
|
199
191
|
'delivery.codeReview.autoFixSeverity':
|
|
200
192
|
'Severity threshold for on-branch code-review remediation (medium fixes 🔴/🟠/🟡, high fixes 🔴/🟠 only; default medium).',
|
|
201
|
-
'delivery.
|
|
202
|
-
'
|
|
193
|
+
'delivery.routing.roleScopedAgents':
|
|
194
|
+
'Whether delivery spawns boot on role-scoped .claude/agents/<role>.md contexts.',
|
|
195
|
+
'delivery.routing.freshCriticSampleRate':
|
|
196
|
+
'Fraction of low-risk acceptance clusters forced through a fresh-context critic (maker-checker floor).',
|
|
197
|
+
'delivery.routing.ceremonyProfile':
|
|
198
|
+
'Acceptance-ceremony depth: minimal (always inline), standard (risk-routed), or strict (always fresh).',
|
|
199
|
+
'delivery.routing.closeAndLand':
|
|
200
|
+
'When true, single-story-close lands through merge in one close (opt out with --no-wait-merge).',
|
|
201
|
+
'delivery.feedbackLoop.auditResultsAutoFile':
|
|
202
|
+
'When true, auto-file non-blocking audit findings as follow-up issues.',
|
|
203
|
+
'delivery.feedbackLoop.retroProposals':
|
|
204
|
+
'When true, auto-file actionable retro proposals as follow-up issues.',
|
|
205
|
+
'delivery.quality.formatAutofix.timeoutMs':
|
|
206
|
+
'Bounded timeout (ms) for the close-time format autofix spawn.',
|
|
207
|
+
'delivery.quality.requireBaselines':
|
|
208
|
+
'When true, absent baseline artifacts fail close-validation instead of skipping cleanly.',
|
|
209
|
+
'delivery.quality.navigability.routeGlobs':
|
|
210
|
+
'Glob patterns marking user-facing routes for the navigability lens / journey gate.',
|
|
211
|
+
'delivery.quality.navigability.navRegistry':
|
|
212
|
+
'Tokens identifying the nav-registry SSOT the navigability lens expects.',
|
|
213
|
+
'delivery.quality.navigability.journeySuite':
|
|
214
|
+
'Optional journey-suite path the post-wave navigability integration gate runs.',
|
|
203
215
|
'delivery.refactorStage.enabled':
|
|
204
216
|
'Whether a dedicated refactor stage runs during delivery.',
|
|
205
217
|
'delivery.acceptanceEval.maxRounds':
|
|
@@ -240,11 +252,19 @@ const PREFIX_MEANINGS = Object.freeze([
|
|
|
240
252
|
],
|
|
241
253
|
['delivery.quality', 'Delivery-time quality configuration.'],
|
|
242
254
|
['delivery.signals', 'Threshold for a delivery friction/telemetry signal.'],
|
|
243
|
-
['delivery.
|
|
244
|
-
['delivery.lifecycle', 'Lifecycle-bus configuration.'],
|
|
255
|
+
['delivery.mergeWatch', 'MergeWatcher poll cadence and wall-clock budget.'],
|
|
245
256
|
[
|
|
246
|
-
'
|
|
247
|
-
'
|
|
257
|
+
'delivery.feedbackLoop',
|
|
258
|
+
'Opt-out toggles for auto-filing non-blocking findings.',
|
|
259
|
+
],
|
|
260
|
+
[
|
|
261
|
+
'delivery.routing',
|
|
262
|
+
'Delivery-spawn routing and acceptance-ceremony profile.',
|
|
263
|
+
],
|
|
264
|
+
['delivery.ci', 'CI-aware delivery namespace (watch, auto-merge).'],
|
|
265
|
+
[
|
|
266
|
+
'planning.navigation',
|
|
267
|
+
'Plan-time navigability reachability gate (route globs + nav registry).',
|
|
248
268
|
],
|
|
249
269
|
[
|
|
250
270
|
'qa.environments',
|
|
@@ -263,8 +283,7 @@ const BLOCK_MEANINGS = Object.freeze({
|
|
|
263
283
|
project: 'Project identity, paths, and command configuration.',
|
|
264
284
|
github: 'GitHub provider identity and merge/notification policy.',
|
|
265
285
|
planning: 'Inputs and guardrails for /epic-plan.',
|
|
266
|
-
delivery:
|
|
267
|
-
'Execution, isolation, quality, and lifecycle settings for delivery.',
|
|
286
|
+
delivery: 'Execution, isolation, quality, and CI settings for delivery.',
|
|
268
287
|
qa: 'Agent-driven QA harness contract.',
|
|
269
288
|
});
|
|
270
289
|
|