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
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* emits the set of Stories safe to dispatch **on this beat** — a Story
|
|
12
12
|
* becomes dispatchable the instant its own dependencies are done, under the
|
|
13
13
|
* same global concurrency cap and the same file-overlap co-dispatch guard
|
|
14
|
-
*
|
|
14
|
+
* `lib/wave-runner/ready-set.js` applies everywhere. There is no wave barrier: this no longer batches
|
|
15
15
|
* Stories into fully-draining waves; it selects continuously.
|
|
16
16
|
*
|
|
17
17
|
* The previous static wave-batch plan (group N must fully drain before
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
* totalStories: number,
|
|
38
38
|
* concurrencyCap: number,
|
|
39
39
|
* inFlight: number,
|
|
40
|
-
* cycleError: string | null
|
|
40
|
+
* cycleError: string | null,
|
|
41
|
+
* wedged: { reason, stories: [{ id, unmetBlockers }] } | null
|
|
41
42
|
* }
|
|
42
43
|
*
|
|
43
44
|
* The standalone loop calls this once per beat: after each Story closes it
|
|
@@ -50,11 +51,17 @@
|
|
|
50
51
|
* `/deliver` uses — `resolveConfig` + `getRunners` reading
|
|
51
52
|
* `delivery.deliverRunner.concurrencyCap` (default 3) — so a
|
|
52
53
|
* `.agentrc.local.json` override is honored. A `--concurrency <n>` CLI flag
|
|
53
|
-
* overrides the config-resolved value for that run only. This
|
|
54
|
-
*
|
|
55
|
-
*
|
|
54
|
+
* overrides the config-resolved value for that run only. This shares one
|
|
55
|
+
* deterministic config source (`delivery.deliverRunner.concurrencyCap`) and
|
|
56
|
+
* one scheduling kernel with every `/deliver` multi-Story invocation.
|
|
56
57
|
*
|
|
57
|
-
*
|
|
58
|
+
* Exit codes: 0 ok · 1 input error · 2 dependency cycle (`cycleError`) ·
|
|
59
|
+
* 3 wedged (`wedged`) — ready is empty, nothing is in flight, and undone
|
|
60
|
+
* Stories are waiting on blockers that are not done. A cycle is a
|
|
61
|
+
* self-referential DAG the operator must fix; a wedge is a well-formed DAG
|
|
62
|
+
* whose gates cannot be satisfied from the supplied `--done` set (usually a
|
|
63
|
+
* blocker outside the delivered set that has not landed). Both are distinct
|
|
64
|
+
* from the ordinary `ready: []` that means "waiting on in-flight work".
|
|
58
65
|
*/
|
|
59
66
|
|
|
60
67
|
import { readFileSync } from 'node:fs';
|
|
@@ -68,13 +75,20 @@ import { AGENT_LABELS } from './lib/label-constants.js';
|
|
|
68
75
|
import { buildStoryAdjacency } from './lib/story-adjacency.js';
|
|
69
76
|
import { selectReadySet } from './lib/wave-runner/ready-set.js';
|
|
70
77
|
|
|
78
|
+
/**
|
|
79
|
+
* Exit code for a wedged run — deliberately distinct from the cycle exit (2)
|
|
80
|
+
* so a caller can tell "your DAG is self-referential" from "your DAG is fine
|
|
81
|
+
* but its gates can never be satisfied from this `--done` set".
|
|
82
|
+
*/
|
|
83
|
+
export const WEDGED_EXIT_CODE = 3;
|
|
84
|
+
|
|
71
85
|
const HELP = `Usage: node .agents/scripts/stories-wave-tick.js --dag '<json>' | --dag-file <path> [--concurrency <n>] [--done <csv>] [--in-flight <n>]
|
|
72
86
|
|
|
73
87
|
Continuous ready-set planner for standalone Story delivery. Consumes a
|
|
74
88
|
dependency graph of Story IDs plus the live run progress and emits the set
|
|
75
89
|
of Stories safe to dispatch on this beat — a Story is dispatchable the
|
|
76
90
|
instant its own dependencies are done — plus the resolved per-beat
|
|
77
|
-
concurrency cap and the same file-overlap guard
|
|
91
|
+
concurrency cap and the same file-overlap guard as selectReadySet.
|
|
78
92
|
|
|
79
93
|
Input DAG format (JSON array):
|
|
80
94
|
[{ "id": 101, "dependsOn": [] }, { "id": 102, "dependsOn": [101] }]
|
|
@@ -102,13 +116,17 @@ Output envelope:
|
|
|
102
116
|
"totalStories": 2,
|
|
103
117
|
"concurrencyCap": 3,
|
|
104
118
|
"inFlight": 0,
|
|
105
|
-
"cycleError": null
|
|
119
|
+
"cycleError": null,
|
|
120
|
+
"wedged": null
|
|
106
121
|
}
|
|
107
122
|
|
|
108
123
|
Exit codes:
|
|
109
124
|
0 - Success, ready set emitted
|
|
110
125
|
1 - Invalid input (missing/malformed DAG, invalid --concurrency/--in-flight/--done)
|
|
111
126
|
2 - Cycle detected in dependency graph
|
|
127
|
+
3 - Wedged: ready is empty, nothing is in flight, and undone Stories are
|
|
128
|
+
waiting on blockers that are not done. Distinct from an ordinary empty
|
|
129
|
+
ready set (which means "waiting on in-flight work") and from a cycle.
|
|
112
130
|
`;
|
|
113
131
|
|
|
114
132
|
/**
|
|
@@ -257,7 +275,7 @@ export function parseConcurrencyOverride(raw) {
|
|
|
257
275
|
/**
|
|
258
276
|
* Resolve the per-beat concurrency cap.
|
|
259
277
|
*
|
|
260
|
-
* Mirrors the `/deliver` seam (`
|
|
278
|
+
* Mirrors the `/deliver` multi-Story seam (`helpers/deliver-story.md`): resolve the
|
|
261
279
|
* project config (which deep-merges `.agentrc.local.json` over `.agentrc.json`)
|
|
262
280
|
* then read `delivery.deliverRunner.concurrencyCap` via `getRunners` (default
|
|
263
281
|
* 3). An explicit `override` (the `--concurrency <n>` CLI flag) wins over
|
|
@@ -322,6 +340,7 @@ export function buildReadySetEnvelope(
|
|
|
322
340
|
concurrencyCap,
|
|
323
341
|
inFlight,
|
|
324
342
|
cycleError: null,
|
|
343
|
+
wedged: null,
|
|
325
344
|
};
|
|
326
345
|
|
|
327
346
|
if (totalStories === 0) {
|
|
@@ -365,7 +384,62 @@ export function buildReadySetEnvelope(
|
|
|
365
384
|
globalCap: concurrencyCap,
|
|
366
385
|
}).map((rec) => rec.id);
|
|
367
386
|
|
|
368
|
-
|
|
387
|
+
// Wedge detection (Story #4540). `ready: []` is normal while work is in
|
|
388
|
+
// flight — the loop is simply waiting. But ready-empty AND nothing in
|
|
389
|
+
// flight AND undone Stories remaining means no beat can ever make
|
|
390
|
+
// progress: the run is stuck, and the previous behaviour was to return
|
|
391
|
+
// exit 0 with an empty ready set forever, indistinguishable from
|
|
392
|
+
// "waiting". Name the stuck ids and their unmet blockers.
|
|
393
|
+
//
|
|
394
|
+
// Distinct from `cycleError`/exit 2: a cycle is a self-referential DAG,
|
|
395
|
+
// whereas this is a DAG whose gates are real but unsatisfiable from the
|
|
396
|
+
// supplied `done` set (typically a blocker outside the delivered set that
|
|
397
|
+
// has not landed).
|
|
398
|
+
const wedge = detectWedge({ nodes, doneIds, ready, inFlight });
|
|
399
|
+
if (wedge) {
|
|
400
|
+
return {
|
|
401
|
+
envelope: { ...base, ready, wedged: wedge },
|
|
402
|
+
exitCode: WEDGED_EXIT_CODE,
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return { envelope: { ...base, ready, wedged: null }, exitCode: 0 };
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Identify a run that cannot progress: nothing dispatchable, nothing in
|
|
411
|
+
* flight, work remaining.
|
|
412
|
+
*
|
|
413
|
+
* @param {{ nodes: object[], doneIds: Set<number>, ready: number[], inFlight: number }} args
|
|
414
|
+
* @returns {{ reason: string, stories: Array<{ id: number, unmetBlockers: number[] }> }|null}
|
|
415
|
+
*/
|
|
416
|
+
export function detectWedge({ nodes, doneIds, ready, inFlight }) {
|
|
417
|
+
if (ready.length > 0 || inFlight > 0) return null;
|
|
418
|
+
const undone = nodes.filter((n) => !doneIds.has(n.id));
|
|
419
|
+
if (undone.length === 0) return null;
|
|
420
|
+
|
|
421
|
+
const stories = undone
|
|
422
|
+
.map((n) => ({
|
|
423
|
+
id: n.id,
|
|
424
|
+
unmetBlockers: (n.dependsOn ?? []).filter((dep) => !doneIds.has(dep)),
|
|
425
|
+
}))
|
|
426
|
+
.filter((s) => s.unmetBlockers.length > 0);
|
|
427
|
+
|
|
428
|
+
// Undone work with no unmet blockers would have been dispatched; if that
|
|
429
|
+
// is the whole set, the cap or in-flight accounting explains the empty
|
|
430
|
+
// ready set rather than a wedge.
|
|
431
|
+
if (stories.length === 0) return null;
|
|
432
|
+
|
|
433
|
+
const detail = stories
|
|
434
|
+
.map((s) => `#${s.id} ← ${s.unmetBlockers.map((d) => `#${d}`).join(', ')}`)
|
|
435
|
+
.join('; ');
|
|
436
|
+
return {
|
|
437
|
+
reason:
|
|
438
|
+
`No Story can be dispatched: nothing is in flight and ${stories.length} ` +
|
|
439
|
+
`Story(ies) are waiting on blockers that are not done — ${detail}. ` +
|
|
440
|
+
`A blocker outside the delivered set must land first, or be included in --ids.`,
|
|
441
|
+
stories,
|
|
442
|
+
};
|
|
369
443
|
}
|
|
370
444
|
|
|
371
445
|
/**
|
|
@@ -405,6 +479,7 @@ export function runStoriesWaveTick({
|
|
|
405
479
|
concurrencyCap,
|
|
406
480
|
inFlight: inFlightValue,
|
|
407
481
|
cycleError: null,
|
|
482
|
+
wedged: null,
|
|
408
483
|
inputError: message,
|
|
409
484
|
},
|
|
410
485
|
exitCode: 1,
|
|
@@ -2,33 +2,17 @@
|
|
|
2
2
|
/* node:coverage ignore file */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* story-plan.js —
|
|
5
|
+
* story-plan.js — QA helper for promote round-trips and `--emit-context`
|
|
6
|
+
* envelope emission.
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Canonical operator planning is `plan-context.js` + `plan-persist.js` (see
|
|
9
|
+
* `.agents/workflows/plan.md`). Use this CLI only for QA promote
|
|
10
|
+
* round-trips (`--body` / `--dry-run`) or test harnesses that need the
|
|
11
|
+
* standalone envelope shape.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* corpus-aware `corpusContext` — the docs digest plus relevant
|
|
15
|
-
* existing-Epic Tech Spec excerpts, Story #4432) and print it as
|
|
16
|
-
* JSON on stdout. Logs route to stderr so the envelope is
|
|
17
|
-
* byte-clean for `JSON.parse`.
|
|
18
|
-
* 2. Persist mode — given a `--body <file>` authored by the host
|
|
19
|
-
* LLM after operator confirmation, validate the shape and persist
|
|
20
|
-
* via `provider.createIssue` (which also adds the new Story to
|
|
21
|
-
* the configured Projects V2 board — Story #3822) with
|
|
22
|
-
* `type::story` + the chosen persona label, falling back to
|
|
23
|
-
* `gh issue create` when the provider lacks a createIssue
|
|
24
|
-
* analogue. Prints `Next: /single-story-deliver <id>`.
|
|
25
|
-
* 3. `--dry-run` — same as persist but exits without touching
|
|
26
|
-
* GitHub. Echoes the rendered body and the `gh` argv it would
|
|
27
|
-
* have run.
|
|
28
|
-
*
|
|
29
|
-
* Mirrors the `/plan` pattern: deterministic Node I/O wrappers
|
|
30
|
-
* with HITL gating handled by the host LLM in chat. No external LLM
|
|
31
|
-
* APIs are called from this script.
|
|
13
|
+
* Operator planning:
|
|
14
|
+
* node .agents/scripts/plan-context.js --seed "…" | --seed-file <path> | --tickets <ids>
|
|
15
|
+
* node .agents/scripts/plan-persist.js --stories …
|
|
32
16
|
*/
|
|
33
17
|
|
|
34
18
|
import { readFile } from 'node:fs/promises';
|
|
@@ -53,10 +37,10 @@ import {
|
|
|
53
37
|
|
|
54
38
|
const HELP = `\
|
|
55
39
|
Usage:
|
|
56
|
-
story-plan.js --emit-context (--
|
|
57
|
-
[--
|
|
40
|
+
story-plan.js --emit-context (--seed "<seed>" | --seed-file <file>) \\
|
|
41
|
+
[--refine | --no-refine] [--pretty]
|
|
58
42
|
|
|
59
|
-
story-plan.js --body <file> [--
|
|
43
|
+
story-plan.js --body <file> [--dry-run]
|
|
60
44
|
|
|
61
45
|
story-plan.js --help
|
|
62
46
|
|
|
@@ -66,12 +50,11 @@ Modes:
|
|
|
66
50
|
draft body using the envelope and the body template.
|
|
67
51
|
--body <file> Persist a pre-authored body. Validates shape (required
|
|
68
52
|
sections, no Epic: ref, AC checklist non-empty) and
|
|
69
|
-
calls \`gh issue create\` with type::story
|
|
53
|
+
calls \`gh issue create\` with type::story.
|
|
70
54
|
--dry-run With --body: print the body and the gh argv that would
|
|
71
55
|
be invoked, then exit 0. No GitHub mutations.
|
|
72
56
|
|
|
73
57
|
Options:
|
|
74
|
-
--persona <name> Persona label (default: engineer).
|
|
75
58
|
--refine Force the idea-refinement hint on regardless of seed
|
|
76
59
|
length. Default heuristic: refine when seed < 200
|
|
77
60
|
chars.
|
|
@@ -80,17 +63,17 @@ Options:
|
|
|
80
63
|
`;
|
|
81
64
|
|
|
82
65
|
/**
|
|
83
|
-
* Resolve the seed string from --
|
|
66
|
+
* Resolve the seed string from --seed or --seed-file. One of the two
|
|
84
67
|
* must be present in --emit-context mode.
|
|
85
68
|
*/
|
|
86
|
-
async function resolveSeed({
|
|
87
|
-
if (
|
|
88
|
-
throw new Error('Pass either --
|
|
69
|
+
async function resolveSeed({ seed, seedFile }) {
|
|
70
|
+
if (seed && seedFile) {
|
|
71
|
+
throw new Error('Pass either --seed or --seed-file, not both.');
|
|
89
72
|
}
|
|
90
|
-
if (
|
|
91
|
-
if (
|
|
73
|
+
if (seed) return seed;
|
|
74
|
+
if (seedFile) return (await readFile(seedFile, 'utf8')).trim();
|
|
92
75
|
throw new Error(
|
|
93
|
-
'--emit-context requires --
|
|
76
|
+
'--emit-context requires --seed "<seed>" or --seed-file <file>.',
|
|
94
77
|
);
|
|
95
78
|
}
|
|
96
79
|
|
|
@@ -147,12 +130,11 @@ async function runEmitContext({
|
|
|
147
130
|
write = (s) => process.stdout.write(s),
|
|
148
131
|
}) {
|
|
149
132
|
const seed = await resolveSeed({
|
|
150
|
-
|
|
151
|
-
|
|
133
|
+
seed: values.seed,
|
|
134
|
+
seedFile: values['seed-file'],
|
|
152
135
|
});
|
|
153
136
|
const override = values.refine ? 'on' : values['no-refine'] ? 'off' : null;
|
|
154
137
|
const refine = shouldRefine({ seed, override });
|
|
155
|
-
const persona = values.persona ?? 'engineer';
|
|
156
138
|
|
|
157
139
|
// Corpus lookup uses the raw (un-defaulted) docsContextFiles list, same
|
|
158
140
|
// as the `/deliver` per-Epic digest builder: `config.project` fills in
|
|
@@ -164,7 +146,7 @@ async function runEmitContext({
|
|
|
164
146
|
// corpus digest reads the project's actual docs directory regardless
|
|
165
147
|
// of the directory this CLI happens to be invoked from — matching the
|
|
166
148
|
// sibling resolution pattern in
|
|
167
|
-
//
|
|
149
|
+
// planning/authoring-context.js.
|
|
168
150
|
const docsRoot = path.resolve(
|
|
169
151
|
PROJECT_ROOT,
|
|
170
152
|
config?.project?.paths?.docsRoot ?? 'docs',
|
|
@@ -175,7 +157,7 @@ async function runEmitContext({
|
|
|
175
157
|
loadBodyTemplate(projectRoot),
|
|
176
158
|
fetchOpenStories(provider),
|
|
177
159
|
readTechStackSummary(projectRoot),
|
|
178
|
-
buildCorpusContext({
|
|
160
|
+
buildCorpusContext({ docsContextFiles, docsRoot }),
|
|
179
161
|
]);
|
|
180
162
|
|
|
181
163
|
const duplicateCandidates = rankDuplicateCandidates({
|
|
@@ -186,7 +168,6 @@ async function runEmitContext({
|
|
|
186
168
|
const envelope = buildContextEnvelope({
|
|
187
169
|
seed,
|
|
188
170
|
refine,
|
|
189
|
-
persona,
|
|
190
171
|
bodyTemplate,
|
|
191
172
|
duplicateCandidates,
|
|
192
173
|
techStack,
|
|
@@ -221,8 +202,7 @@ async function runPersist({
|
|
|
221
202
|
}
|
|
222
203
|
|
|
223
204
|
const title = extractTitle(body);
|
|
224
|
-
const
|
|
225
|
-
const labels = [TYPE_LABELS.STORY, `persona::${persona}`];
|
|
205
|
+
const labels = [TYPE_LABELS.STORY];
|
|
226
206
|
const argv = renderGhArgv({ title, bodyPath, labels });
|
|
227
207
|
|
|
228
208
|
if (dryRun) {
|
|
@@ -264,7 +244,7 @@ async function runPersist({
|
|
|
264
244
|
}
|
|
265
245
|
|
|
266
246
|
write(`${JSON.stringify({ issueNumber, title, labels }, null, 2)}\n`);
|
|
267
|
-
Logger.info(`Next: /
|
|
247
|
+
Logger.info(`Next: /deliver ${issueNumber}`);
|
|
268
248
|
}
|
|
269
249
|
|
|
270
250
|
/* node:coverage ignore next */
|
|
@@ -272,10 +252,9 @@ async function main() {
|
|
|
272
252
|
const { values } = parseArgs({
|
|
273
253
|
options: {
|
|
274
254
|
'emit-context': { type: 'boolean', default: false },
|
|
275
|
-
|
|
276
|
-
'
|
|
255
|
+
seed: { type: 'string' },
|
|
256
|
+
'seed-file': { type: 'string' },
|
|
277
257
|
body: { type: 'string' },
|
|
278
|
-
persona: { type: 'string' },
|
|
279
258
|
refine: { type: 'boolean', default: false },
|
|
280
259
|
'no-refine': { type: 'boolean', default: false },
|
|
281
260
|
pretty: { type: 'boolean', default: false },
|
|
@@ -1,27 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* .agents/scripts/update-ticket-state.js — CLI
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* This file preserves backward compatibility for CLI usage and existing
|
|
8
|
-
* testing patterns.
|
|
9
|
-
*
|
|
10
|
-
* Successor to the retired mandrel MCP tools. See ADR 20260424-702a in docs/decisions.md for the migration table.
|
|
2
|
+
* .agents/scripts/update-ticket-state.js — CLI entrypoint for ticket
|
|
3
|
+
* label transitions. Core logic lives in `lib/orchestration/ticketing.js`;
|
|
4
|
+
* this file is the operator-facing command surface (not a compatibility
|
|
5
|
+
* layer).
|
|
11
6
|
*/
|
|
12
7
|
|
|
13
8
|
import { parseArgs } from 'node:util';
|
|
14
9
|
import { resolveConfig } from './lib/config-resolver.js';
|
|
15
10
|
import { Logger } from './lib/Logger.js';
|
|
16
|
-
import {
|
|
17
|
-
enqueueLabel,
|
|
18
|
-
outboxPathFor,
|
|
19
|
-
} from './lib/orchestration/bookkeeping-outbox.js';
|
|
20
|
-
import {
|
|
21
|
-
cascadeCompletion,
|
|
22
|
-
STATE_LABELS,
|
|
23
|
-
transitionTicketState,
|
|
24
|
-
} from './lib/orchestration/ticketing.js';
|
|
11
|
+
import { transitionTicketState } from './lib/orchestration/ticketing.js';
|
|
25
12
|
import { createProvider } from './lib/provider-factory.js';
|
|
26
13
|
|
|
27
14
|
// ── CLI Main Block ────────────────────────────────────────────────────────
|
|
@@ -33,27 +20,21 @@ if (
|
|
|
33
20
|
const { values } = parseArgs({
|
|
34
21
|
args: process.argv.slice(2),
|
|
35
22
|
options: {
|
|
36
|
-
task: { type: 'string' },
|
|
37
23
|
ticket: { type: 'string' },
|
|
38
24
|
state: { type: 'string' },
|
|
39
25
|
'remove-label': { type: 'string' },
|
|
40
|
-
buffer: { type: 'boolean' },
|
|
41
|
-
epic: { type: 'string' },
|
|
42
26
|
},
|
|
43
27
|
strict: false,
|
|
44
28
|
});
|
|
45
29
|
|
|
46
|
-
|
|
47
|
-
// ticket type, not just Tasks). Both continue to work.
|
|
48
|
-
const idSource = values.ticket ?? values.task;
|
|
49
|
-
const ticketId = Number.parseInt(idSource, 10);
|
|
30
|
+
const ticketId = Number.parseInt(values.ticket, 10);
|
|
50
31
|
const state = values.state;
|
|
51
32
|
const removeLabel = values['remove-label'];
|
|
52
33
|
|
|
53
34
|
if (Number.isNaN(ticketId) || (!state && !removeLabel)) {
|
|
54
35
|
throw new Error(
|
|
55
36
|
'Usage: node update-ticket-state.js ' +
|
|
56
|
-
'
|
|
37
|
+
'--ticket <id> ' +
|
|
57
38
|
'[--state <state> | --remove-label <label>]',
|
|
58
39
|
);
|
|
59
40
|
}
|
|
@@ -75,50 +56,18 @@ if (
|
|
|
75
56
|
return;
|
|
76
57
|
}
|
|
77
58
|
|
|
78
|
-
// Headless buffering (Epic #4476 M5): buffer an intermediate state flip to
|
|
79
|
-
// the per-Epic outbox instead of a live GitHub round-trip; finalize's
|
|
80
|
-
// bookkeeping-reconcile.js drains it once. `agent::blocked` (the HITL gate,
|
|
81
|
-
// §1.J) and `agent::done` (its cascade must run live) ALWAYS surface
|
|
82
|
-
// immediately and are never buffered. Requires --epic to locate the outbox.
|
|
83
|
-
if (
|
|
84
|
-
values.buffer &&
|
|
85
|
-
state !== STATE_LABELS.BLOCKED &&
|
|
86
|
-
state !== STATE_LABELS.DONE
|
|
87
|
-
) {
|
|
88
|
-
const epicId = Number.parseInt(values.epic ?? '', 10);
|
|
89
|
-
if (!Number.isInteger(epicId) || epicId <= 0) {
|
|
90
|
-
throw new Error('--buffer requires --epic <id>');
|
|
91
|
-
}
|
|
92
|
-
enqueueLabel({
|
|
93
|
-
outboxPath: outboxPathFor(epicId, config),
|
|
94
|
-
ticketId,
|
|
95
|
-
state,
|
|
96
|
-
});
|
|
97
|
-
Logger.info(
|
|
98
|
-
`[State-Sync] Buffered #${ticketId} → ${state} (headless; drained at finalize)`,
|
|
99
|
-
);
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
59
|
Logger.info(
|
|
104
60
|
`[State-Sync] Transitioning ticket #${ticketId} to ${state}...`,
|
|
105
61
|
);
|
|
62
|
+
// Story #4545 — no second cascade here. `transitionTicketState` already
|
|
63
|
+
// fires the upward cascade on every transition (bulk.js registers
|
|
64
|
+
// `cascadeParentState` as transition.js's cascade runner, and the DONE
|
|
65
|
+
// branch delegates to `cascadeCompletion`), so the explicit call this
|
|
66
|
+
// used to make re-walked the same parents and re-spent the same API
|
|
67
|
+
// calls a second time on every done transition — under a Story-only
|
|
68
|
+
// model where no orchestration parent exists to find.
|
|
106
69
|
await transitionTicketState(provider, ticketId, state);
|
|
107
70
|
|
|
108
|
-
if (state === STATE_LABELS.DONE) {
|
|
109
|
-
Logger.info(`[State-Sync] Cascading completion from #${ticketId}...`);
|
|
110
|
-
const cascade = await cascadeCompletion(provider, ticketId);
|
|
111
|
-
// Hoisted out of the `for...of` initializer because typhonjs-escomplex
|
|
112
|
-
// mis-parses optional chaining there (it would zero out this file's
|
|
113
|
-
// maintainability score).
|
|
114
|
-
const cascadeFailures = cascade?.failed ?? [];
|
|
115
|
-
for (const { parentId, error } of cascadeFailures) {
|
|
116
|
-
Logger.warn(
|
|
117
|
-
`[State-Sync] ⚠️ Cascade partial-failure on parent #${parentId}: ${error}`,
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
71
|
// Optional secondary label removal alongside the state transition
|
|
123
72
|
// (e.g. clear `status::blocked` when transitioning back to ready).
|
|
124
73
|
if (removeLabel) {
|