mandrel 1.94.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +116 -99
- package/.agents/agents/acceptance-critic.md +9 -7
- package/.agents/agents/story-worker.md +45 -51
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +498 -1287
- package/.agents/docs/agentrc-reference.json +185 -80
- package/.agents/docs/configuration.md +132 -190
- package/.agents/docs/execution-reference.md +51 -25
- package/.agents/docs/quality-gates.md +25 -33
- package/.agents/docs/workflows.md +8 -8
- package/.agents/instructions.md +113 -139
- package/.agents/rules/ci-remediation.md +11 -15
- package/.agents/rules/git-conventions-reference.md +48 -58
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +83 -254
- package/.agents/schemas/audit-rules.json +59 -1
- package/.agents/schemas/audit-rules.schema.json +33 -1
- package/.agents/schemas/lifecycle/README.md +1 -2
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
- package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
- package/.agents/schemas/signal-event.schema.json +3 -3
- package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +22 -66
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/bootstrap.js +3 -3
- package/.agents/scripts/check-dead-exports.js +43 -104
- package/.agents/scripts/check-doc-links.js +2 -2
- package/.agents/scripts/check-lifecycle-lint.js +7 -10
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/deliver-recover.js +122 -0
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +20 -50
- package/.agents/scripts/generate-skills-index.js +17 -1
- package/.agents/scripts/generate-workflows-doc.js +4 -4
- package/.agents/scripts/lib/ITicketingProvider.js +1 -19
- package/.agents/scripts/lib/Logger.js +6 -10
- package/.agents/scripts/lib/audit-suite/runner.js +2 -2
- package/.agents/scripts/lib/audit-suite/selector.js +328 -28
- package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
- package/.agents/scripts/lib/baselines/kernel.js +206 -18
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
- package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
- package/.agents/scripts/lib/checks/index.js +3 -2
- package/.agents/scripts/lib/checks/loop-health.js +12 -11
- package/.agents/scripts/lib/checks/state.js +17 -248
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +39 -9
- package/.agents/scripts/lib/close-validation/gates.js +15 -15
- package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
- package/.agents/scripts/lib/close-validation/runner.js +13 -21
- package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +52 -35
- package/.agents/scripts/lib/config/explain.js +61 -48
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +29 -80
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +12 -15
- package/.agents/scripts/lib/config/runners.js +20 -66
- package/.agents/scripts/lib/config/temp-paths.js +30 -63
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +2 -7
- package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
- package/.agents/scripts/lib/config-settings-schema.js +100 -60
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +2 -2
- package/.agents/scripts/lib/duplicate-search.js +242 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +23 -14
- package/.agents/scripts/lib/format-generated-json.js +97 -0
- package/.agents/scripts/lib/framework-version.js +19 -190
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
- package/.agents/scripts/lib/git-utils.js +32 -20
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +10 -38
- package/.agents/scripts/lib/label-taxonomy.js +10 -55
- package/.agents/scripts/lib/observability/active-story-env.js +44 -165
- package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
- package/.agents/scripts/lib/observability/signal-validator.js +4 -4
- package/.agents/scripts/lib/observability/signals-writer.js +6 -82
- package/.agents/scripts/lib/observability/source-classifier.js +5 -5
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
- package/.agents/scripts/lib/orchestration/code-review.js +78 -436
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
- package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
- package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
- package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
- package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
- package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
- package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
- package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
- package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
- package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
- package/.agents/scripts/lib/planning-corpus.js +12 -281
- package/.agents/scripts/lib/preflight-runner.js +4 -4
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
- package/.agents/scripts/lib/signals/index.js +4 -17
- package/.agents/scripts/lib/signals/read.js +35 -35
- package/.agents/scripts/lib/signals/schema.js +8 -11
- package/.agents/scripts/lib/signals/span-tree.js +7 -7
- package/.agents/scripts/lib/signals/write.js +0 -1
- package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +17 -19
- package/.agents/scripts/lib/story-body/story-body.js +130 -75
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
- package/.agents/scripts/lib/validation-evidence.js +32 -60
- package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- package/.agents/scripts/lint-issue-body.js +71 -40
- package/.agents/scripts/mandrel-update-preflight.js +1 -1
- package/.agents/scripts/notify.js +4 -3
- package/.agents/scripts/plan-context.js +102 -80
- package/.agents/scripts/plan-persist.js +230 -279
- package/.agents/scripts/plan-run-epilogue.js +142 -0
- package/.agents/scripts/post-structured-comment.js +0 -38
- package/.agents/scripts/pr-watch-with-update.js +43 -22
- package/.agents/scripts/providers/github/compose.js +0 -1
- package/.agents/scripts/providers/github/errors.js +0 -19
- package/.agents/scripts/providers/github/issues.js +13 -39
- package/.agents/scripts/providers/github/mappers.js +5 -12
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -156
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/resolve-stories.js +236 -0
- package/.agents/scripts/run-coverage.js +4 -1
- package/.agents/scripts/run-lint.js +2 -2
- package/.agents/scripts/run-verify.js +31 -2
- package/.agents/scripts/signals-view.js +25 -21
- package/.agents/scripts/single-story-close.js +178 -26
- package/.agents/scripts/single-story-confirm-merge.js +313 -24
- package/.agents/scripts/single-story-init.js +35 -30
- package/.agents/scripts/stories-wave-tick.js +85 -10
- package/.agents/scripts/story-plan.js +28 -49
- package/.agents/scripts/update-ticket-state.js +14 -65
- package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
- package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
- package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
- package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
- package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
- package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
- package/.agents/skills/core/scope-triage/SKILL.md +31 -172
- package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
- package/.agents/skills/core/security-and-hardening/reference.md +375 -0
- package/.agents/skills/skills.index.json +3 -53
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +6 -7
- package/.agents/workflows/audit-clean-code.md +7 -7
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +9 -10
- package/.agents/workflows/audit-lighthouse.md +11 -3
- package/.agents/workflows/audit-navigability.md +13 -2
- package/.agents/workflows/audit-performance.md +5 -6
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +11 -12
- package/.agents/workflows/audit-security.md +4 -5
- package/.agents/workflows/audit-seo.md +13 -3
- package/.agents/workflows/audit-sre.md +3 -3
- package/.agents/workflows/audit-to-stories.md +20 -20
- package/.agents/workflows/audit-ux-ui.md +10 -3
- package/.agents/workflows/deliver.md +177 -176
- package/.agents/workflows/git-cleanup.md +5 -6
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
- package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
- package/.agents/workflows/helpers/code-review.md +75 -196
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
- package/.agents/workflows/helpers/deliver-story.md +606 -0
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/parallel-tooling.md +3 -3
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
- package/.agents/workflows/mandrel-update.md +2 -1
- package/.agents/workflows/plan.md +277 -145
- package/.agents/workflows/qa-assist.md +27 -33
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -6
- package/README.md +9 -8
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +70 -0
- package/lib/cli/registry.js +262 -19
- package/lib/cli/sync-agents.js +157 -0
- package/lib/cli/sync-commands.js +115 -6
- package/lib/cli/sync.js +168 -6
- package/lib/cli/update.js +105 -8
- package/lib/cli/version-helpers.js +131 -0
- package/lib/migrations/README.md +7 -5
- package/lib/migrations/index.js +12 -8
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
- package/package.json +2 -2
- package/.agents/agents/retro.md +0 -42
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer.md +0 -33
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/security-engineer.md +0 -111
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
- package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
- package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -66
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -852
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
- package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
- package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
- package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
- package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
- package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
- package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
- package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
- package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
- package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
- package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
- package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/slice-phase.js +0 -361
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -464
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
- package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
- package/.agents/workflows/helpers/deliver-epic.md +0 -998
- package/.agents/workflows/helpers/deliver-stories.md +0 -450
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -353
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- package/.agents/workflows/helpers/single-story-deliver.md +0 -557
|
@@ -3,19 +3,25 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { writeFile as defaultWriteFile } from 'node:fs/promises';
|
|
6
|
-
import
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { storyTempDir } from '../config/temp-paths.js';
|
|
7
8
|
import { getSpawnCount as defaultGetSpawnCount } from '../gh-exec.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Throw-away ghSpawnCount emitter (Story #1795 / Epic #1788).
|
|
11
12
|
*
|
|
12
13
|
* Writes the current `gh-exec` spawn counter to
|
|
13
|
-
* `temp/
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
14
|
+
* `temp/run-<id>/stories/story-<sid>/gh-spawn-count.json`.
|
|
15
|
+
*
|
|
16
|
+
* Story #4545 — its reader is gone: `analyze-execution.js` consumed this file
|
|
17
|
+
* to emit a `ghSpawnCount` field on the `story-perf-summary` payload, and both
|
|
18
|
+
* that CLI and that payload were deleted with the execution-analysis surface.
|
|
19
|
+
* The writer itself already had no production caller before that (the
|
|
20
|
+
* `runPostMergeClose` orchestrator named below went in the v2.0.0 cutover), so
|
|
21
|
+
* this module is production-dead and kept alive only by its own test — the
|
|
22
|
+
* test-importer blind spot the dead-exports ratchet cannot see. It is left in
|
|
23
|
+
* place rather than deleted because reviving spawn telemetry against the live
|
|
24
|
+
* close path is a decision, not a sweep.
|
|
19
25
|
*
|
|
20
26
|
* @param {object} opts
|
|
21
27
|
* @param {number|string} opts.epicId
|
|
@@ -50,7 +56,10 @@ export async function emitGhSpawnCount({
|
|
|
50
56
|
);
|
|
51
57
|
return { status: 'failed', reason: 'counter-read-failed' };
|
|
52
58
|
}
|
|
53
|
-
const targetPath =
|
|
59
|
+
const targetPath = path.join(
|
|
60
|
+
storyTempDir(eid, sid, config),
|
|
61
|
+
'gh-spawn-count.json',
|
|
62
|
+
);
|
|
54
63
|
const payload = {
|
|
55
64
|
kind: 'gh-spawn-count',
|
|
56
65
|
epicId: eid,
|
|
@@ -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,48 +1,46 @@
|
|
|
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
|
-
* floor** (Epic #4478, M7-B, Part 2).
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* clamped into `[0, 1]`; `0` disables
|
|
36
|
-
* every cluster fresh. The default is
|
|
21
|
+
* floor** (Epic #4478, M7-B, Part 2). Ceremony routing sends the acceptance
|
|
22
|
+
* clusters of a change set that touches no sensitive path down the
|
|
23
|
+
* contract-identical *inline* critic path, but a fraction of them are still
|
|
24
|
+
* forced through a *fresh-context* critic so a low derived level never degrades
|
|
25
|
+
* to zero independent checking. The rate is clamped into `[0, 1]`; `0` disables
|
|
26
|
+
* the floor (pure level routing), `1` forces every cluster fresh. The default is
|
|
27
|
+
* `0.2`. See `resolveCeremonyForRisk` in
|
|
37
28
|
* `lib/orchestration/ceremony-routing.js`.
|
|
38
29
|
*
|
|
39
30
|
* Framework-defaults pattern mirrors `lib/config/ci.js#getCiDelivery`.
|
|
40
31
|
*/
|
|
41
32
|
|
|
42
33
|
export const DELIVERY_ROUTING_DEFAULTS = Object.freeze({
|
|
43
|
-
singleDelivery: true,
|
|
44
34
|
roleScopedAgents: true,
|
|
45
35
|
freshCriticSampleRate: 0.2,
|
|
36
|
+
/** @type {'minimal'|'standard'|'strict'} */
|
|
37
|
+
ceremonyProfile: 'standard',
|
|
38
|
+
/**
|
|
39
|
+
* When true (default), attended `/deliver` lands through merge in one
|
|
40
|
+
* close (`--wait-merge` semantics) instead of stopping at `agent::closing`.
|
|
41
|
+
* Operators opt out per-run with `--no-wait-merge`.
|
|
42
|
+
*/
|
|
43
|
+
closeAndLand: true,
|
|
46
44
|
});
|
|
47
45
|
|
|
48
46
|
/**
|
|
@@ -62,6 +60,19 @@ function clampSampleRate(value) {
|
|
|
62
60
|
return value;
|
|
63
61
|
}
|
|
64
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Normalize ceremony profile; unknown values → `standard`.
|
|
65
|
+
*
|
|
66
|
+
* @param {unknown} value
|
|
67
|
+
* @returns {'minimal'|'standard'|'strict'}
|
|
68
|
+
*/
|
|
69
|
+
function normalizeCeremonyProfile(value) {
|
|
70
|
+
if (value === 'minimal' || value === 'standard' || value === 'strict') {
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
return DELIVERY_ROUTING_DEFAULTS.ceremonyProfile;
|
|
74
|
+
}
|
|
75
|
+
|
|
65
76
|
/**
|
|
66
77
|
* Read the merged `delivery.routing` block, applying framework defaults for
|
|
67
78
|
* any field the operator omitted. Accepts the full resolved config, the bare
|
|
@@ -69,19 +80,25 @@ function clampSampleRate(value) {
|
|
|
69
80
|
* tolerant unwrap so callers can pass whichever shape they hold.
|
|
70
81
|
*
|
|
71
82
|
* @param {object | null | undefined} config
|
|
72
|
-
* @returns {{
|
|
83
|
+
* @returns {{
|
|
84
|
+
* roleScopedAgents: boolean,
|
|
85
|
+
* freshCriticSampleRate: number,
|
|
86
|
+
* ceremonyProfile: 'minimal'|'standard'|'strict',
|
|
87
|
+
* closeAndLand: boolean,
|
|
88
|
+
* }}
|
|
73
89
|
*/
|
|
74
90
|
export function getDeliveryRouting(config) {
|
|
75
91
|
const routing = config?.delivery?.routing ?? config?.routing ?? config ?? {};
|
|
76
92
|
return {
|
|
77
|
-
singleDelivery:
|
|
78
|
-
typeof routing.singleDelivery === 'boolean'
|
|
79
|
-
? routing.singleDelivery
|
|
80
|
-
: DELIVERY_ROUTING_DEFAULTS.singleDelivery,
|
|
81
93
|
roleScopedAgents:
|
|
82
94
|
typeof routing.roleScopedAgents === 'boolean'
|
|
83
95
|
? routing.roleScopedAgents
|
|
84
96
|
: DELIVERY_ROUTING_DEFAULTS.roleScopedAgents,
|
|
85
97
|
freshCriticSampleRate: clampSampleRate(routing.freshCriticSampleRate),
|
|
98
|
+
ceremonyProfile: normalizeCeremonyProfile(routing.ceremonyProfile),
|
|
99
|
+
closeAndLand:
|
|
100
|
+
typeof routing.closeAndLand === 'boolean'
|
|
101
|
+
? routing.closeAndLand
|
|
102
|
+
: DELIVERY_ROUTING_DEFAULTS.closeAndLand,
|
|
86
103
|
};
|
|
87
104
|
}
|
|
@@ -63,13 +63,13 @@ const SECRET_SEGMENT_PATTERNS = Object.freeze([
|
|
|
63
63
|
const KEY_MEANINGS = Object.freeze({
|
|
64
64
|
// project.*
|
|
65
65
|
'project.baseBranch':
|
|
66
|
-
'Default base branch
|
|
66
|
+
'Default base branch Stories branch from and merge back into.',
|
|
67
67
|
'project.paths.agentRoot':
|
|
68
68
|
'Directory holding the distributed agent bundle (instructions, skills, scripts).',
|
|
69
69
|
'project.paths.docsRoot':
|
|
70
70
|
'Directory the mandatory docs-context reads resolve against.',
|
|
71
71
|
'project.paths.tempRoot':
|
|
72
|
-
'Root for gitignored scratch output (per-
|
|
72
|
+
'Root for gitignored scratch output (per-run state, mirrors, logs).',
|
|
73
73
|
'project.docsContextFiles':
|
|
74
74
|
'Authoritative files an agent must read before starting any task.',
|
|
75
75
|
'project.commands.lintBaseline':
|
|
@@ -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':
|
|
@@ -112,10 +114,6 @@ const KEY_MEANINGS = Object.freeze({
|
|
|
112
114
|
'Allowlist of events that fire a webhook notification.',
|
|
113
115
|
|
|
114
116
|
// planning.*
|
|
115
|
-
'planning.context.maxBytes':
|
|
116
|
-
'Byte budget for the planning-context payload before summary mode kicks in.',
|
|
117
|
-
'planning.context.summaryMode':
|
|
118
|
-
'When the planner switches to a summarized context representation.',
|
|
119
117
|
'planning.codebaseSnapshot.tier':
|
|
120
118
|
'Depth of the structural codebase view threaded into spec authoring.',
|
|
121
119
|
'planning.codebaseSnapshot.include':
|
|
@@ -126,28 +124,28 @@ const KEY_MEANINGS = Object.freeze({
|
|
|
126
124
|
'How many recent commits the snapshot summarizes.',
|
|
127
125
|
'planning.riskHeuristics':
|
|
128
126
|
'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
127
|
'planning.failOnSharedEditors':
|
|
136
128
|
'Whether shared-editor conflict findings are promoted to hard errors.',
|
|
137
129
|
'planning.requireExplicitCrossStoryDeps':
|
|
138
130
|
'Whether implicit cross-Story dependencies are promoted to hard errors.',
|
|
131
|
+
'planning.failOnRegistryConflicts':
|
|
132
|
+
'Whether cross-cutting registry conflict findings are promoted to hard errors.',
|
|
133
|
+
'planning.failOnLargeFanOut':
|
|
134
|
+
'Whether large fan-out findings are promoted to hard errors.',
|
|
135
|
+
'planning.largeFanOutThreshold':
|
|
136
|
+
'Story count above which a plan is flagged as a large fan-out.',
|
|
137
|
+
'planning.crossCuttingRegistries':
|
|
138
|
+
'Glob patterns naming cross-cutting registry files the planner conflict-checks.',
|
|
139
|
+
'planning.navigation.routeGlobs':
|
|
140
|
+
'Glob patterns marking paths that add a user-facing route (plan-time reachability gate).',
|
|
141
|
+
'planning.navigation.navRegistry':
|
|
142
|
+
'Tokens identifying the nav-registry SSOT a route-adding Story is expected to reference.',
|
|
139
143
|
|
|
140
144
|
// delivery.*
|
|
141
145
|
'delivery.execution.timeoutMs':
|
|
142
146
|
'Per-execution timeout for orchestrated delivery steps.',
|
|
143
|
-
'delivery.maxTokenBudget':
|
|
144
|
-
'Cap on the hydrated task-prompt size handed to an agent.',
|
|
145
147
|
'delivery.lease.ttlMs':
|
|
146
|
-
'Time-to-live for the
|
|
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.',
|
|
148
|
+
'Time-to-live for the delivery lease before a stale claim is reclaimable.',
|
|
151
149
|
'delivery.ci.watch.pollIntervalMs':
|
|
152
150
|
'Poll cadence (ms) for the merge/CI watch loop.',
|
|
153
151
|
'delivery.ci.watch.maxPolls':
|
|
@@ -156,40 +154,28 @@ const KEY_MEANINGS = Object.freeze({
|
|
|
156
154
|
'Maximum times the CI watch may resume after a transient stall.',
|
|
157
155
|
'delivery.ci.autoMerge':
|
|
158
156
|
'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
157
|
'delivery.docsFreshness.paths':
|
|
170
158
|
'Docs whose freshness is checked at delivery time.',
|
|
171
159
|
'delivery.deliverRunner.concurrencyCap':
|
|
172
|
-
'Maximum Stories dispatched in parallel within one wave. Default 3 — conservative by design to keep host-quota consumption predictable. Operators running wide
|
|
173
|
-
'delivery.deliverRunner.progressReportIntervalSec':
|
|
174
|
-
'Cadence for delivery progress reporting.',
|
|
175
|
-
'delivery.deliverRunner.verifyConcurrencyCap':
|
|
176
|
-
'Maximum verify steps run in parallel.',
|
|
160
|
+
'Maximum Stories dispatched in parallel within one wave. Default 3 — conservative by design to keep host-quota consumption predictable. Operators running wide waves with adequate parallel-agent quota should raise this to reduce wall-clock time proportionally.',
|
|
177
161
|
'delivery.worktreeIsolation.enabled':
|
|
178
162
|
'Whether each Story runs in its own git worktree.',
|
|
179
163
|
'delivery.worktreeIsolation.root':
|
|
180
164
|
'Directory under which per-Story worktrees are created.',
|
|
181
165
|
'delivery.worktreeIsolation.nodeModulesStrategy':
|
|
182
|
-
'How node_modules is provisioned per worktree.',
|
|
166
|
+
'How node_modules is provisioned per worktree (default clone on darwin/linux; per-worktree on win32).',
|
|
183
167
|
'delivery.worktreeIsolation.primeFromPath':
|
|
184
168
|
'Source path a worktree primes its node_modules from.',
|
|
185
169
|
'delivery.worktreeIsolation.allowSymlinkOnWindows':
|
|
186
170
|
'Whether symlink node_modules strategy is allowed on Windows.',
|
|
187
171
|
'delivery.worktreeIsolation.reapOnSuccess':
|
|
188
172
|
'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
173
|
'delivery.worktreeIsolation.bootstrapFiles':
|
|
192
|
-
'Files copied into each new worktree (e.g. .env, .mcp.json).',
|
|
174
|
+
'Files copied into each new worktree (e.g. .env, .mcp.json, local overrides).',
|
|
175
|
+
'delivery.mergeWatch.intervalSeconds':
|
|
176
|
+
'Poll cadence (seconds) for the close-and-land merge wait after the arm.',
|
|
177
|
+
'delivery.mergeWatch.maxBudgetSeconds':
|
|
178
|
+
'Cumulative wall-clock budget (seconds) across resumes before the merge wait gives up and blocks.',
|
|
193
179
|
'delivery.codeReview.providers':
|
|
194
180
|
'Ordered provider chain the code-review phase consults.',
|
|
195
181
|
'delivery.codeReview.maxFixAttempts':
|
|
@@ -198,14 +184,34 @@ const KEY_MEANINGS = Object.freeze({
|
|
|
198
184
|
'Maximum files an auto-fix may touch in one attempt.',
|
|
199
185
|
'delivery.codeReview.autoFixSeverity':
|
|
200
186
|
'Severity threshold for on-branch code-review remediation (medium fixes 🔴/🟠/🟡, high fixes 🔴/🟠 only; default medium).',
|
|
201
|
-
'delivery.
|
|
202
|
-
'
|
|
187
|
+
'delivery.routing.roleScopedAgents':
|
|
188
|
+
'Whether delivery spawns boot on role-scoped .claude/agents/<role>.md contexts.',
|
|
189
|
+
'delivery.routing.freshCriticSampleRate':
|
|
190
|
+
'Fraction of low-risk acceptance clusters forced through a fresh-context critic (maker-checker floor).',
|
|
191
|
+
'delivery.routing.ceremonyProfile':
|
|
192
|
+
'Acceptance-ceremony depth: minimal (always inline), standard (derived-level routed), or strict (always fresh).',
|
|
193
|
+
'delivery.routing.closeAndLand':
|
|
194
|
+
'When true, single-story-close lands through merge in one close (opt out with --no-wait-merge).',
|
|
195
|
+
'delivery.feedbackLoop.auditResultsAutoFile':
|
|
196
|
+
'When true, auto-file non-blocking audit findings as follow-up issues.',
|
|
197
|
+
'delivery.feedbackLoop.retroProposals':
|
|
198
|
+
'When true, auto-file actionable retro proposals as follow-up issues.',
|
|
199
|
+
'delivery.quality.formatAutofix.timeoutMs':
|
|
200
|
+
'Bounded timeout (ms) for the close-time format autofix spawn.',
|
|
201
|
+
'delivery.quality.requireBaselines':
|
|
202
|
+
'When true, absent baseline artifacts fail close-validation instead of skipping cleanly.',
|
|
203
|
+
'delivery.quality.navigability.routeGlobs':
|
|
204
|
+
'Glob patterns marking user-facing routes for the navigability lens / journey gate.',
|
|
205
|
+
'delivery.quality.navigability.navRegistry':
|
|
206
|
+
'Tokens identifying the nav-registry SSOT the navigability lens expects.',
|
|
207
|
+
'delivery.quality.navigability.journeySuite':
|
|
208
|
+
'Optional journey-suite path the post-wave navigability integration gate runs.',
|
|
203
209
|
'delivery.refactorStage.enabled':
|
|
204
210
|
'Whether a dedicated refactor stage runs during delivery.',
|
|
205
211
|
'delivery.acceptanceEval.maxRounds':
|
|
206
212
|
'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).',
|
|
207
213
|
'delivery.acceptanceEval.clusterCeiling':
|
|
208
|
-
'Max acceptance criteria one single-delivery acceptance critic scores per fresh-context pass; the
|
|
214
|
+
'Max acceptance criteria one single-delivery acceptance critic scores per fresh-context pass; the Story ACs are split into ceil(totalACs / clusterCeiling) maker-blind critic clusters (default 4; clamped to [1, 8]).',
|
|
209
215
|
|
|
210
216
|
// qa.*
|
|
211
217
|
'qa.featureRoot': 'Root directory holding the QA harness .feature files.',
|
|
@@ -240,11 +246,19 @@ const PREFIX_MEANINGS = Object.freeze([
|
|
|
240
246
|
],
|
|
241
247
|
['delivery.quality', 'Delivery-time quality configuration.'],
|
|
242
248
|
['delivery.signals', 'Threshold for a delivery friction/telemetry signal.'],
|
|
243
|
-
['delivery.
|
|
244
|
-
['delivery.lifecycle', 'Lifecycle-bus configuration.'],
|
|
249
|
+
['delivery.mergeWatch', 'Merge-wait poll cadence and wall-clock budget.'],
|
|
245
250
|
[
|
|
246
|
-
'
|
|
247
|
-
'
|
|
251
|
+
'delivery.feedbackLoop',
|
|
252
|
+
'Opt-out toggles for auto-filing non-blocking findings.',
|
|
253
|
+
],
|
|
254
|
+
[
|
|
255
|
+
'delivery.routing',
|
|
256
|
+
'Delivery-spawn routing and acceptance-ceremony profile.',
|
|
257
|
+
],
|
|
258
|
+
['delivery.ci', 'CI-aware delivery namespace (watch, auto-merge).'],
|
|
259
|
+
[
|
|
260
|
+
'planning.navigation',
|
|
261
|
+
'Plan-time navigability reachability gate (route globs + nav registry).',
|
|
248
262
|
],
|
|
249
263
|
[
|
|
250
264
|
'qa.environments',
|
|
@@ -262,9 +276,8 @@ const PREFIX_MEANINGS = Object.freeze([
|
|
|
262
276
|
const BLOCK_MEANINGS = Object.freeze({
|
|
263
277
|
project: 'Project identity, paths, and command configuration.',
|
|
264
278
|
github: 'GitHub provider identity and merge/notification policy.',
|
|
265
|
-
planning: 'Inputs and guardrails for /
|
|
266
|
-
delivery:
|
|
267
|
-
'Execution, isolation, quality, and lifecycle settings for delivery.',
|
|
279
|
+
planning: 'Inputs and guardrails for /plan.',
|
|
280
|
+
delivery: 'Execution, isolation, quality, and CI settings for delivery.',
|
|
268
281
|
qa: 'Agent-driven QA harness contract.',
|
|
269
282
|
});
|
|
270
283
|
|
|
@@ -55,11 +55,13 @@ export const NOTIFICATIONS_DEFAULTS = Object.freeze({
|
|
|
55
55
|
'operator-message',
|
|
56
56
|
]),
|
|
57
57
|
webhookEvents: Object.freeze([
|
|
58
|
-
'
|
|
59
|
-
'
|
|
60
|
-
'
|
|
61
|
-
'
|
|
62
|
-
'
|
|
58
|
+
'state-transition',
|
|
59
|
+
'story-merged',
|
|
60
|
+
'story-closing',
|
|
61
|
+
'operator-message',
|
|
62
|
+
'merge.unlanded',
|
|
63
|
+
'merge.flip-failed',
|
|
64
|
+
'loop.tick',
|
|
63
65
|
]),
|
|
64
66
|
});
|
|
65
67
|
|
|
@@ -5,25 +5,23 @@
|
|
|
5
5
|
* Post-reshape, the surviving operator-configurable keys are split across
|
|
6
6
|
* `planning.*` and `delivery.*`:
|
|
7
7
|
*
|
|
8
|
-
* - `planning.context.{maxBytes, summaryMode}` (planning-context budget)
|
|
9
|
-
* - `delivery.maxTokenBudget` (task-prompt hydration cap)
|
|
10
8
|
* - `delivery.execution.timeoutMs` (per-process execution timeout)
|
|
11
9
|
* - `delivery.lease.ttlMs` (assignee-as-lease staleness window — Story #3480)
|
|
12
|
-
* - `delivery.signals.{
|
|
13
|
-
*
|
|
10
|
+
* - `delivery.signals.{rework, retry}` (performance-signal detector
|
|
11
|
+
* thresholds — `hotspot` retired with Epic #4406; `churn`/`idle` dropped)
|
|
14
12
|
*
|
|
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.
|
|
13
|
+
* Framework constants (not operator-tunable via `.agentrc.json`):
|
|
14
|
+
* - `maxTickets` — decomposer reviewability budget (Story #4163)
|
|
22
15
|
*
|
|
23
|
-
* Dropped entirely: `maxInstructionSteps`, `friction
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
16
|
+
* Dropped entirely: `maxInstructionSteps`, `friction.*`, `executionMaxBuffer`,
|
|
17
|
+
* `signals.{churn, idle}`, `delivery.preflight`, `delivery.maxTokenBudget`
|
|
18
|
+
* (planning no longer sizes against a token-budget envelope; session-mass
|
|
19
|
+
* ceilings are absolute in `DEFAULT_MODEL_CAPACITY`), and
|
|
20
|
+
* `planning.context.{maxBytes, summaryMode}` (Story #4541 — the `applyBudget`
|
|
21
|
+
* pass they fed lost its last caller in the v2 cutover, and it bounded a field
|
|
22
|
+
* the envelope builders discarded; the live bound on planner-context size is
|
|
23
|
+
* the fixed `PLAN_CONTEXT_ENVELOPE_BYTE_CEILING` in
|
|
24
|
+
* `lib/orchestration/plan-context.js`).
|
|
27
25
|
*
|
|
28
26
|
* The historic combined accessor `getLimits(config)` is preserved as a
|
|
29
27
|
* compatibility surface: it returns a wrapper carrying the surviving
|
|
@@ -31,45 +29,36 @@
|
|
|
31
29
|
* working. New call sites should prefer the specific accessors below.
|
|
32
30
|
*/
|
|
33
31
|
|
|
34
|
-
import { getPreflight } from './preflight.js';
|
|
35
|
-
|
|
36
32
|
/**
|
|
37
|
-
* Framework defaults for the performance-signal detector thresholds.
|
|
38
|
-
*
|
|
33
|
+
* Framework defaults for the performance-signal detector thresholds.
|
|
34
|
+
* `hotspot` was retired with its detector (Epic #4406); `churn` and `idle`
|
|
35
|
+
* were dropped earlier.
|
|
39
36
|
*/
|
|
40
37
|
export const SIGNALS_DEFAULTS = Object.freeze({
|
|
41
|
-
hotspot: Object.freeze({ p95Multiplier: 1.25 }),
|
|
42
38
|
rework: Object.freeze({ editsPerFile: 5 }),
|
|
43
39
|
retry: Object.freeze({ repeatCount: 3 }),
|
|
44
40
|
});
|
|
45
41
|
|
|
46
42
|
/**
|
|
47
43
|
* Default TTL for the assignee-as-lease primitive (Story #3480). A claim
|
|
48
|
-
* whose owner
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
44
|
+
* whose owner's last heartbeat is older than this window is considered stale
|
|
45
|
+
* and may be reclaimed by another operator.
|
|
46
|
+
*
|
|
47
|
+
* Note: no shipped caller supplies a real heartbeat — the emitter was inert
|
|
48
|
+
* and was deleted (A22), so the guards anchor liveness to `now` and every
|
|
49
|
+
* foreign claim reads live (fail-closed; clear a stranded claim with
|
|
50
|
+
* `--steal`). This value is therefore only consulted by a caller that threads
|
|
51
|
+
* its own `heartbeatAt`, and is kept as the documented default for that seam.
|
|
52
52
|
*/
|
|
53
53
|
export const LEASE_TTL_MS_DEFAULT = 900000;
|
|
54
54
|
|
|
55
55
|
/**
|
|
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.
|
|
56
|
+
* Framework defaults for the surviving limits surface.
|
|
63
57
|
*/
|
|
64
58
|
export const LIMITS_DEFAULTS = Object.freeze({
|
|
65
59
|
maxTickets: 80,
|
|
66
|
-
maxTokenBudget: 300000,
|
|
67
60
|
executionTimeoutMs: 600000,
|
|
68
61
|
leaseTtlMs: LEASE_TTL_MS_DEFAULT,
|
|
69
|
-
planningContext: Object.freeze({
|
|
70
|
-
maxBytes: 50000,
|
|
71
|
-
summaryMode: 'auto',
|
|
72
|
-
}),
|
|
73
62
|
signals: SIGNALS_DEFAULTS,
|
|
74
63
|
});
|
|
75
64
|
|
|
@@ -79,7 +68,7 @@ export const LIMITS_DEFAULTS = Object.freeze({
|
|
|
79
68
|
* operator can override a single threshold without re-listing the others.
|
|
80
69
|
*
|
|
81
70
|
* @param {object|undefined} userSignals
|
|
82
|
-
* @returns {{
|
|
71
|
+
* @returns {{ rework: {editsPerFile: number}, retry: {repeatCount: number} }}
|
|
83
72
|
*/
|
|
84
73
|
function mergeSignals(userSignals) {
|
|
85
74
|
const user =
|
|
@@ -97,35 +86,23 @@ function mergeSignals(userSignals) {
|
|
|
97
86
|
|
|
98
87
|
/**
|
|
99
88
|
* Resolve the surviving limits surface against a `.agentrc.json` shape
|
|
100
|
-
* (post-reshape).
|
|
101
|
-
* `
|
|
102
|
-
*
|
|
103
|
-
* from `planning.*`, pulls `maxTokenBudget` and `executionTimeoutMs` from
|
|
104
|
-
* `delivery.*`, pulls signals from `delivery.signals.*`.
|
|
89
|
+
* (post-reshape). `maxTickets` is a framework constant (never read from
|
|
90
|
+
* config); pulls `executionTimeoutMs` from `delivery.*`, pulls signals from
|
|
91
|
+
* `delivery.signals.*`.
|
|
105
92
|
*
|
|
106
93
|
* @param {object|undefined} config
|
|
107
94
|
* @returns {{
|
|
108
95
|
* maxTickets: number,
|
|
109
|
-
* maxTokenBudget: number,
|
|
110
96
|
* executionTimeoutMs: number,
|
|
111
97
|
* leaseTtlMs: number,
|
|
112
|
-
* planningContext: { maxBytes: number, summaryMode: string },
|
|
113
98
|
* signals: ReturnType<typeof mergeSignals>,
|
|
114
99
|
* }}
|
|
115
100
|
*/
|
|
116
101
|
export function resolveLimits(config) {
|
|
117
|
-
const planning =
|
|
118
|
-
config?.planning && typeof config.planning === 'object'
|
|
119
|
-
? config.planning
|
|
120
|
-
: {};
|
|
121
102
|
const delivery =
|
|
122
103
|
config?.delivery && typeof config.delivery === 'object'
|
|
123
104
|
? config.delivery
|
|
124
105
|
: {};
|
|
125
|
-
const planningContextUser =
|
|
126
|
-
planning.context && typeof planning.context === 'object'
|
|
127
|
-
? planning.context
|
|
128
|
-
: {};
|
|
129
106
|
const execution =
|
|
130
107
|
delivery.execution && typeof delivery.execution === 'object'
|
|
131
108
|
? delivery.execution
|
|
@@ -133,18 +110,10 @@ export function resolveLimits(config) {
|
|
|
133
110
|
const lease =
|
|
134
111
|
delivery.lease && typeof delivery.lease === 'object' ? delivery.lease : {};
|
|
135
112
|
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
113
|
maxTickets: LIMITS_DEFAULTS.maxTickets,
|
|
140
|
-
maxTokenBudget: delivery.maxTokenBudget ?? LIMITS_DEFAULTS.maxTokenBudget,
|
|
141
114
|
executionTimeoutMs:
|
|
142
115
|
execution.timeoutMs ?? LIMITS_DEFAULTS.executionTimeoutMs,
|
|
143
116
|
leaseTtlMs: lease.ttlMs ?? LIMITS_DEFAULTS.leaseTtlMs,
|
|
144
|
-
planningContext: {
|
|
145
|
-
...LIMITS_DEFAULTS.planningContext,
|
|
146
|
-
...planningContextUser,
|
|
147
|
-
},
|
|
148
117
|
signals: mergeSignals(delivery.signals),
|
|
149
118
|
};
|
|
150
119
|
}
|
|
@@ -173,26 +142,6 @@ export function getSignals(config) {
|
|
|
173
142
|
return getLimits(config).signals;
|
|
174
143
|
}
|
|
175
144
|
|
|
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
145
|
/**
|
|
197
146
|
* Resolve the assignee-as-lease TTL in milliseconds (Story #3480). Standalone
|
|
198
147
|
* accessor so the `ticket-lease` module can import it without dragging the
|