mandrel 2.60.0 → 2.62.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 +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,42 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* deliver-recover.js — probe a stranded Story and name its ONE next command
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* probeable — labels and lease from the ticket, the branch locally and via
|
|
7
|
-
* its tracking ref, the worktree path, the PR by head branch (with state,
|
|
8
|
-
* merge, and checks probes) — so this module is probes, a decision table
|
|
9
|
-
* over `label × PR × branch × worktree`, and one command with the evidence it
|
|
10
|
-
* was derived from. It never mutates anything, and it never prints a menu of
|
|
11
|
-
* options: a menu is what an operator already has, and it is the thing they
|
|
12
|
-
* cannot act on.
|
|
13
|
-
*
|
|
14
|
-
* The strand shapes the table resolves, and why each is real:
|
|
15
|
-
*
|
|
16
|
-
* - `executing`, branch UNPUSHED, no PR → resume implementation. The work
|
|
17
|
-
* never reached close. Since Story #5267 the worker pushes before its
|
|
18
|
-
* creditable capture, so an unpushed branch means this and nothing else.
|
|
19
|
-
* - `executing`, branch PUSHED, no PR → run close. The worker's hand-off
|
|
20
|
-
* landed; only the close-and-land tail is owed, and re-initializing here
|
|
21
|
-
* would re-open finished work.
|
|
22
|
-
* - `closing` with a pending PR → resume the land. The overwhelmingly
|
|
23
|
-
* common shape now that the merge wait is bounded: the wait returned
|
|
24
|
-
* `pending` and something has to pick it back up.
|
|
25
|
-
* - `closing` with a red PR → enter the fix loop. Waiting is pointless; no
|
|
26
|
-
* budget turns a failed check green.
|
|
27
|
-
* - `closing` with a MERGED PR → run confirm. **This is the strand a
|
|
28
|
-
* `/mandrel-deliver` re-run refuses outright**, because `single-story-init.js`
|
|
29
|
-
* hard-errors on an already-closed Story — so before this surface, the
|
|
30
|
-
* merged-but-label-stale Story had no automated way back.
|
|
31
|
-
* - `done` with a drifted board → run resync. The GitHub Projects bot won
|
|
32
|
-
* the race.
|
|
33
|
-
* - `blocked` → print the class-specific remediation the friction comment
|
|
34
|
-
* already names, rather than inventing a second opinion about a
|
|
35
|
-
* condition that was already classified.
|
|
36
|
-
*
|
|
37
|
-
* The command vocabulary is shared with the terminal envelope
|
|
38
|
-
* (`story-deliver-terminal.js#NEXT_COMMANDS`), so recovery and normal
|
|
39
|
-
* resumption speak one language instead of two dialects for one state.
|
|
2
|
+
* deliver-recover.js — probe a stranded Story and name its ONE next command.
|
|
3
|
+
* Read-only: probes, a decision table over label × PR × branch × worktree ×
|
|
4
|
+
* close artifacts, and one command plus its evidence — never a menu. The
|
|
5
|
+
* command vocabulary is `story-deliver-terminal.js#NEXT_COMMANDS`.
|
|
40
6
|
*/
|
|
41
7
|
|
|
42
8
|
import nodeFs from 'node:fs';
|
|
@@ -47,26 +13,17 @@ import {
|
|
|
47
13
|
} from '../config/temp-paths.js';
|
|
48
14
|
import { gh as defaultGh } from '../gh-exec.js';
|
|
49
15
|
import { gitSpawn as defaultGitSpawn, getStoryBranch } from '../git-utils.js';
|
|
50
|
-
import { deriveChecksStatus } from './merge-poll.js';
|
|
16
|
+
import { deriveChecksStatus, isPrMerged } from './merge-poll.js';
|
|
51
17
|
import { NEXT_COMMANDS } from './story-deliver-terminal.js';
|
|
52
18
|
import { STATE_LABELS } from './ticketing.js';
|
|
53
19
|
|
|
54
20
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* The window is generous on purpose. Gate output arrives in bursts — a single
|
|
59
|
-
* `npm test` gate can run for a long stretch between lines — so a tight window
|
|
60
|
-
* would read a slow-but-healthy close as dead and re-open the exact
|
|
61
|
-
* misdiagnosis this exists to remove. Being wrong in the other direction is
|
|
62
|
-
* cheap: the verdict for a live close is "re-run this read-only probe", which
|
|
63
|
-
* costs nothing if the close has in fact already exited.
|
|
21
|
+
* Gate-log freshness window for a close to count as live. Generous because
|
|
22
|
+
* gate output is bursty; erring toward "live" only costs a re-probe.
|
|
64
23
|
*/
|
|
65
24
|
const CLOSE_IN_FLIGHT_WINDOW_MS = 120_000;
|
|
66
25
|
|
|
67
26
|
/**
|
|
68
|
-
* Probe the ticket: state labels, issue open/closed, and the lease holder.
|
|
69
|
-
*
|
|
70
27
|
* @returns {Promise<object>}
|
|
71
28
|
*/
|
|
72
29
|
export async function probeTicket({ provider, storyId }) {
|
|
@@ -90,8 +47,7 @@ export async function probeTicket({ provider, storyId }) {
|
|
|
90
47
|
}
|
|
91
48
|
|
|
92
49
|
/**
|
|
93
|
-
*
|
|
94
|
-
* worktree path. Pure git — no network.
|
|
50
|
+
* Local branch, remote tracking ref and worktree path. No network.
|
|
95
51
|
*
|
|
96
52
|
* @returns {object}
|
|
97
53
|
*/
|
|
@@ -128,9 +84,7 @@ export function probeBranch({ cwd, storyBranch, config, gitSpawnFn }) {
|
|
|
128
84
|
}
|
|
129
85
|
|
|
130
86
|
/**
|
|
131
|
-
*
|
|
132
|
-
* is no longer `open`, and the merged-but-label-stale strand is precisely
|
|
133
|
-
* the one that matters most here.
|
|
87
|
+
* `--state all`: the merged-but-label-stale strand needs the merged PR.
|
|
134
88
|
*
|
|
135
89
|
* @returns {Promise<object|null>}
|
|
136
90
|
*/
|
|
@@ -155,20 +109,9 @@ export async function probePr({ storyBranch, gh = defaultGh }) {
|
|
|
155
109
|
}
|
|
156
110
|
|
|
157
111
|
/**
|
|
158
|
-
* Probe the
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
* These exist because the label-and-PR probes above cannot see the difference
|
|
162
|
-
* between an implementation that died and a close that is still running —
|
|
163
|
-
* both read `agent::executing` with no PR for the whole gate chain. The
|
|
164
|
-
* artifacts can: a persisted envelope means the close already reached a
|
|
165
|
-
* verdict, and a recently-appended gate log means one is mid-chain right now.
|
|
166
|
-
* Gate-log freshness is exactly the signal operators were already using by
|
|
167
|
-
* hand to tell the two apart, which is the argument for reading it here
|
|
168
|
-
* instead of expecting them to know.
|
|
169
|
-
*
|
|
170
|
-
* Never throws: an unreadable or absent artifact is a `null` reading, and the
|
|
171
|
-
* table falls back to the label-only verdict it always had.
|
|
112
|
+
* Probe the close's persisted terminal envelope and gate log — the only
|
|
113
|
+
* evidence separating a dead implementation from a close mid-gate-chain
|
|
114
|
+
* (both read `executing` with no PR). Never throws; absent reads are `null`.
|
|
172
115
|
*
|
|
173
116
|
* @param {{
|
|
174
117
|
* storyId: number,
|
|
@@ -216,9 +159,6 @@ export function probeCloseArtifacts({
|
|
|
216
159
|
let envelopeMtimeMs = null;
|
|
217
160
|
try {
|
|
218
161
|
const parsed = JSON.parse(fsImpl.readFileSync(envelopePath, 'utf8'));
|
|
219
|
-
// A parsed non-object (or an array) is not an envelope; treat it as
|
|
220
|
-
// absent rather than handing the table something it cannot read fields
|
|
221
|
-
// off of.
|
|
222
162
|
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
223
163
|
envelope = parsed;
|
|
224
164
|
envelopeMtimeMs = fsImpl.statSync(envelopePath).mtimeMs;
|
|
@@ -249,14 +189,8 @@ export function probeCloseArtifacts({
|
|
|
249
189
|
}
|
|
250
190
|
|
|
251
191
|
/**
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
* A persisted envelope is definitive about the close that wrote it — but a
|
|
255
|
-
* Story can be closed more than once (a `pending` wait resumed, a red gate
|
|
256
|
-
* fixed and re-run), and a *stale* envelope from the previous attempt must not
|
|
257
|
-
* out-argue a gate log the current attempt is appending to as we read. So the
|
|
258
|
-
* live signal wins whenever the gate log is both fresh and fresher than the
|
|
259
|
-
* envelope.
|
|
192
|
+
* A fresh gate log newer than the envelope wins: a Story can be closed more
|
|
193
|
+
* than once, and a prior attempt's envelope must not mask a live one.
|
|
260
194
|
*
|
|
261
195
|
* @param {object} artifacts A {@link probeCloseArtifacts} reading.
|
|
262
196
|
* @returns {boolean}
|
|
@@ -268,14 +202,9 @@ function closeLooksLive(artifacts) {
|
|
|
268
202
|
}
|
|
269
203
|
|
|
270
204
|
/**
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
*
|
|
274
|
-
* Nothing is re-derived here: the envelope on disk is the same
|
|
275
|
-
* schema-validated object the close emitted, so its own `status` and
|
|
276
|
-
* `nextCommand` are relayed rather than a second opinion invented from
|
|
277
|
-
* labels. A `landed` envelope carries a null next command, and the honest
|
|
278
|
-
* follow-up for a landed-but-mislabelled Story is the idempotent confirm.
|
|
205
|
+
* Close finished but its envelope never reached the caller. Relay the
|
|
206
|
+
* envelope's own `nextCommand`; a landed one names none, so fall back to the
|
|
207
|
+
* idempotent confirm.
|
|
279
208
|
*/
|
|
280
209
|
function envelopeOnDiskVerdict({ storyId, artifacts, evidence }) {
|
|
281
210
|
const { envelope, envelopePath } = artifacts;
|
|
@@ -294,13 +223,8 @@ function envelopeOnDiskVerdict({ storyId, artifacts, evidence }) {
|
|
|
294
223
|
}
|
|
295
224
|
|
|
296
225
|
/**
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
* The next command is this probe again. That is not a shrug: there is no
|
|
300
|
-
* attach-to-a-running-close surface, the close needs nothing from anyone, and
|
|
301
|
-
* every *other* command an operator might reach for here is actively harmful
|
|
302
|
-
* — which is why the detail names the re-init hazard explicitly instead of
|
|
303
|
-
* leaving it implied.
|
|
226
|
+
* A close is running: the only safe command is this probe again; every
|
|
227
|
+
* other one (notably re-init) would race it.
|
|
304
228
|
*/
|
|
305
229
|
function closeInFlightVerdict({ storyId, artifacts, evidence }) {
|
|
306
230
|
const seconds = Math.round((artifacts.gateLogAgeMs ?? 0) / 1000);
|
|
@@ -320,12 +244,7 @@ function closeInFlightVerdict({ storyId, artifacts, evidence }) {
|
|
|
320
244
|
}
|
|
321
245
|
|
|
322
246
|
/**
|
|
323
|
-
* The `agent::executing` rows
|
|
324
|
-
* by Story #5267).
|
|
325
|
-
*
|
|
326
|
-
* Lifted out of {@link decideRecovery} because this label alone fans out into
|
|
327
|
-
* five distinct strands, and because the push-state split below only reads
|
|
328
|
-
* correctly next to the artifact probes it is ordered after.
|
|
247
|
+
* The `agent::executing` rows; order matters (artifacts before push state).
|
|
329
248
|
*
|
|
330
249
|
* @param {{ storyId: number, branch: object, pr: object|null, closeArtifacts?: object, evidence: string[] }} args
|
|
331
250
|
* @returns {{ shape: string, nextCommand: string|null, detail: string, evidence: string[] }}
|
|
@@ -342,12 +261,7 @@ function decideExecuting({ storyId, branch, pr, closeArtifacts, evidence }) {
|
|
|
342
261
|
evidence,
|
|
343
262
|
};
|
|
344
263
|
}
|
|
345
|
-
//
|
|
346
|
-
// here. Every other row of this table describes a state whose evidence is
|
|
347
|
-
// already unambiguous; `executing` + no PR is the one row that reads
|
|
348
|
-
// identically for a dead implementation and for a close that is halfway
|
|
349
|
-
// through its gate chain, and answering it from labels alone is what sent
|
|
350
|
-
// operators to re-init on top of a live close.
|
|
264
|
+
// `executing` + no PR is ambiguous from labels alone; artifacts decide.
|
|
351
265
|
if (closeLooksLive(closeArtifacts)) {
|
|
352
266
|
return closeInFlightVerdict({
|
|
353
267
|
storyId,
|
|
@@ -362,13 +276,8 @@ function decideExecuting({ storyId, branch, pr, closeArtifacts, evidence }) {
|
|
|
362
276
|
evidence,
|
|
363
277
|
});
|
|
364
278
|
}
|
|
365
|
-
//
|
|
366
|
-
//
|
|
367
|
-
// capture. Before that ordering, a worker whose turn ended on the
|
|
368
|
-
// backgrounded capture left an unpushed branch that was indistinguishable
|
|
369
|
-
// from work that never got started; now an unpushed branch means exactly one
|
|
370
|
-
// thing, and a pushed one means the hand-off happened and only close is
|
|
371
|
-
// owed.
|
|
279
|
+
// The worker pushes before its creditable capture, so pushed means
|
|
280
|
+
// handed off (close owed) and unpushed means implementation unfinished.
|
|
372
281
|
if (branch?.remote) {
|
|
373
282
|
return {
|
|
374
283
|
shape: 'executing-pushed-no-pr',
|
|
@@ -394,11 +303,7 @@ function decideExecuting({ storyId, branch, pr, closeArtifacts, evidence }) {
|
|
|
394
303
|
}
|
|
395
304
|
|
|
396
305
|
/**
|
|
397
|
-
* The decision table
|
|
398
|
-
* mapping is testable without git, GitHub, or a clock.
|
|
399
|
-
*
|
|
400
|
-
* Returns exactly one `{ shape, nextCommand, evidence[], detail }` — never a
|
|
401
|
-
* list of candidates.
|
|
306
|
+
* The pure decision table: exactly one verdict, never a list.
|
|
402
307
|
*
|
|
403
308
|
* @param {{
|
|
404
309
|
* storyId: number,
|
|
@@ -435,10 +340,9 @@ export function decideRecovery({
|
|
|
435
340
|
];
|
|
436
341
|
|
|
437
342
|
const label = ticket?.stateLabel;
|
|
438
|
-
const merged =
|
|
343
|
+
const merged = isPrMerged(pr);
|
|
439
344
|
|
|
440
|
-
// A merged PR outranks every label
|
|
441
|
-
// branch; whatever the label says, the only thing left is the flip + tail.
|
|
345
|
+
// A merged PR outranks every label: only the flip + tail remain.
|
|
442
346
|
if (merged && label !== STATE_LABELS.DONE) {
|
|
443
347
|
return {
|
|
444
348
|
shape: 'merged-label-stale',
|
|
@@ -526,15 +430,8 @@ export function decideRecovery({
|
|
|
526
430
|
}
|
|
527
431
|
|
|
528
432
|
/**
|
|
529
|
-
*
|
|
530
|
-
*
|
|
531
|
-
* push and PR-open land, and confidently misdirect the operator to re-init a
|
|
532
|
-
* Story whose close is about to open a PR (observed live on Story #4712: two
|
|
533
|
-
* probes seconds apart flipped `executing-no-pr` → `executing-with-pr`).
|
|
534
|
-
* These shapes therefore earn a stability re-probe before the verdict is
|
|
535
|
-
* trusted; the remaining shapes (`merged-label-stale`, `blocked`,
|
|
536
|
-
* `done-board-drift`, `ready`) describe settled states no live process is
|
|
537
|
-
* racing to change.
|
|
433
|
+
* Shapes a live delivery may be mutating (e.g. a PR about to open), so they
|
|
434
|
+
* earn a stability re-probe; the other shapes are settled.
|
|
538
435
|
*/
|
|
539
436
|
const TRANSIENT_SHAPES = new Set([
|
|
540
437
|
'executing-no-pr',
|
|
@@ -543,27 +440,14 @@ const TRANSIENT_SHAPES = new Set([
|
|
|
543
440
|
'closing-no-pr',
|
|
544
441
|
'closing-pr-pending',
|
|
545
442
|
'closing-pr-red',
|
|
546
|
-
// Story #4816 — the definition of this shape is "a process is mutating this
|
|
547
|
-
// Story right now", so it is the most transient row in the table: the second
|
|
548
|
-
// probe often catches the push and PR landing and returns a settled verdict
|
|
549
|
-
// instead.
|
|
550
443
|
'close-in-flight',
|
|
551
444
|
]);
|
|
552
445
|
|
|
553
|
-
/**
|
|
554
|
-
* Default settle window between the two probes of the stability pass. Long
|
|
555
|
-
* enough for an in-flight push / `gh pr create` / label flip to land (each is
|
|
556
|
-
* a single network call), short enough that the read-only CLI stays
|
|
557
|
-
* interactive.
|
|
558
|
-
*/
|
|
446
|
+
/** Settle window: enough for one push / PR open / label flip to land. */
|
|
559
447
|
const STABILITY_DELAY_MS = 5000;
|
|
560
448
|
|
|
561
449
|
/**
|
|
562
|
-
*
|
|
563
|
-
* derived DIFFERENT shapes, so neither is safe to act on — acting on the
|
|
564
|
-
* first misdirects (the #4712 shape), acting on the second may race the same
|
|
565
|
-
* live process again. The one next command is the probe itself, re-run once
|
|
566
|
-
* the live process settles.
|
|
450
|
+
* The two probes disagreed, so neither is safe to act on; re-probe later.
|
|
567
451
|
*
|
|
568
452
|
* @param {{ storyId: number, first: object, second: object, delayMs: number }} args
|
|
569
453
|
* @returns {{ shape: string, nextCommand: string, detail: string, evidence: string[] }}
|
|
@@ -586,10 +470,7 @@ function buildInTransitionVerdict({ storyId, first, second, delayMs }) {
|
|
|
586
470
|
};
|
|
587
471
|
}
|
|
588
472
|
|
|
589
|
-
/**
|
|
590
|
-
* One full probe round: ticket + branch + PR → decision. Throws only when
|
|
591
|
-
* the ticket itself is unreadable (the probe cannot run without it).
|
|
592
|
-
*/
|
|
473
|
+
/** Throws only when the ticket is unreadable. */
|
|
593
474
|
async function probeAndDecide({
|
|
594
475
|
storyId,
|
|
595
476
|
storyBranch,
|
|
@@ -608,9 +489,6 @@ async function probeAndDecide({
|
|
|
608
489
|
}
|
|
609
490
|
const branch = probeBranch({ cwd, storyBranch, config, gitSpawnFn });
|
|
610
491
|
const pr = await probePr({ storyBranch, gh });
|
|
611
|
-
// Re-read on every round: the whole point of the stability pass is that a
|
|
612
|
-
// second look can catch a close that has since flushed a gate line or
|
|
613
|
-
// written its envelope.
|
|
614
492
|
const closeArtifacts = probeCloseArtifacts({
|
|
615
493
|
storyId,
|
|
616
494
|
config,
|
|
@@ -627,14 +505,9 @@ async function probeAndDecide({
|
|
|
627
505
|
}
|
|
628
506
|
|
|
629
507
|
/**
|
|
630
|
-
* Probe live state and resolve the single next command.
|
|
631
|
-
*
|
|
632
|
-
*
|
|
633
|
-
* (same consecutive-evidence pattern the merge wait's fail-fast uses, Story
|
|
634
|
-
* #4695): a second probe after a short settle window. Matching shapes return
|
|
635
|
-
* the fresher verdict; diverging shapes return `in-transition` instead of a
|
|
636
|
-
* confidently wrong command. Settled shapes skip the second round — their
|
|
637
|
-
* state has no live process racing to change it.
|
|
508
|
+
* Probe live state and resolve the single next command. Transient shapes
|
|
509
|
+
* are re-probed after a settle window: a match returns the fresher verdict,
|
|
510
|
+
* a divergence returns `in-transition`.
|
|
638
511
|
*
|
|
639
512
|
* @param {object} args
|
|
640
513
|
* @param {number} args.storyId
|
|
@@ -643,9 +516,7 @@ async function probeAndDecide({
|
|
|
643
516
|
* @param {object} [args.config]
|
|
644
517
|
* @param {object} [args.gh]
|
|
645
518
|
* @param {Function} [args.gitSpawnFn]
|
|
646
|
-
* @param {boolean} [args.reprobe=true]
|
|
647
|
-
* (single-probe legacy behavior — for scripted callers that own their own
|
|
648
|
-
* settling).
|
|
519
|
+
* @param {boolean} [args.reprobe=true] Skip the stability pass when false.
|
|
649
520
|
* @param {number} [args.stabilityDelayMs] Settle window between the probes.
|
|
650
521
|
* @param {Function} [args.sleepFn] Test seam for the settle wait.
|
|
651
522
|
* @param {typeof nodeFs} [args.fsImpl] Test seam for the close-artifact reads.
|
|
@@ -690,7 +561,6 @@ export async function recoverStory({
|
|
|
690
561
|
const second = await probeAndDecide(probeArgs);
|
|
691
562
|
|
|
692
563
|
if (second.decision.shape === first.decision.shape) {
|
|
693
|
-
// Stable across the settle window — trust the fresher evidence.
|
|
694
564
|
return {
|
|
695
565
|
storyId,
|
|
696
566
|
storyBranch,
|
|
@@ -715,9 +585,7 @@ export async function recoverStory({
|
|
|
715
585
|
}
|
|
716
586
|
|
|
717
587
|
/**
|
|
718
|
-
* Render the
|
|
719
|
-
* evidence it was derived from — so the operator can check the reasoning
|
|
720
|
-
* rather than trust it.
|
|
588
|
+
* Render the report with its evidence so the reasoning can be checked.
|
|
721
589
|
*
|
|
722
590
|
* @param {object} recovery
|
|
723
591
|
* @returns {string}
|
|
@@ -1,39 +1,15 @@
|
|
|
1
1
|
import { assignLayers, detectCycle } from '../Graph.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Sources of story dependencies:
|
|
8
|
-
* 1. **Implicit (cross-story tasks)**: Task T in Story A depends on Task T'
|
|
9
|
-
* in Story B → Story A depends on Story B. Under the 2-tier hierarchy
|
|
10
|
-
* (Epic → Story) Stories carry no child Tasks, so this source
|
|
11
|
-
* is empty in practice; it is retained for callers that adapt a
|
|
12
|
-
* task-bearing shape into `storyGroups`.
|
|
13
|
-
* 2. **Explicit (story body)**: Story A body contains `blocked by #B` →
|
|
14
|
-
* Story A depends on Story B.
|
|
15
|
-
*
|
|
16
|
-
* After merging both sources, runs `assignLayers` to produce wave indices.
|
|
17
|
-
*
|
|
18
|
-
* > **Focus-overlap engine removed (Story #3906).** A third source — a
|
|
19
|
-
* > focus-area overlap engine that rolled task-level `focusAreas` / `scope`
|
|
20
|
-
* > up to the Story level and serialized "overlapping" Stories — was deleted
|
|
21
|
-
* > because Task deletion in the 2-tier migration left every Story's task
|
|
22
|
-
* > list empty, so the rollup produced empty focus bags and the engine added
|
|
23
|
-
* > **zero** edges on every real plan. It advertised file-contention
|
|
24
|
-
* > serialization it never delivered. Cross-Story prerequisites are carried
|
|
25
|
-
* > by explicit `blocked by` declarations (source 2 above).
|
|
4
|
+
* Story-level waves from cross-story task dependencies (empty in practice —
|
|
5
|
+
* Stories carry no Tasks — kept for task-bearing adapters) plus explicit
|
|
6
|
+
* `blocked by` edges. Throws on a cycle.
|
|
26
7
|
*
|
|
27
8
|
* @param {Map<number, {storyId: number|string, tasks: object[]}>} storyGroups
|
|
28
|
-
*
|
|
29
|
-
* @param {Map<number|string, number[]>} [explicitDeps]
|
|
30
|
-
* Optional map of storyId → [blockerStoryId, ...] parsed from story ticket
|
|
31
|
-
* `blocked by` references. Only includes references to *other stories within
|
|
32
|
-
* the same Epic*.
|
|
9
|
+
* @param {Map<number|string, number[]>} [explicitDeps] storyId → blocker ids.
|
|
33
10
|
* @returns {Map<number|string, number>} Map of storyId → wave index.
|
|
34
11
|
*/
|
|
35
12
|
export function computeStoryWaves(storyGroups, explicitDeps) {
|
|
36
|
-
// Build a reverse lookup: taskId → storyId
|
|
37
13
|
const taskToStory = new Map();
|
|
38
14
|
for (const [storyId, group] of storyGroups.entries()) {
|
|
39
15
|
for (const task of group.tasks) {
|
|
@@ -41,8 +17,6 @@ export function computeStoryWaves(storyGroups, explicitDeps) {
|
|
|
41
17
|
}
|
|
42
18
|
}
|
|
43
19
|
|
|
44
|
-
// Build story-level adjacency: storyA depends on storyB if any task in
|
|
45
|
-
// storyA has a dependency on a task in storyB.
|
|
46
20
|
const storyAdjacency = new Map();
|
|
47
21
|
for (const storyId of storyGroups.keys()) {
|
|
48
22
|
storyAdjacency.set(storyId, []);
|
|
@@ -59,8 +33,6 @@ export function computeStoryWaves(storyGroups, explicitDeps) {
|
|
|
59
33
|
}
|
|
60
34
|
}
|
|
61
35
|
|
|
62
|
-
// Merge explicit story-to-story dependencies (from `blocked by` on the
|
|
63
|
-
// story ticket body itself).
|
|
64
36
|
if (explicitDeps) {
|
|
65
37
|
const explicit = explicitDeps.get(storyId) ?? [];
|
|
66
38
|
for (const depStoryId of explicit) {
|
|
@@ -73,8 +45,6 @@ export function computeStoryWaves(storyGroups, explicitDeps) {
|
|
|
73
45
|
storyAdjacency.set(storyId, [...depStories]);
|
|
74
46
|
}
|
|
75
47
|
|
|
76
|
-
// Detect cycles in the dependency-derived graph. A cycle is a planning
|
|
77
|
-
// error.
|
|
78
48
|
const cycle = detectCycle(storyAdjacency);
|
|
79
49
|
if (cycle) {
|
|
80
50
|
throw new Error(
|
|
@@ -83,6 +53,5 @@ export function computeStoryWaves(storyGroups, explicitDeps) {
|
|
|
83
53
|
);
|
|
84
54
|
}
|
|
85
55
|
|
|
86
|
-
// Assign layers (waves) to stories
|
|
87
56
|
return assignLayers(storyAdjacency);
|
|
88
57
|
}
|
|
@@ -1,28 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dependency-candidates.js — open Stories
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* today that edits a file an already-open Story from an earlier plan is going
|
|
8
|
-
* to rewrite. Delivered concurrently, the second lands on a base the first
|
|
9
|
-
* just changed — and the planner had no way to see it coming, because the
|
|
10
|
-
* duplicate search asks "is this the same Story?" (title/body similarity),
|
|
11
|
-
* never "does this Story touch what I am about to touch?".
|
|
12
|
-
*
|
|
13
|
-
* Overlap here is therefore computed on **declared footprints**, not prose:
|
|
14
|
-
* the seed's `predictedPaths` against each open Story's parsed `changes[]`,
|
|
15
|
-
* via the same `storyFootprint` the wave runner uses to withhold colliding
|
|
16
|
-
* Stories at dispatch. That is deliberate — the planner sees the collision the
|
|
17
|
-
* runtime would later enforce, one layer earlier and while it is still cheap
|
|
18
|
-
* to order around.
|
|
19
|
-
*
|
|
20
|
-
* The result is **advisory**: an overlap is a prompt to consider an edge, not
|
|
21
|
-
* proof one is needed. Two Stories can touch a shared barrel file with no real
|
|
22
|
-
* ordering between them; only the operator knows.
|
|
2
|
+
* dependency-candidates.js — open Stories from earlier plans whose declared
|
|
3
|
+
* footprint overlaps a new seed's predicted paths, via the same
|
|
4
|
+
* `storyFootprint` the wave runner uses to withhold collisions — so the
|
|
5
|
+
* planner sees the collision the runtime would enforce. Advisory: an overlap
|
|
6
|
+
* suggests an edge, it does not prove one.
|
|
23
7
|
*
|
|
24
8
|
* @module lib/orchestration/dependency-candidates
|
|
25
|
-
* @see Story #5155
|
|
26
9
|
*/
|
|
27
10
|
|
|
28
11
|
import { Logger } from '../Logger.js';
|
|
@@ -31,8 +14,6 @@ import { parse as parseStoryBody } from '../story-body/story-body.js';
|
|
|
31
14
|
import { storyFootprint } from '../wave-runner/footprint.js';
|
|
32
15
|
|
|
33
16
|
/**
|
|
34
|
-
* Build an issue URL for a Story the provider returned without one.
|
|
35
|
-
*
|
|
36
17
|
* @param {number} id
|
|
37
18
|
* @param {{ owner?: string, repo?: string }} [opts]
|
|
38
19
|
* @returns {string}
|
|
@@ -43,12 +24,7 @@ function buildStoryUrl(id, { owner, repo } = {}) {
|
|
|
43
24
|
}
|
|
44
25
|
|
|
45
26
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* Total by construction: an unparseable body yields an empty footprint, which
|
|
49
|
-
* intersects with nothing and drops the Story from the candidate list. A
|
|
50
|
-
* hand-written Story with no `## Changes` section is exactly that case, and it
|
|
51
|
-
* is the right outcome — there is no declared footprint to collide with.
|
|
27
|
+
* Declared footprint; empty (never a candidate) when unparseable.
|
|
52
28
|
*
|
|
53
29
|
* @param {object} issue
|
|
54
30
|
* @returns {Set<string>}
|
|
@@ -64,13 +40,8 @@ function footprintOf(issue) {
|
|
|
64
40
|
}
|
|
65
41
|
|
|
66
42
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* Returns `[]` **without contacting the provider** when the seed named no
|
|
71
|
-
* paths: with nothing to intersect, every candidate would score empty, and the
|
|
72
|
-
* round-trip would buy nothing. That short-circuit is load-bearing for the
|
|
73
|
-
* common one-line seed, which mentions no file at all.
|
|
43
|
+
* Returns `[]` without contacting the provider when the seed names no paths
|
|
44
|
+
* (the common case).
|
|
74
45
|
*
|
|
75
46
|
* @param {{
|
|
76
47
|
* predictedPaths: string[],
|
|
@@ -113,10 +84,7 @@ export async function findDependencyCandidates({
|
|
|
113
84
|
|
|
114
85
|
const out = [];
|
|
115
86
|
for (const issue of Array.isArray(issues) ? issues : []) {
|
|
116
|
-
//
|
|
117
|
-
// the old `number`-then-`id` fallback was the bug in waiting — on this
|
|
118
|
-
// shape the fallback never fires, and on a raw REST payload it silently
|
|
119
|
-
// produced database ids for every candidate the planner offered.
|
|
87
|
+
// Declared ticket shape: `id` is the issue number.
|
|
120
88
|
const id = Number(issue?.id);
|
|
121
89
|
if (!Number.isInteger(id) || id <= 0 || excluded.has(id)) continue;
|
|
122
90
|
|