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
|
@@ -1,200 +1,201 @@
|
|
|
1
1
|
---
|
|
2
2
|
description:
|
|
3
|
-
Unified delivery entry point.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
segment to the Epic wave loop or the standalone multi-Story fan-out —
|
|
7
|
-
preserving every flag and the parallel-delivery contract of the retired
|
|
8
|
-
commands.
|
|
3
|
+
Unified delivery entry point. Takes a list of Story ids, resolves their
|
|
4
|
+
dependency graph from live state, and delivers each via the single
|
|
5
|
+
deliver-story engine — story-<id> → PR → main.
|
|
9
6
|
---
|
|
10
7
|
|
|
11
|
-
# /deliver
|
|
8
|
+
# /deliver <storyId...>
|
|
12
9
|
|
|
13
10
|
## Role
|
|
14
11
|
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
Single delivery path with a single input shape: **a list of Story ids**.
|
|
13
|
+
`/deliver` owns input resolution and sequencing only — every Story runs
|
|
14
|
+
through [`helpers/deliver-story.md`](helpers/deliver-story.md). There is no
|
|
15
|
+
Epic wave loop, no `epic/<id>` integration branch, and no `--no-ff` wave
|
|
16
|
+
merges.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
standalone multi-Story path (`stories-wave-tick.js` continuous ready-set
|
|
25
|
-
loop, operator confirmation, parallel fan-out to
|
|
26
|
-
[`helpers/single-story-deliver`](helpers/single-story-deliver.md)).
|
|
18
|
+
The dependency graph is **discovered, not declared**: `resolve-stories.js`
|
|
19
|
+
reads it from live state (body edges ∪ native GitHub `blocked_by` edges,
|
|
20
|
+
with every blocker resolved against its real issue state). You never hand it
|
|
21
|
+
a graph, and there is no batch label — which is what lets you deliver
|
|
22
|
+
Stories **across plan runs and over time**: a Story whose blocker landed
|
|
23
|
+
weeks ago in a different run is simply ready.
|
|
27
24
|
|
|
28
|
-
##
|
|
25
|
+
## Inputs
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
reference) before routing:
|
|
32
|
-
|
|
33
|
-
| Input | Route |
|
|
34
|
-
| --- | --- |
|
|
35
|
-
| Exactly one `type::epic` ID | **Epic path** — resolve the Epic's delivery route (see [Epic delivery-route resolution](#epic-delivery-route-resolution) below), then run the selected helper's phases unchanged (single-segment plan; no confirmation prompt). |
|
|
36
|
-
| One or more `type::story` IDs, none carrying an `Epic: #N` reference | **Standalone path** — run [`helpers/deliver-stories.md`](helpers/deliver-stories.md) Phases 0–3 (single-segment plan; no confirmation prompt). |
|
|
37
|
-
| Any combination of ≥1 `type::epic` IDs and ≥0 standalone `type::story` IDs | **Segment plan** — compose and execute the sequential segment plan below. |
|
|
38
|
-
| Any Story carrying an `Epic: #N` reference (alone or mixed into an otherwise-valid set) | **Error**, naming every affected ID and the fix: `Story #<id> belongs to Epic #<n> — run /deliver <n>`. |
|
|
39
|
-
|
|
40
|
-
Per-ID classification is unchanged: fetch the `type::*` label and probe the
|
|
41
|
-
body for an `Epic: #N` reference before routing. Never guess a route.
|
|
42
|
-
|
|
43
|
-
## Epic delivery-route resolution
|
|
44
|
-
|
|
45
|
-
Every `type::epic` segment resolves to one of two delivery shapes before its
|
|
46
|
-
helper runs. The routing is a pure function of the Epic's labels, its
|
|
47
|
-
`epic-plan-state` checkpoint, and the config kill-switch — implemented in
|
|
48
|
-
[`lib/orchestration/deliver-route.js`](../scripts/lib/orchestration/deliver-route.js)
|
|
49
|
-
(`resolveEpicDeliveryRoute(epic, checkpoint, config)`), mirroring how the
|
|
50
|
-
code-review depth resolver reads `planningRisk`/`decompose` off the same
|
|
51
|
-
checkpoint. Fetch the Epic's labels and read its `epic-plan-state` structured
|
|
52
|
-
comment, then apply the precedence (highest wins):
|
|
53
|
-
|
|
54
|
-
1. **Kill-switch — overrides all.** `delivery.routing.singleDelivery === false`
|
|
55
|
-
(default `true`, read via `getDeliveryRouting`) forces **fan-out** for
|
|
56
|
-
*every* Epic, even a single-marked one. This is the instant, per-consumer
|
|
57
|
-
global revert that ships before the default flips — no code rollback, no
|
|
58
|
-
re-plan.
|
|
59
|
-
2. **Single marker → single route.** The `delivery::single` label (primary)
|
|
60
|
-
**or** `decompose.shape === "single"` on the checkpoint (secondary). A
|
|
61
|
-
spec-only plan authored no Story tree; its `## Delivery Slicing` table is
|
|
62
|
-
the audit trail.
|
|
63
|
-
3. **No marker → fan-out.** A legacy Epic (no marker, an authored Story tree)
|
|
64
|
-
or a genuinely-wide DAG. Deliver-time width only *advises* — it never
|
|
65
|
-
reroutes a single-marked Epic (that would orphan a tree that does not
|
|
66
|
-
exist; re-route = re-plan).
|
|
67
|
-
|
|
68
|
-
**Route dispatch.**
|
|
69
|
-
|
|
70
|
-
- **`fan-out`** → run [`helpers/deliver-epic.md`](helpers/deliver-epic.md)
|
|
71
|
-
Phases 1–9 unchanged (the wave loop fanning out per-Story sub-agents).
|
|
72
|
-
- **`single`** → run
|
|
73
|
-
[`helpers/deliver-epic-single.md`](helpers/deliver-epic-single.md) (the
|
|
74
|
-
live flip, M4-B): a one-worktree in-session slice walk (prepare `--single` →
|
|
75
|
-
ordered `## Delivery Slicing` walk on `epic/<id>` → per-AC-cluster
|
|
76
|
-
acceptance critics) that **reuses `helpers/deliver-epic.md` Phases 3–9
|
|
77
|
-
byte-for-byte** for the merge tail. This is now the **default** shape for a
|
|
78
|
-
single-marked Epic. The kill-switch (`delivery.routing.singleDelivery=false`)
|
|
79
|
-
still forces this verdict back to `fan-out` — an instant global revert with
|
|
80
|
-
no code rollback.
|
|
81
|
-
|
|
82
|
-
## Segment plan (mixed / multi-Epic input)
|
|
83
|
-
|
|
84
|
-
When the supplied IDs span more than one Epic, or mix Epics with standalone
|
|
85
|
-
Stories, the router composes a **segment plan** and executes the segments
|
|
86
|
-
**strictly sequentially**:
|
|
87
|
-
|
|
88
|
-
1. **Standalone segment first** (when any standalone Story IDs are
|
|
89
|
-
present): the full standalone-Story set forms **one** segment,
|
|
90
|
-
delivered via [`helpers/deliver-stories.md`](helpers/deliver-stories.md)
|
|
91
|
-
Phases 0–3 unchanged. It runs first because it is fast, each Story
|
|
92
|
-
merges to `main` independently, and each subsequent Epic segment's
|
|
93
|
-
Phase 7.0 base-sync then integrates those merges naturally instead of
|
|
94
|
-
the Epic PR opening behind base.
|
|
95
|
-
2. **Epic segments in input order**: each `type::epic` ID forms its own
|
|
96
|
-
segment. Resolve its delivery route (see [Epic delivery-route
|
|
97
|
-
resolution](#epic-delivery-route-resolution)) and run the selected helper
|
|
98
|
-
unchanged — the `fan-out` route dispatches
|
|
99
|
-
[`helpers/deliver-epic.md`](helpers/deliver-epic.md) Phases 1–9, the
|
|
100
|
-
`single` route dispatches
|
|
101
|
-
[`helpers/deliver-epic-single.md`](helpers/deliver-epic-single.md) (which
|
|
102
|
-
reuses that helper's Phases 3–9 for the merge tail).
|
|
103
|
-
|
|
104
|
-
Sequential execution is a deliberate design decision: the Epic path assumes
|
|
105
|
-
a single main checkout (prepare's checkout guard, Phase 7.0
|
|
106
|
-
`git checkout epic/<id>`), holds a per-Epic lease, serializes same-machine
|
|
107
|
-
sessions via `epic-merge-lock.js`, and constrains dispatch to one wave at a
|
|
108
|
-
time. Segments are never interleaved or parallelized; running them one at a
|
|
109
|
-
time keeps both helpers' machinery untouched.
|
|
110
|
-
|
|
111
|
-
**Confirmation gate.** When the composed plan has more than one segment,
|
|
112
|
-
present it to the operator before dispatching — the segments, the IDs in
|
|
113
|
-
each, and the execution order — and wait for confirmation. `--yes`
|
|
114
|
-
suppresses this prompt. Single-segment plans route directly with today's
|
|
115
|
-
behavior (no new prompt; the standalone path's own Phase 1 confirmation
|
|
116
|
-
still applies as before).
|
|
117
|
-
|
|
118
|
-
**Failure policy.** A segment that ends non-complete (blocked, failed, or
|
|
119
|
-
halted at a gate) **stops the run** — no subsequent segment dispatches.
|
|
120
|
-
Report the terminal state: which segments completed, which segment halted
|
|
121
|
-
(and why), and which segments never started. Name the resume command:
|
|
122
|
-
re-running `/deliver` with the same IDs — both path helpers short-circuit
|
|
123
|
-
already-done work (the Epic path resumes idempotently from its checkpoint;
|
|
124
|
-
merged standalone Stories no-op).
|
|
125
|
-
|
|
126
|
-
## Flags (scoped per segment)
|
|
127
|
-
|
|
128
|
-
| Path | Flags |
|
|
27
|
+
| Invocation | Behavior |
|
|
129
28
|
| --- | --- |
|
|
130
|
-
|
|
|
131
|
-
|
|
|
29
|
+
| `/deliver <storyId>` | Deliver one Story via `helpers/deliver-story.md`. |
|
|
30
|
+
| `/deliver <storyId> <storyId> ...` | Resolve the set with `resolve-stories.js`, then sequence by the discovered graph via `stories-wave-tick.js`. Default concurrency is **3**. |
|
|
132
31
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
ignored — never an error (the existing convention, restated for segment
|
|
138
|
-
plans).
|
|
32
|
+
Any named ticket that is not `type::story`, or that still carries an
|
|
33
|
+
`Epic: #N` footer, is a hard error naming the id and the fix (close or
|
|
34
|
+
re-plan as a v2 Story). Resolution refuses the whole set rather than
|
|
35
|
+
silently dropping the offending id and under-delivering.
|
|
139
36
|
|
|
140
|
-
**
|
|
37
|
+
> **Retired (Story #4540).** `--run <planRunId>` and the `plan-run::<id>`
|
|
38
|
+
> label are gone, along with `--dep`. Batch identity was the wrong axis:
|
|
39
|
+
> it could not express an edge to a Story planned in another run, while
|
|
40
|
+
> ordering already lives in the dependency edges themselves. Deliver the
|
|
41
|
+
> ids; the graph resolves itself.
|
|
141
42
|
|
|
142
|
-
|
|
143
|
-
/deliver <id> <id> … --dep <from>:<to> --concurrency <n> --yes
|
|
144
|
-
```
|
|
43
|
+
## Flags
|
|
145
44
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
45
|
+
| Flag | Meaning |
|
|
46
|
+
| --- | --- |
|
|
47
|
+
| `--concurrency <n>` | Ready-set fan-out cap (default **3** from `delivery.deliverRunner.concurrencyCap`; set `1` for sequential). |
|
|
48
|
+
| `--yes` | Suppress the multi-Story confirmation gate. |
|
|
49
|
+
| `--steal` | Forwarded to `single-story-init.js` / lease steal. |
|
|
50
|
+
| `--wait-merge` | Force close-and-land (the default; `delivery.routing.closeAndLand`, default `true`). |
|
|
51
|
+
| `--no-wait-merge` | Opt out of close-and-land; stop at `agent::closing` for a human land. |
|
|
52
|
+
|
|
53
|
+
**Operator-merge implies no-wait.** `--no-auto-merge` and
|
|
54
|
+
`delivery.ci.autoMerge: "strict"` deliberately leave the PR un-armed, so
|
|
55
|
+
there is nothing for close to land: the Story rests at `agent::closing` for
|
|
56
|
+
the human merge, and is **not** flipped to `agent::blocked`. An explicit
|
|
57
|
+
`--wait-merge` does not override this — close cannot land a PR that was
|
|
58
|
+
never armed. A genuine *arm failure* is different: it still waits and still
|
|
59
|
+
blocks, because that is a fault to report rather than an operator decision
|
|
60
|
+
to respect.
|
|
156
61
|
|
|
157
62
|
## Procedure
|
|
158
63
|
|
|
159
|
-
1. **
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
64
|
+
1. **Resolve the set.** One command, for one Story or many:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
node .agents/scripts/resolve-stories.js --ids <id,id,...>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Capture `stories[]`, `dag[]`, and `done[]` from the envelope. Do **not**
|
|
71
|
+
rebuild the graph by hand — it is discovered from live state, including
|
|
72
|
+
edges a body does not spell out and blockers outside the delivered set.
|
|
73
|
+
|
|
74
|
+
Resolution hard-errors (exit 1) on a named id that is not a Story, still
|
|
75
|
+
carries an `Epic: #N` footer, or whose native dependency edges cannot be
|
|
76
|
+
read. A failed edge read is fatal by design: a missing gate would
|
|
77
|
+
co-dispatch a Story against an unlanded blocker.
|
|
78
|
+
|
|
79
|
+
2. **Confirm (N>1).** Present the order and wait unless `--yes`.
|
|
80
|
+
|
|
81
|
+
3. **Sequence.** Loop until every Story is done:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
node .agents/scripts/stories-wave-tick.js \
|
|
85
|
+
--dag '<dag from step 1>' --done <csv> --in-flight <n> --concurrency <n>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Seed the first beat's `--done` from the resolver's `done[]`** — not from
|
|
89
|
+
an empty string. That array carries the blockers that have already landed,
|
|
90
|
+
including foreign ones outside the delivered set. Seeding it empty
|
|
91
|
+
discards exactly the cross-run resolution this step exists for, and the
|
|
92
|
+
run wedges on a blocker that finished weeks ago. On later beats, `--done`
|
|
93
|
+
is `done[]` plus every Story that has since closed.
|
|
94
|
+
|
|
95
|
+
Branch on the exit code:
|
|
96
|
+
- **0** — dispatch each `ready` id. An empty `ready` with work in flight
|
|
97
|
+
means "waiting"; keep looping.
|
|
98
|
+
- **2** — `cycleError`: the graph is self-referential. Fix the
|
|
99
|
+
`depends_on` declarations; do not retry.
|
|
100
|
+
- **3** — `wedged`: nothing is dispatchable, nothing is in flight, and
|
|
101
|
+
undone Stories are waiting on blockers that are not done. The envelope
|
|
102
|
+
names the stuck ids and their unmet blockers. Either land the blocker
|
|
103
|
+
first or include it in `--ids`. Do not retry unchanged — the state
|
|
104
|
+
cannot improve on its own.
|
|
105
|
+
|
|
106
|
+
For each `ready` Story id, read
|
|
107
|
+
[`helpers/deliver-story.md`](helpers/deliver-story.md) **in full** and
|
|
108
|
+
execute it (init → implement → ceremony → close-and-land). Under
|
|
109
|
+
`--yes` / injected helper content, execute directly without a re-read
|
|
110
|
+
turn.
|
|
111
|
+
|
|
112
|
+
4. **Per-run epilogue (N>1).** After the last Story lands, keyed on the
|
|
113
|
+
delivered id set:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
node .agents/scripts/plan-run-epilogue.js --stories 101,102
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
This executes, in order:
|
|
120
|
+
- `audit-roster` — selects cross-Story audit lenses over the combined
|
|
121
|
+
landed tip and posts `plan-run-audit-roster` on the primary Story;
|
|
122
|
+
the host MUST walk each listed lens against the combined diff
|
|
123
|
+
- `follow-up-rollup` — friction follow-ups across every Story in the
|
|
124
|
+
run (files issues when auto-file is on; posts `follow-ups`)
|
|
125
|
+
- `sibling-coherence` — Spec/Acceptance coherence check across sibling
|
|
126
|
+
bodies (`plan-run-sibling-coherence`)
|
|
127
|
+
|
|
128
|
+
A single-Story run skips the epilogue — follow-ups are captured on
|
|
129
|
+
merge confirm instead (`captureStoryFollowUps`).
|
|
130
|
+
|
|
131
|
+
## Branch model (authoritative)
|
|
132
|
+
|
|
133
|
+
Every Story:
|
|
134
|
+
|
|
135
|
+
```text
|
|
136
|
+
story-<id> → PR → main (squash + required checks)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
There is no `epic/<id>` integration branch and no `--no-ff` wave merge.
|
|
140
|
+
Dependent Stories land sequentially so each builds on the previous merge
|
|
141
|
+
to `main`.
|
|
142
|
+
|
|
143
|
+
## Ceremony (profiles + two scopes)
|
|
144
|
+
|
|
145
|
+
Ceremony depth is selected by `delivery.routing.ceremonyProfile`
|
|
146
|
+
(`minimal` | `standard` | `strict`, default `standard`) and the **change
|
|
147
|
+
level derived from the Story's own diff** — the changed files' intersection
|
|
148
|
+
with the sensitive-path classes in `audit-rules.json`
|
|
149
|
+
(`review-depth.js#deriveChangeLevel`), not a planner-authored verdict
|
|
150
|
+
(Story #4542):
|
|
151
|
+
|
|
152
|
+
| Profile | Acceptance critic | When to use |
|
|
153
|
+
| --- | --- | --- |
|
|
154
|
+
| `minimal` | Always inline | Tiny trusted N=1 Stories |
|
|
155
|
+
| `standard` | Derived-level routed (+ sampling floor) | Default |
|
|
156
|
+
| `strict` | Always fresh-context | High-assurance / regulated surfaces |
|
|
157
|
+
|
|
158
|
+
| Scope | What runs | Mechanism |
|
|
159
|
+
| --- | --- | --- |
|
|
160
|
+
| **Per-Story (always)** | Gates, branch discipline, close-and-land | `deliver-story` / `single-story-close` |
|
|
161
|
+
| **Per-Story (profile + derived level)** | Acceptance critic mode; review depth | `ceremony-routing.js` + `review-depth.js` + `code-review.js` |
|
|
162
|
+
| **Per-run (N>1)** | Audit roster · follow-up roll-up · sibling coherence | `plan-run-epilogue.js` once at run end |
|
|
163
|
+
| **Per-Story land tail** | Follow-up capture · status resync · ref cleanup · base fast-forward | `single-story-close/phases/post-land.js` (in-process, per-step reported) |
|
|
164
|
+
|
|
165
|
+
## Reading a Story's outcome
|
|
166
|
+
|
|
167
|
+
Each Story's delivery ends in exactly one schema-validated terminal envelope
|
|
168
|
+
([`story-deliver-terminal.schema.json`](../schemas/story-deliver-terminal.schema.json),
|
|
169
|
+
Story #4543) — `landed` | `pending` | `blocked` | `failed`. That schema is the
|
|
170
|
+
SSOT for the shape; this workflow does not restate its fields.
|
|
171
|
+
|
|
172
|
+
`pending` is **not** a failure: the bounded merge wait expired with the PR
|
|
173
|
+
healthy and in flight (or a human owns the merge), nothing was mutated, and
|
|
174
|
+
the envelope's `nextCommand` names what resumes it. Run that command rather
|
|
175
|
+
than re-dispatching the Story.
|
|
176
|
+
|
|
177
|
+
For a Story in an unclear state — including the merged-but-label-stale one a
|
|
178
|
+
`/deliver` re-run refuses outright — probe it read-only:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
node .agents/scripts/deliver-recover.js --story <storyId>
|
|
182
|
+
```
|
|
174
183
|
|
|
175
184
|
## Constraints
|
|
176
185
|
|
|
177
|
-
- **Land or block — never a silent local build
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
- `/deliver` requires planned tickets: Epics at `agent::ready` (the
|
|
186
|
-
Epic helper's preflight enforces this, per segment) or well-formed
|
|
187
|
-
standalone Stories. Planning happens in [`/plan`](plan.md); the
|
|
188
|
-
plan-review gate between the two commands is a hard boundary.
|
|
189
|
-
- The router performs no git or label mutations itself; the path helpers
|
|
190
|
-
own every script invocation.
|
|
191
|
-
- Segments execute strictly sequentially — never interleave a standalone
|
|
192
|
-
Story fan-out with an Epic wave loop, and never run two Epic segments
|
|
193
|
-
concurrently.
|
|
186
|
+
- **Land or block — never a silent local build.** Worktrees, `story-<id>`
|
|
187
|
+
branches, close-validation, and PR-to-`main` are the only sanctioned
|
|
188
|
+
delivery mechanism. Attended delivers default to close-and-land
|
|
189
|
+
(`delivery.routing.closeAndLand: true`); use `--no-wait-merge` only when
|
|
190
|
+
a human will land the PR.
|
|
191
|
+
- `/deliver` never plans — tickets come from [`/plan`](plan.md).
|
|
192
|
+
- The router performs no git/label mutations; `deliver-story` owns every
|
|
193
|
+
script invocation per Story.
|
|
194
194
|
|
|
195
195
|
## See also
|
|
196
196
|
|
|
197
|
-
- [`/plan`](plan.md) —
|
|
198
|
-
- [`helpers/deliver-
|
|
199
|
-
|
|
200
|
-
|
|
197
|
+
- [`/plan`](plan.md) — unified planning entry point.
|
|
198
|
+
- [`helpers/deliver-story.md`](helpers/deliver-story.md) — the one Story
|
|
199
|
+
delivery engine.
|
|
200
|
+
- Placeholder design Story for a fully deterministic deliver-run
|
|
201
|
+
orchestrator: [#4521](https://github.com/dsj1984/mandrel/issues/4521).
|
|
@@ -24,7 +24,7 @@ confirmation:
|
|
|
24
24
|
already gone (or never existed) but whose `origin/<branch>` still
|
|
25
25
|
points at a merged PR — even without `--remote`; `--remote` is still
|
|
26
26
|
required to *delete* them. A third branch, whose content already
|
|
27
|
-
landed in `<base>` by another route (a squash-merged
|
|
27
|
+
landed in `<base>` by another route (a squash-merged PR, a
|
|
28
28
|
cherry-pick, a manual `merge --squash`), is caught by a
|
|
29
29
|
**content-equivalence probe** (`git merge-tree --write-tree`,
|
|
30
30
|
git ≥ 2.38) even when it has no merged PR of its own and is not a
|
|
@@ -40,7 +40,7 @@ passed, **all four phases run** sequentially. Pass any of
|
|
|
40
40
|
narrow the run.
|
|
41
41
|
|
|
42
42
|
> **When to run**: After a session that landed several PRs, or before
|
|
43
|
-
> starting a new
|
|
43
|
+
> starting a new Story, to put the local checkout into a known
|
|
44
44
|
> tidy state.
|
|
45
45
|
>
|
|
46
46
|
> **Persona**: `devops-engineer` · **Skills**:
|
|
@@ -226,10 +226,9 @@ The merged-branch sweep recognizes three detection signals, in order:
|
|
|
226
226
|
`git merge-tree --write-tree <base> <branch>` (git ≥ 2.38) produces a
|
|
227
227
|
tree identical to `<base>`'s own tree — i.e. applying the branch's
|
|
228
228
|
changes on top of `<base>` is a content no-op. This catches
|
|
229
|
-
`story-<id>` branches merged
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
other branch whose content landed via a different route (a renamed
|
|
229
|
+
`story-<id>` branches whose PR **squash-merged** to `main` (the story
|
|
230
|
+
commits are not ancestors of `main`), and any other branch whose content
|
|
231
|
+
landed via a different route (a renamed
|
|
233
232
|
head, a cherry-pick, a manual `merge --squash`). When git rejects
|
|
234
233
|
`--write-tree` (git < 2.38) or the simulated merge conflicts, the
|
|
235
234
|
probe is inconclusive and the branch keeps its existing `not-merged`
|
|
@@ -10,7 +10,7 @@ description: >-
|
|
|
10
10
|
# /git-deliver [Message] [--no-push] [--pr] [--draft] [--no-auto-merge] [--branch <name>] [--base <branch>]
|
|
11
11
|
|
|
12
12
|
The **single source of truth** for getting outstanding working-tree changes
|
|
13
|
-
out the door when they do not belong to a planned
|
|
13
|
+
out the door when they do not belong to a planned Story (typo fixes, doc
|
|
14
14
|
tweaks, dependency bumps, operator housekeeping, benchmark result commits
|
|
15
15
|
from mandrel-bench's `/benchmark` Step 4). It is the ad-hoc counterpart to
|
|
16
16
|
the heavyweight `/deliver` pipeline: one command that **detects the git
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Merge Conflict Resolution — Shared Procedure
|
|
2
2
|
|
|
3
3
|
Canonical, workflow-agnostic procedure for resolving merge / rebase conflicts.
|
|
4
|
-
Referenced by `deliver
|
|
4
|
+
Referenced by `deliver.md` and `helpers/deliver-story.md`.
|
|
5
5
|
|
|
6
6
|
## Procedure
|
|
7
7
|
|
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: >-
|
|
3
3
|
Shared include for the bounded acceptance self-eval loop run during Story
|
|
4
|
-
delivery (
|
|
5
|
-
|
|
6
|
-
supplies its own gate-decision wrapper (snapshot vs. label transitions).
|
|
4
|
+
delivery (`helpers/deliver-story`). Defines the per-round critic mechanic;
|
|
5
|
+
the caller supplies its gate-decision wrapper (label transitions).
|
|
7
6
|
---
|
|
8
7
|
|
|
9
8
|
# Bounded acceptance self-eval loop (shared include)
|
|
10
9
|
|
|
11
10
|
> **Include module.** Not a slash command. Referenced from
|
|
12
|
-
> [`
|
|
13
|
-
>
|
|
14
|
-
>
|
|
15
|
-
> mechanic; each caller layers only its own wrapper (snapshot transitions vs.
|
|
16
|
-
> standalone label transitions, and whether to pass `--epic`).
|
|
11
|
+
> [`deliver-story.md`](deliver-story.md) at Step 1a. This file is the
|
|
12
|
+
> **single prose home** for the per-round critic mechanic; the caller layers
|
|
13
|
+
> only its wrapper (Story label transitions).
|
|
17
14
|
|
|
18
15
|
After the implementation commits land and **before** the Story proceeds to
|
|
19
16
|
close, run an explicit, **independent** eval pass that scores the working diff
|
|
@@ -25,10 +22,9 @@ satisfies *this Story's* acceptance criteria.
|
|
|
25
22
|
The loop is **always on** (a hard cutover — there is no flag to disable it) and
|
|
26
23
|
**bounded** by `delivery.acceptanceEval.maxRounds` (default 2), which the
|
|
27
24
|
resolver clamps into `[1, hard ceiling]` so the cap can never be switched off or
|
|
28
|
-
run unbounded. It is **distinct from** the
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
per-criterion, mid-delivery, and evaluates the actual work product.
|
|
25
|
+
run unbounded. It is **distinct from** the per-run `sibling-coherence` epilogue
|
|
26
|
+
step (`planRunEpilogue` for N>1): this loop is per-Story, per-criterion,
|
|
27
|
+
mid-delivery, and evaluates the actual work product.
|
|
32
28
|
|
|
33
29
|
## Per round
|
|
34
30
|
|
|
@@ -37,7 +33,7 @@ per-criterion, mid-delivery, and evaluates the actual work product.
|
|
|
37
33
|
continuation of your implementing turn — so the evaluator does not grade its
|
|
38
34
|
own homework.
|
|
39
35
|
|
|
40
|
-
> **Sub-agent type +
|
|
36
|
+
> **Sub-agent type + derived-level ceremony (Epic #4478, M7-B).** When
|
|
41
37
|
> `delivery.routing.roleScopedAgents` is enabled (the **default**), dispatch
|
|
42
38
|
> the critic with `subagent_type: acceptance-critic` — it boots on the
|
|
43
39
|
> role-scoped [`acceptance-critic`](../../agents/acceptance-critic.md) context
|
|
@@ -46,20 +42,28 @@ per-criterion, mid-delivery, and evaluates the actual work product.
|
|
|
46
42
|
> kill-switch is **off** (`roleScopedAgents: false`), fall back to
|
|
47
43
|
> `subagent_type: general-purpose`.
|
|
48
44
|
>
|
|
49
|
-
> **Whether to spawn fresh at all is
|
|
50
|
-
>
|
|
51
|
-
> `
|
|
45
|
+
> **Whether to spawn fresh at all is routed off the derived change level**
|
|
46
|
+
> — the same signal `review-depth.js` resolves depth from, so the two
|
|
47
|
+
> decisions cannot disagree. Derive it with `deriveChangeLevel` from
|
|
48
|
+
> [`review-depth.js`](../../scripts/lib/orchestration/review-depth.js) over
|
|
49
|
+
> the Story's changed files (`git diff --name-only main...story-<id>`), then
|
|
50
|
+
> resolve the ceremony per cluster with `resolveCeremonyForRisk` from
|
|
52
51
|
> [`ceremony-routing.js`](../../scripts/lib/orchestration/ceremony-routing.js)
|
|
53
|
-
> using
|
|
54
|
-
> `
|
|
55
|
-
>
|
|
56
|
-
> `inline`** (the contract-identical inline fallback below),
|
|
57
|
-
> `freshCriticSampleRate` fraction of low-
|
|
58
|
-
> forces `fresh` so low
|
|
59
|
-
> / unknown
|
|
60
|
-
> fresh-vs-inline **per cluster
|
|
52
|
+
> using that `derivedLevel` and `delivery.routing.freshCriticSampleRate`:
|
|
53
|
+
> **`high` (the diff touches a sensitive path registered in
|
|
54
|
+
> `audit-rules.json`) → `fresh`** (spawn the critic); **`low` (it touches
|
|
55
|
+
> none) → `inline`** (the contract-identical inline fallback below),
|
|
56
|
+
> **except** the `freshCriticSampleRate` fraction of low-level clusters the
|
|
57
|
+
> sampling floor forces `fresh` so a low level never means zero independent
|
|
58
|
+
> checking; **`null` / unknown (the diff could not be enumerated) → `fresh` +
|
|
59
|
+
> full ceremony** (fail-safe). This chooses fresh-vs-inline **per cluster
|
|
60
|
+
> only — it never changes the cluster count**.
|
|
61
61
|
>
|
|
62
|
-
>
|
|
62
|
+
> Story #4542 re-based this off the planner-authored risk verdict: a level
|
|
63
|
+
> the plan asserted about itself was exactly the signal that could *reduce*
|
|
64
|
+
> independent checking, and nothing verified it against the diff.
|
|
65
|
+
>
|
|
66
|
+
> **Inline-critic path (low-level-routed OR nesting-absent harness).** The
|
|
63
67
|
> verdict is authored **inline** whenever the risk router above resolves to
|
|
64
68
|
> `inline` (a low-risk cluster not caught by the sampling floor), and also as
|
|
65
69
|
> a **fallback** on any harness that cannot spawn the fresh critic.
|
|
@@ -100,15 +104,9 @@ per-criterion, mid-delivery, and evaluates the actual work product.
|
|
|
100
104
|
HEAD-sha key enforces "unchanged HEAD") and pass the exact gate name:
|
|
101
105
|
|
|
102
106
|
```bash
|
|
103
|
-
# Epic-attached Story:
|
|
104
107
|
node <main-repo>/.agents/scripts/evidence-gate.js \
|
|
105
|
-
--
|
|
108
|
+
--standalone --scope-id <storyId> --gate lint \
|
|
106
109
|
--worktree <worktree> -- npm run lint
|
|
107
|
-
|
|
108
|
-
# Standalone Story (no parent Epic) — use --standalone, omit --epic-id:
|
|
109
|
-
node <main-repo>/.agents/scripts/evidence-gate.js \
|
|
110
|
-
--standalone --scope-id <storyId> --gate typecheck \
|
|
111
|
-
--worktree <worktree> -- <resolved typecheck command>
|
|
112
110
|
```
|
|
113
111
|
|
|
114
112
|
Close's `shouldSkip` then short-circuits that gate when HEAD is
|
|
@@ -122,13 +120,11 @@ per-criterion, mid-delivery, and evaluates the actual work product.
|
|
|
122
120
|
one `{ index, criterion, verdict: met|partial|unmet, evidence,
|
|
123
121
|
verifyEvidence[] }` record per acceptance item.
|
|
124
122
|
2. **Decide.** Run the gate against the verdict (the caller's Step 1a names the
|
|
125
|
-
exact invocation —
|
|
126
|
-
`--epic <epicId>` so the per-criterion signal lands on the Epic-scoped
|
|
127
|
-
stream):
|
|
123
|
+
exact invocation — omit `--epic`):
|
|
128
124
|
|
|
129
125
|
```bash
|
|
130
126
|
node <main-repo>/.agents/scripts/acceptance-eval.js \
|
|
131
|
-
--story <storyId>
|
|
127
|
+
--story <storyId> --verdict <verdict-path>
|
|
132
128
|
```
|
|
133
129
|
|
|
134
130
|
The gate validates the verdict against the schema, applies the round cap,
|
|
@@ -138,11 +134,10 @@ per-criterion, mid-delivery, and evaluates the actual work product.
|
|
|
138
134
|
close.
|
|
139
135
|
- **`decision: "redraft"`** (some `partial`/`unmet`, rounds remaining) →
|
|
140
136
|
exit 0. Redraft the flagged criteria (named in `unmetCriteria[]`), commit
|
|
141
|
-
the fix, and
|
|
137
|
+
the fix, and start another round.
|
|
142
138
|
- **`decision: "block"`** (round cap reached, criteria still unmet) → exit
|
|
143
139
|
non-zero. **Do not proceed to close.** Take the caller's blocked path
|
|
144
|
-
(transition to `agent::blocked`
|
|
145
|
-
|
|
146
|
-
silently proceed to close.
|
|
140
|
+
(transition to `agent::blocked`) and post a `friction` comment naming the
|
|
141
|
+
unmet criteria and their evidence. Never silently proceed to close.
|
|
147
142
|
|
|
148
143
|
Write the verdict files under `temp/` only — they are scratch artifacts.
|
|
@@ -58,13 +58,13 @@ review-time prose rule.
|
|
|
58
58
|
|
|
59
59
|
Per-file Maintainability Index (MI) is tracked in
|
|
60
60
|
[`baselines/maintainability.json`](../../../baselines/maintainability.json).
|
|
61
|
-
A commit that drops a file's MI by more than
|
|
62
|
-
`delivery.quality.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
A commit that drops a file's MI by more than the configured
|
|
62
|
+
`delivery.quality.gates.maintainability.tolerance` (default `0.5` points)
|
|
63
|
+
requires a refactor in the same Story — not a baseline bump. `tolerance` is
|
|
64
|
+
the single MI-drop control: it is not a noise filter beneath a separate
|
|
65
|
+
must-refactor ceiling — any drop past it is treated as a regression that
|
|
66
|
+
must be undone or offset, not absorbed. Set `tolerance` higher only when the
|
|
67
|
+
project deliberately wants a looser MI-drop budget.
|
|
68
68
|
|
|
69
69
|
`quality:preview --changed-since HEAD` shows the per-file MI delta in the
|
|
70
70
|
working tree before the commit lands.
|