mandrel 1.93.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/acceptance-critic.md +129 -0
- package/.agents/agents/story-worker.md +161 -0
- package/.agents/docs/SDLC.md +489 -1285
- package/.agents/docs/agentrc-reference.json +177 -67
- package/.agents/docs/configuration.md +108 -136
- package/.agents/docs/execution-reference.md +44 -22
- package/.agents/docs/quality-gates.md +13 -19
- package/.agents/docs/workflows.md +3 -3
- package/.agents/instructions.md +107 -108
- package/.agents/rules/ci-remediation.md +8 -12
- package/.agents/rules/git-conventions-reference.md +224 -0
- package/.agents/rules/git-conventions.md +42 -223
- package/.agents/rules/security-baseline.md +5 -0
- package/.agents/rules/testing-standards.md +106 -13
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +71 -201
- 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/acceptance-eval.js +62 -18
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- 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-context-budget.js +62 -5
- 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/diagnose-friction.js +0 -6
- 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/bootstrap/project-bootstrap.js +56 -18
- 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 +160 -22
- package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +103 -0
- package/.agents/scripts/lib/config/explain.js +57 -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 +3 -8
- package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -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 +39 -4
- 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 +112 -3
- package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
- package/.agents/scripts/lib/observability/source-classifier.js +3 -3
- package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
- 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-critic-conditions.js +3 -2
- 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 +14 -14
- 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/close-validation.js +1 -0
- 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 +3 -8
- 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/provider-factory.js +1 -1
- 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/post-structured-comment.js +38 -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/sync-claude-agents.js +165 -0
- package/.agents/scripts/update-ticket-state.js +37 -15
- package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
- package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
- package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
- package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
- package/.agents/skills/core/scope-triage/SKILL.md +28 -172
- package/.agents/skills/skills.index.json +8 -418
- 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 -131
- 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 +52 -40
- 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/mandrel-sync-config.md +1 -1
- 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 +3 -2
- 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 +46 -0
- package/lib/cli/registry.js +95 -0
- package/lib/migrations/index.js +6 -5
- package/package.json +5 -3
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer-mobile.md +0 -120
- package/.agents/personas/engineer-web.md +0 -111
- package/.agents/personas/engineer.md +0 -119
- package/.agents/personas/product.md +0 -94
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/refactorer.md +0 -113
- package/.agents/personas/security-engineer.md +0 -112
- package/.agents/personas/sre.md +0 -86
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/personas/ux-designer.md +0 -95
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- 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 -590
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-decompose.js +0 -54
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-plan-spec.js +0 -64
- 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 -660
- 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 -388
- 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-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
- 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 -278
- 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/skill-capsule-loader.js +0 -109
- 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 -301
- 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/plan-critics.js +0 -199
- package/.agents/scripts/retro-run.js +0 -218
- 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 -335
- package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
- package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
- package/.agents/skills/core/code-simplification/SKILL.md +0 -389
- package/.agents/skills/core/context-engineering/SKILL.md +0 -309
- package/.agents/skills/core/context-engineering/examples.md +0 -58
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
- 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 -413
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
- package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
- package/.agents/skills/core/idea-refinement/examples.md +0 -437
- package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
- package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
- package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
- package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
- package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
- package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
- package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
- package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
- package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
- package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
- package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
- package/.agents/workflows/helpers/deliver-epic.md +0 -955
- package/.agents/workflows/helpers/deliver-stories.md +0 -440
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
- 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 -351
- 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
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `delivery.routing` accessor + framework defaults — Epic #4478 (M7-B), the
|
|
3
|
+
* role-scoped-boot-context flip and the maker-checker sampling floor.
|
|
4
|
+
*
|
|
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.
|
|
8
|
+
*
|
|
9
|
+
* `delivery.routing.roleScopedAgents` is the **kill-switch for the role-scoped
|
|
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.
|
|
19
|
+
*
|
|
20
|
+
* `delivery.routing.freshCriticSampleRate` is the **maker-checker sampling
|
|
21
|
+
* floor** (Epic #4478, M7-B, Part 2). Risk-routed ceremony sends a low-risk
|
|
22
|
+
* acceptance cluster down the contract-identical *inline* critic path, but a
|
|
23
|
+
* fraction of low-risk clusters are still forced through a *fresh-context*
|
|
24
|
+
* critic so "low risk" never degrades to zero independent checking. The rate is
|
|
25
|
+
* clamped into `[0, 1]`; `0` disables the floor (pure risk routing), `1` forces
|
|
26
|
+
* every cluster fresh. The default is `0.2`. See `resolveCeremonyForRisk` in
|
|
27
|
+
* `lib/orchestration/ceremony-routing.js`.
|
|
28
|
+
*
|
|
29
|
+
* Framework-defaults pattern mirrors `lib/config/ci.js#getCiDelivery`.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
export const DELIVERY_ROUTING_DEFAULTS = Object.freeze({
|
|
33
|
+
roleScopedAgents: true,
|
|
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,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Clamp a candidate sample rate into `[0, 1]`. Non-finite / non-number inputs
|
|
47
|
+
* fall back to the framework default so a degraded config never yields a
|
|
48
|
+
* NaN-driven or out-of-range floor.
|
|
49
|
+
*
|
|
50
|
+
* @param {unknown} value
|
|
51
|
+
* @returns {number}
|
|
52
|
+
*/
|
|
53
|
+
function clampSampleRate(value) {
|
|
54
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
55
|
+
return DELIVERY_ROUTING_DEFAULTS.freshCriticSampleRate;
|
|
56
|
+
}
|
|
57
|
+
if (value < 0) return 0;
|
|
58
|
+
if (value > 1) return 1;
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
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
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Read the merged `delivery.routing` block, applying framework defaults for
|
|
77
|
+
* any field the operator omitted. Accepts the full resolved config, the bare
|
|
78
|
+
* `delivery` bag, or the bare `routing` bag — mirroring `getCiDelivery`'s
|
|
79
|
+
* tolerant unwrap so callers can pass whichever shape they hold.
|
|
80
|
+
*
|
|
81
|
+
* @param {object | null | undefined} config
|
|
82
|
+
* @returns {{
|
|
83
|
+
* roleScopedAgents: boolean,
|
|
84
|
+
* freshCriticSampleRate: number,
|
|
85
|
+
* ceremonyProfile: 'minimal'|'standard'|'strict',
|
|
86
|
+
* closeAndLand: boolean,
|
|
87
|
+
* }}
|
|
88
|
+
*/
|
|
89
|
+
export function getDeliveryRouting(config) {
|
|
90
|
+
const routing = config?.delivery?.routing ?? config?.routing ?? config ?? {};
|
|
91
|
+
return {
|
|
92
|
+
roleScopedAgents:
|
|
93
|
+
typeof routing.roleScopedAgents === 'boolean'
|
|
94
|
+
? routing.roleScopedAgents
|
|
95
|
+
: DELIVERY_ROUTING_DEFAULTS.roleScopedAgents,
|
|
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,
|
|
102
|
+
};
|
|
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,12 +190,34 @@ 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':
|
|
206
218
|
'Redraft rounds the per-Story acceptance self-eval loop runs before escalating to agent::blocked (default 2; clamped to a hard ceiling that cannot be disabled).',
|
|
219
|
+
'delivery.acceptanceEval.clusterCeiling':
|
|
220
|
+
'Max acceptance criteria one single-delivery acceptance critic scores per fresh-context pass; the Epic ACs are split into ceil(totalACs / clusterCeiling) maker-blind critic clusters (default 4; clamped to [1, 8]).',
|
|
207
221
|
|
|
208
222
|
// qa.*
|
|
209
223
|
'qa.featureRoot': 'Root directory holding the QA harness .feature files.',
|
|
@@ -238,11 +252,19 @@ const PREFIX_MEANINGS = Object.freeze([
|
|
|
238
252
|
],
|
|
239
253
|
['delivery.quality', 'Delivery-time quality configuration.'],
|
|
240
254
|
['delivery.signals', 'Threshold for a delivery friction/telemetry signal.'],
|
|
241
|
-
['delivery.
|
|
242
|
-
['delivery.lifecycle', 'Lifecycle-bus configuration.'],
|
|
255
|
+
['delivery.mergeWatch', 'MergeWatcher poll cadence and wall-clock budget.'],
|
|
243
256
|
[
|
|
244
|
-
'
|
|
245
|
-
'
|
|
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).',
|
|
246
268
|
],
|
|
247
269
|
[
|
|
248
270
|
'qa.environments',
|
|
@@ -261,8 +283,7 @@ const BLOCK_MEANINGS = Object.freeze({
|
|
|
261
283
|
project: 'Project identity, paths, and command configuration.',
|
|
262
284
|
github: 'GitHub provider identity and merge/notification policy.',
|
|
263
285
|
planning: 'Inputs and guardrails for /epic-plan.',
|
|
264
|
-
delivery:
|
|
265
|
-
'Execution, isolation, quality, and lifecycle settings for delivery.',
|
|
286
|
+
delivery: 'Execution, isolation, quality, and CI settings for delivery.',
|
|
266
287
|
qa: 'Agent-driven QA harness contract.',
|
|
267
288
|
});
|
|
268
289
|
|
|
@@ -6,24 +6,18 @@
|
|
|
6
6
|
* `planning.*` and `delivery.*`:
|
|
7
7
|
*
|
|
8
8
|
* - `planning.context.{maxBytes, summaryMode}` (planning-context budget)
|
|
9
|
-
* - `delivery.maxTokenBudget` (task-prompt hydration cap)
|
|
10
9
|
* - `delivery.execution.timeoutMs` (per-process execution timeout)
|
|
11
10
|
* - `delivery.lease.ttlMs` (assignee-as-lease staleness window — Story #3480)
|
|
12
|
-
* - `delivery.signals.{
|
|
13
|
-
*
|
|
11
|
+
* - `delivery.signals.{rework, retry}` (performance-signal detector
|
|
12
|
+
* thresholds — `hotspot` retired with Epic #4406; `churn`/`idle` dropped)
|
|
14
13
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* `planning.maxTickets` operator knob to `LIMITS_DEFAULTS.maxTickets` and
|
|
18
|
-
* removed it from the AJV schema, the published mirror, and the explain
|
|
19
|
-
* map. The persist-time over-budget gate (ADR-20260610) still reads the
|
|
20
|
-
* constant via `getLimits(config).maxTickets`; `resolveLimits` no longer
|
|
21
|
-
* reads `planning.maxTickets`, so setting it in a config is inert.
|
|
14
|
+
* Framework constants (not operator-tunable via `.agentrc.json`):
|
|
15
|
+
* - `maxTickets` — decomposer reviewability budget (Story #4163)
|
|
22
16
|
*
|
|
23
|
-
* Dropped entirely: `maxInstructionSteps`, `friction
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
17
|
+
* Dropped entirely: `maxInstructionSteps`, `friction.*`, `executionMaxBuffer`,
|
|
18
|
+
* `signals.{churn, idle}`, `delivery.preflight`, `delivery.maxTokenBudget`
|
|
19
|
+
* (planning no longer sizes against a token-budget envelope; session-mass
|
|
20
|
+
* ceilings are absolute in `DEFAULT_MODEL_CAPACITY`).
|
|
27
21
|
*
|
|
28
22
|
* The historic combined accessor `getLimits(config)` is preserved as a
|
|
29
23
|
* compatibility surface: it returns a wrapper carrying the surviving
|
|
@@ -31,14 +25,12 @@
|
|
|
31
25
|
* working. New call sites should prefer the specific accessors below.
|
|
32
26
|
*/
|
|
33
27
|
|
|
34
|
-
import { getPreflight } from './preflight.js';
|
|
35
|
-
|
|
36
28
|
/**
|
|
37
|
-
* Framework defaults for the performance-signal detector thresholds.
|
|
38
|
-
*
|
|
29
|
+
* Framework defaults for the performance-signal detector thresholds.
|
|
30
|
+
* `hotspot` was retired with its detector (Epic #4406); `churn` and `idle`
|
|
31
|
+
* were dropped earlier.
|
|
39
32
|
*/
|
|
40
33
|
export const SIGNALS_DEFAULTS = Object.freeze({
|
|
41
|
-
hotspot: Object.freeze({ p95Multiplier: 1.25 }),
|
|
42
34
|
rework: Object.freeze({ editsPerFile: 5 }),
|
|
43
35
|
retry: Object.freeze({ repeatCount: 3 }),
|
|
44
36
|
});
|
|
@@ -53,17 +45,10 @@ export const SIGNALS_DEFAULTS = Object.freeze({
|
|
|
53
45
|
export const LEASE_TTL_MS_DEFAULT = 900000;
|
|
54
46
|
|
|
55
47
|
/**
|
|
56
|
-
* Framework defaults for the surviving limits surface.
|
|
57
|
-
* bumps from 5 min to 10 min per the Story 1 decisions log.
|
|
58
|
-
*
|
|
59
|
-
* `maxTokenBudget` is a **single global value** (Story #3875 — raised once
|
|
60
|
-
* from 200000 to 300000 so capability-sized Stories are not clipped by
|
|
61
|
-
* hydration elision). There is intentionally no per-profile or
|
|
62
|
-
* per-complexity budget branch anywhere in the resolver.
|
|
48
|
+
* Framework defaults for the surviving limits surface.
|
|
63
49
|
*/
|
|
64
50
|
export const LIMITS_DEFAULTS = Object.freeze({
|
|
65
51
|
maxTickets: 80,
|
|
66
|
-
maxTokenBudget: 300000,
|
|
67
52
|
executionTimeoutMs: 600000,
|
|
68
53
|
leaseTtlMs: LEASE_TTL_MS_DEFAULT,
|
|
69
54
|
planningContext: Object.freeze({
|
|
@@ -79,7 +64,7 @@ export const LIMITS_DEFAULTS = Object.freeze({
|
|
|
79
64
|
* operator can override a single threshold without re-listing the others.
|
|
80
65
|
*
|
|
81
66
|
* @param {object|undefined} userSignals
|
|
82
|
-
* @returns {{
|
|
67
|
+
* @returns {{ rework: {editsPerFile: number}, retry: {repeatCount: number} }}
|
|
83
68
|
*/
|
|
84
69
|
function mergeSignals(userSignals) {
|
|
85
70
|
const user =
|
|
@@ -97,16 +82,14 @@ function mergeSignals(userSignals) {
|
|
|
97
82
|
|
|
98
83
|
/**
|
|
99
84
|
* Resolve the surviving limits surface against a `.agentrc.json` shape
|
|
100
|
-
* (post-reshape).
|
|
101
|
-
* `
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* `delivery.*`, pulls signals from `delivery.signals.*`.
|
|
85
|
+
* (post-reshape). `maxTickets` is a framework constant (never read from
|
|
86
|
+
* config); pulls `planningContext` from `planning.*`, pulls
|
|
87
|
+
* `executionTimeoutMs` from `delivery.*`, pulls signals from
|
|
88
|
+
* `delivery.signals.*`.
|
|
105
89
|
*
|
|
106
90
|
* @param {object|undefined} config
|
|
107
91
|
* @returns {{
|
|
108
92
|
* maxTickets: number,
|
|
109
|
-
* maxTokenBudget: number,
|
|
110
93
|
* executionTimeoutMs: number,
|
|
111
94
|
* leaseTtlMs: number,
|
|
112
95
|
* planningContext: { maxBytes: number, summaryMode: string },
|
|
@@ -133,11 +116,7 @@ export function resolveLimits(config) {
|
|
|
133
116
|
const lease =
|
|
134
117
|
delivery.lease && typeof delivery.lease === 'object' ? delivery.lease : {};
|
|
135
118
|
return {
|
|
136
|
-
// `maxTickets` is a framework constant (Story #4163) — never read from
|
|
137
|
-
// `planning.maxTickets`. The persist-time over-budget gate still reads
|
|
138
|
-
// this value via getLimits().maxTickets.
|
|
139
119
|
maxTickets: LIMITS_DEFAULTS.maxTickets,
|
|
140
|
-
maxTokenBudget: delivery.maxTokenBudget ?? LIMITS_DEFAULTS.maxTokenBudget,
|
|
141
120
|
executionTimeoutMs:
|
|
142
121
|
execution.timeoutMs ?? LIMITS_DEFAULTS.executionTimeoutMs,
|
|
143
122
|
leaseTtlMs: lease.ttlMs ?? LIMITS_DEFAULTS.leaseTtlMs,
|
|
@@ -173,26 +152,6 @@ export function getSignals(config) {
|
|
|
173
152
|
return getLimits(config).signals;
|
|
174
153
|
}
|
|
175
154
|
|
|
176
|
-
/**
|
|
177
|
-
* Resolve the configured `delivery.preflight.max*` ceilings as a plain
|
|
178
|
-
* object holding **only** the keys the operator actually configured
|
|
179
|
-
* (Story #3875 — plan-time/delivery-time reconciliation). Unconfigured
|
|
180
|
-
* ceilings (`null` floors, meaning "no cap") are omitted entirely so the
|
|
181
|
-
* decomposition context can thread a compact, non-null envelope to the
|
|
182
|
-
* planner. An Epic on a zero-config project yields `{}` — never `null`.
|
|
183
|
-
*
|
|
184
|
-
* @param {object | null | undefined} config
|
|
185
|
-
* @returns {Record<string, number>}
|
|
186
|
-
*/
|
|
187
|
-
export function resolvePreflightCeilings(config) {
|
|
188
|
-
const resolved = getPreflight(config);
|
|
189
|
-
const ceilings = {};
|
|
190
|
-
for (const [key, value] of Object.entries(resolved)) {
|
|
191
|
-
if (value !== null) ceilings[key] = value;
|
|
192
|
-
}
|
|
193
|
-
return ceilings;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
155
|
/**
|
|
197
156
|
* Resolve the assignee-as-lease TTL in milliseconds (Story #3480). Standalone
|
|
198
157
|
* accessor so the `ticket-lease` module can import it without dragging the
|
|
@@ -32,7 +32,6 @@ export const PATHS_DEFAULTS = Object.freeze({
|
|
|
32
32
|
* auditOutputDir: string,
|
|
33
33
|
* scriptsRoot: string,
|
|
34
34
|
* workflowsRoot: string,
|
|
35
|
-
* personasRoot: string,
|
|
36
35
|
* schemasRoot: string,
|
|
37
36
|
* skillsRoot: string,
|
|
38
37
|
* templatesRoot: string,
|
|
@@ -53,7 +52,6 @@ export function resolvePaths(userPaths) {
|
|
|
53
52
|
auditOutputDir: `${tempRoot}/audits`,
|
|
54
53
|
scriptsRoot: `${agentRoot}/scripts`,
|
|
55
54
|
workflowsRoot: `${agentRoot}/workflows`,
|
|
56
|
-
personasRoot: `${agentRoot}/personas`,
|
|
57
55
|
schemasRoot: `${agentRoot}/schemas`,
|
|
58
56
|
skillsRoot: `${agentRoot}/skills`,
|
|
59
57
|
templatesRoot: `${agentRoot}/templates`,
|
|
@@ -57,7 +57,7 @@ const DEFAULT_COVERAGE_FLOORS = Object.freeze({
|
|
|
57
57
|
'*': Object.freeze({ lines: 90, branches: 85, functions: 90 }),
|
|
58
58
|
});
|
|
59
59
|
const DEFAULT_CRAP_FLOORS = Object.freeze({
|
|
60
|
-
'*': Object.freeze({
|
|
60
|
+
'*': Object.freeze({ max: 30, p95: 20, methodsAbove20: 50 }),
|
|
61
61
|
});
|
|
62
62
|
/**
|
|
63
63
|
* Story #2193 — maintainability rollups expose the `min` / `p50` / `p95`
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Runner accessor (Epic #1720 Story #1739 — top-level reshape).
|
|
3
3
|
*
|
|
4
|
-
* Post-reshape, only `delivery.deliverRunner
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `DEFAULT_DECOMPOSER`).
|
|
4
|
+
* Post-reshape, only `delivery.deliverRunner` and `delivery.codeReview` are
|
|
5
|
+
* configurable via this accessor; everything else lives in framework-internal
|
|
6
|
+
* constants exported alongside (`DEFAULT_STORY_MERGE_RETRY`,
|
|
7
|
+
* `DEFAULT_DECOMPOSER`). `delivery.epicAudit` was removed on v2 (Story-only
|
|
8
|
+
* delivery — no epic-audit runner; remediation policy lives on
|
|
9
|
+
* `delivery.codeReview`).
|
|
8
10
|
*/
|
|
9
11
|
|
|
10
12
|
/** Hardcoded story-merge retry policy (was `orchestration.runners.storyMergeRetry`). */
|
|
@@ -23,14 +25,13 @@ export const DEFAULT_DECOMPOSER = Object.freeze({
|
|
|
23
25
|
* `delivery.deliverRunner.*` in `.agentrc.json`.
|
|
24
26
|
*
|
|
25
27
|
* **Throughput tradeoff — `concurrencyCap`.**
|
|
26
|
-
* The default of 3 is intentionally
|
|
27
|
-
* consumption
|
|
28
|
-
* GitHub API with concurrent label writes
|
|
29
|
-
*
|
|
30
|
-
* `delivery.deliverRunner.concurrencyCap
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* `agentrc-reference.json` `delivery.deliverRunner.concurrencyCap` for details.
|
|
28
|
+
* The default of 3 is intentionally moderate: it keeps host-quota
|
|
29
|
+
* consumption predictable for multi-Story plan-runs and avoids saturating
|
|
30
|
+
* the GitHub API with concurrent label writes, while still allowing a
|
|
31
|
+
* small ready-set fan-out. Operators who want strictly sequential delivery
|
|
32
|
+
* should set `delivery.deliverRunner.concurrencyCap: 1`. Raising the cap
|
|
33
|
+
* reduces wall-clock time where dependencies allow. See `deliver.md` and
|
|
34
|
+
* `agentrc-reference.json` `delivery.deliverRunner.concurrencyCap`.
|
|
34
35
|
*
|
|
35
36
|
* **`verifyConcurrencyCap`** (Epic #3019 Tech Spec §1.4 / Story #3024) is a
|
|
36
37
|
* separate knob that bounds the `verifyWaveResults` loop independently of
|
|
@@ -39,35 +40,14 @@ export const DEFAULT_DECOMPOSER = Object.freeze({
|
|
|
39
40
|
*/
|
|
40
41
|
const DEFAULT_DELIVER_RUNNER = Object.freeze({
|
|
41
42
|
concurrencyCap: 3,
|
|
42
|
-
progressReportIntervalSec: 120,
|
|
43
43
|
verifyConcurrencyCap: 4,
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
/**
|
|
47
|
-
* Default auto-fix loop ceilings for /deliver
|
|
48
|
-
*
|
|
49
|
-
* `
|
|
50
|
-
* (Story #2611, Epic #2586).
|
|
51
|
-
*
|
|
52
|
-
* `autoFixSeverity` is **tier-aware** (Story #4412, Epic #4405). The
|
|
53
|
-
* Epic-close audit tier (`DEFAULT_EPIC_AUDIT`) defaults to `'high'` —
|
|
54
|
-
* remediating only 🔴 Critical + 🟠 High findings on-branch while 🟡 Medium
|
|
55
|
-
* and 🟢 Suggestion findings graduate to follow-up issues. This is the
|
|
56
|
-
* three-tier model's slim outermost tier: 🟡 Medium code-quality concerns are
|
|
57
|
-
* already routed into on-branch remediation shift-left (the write-time
|
|
58
|
-
* checklist threading of Story #4410 and the Story-scope local-lens pass of
|
|
59
|
-
* Story #4409), so the Epic-close tier stops paying to re-remediate them where
|
|
60
|
-
* a fix is most expensive. The code-review tier (`DEFAULT_CODE_REVIEW`) keeps
|
|
61
|
-
* the `'medium'` default introduced by Story #4399. Both are hard cutovers per
|
|
62
|
-
* `rules/git-conventions.md` — no back-compat flag; an operator opts back into
|
|
63
|
-
* the wider routing by setting `delivery.epicAudit.autoFixSeverity: 'medium'`.
|
|
47
|
+
* Default auto-fix loop ceilings for /deliver code-review. Operators
|
|
48
|
+
* override via `delivery.codeReview.*` in `.agentrc.json` (Story #2611,
|
|
49
|
+
* Epic #2586; `autoFixSeverity` default `'medium'` per Story #4399).
|
|
64
50
|
*/
|
|
65
|
-
export const DEFAULT_EPIC_AUDIT = Object.freeze({
|
|
66
|
-
maxFixAttempts: 3,
|
|
67
|
-
maxFixScopeFiles: 5,
|
|
68
|
-
autoFixSeverity: 'high',
|
|
69
|
-
});
|
|
70
|
-
|
|
71
51
|
export const DEFAULT_CODE_REVIEW = Object.freeze({
|
|
72
52
|
maxFixAttempts: 3,
|
|
73
53
|
maxFixScopeFiles: 5,
|
|
@@ -79,8 +59,7 @@ export const DEFAULT_CODE_REVIEW = Object.freeze({
|
|
|
79
59
|
*
|
|
80
60
|
* @param {object | null | undefined} config
|
|
81
61
|
* @returns {{
|
|
82
|
-
* deliverRunner: { concurrencyCap: number,
|
|
83
|
-
* epicAudit: { maxFixAttempts: number, maxFixScopeFiles: number, autoFixSeverity: 'high'|'medium' },
|
|
62
|
+
* deliverRunner: { concurrencyCap: number, verifyConcurrencyCap: number },
|
|
84
63
|
* codeReview: { maxFixAttempts: number, maxFixScopeFiles: number, autoFixSeverity: 'high'|'medium' },
|
|
85
64
|
* storyMergeRetry: { maxAttempts: number, backoffMs: readonly number[] },
|
|
86
65
|
* decomposer: { concurrencyCap: number },
|
|
@@ -88,28 +67,16 @@ export const DEFAULT_CODE_REVIEW = Object.freeze({
|
|
|
88
67
|
*/
|
|
89
68
|
export function getRunners(config) {
|
|
90
69
|
const deliverRunnerUser = config?.delivery?.deliverRunner ?? {};
|
|
91
|
-
const epicAuditUser = config?.delivery?.epicAudit ?? {};
|
|
92
70
|
const codeReviewUser = config?.delivery?.codeReview ?? {};
|
|
93
71
|
return {
|
|
94
72
|
deliverRunner: {
|
|
95
73
|
concurrencyCap:
|
|
96
74
|
deliverRunnerUser.concurrencyCap ??
|
|
97
75
|
DEFAULT_DELIVER_RUNNER.concurrencyCap,
|
|
98
|
-
progressReportIntervalSec:
|
|
99
|
-
deliverRunnerUser.progressReportIntervalSec ??
|
|
100
|
-
DEFAULT_DELIVER_RUNNER.progressReportIntervalSec,
|
|
101
76
|
verifyConcurrencyCap:
|
|
102
77
|
deliverRunnerUser.verifyConcurrencyCap ??
|
|
103
78
|
DEFAULT_DELIVER_RUNNER.verifyConcurrencyCap,
|
|
104
79
|
},
|
|
105
|
-
epicAudit: {
|
|
106
|
-
maxFixAttempts:
|
|
107
|
-
epicAuditUser.maxFixAttempts ?? DEFAULT_EPIC_AUDIT.maxFixAttempts,
|
|
108
|
-
maxFixScopeFiles:
|
|
109
|
-
epicAuditUser.maxFixScopeFiles ?? DEFAULT_EPIC_AUDIT.maxFixScopeFiles,
|
|
110
|
-
autoFixSeverity:
|
|
111
|
-
epicAuditUser.autoFixSeverity ?? DEFAULT_EPIC_AUDIT.autoFixSeverity,
|
|
112
|
-
},
|
|
113
80
|
codeReview: {
|
|
114
81
|
maxFixAttempts:
|
|
115
82
|
codeReviewUser.maxFixAttempts ?? DEFAULT_CODE_REVIEW.maxFixAttempts,
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `temp/
|
|
2
|
+
* `temp/run-<id>/` path-resolution helper (Epic #1030 Story #1039).
|
|
3
3
|
*
|
|
4
4
|
* Single source of truth for every artifact path that lives under
|
|
5
5
|
* `project.paths.tempRoot`. Every script that previously hand-rolled
|
|
6
|
-
* a flat `temp/<artifact>-
|
|
6
|
+
* a flat `temp/<artifact>-run-<id>.<ext>` path migrates to call one of
|
|
7
7
|
* these helpers. The Tech Spec (#1032) names this module as the cutover
|
|
8
8
|
* grep target — `temp/.*-epic-` should be empty across `.agents/scripts`
|
|
9
9
|
* once the migration Stories land.
|
|
10
10
|
*
|
|
11
11
|
* Layout:
|
|
12
|
-
* temp/
|
|
12
|
+
* temp/run-<eid>/
|
|
13
13
|
* ├─ techspec.md
|
|
14
14
|
* ├─ manifest.md (dispatch manifest)
|
|
15
15
|
* ├─ retro.md (mirror of GitHub retro at Epic close)
|
|
16
16
|
* ├─ perf-report.md (analyzer output, Epic-level)
|
|
17
17
|
* ├─ lifecycle.ndjson (lifecycle bus ledger)
|
|
18
|
-
* ├─ checkpoints/... (epic-runner state store)
|
|
18
|
+
* ├─ checkpoints/... (pre-v2 epic-runner state store; retained layout)
|
|
19
19
|
* ├─ <name> (epicArtifactPath escape hatch)
|
|
20
20
|
* └─ stories/
|
|
21
21
|
* └─ story-<sid>/
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
* parent of `git rev-parse --git-common-dir`) rather than `process.cwd()`.
|
|
44
44
|
* Without this, a story child that `cd`s into `.worktrees/story-<id>/` before
|
|
45
45
|
* calling `story-phase.js` would append `story.heartbeat` records to
|
|
46
|
-
* `<worktree>/temp/
|
|
46
|
+
* `<worktree>/temp/run-N/lifecycle.ndjson`, while the `/deliver` host
|
|
47
47
|
* (running from the main checkout) reads the main-checkout copy — so the
|
|
48
48
|
* idle-watchdog never sees heartbeats and the Epic-lease guard silently
|
|
49
49
|
* reclaims live foreign claims (the audit-#3513 bug class). Anchoring the
|
|
@@ -206,18 +206,23 @@ const artifactName = (name) => {
|
|
|
206
206
|
};
|
|
207
207
|
|
|
208
208
|
/**
|
|
209
|
-
* `temp/
|
|
209
|
+
* `temp/run-<eid>/` — every Epic-scoped artifact lives under here.
|
|
210
210
|
*
|
|
211
211
|
* @param {number} eid
|
|
212
212
|
* @param {object} [config]
|
|
213
213
|
* @returns {string}
|
|
214
214
|
*/
|
|
215
|
+
export function runTempDir(rid, config) {
|
|
216
|
+
return path.join(anchorTempRoot(tempRootFrom(config)), `run-${epicId(rid)}`);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** @deprecated Use {@link runTempDir}. */
|
|
215
220
|
export function epicTempDir(eid, config) {
|
|
216
|
-
return
|
|
221
|
+
return runTempDir(eid, config);
|
|
217
222
|
}
|
|
218
223
|
|
|
219
224
|
/**
|
|
220
|
-
* `temp/
|
|
225
|
+
* `temp/run-<eid>/stories/story-<sid>/` — every Story-scoped artifact
|
|
221
226
|
* lives under here.
|
|
222
227
|
*
|
|
223
228
|
* Story #2874: accepts `eid === null` for standalone Stories (no
|
|
@@ -246,7 +251,7 @@ export function storyTempDir(eid, sid, config) {
|
|
|
246
251
|
}
|
|
247
252
|
|
|
248
253
|
/**
|
|
249
|
-
* `temp/
|
|
254
|
+
* `temp/run-<eid>/stories/story-<sid>/signals.ndjson` — append-only
|
|
250
255
|
* signal stream consumed by the analyzer (Epic #1030 AC1).
|
|
251
256
|
*
|
|
252
257
|
* @param {number} eid
|
|
@@ -259,18 +264,18 @@ export function signalsFile(eid, sid, config) {
|
|
|
259
264
|
}
|
|
260
265
|
|
|
261
266
|
/**
|
|
262
|
-
* `temp/
|
|
267
|
+
* `temp/run-<eid>/stories/story-<sid>/lifecycle.ndjson` — the story-scope
|
|
263
268
|
* ledger destination for lifecycle events emitted directly by a Story
|
|
264
269
|
* (rather than routed through the Epic-scoped bus ledger). Story #4426
|
|
265
270
|
* (Epic #4425) introduces the first consumer: a standalone
|
|
266
271
|
* `single-story-close` run (no parent Epic) emitting `merge.unlanded`
|
|
267
|
-
* needs an on-disk home even though there is no `
|
|
272
|
+
* needs an on-disk home even though there is no `run-<id>/` directory to
|
|
268
273
|
* anchor the event to.
|
|
269
274
|
*
|
|
270
275
|
* Mirrors `epicLedgerPath` exactly, one level down: `eid === null` routes
|
|
271
276
|
* through `storyTempDir`'s standalone branch to
|
|
272
277
|
* `<tempRoot>/standalone/stories/story-<sid>/lifecycle.ndjson`; a real
|
|
273
|
-
* `eid` routes to `<tempRoot>/
|
|
278
|
+
* `eid` routes to `<tempRoot>/run-<eid>/stories/story-<sid>/lifecycle.ndjson`,
|
|
274
279
|
* so an Epic-attached Story's story-scope ledger sits alongside its
|
|
275
280
|
* `signals.ndjson` sibling.
|
|
276
281
|
*
|
|
@@ -324,7 +329,7 @@ export const epicPerfReportPath = (eid, config) =>
|
|
|
324
329
|
epicArtifactPath(eid, 'perf-report.md', config);
|
|
325
330
|
|
|
326
331
|
/**
|
|
327
|
-
* `temp/
|
|
332
|
+
* `temp/run-<eid>/epic-perf-report.json` — canonical JSON snapshot of
|
|
328
333
|
* the `epic-perf-report` payload persisted at /deliver close
|
|
329
334
|
* (Epic #3019 / Story #3029 / Task #3040). When present alongside the
|
|
330
335
|
* `epic-perf-report` structured comment, the report is discoverable
|
|
@@ -340,7 +345,7 @@ export const epicPerfReportJsonPath = (eid, config) =>
|
|
|
340
345
|
epicArtifactPath(eid, 'epic-perf-report.json', config);
|
|
341
346
|
|
|
342
347
|
/**
|
|
343
|
-
* `temp/
|
|
348
|
+
* `temp/run-<eid>/lifecycle.ndjson` — append-only lifecycle bus ledger
|
|
344
349
|
* (Story #2510). The LedgerWriter persists every emitted/completed/failed
|
|
345
350
|
* record here; the TraceLogger renders the companion markdown from it.
|
|
346
351
|
*
|