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,18 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* summary
|
|
3
|
-
*
|
|
4
|
-
* Renders the persist receipts — the created Story set, whether the operator
|
|
5
|
-
* forced a review stop, the `depends_on` ordering table and the exact deliver
|
|
6
|
-
* command. Story #5343 moved that rendering onto the **`story-plan-state`**
|
|
7
|
-
* marker every created Story already carries: it used to be a second,
|
|
8
|
-
* primary-Story-only `plan-summary` comment, which cost one more write per
|
|
9
|
-
* plan and split the operator's reading between two markers. Story #5367
|
|
10
|
-
* deleted the machine checkpoint that shared the marker with it, so this
|
|
11
|
-
* rendering is now the whole body of the one comment persist posts.
|
|
12
|
-
*
|
|
13
|
-
* Story #4542 removed the risk / review-routing line: no risk level, gate
|
|
14
|
-
* decision, or acceptance disposition is computed at plan time any more, so
|
|
15
|
-
* reporting one here would document a mechanism that does not run.
|
|
2
|
+
* The plan summary — the whole body of each Story's `story-plan-state`
|
|
3
|
+
* comment: created Stories, delivery order, and the deliver command.
|
|
16
4
|
*
|
|
17
5
|
* @module lib/orchestration/plan-persist/summary
|
|
18
6
|
*/
|
|
@@ -21,8 +9,6 @@ import { computeStoryWaves } from '../dependency-analyzer.js';
|
|
|
21
9
|
import { renderPredictedSerialisationLines } from './wave-serialisation.js';
|
|
22
10
|
|
|
23
11
|
/**
|
|
24
|
-
* Compute the dry-run wave assignment for a validated ticket set.
|
|
25
|
-
*
|
|
26
12
|
* @param {Array<{ slug: string, title?: string, depends_on?: string[] }>} tickets
|
|
27
13
|
* @returns {Array<{ wave: number, stories: Array<{ slug: string, title: string }> }>}
|
|
28
14
|
*/
|
|
@@ -66,21 +52,11 @@ function renderWaveTableLines(waveTable) {
|
|
|
66
52
|
}
|
|
67
53
|
|
|
68
54
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
* The wave table is a promise about parallelism — "these Stories can run
|
|
72
|
-
* together". `computeSharedEditorFindings` knows exactly where that promise
|
|
73
|
-
* breaks down: a path two same-wave Stories both write will conflict on every
|
|
74
|
-
* merge after the first. Until now those findings degraded to a `Logger.warn`
|
|
75
|
-
* on stderr and were discarded, so the comment carried the optimistic half of
|
|
76
|
-
* the analysis and none of the caveat. Rendering them here puts the promise
|
|
77
|
-
* and its known exceptions on one durable surface.
|
|
78
|
-
*
|
|
79
|
-
* Advisory by default and labelled as such — `planning.failOnSharedEditors`
|
|
80
|
-
* is the knob that makes a collision refuse the plan, and it stays off.
|
|
55
|
+
* Same-wave Stories writing one path — the caveat to the wave table's
|
|
56
|
+
* parallelism promise, kept on the same durable surface. Advisory.
|
|
81
57
|
*
|
|
82
58
|
* @param {object[]|null} conflictFindings
|
|
83
|
-
* @returns {string[]}
|
|
59
|
+
* @returns {string[]}
|
|
84
60
|
*/
|
|
85
61
|
function renderSharedEditorLines(conflictFindings) {
|
|
86
62
|
const shared = (
|
|
@@ -113,9 +89,6 @@ function renderSharedEditorLines(conflictFindings) {
|
|
|
113
89
|
}
|
|
114
90
|
|
|
115
91
|
/**
|
|
116
|
-
* Build the body of each Story's `story-plan-state` comment (Story #5343;
|
|
117
|
-
* Story #5367 made it the whole body).
|
|
118
|
-
*
|
|
119
92
|
* @param {object} input
|
|
120
93
|
* @returns {string}
|
|
121
94
|
*/
|
|
@@ -131,7 +104,7 @@ export function buildPlanSummaryCommentBody({
|
|
|
131
104
|
stories = null,
|
|
132
105
|
conflictFindings = null,
|
|
133
106
|
waveCollisions = null,
|
|
134
|
-
//
|
|
107
|
+
// Unused; accepted so older call sites don't crash.
|
|
135
108
|
single = null,
|
|
136
109
|
amend = null,
|
|
137
110
|
}) {
|
|
@@ -154,15 +127,12 @@ export function buildPlanSummaryCommentBody({
|
|
|
154
127
|
? stories.map((s) => `#${s.id} (\`${s.slug}\`)`).join(', ')
|
|
155
128
|
: `${ticketCount} Story(ies)`;
|
|
156
129
|
|
|
157
|
-
//
|
|
158
|
-
// operator flag, never a value derived from a self-authored risk verdict.
|
|
130
|
+
// An explicit operator flag, never derived from a risk verdict.
|
|
159
131
|
const reviewLines = forceReview
|
|
160
132
|
? ['- ⚠️ Review: operator-forced via `--force-review`.']
|
|
161
133
|
: [];
|
|
162
134
|
|
|
163
|
-
// The
|
|
164
|
-
// GitHub on every plan, so it is the operator's primary instruction: it
|
|
165
|
-
// must name real ids, not a batch token that no longer exists.
|
|
135
|
+
// The operator's primary instruction: must name real ids.
|
|
166
136
|
const deliverCommand =
|
|
167
137
|
Array.isArray(stories) && stories.length > 0
|
|
168
138
|
? `/mandrel-deliver ${stories.map((s) => s.id).join(' ')}`
|
|
@@ -1,45 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* supersede-ops.js — close the `/mandrel-plan --tickets` source issues
|
|
3
|
-
* authored Stories supersede
|
|
4
|
-
*
|
|
5
|
-
* `plan-context.js` fetches the source issues, emits `sourceTickets[]` on the
|
|
6
|
-
* `/mandrel-plan` envelope, and (with `--out`) writes that envelope to disk.
|
|
7
|
-
* `resolveSourceTicketIds` below reads the id set back off it, so the normal
|
|
8
|
-
* `/mandrel-plan --tickets` path needs no flag; an explicit `--source-tickets` still
|
|
9
|
-
* wins when passed, as the override for hand-driven runs (Story #4554).
|
|
10
|
-
* Before that thread existed the ids reached
|
|
11
|
-
* this module *solely* via the hand-passed flag, so a forgotten flag left
|
|
12
|
-
* `sourceTicketIds` empty — the partition below then passed **vacuously** (an
|
|
13
|
-
* empty set trivially partitions), the close phase short-circuited, and the
|
|
14
|
-
* run reported success while every source issue stayed open.
|
|
15
|
-
*
|
|
16
|
-
* Two halves, deliberately separated by the `createIssue` boundary:
|
|
17
|
-
*
|
|
18
|
-
* 1. **`resolveSupersedePartition`** — the plan-time completion pass that
|
|
19
|
-
* runs *before* any GitHub write. No id may be claimed by two Stories
|
|
20
|
-
* and no Story may claim an id that was not a source ticket — both fail
|
|
21
|
-
* closed. A source id nobody claimed is assigned to the primary Story
|
|
22
|
-
* with a warning (Story #5342): the plan is replacing it either way, so
|
|
23
|
-
* the only open question was bookkeeping.
|
|
24
|
-
* 2. **`closeSupersededTickets`** — the bookkeeping pass that runs *after*
|
|
25
|
-
* the Stories exist. It **never throws**: a throw here would leave the
|
|
26
|
-
* run half-done with Stories already live. An already-closed, deleted,
|
|
27
|
-
* or inaccessible source ticket is a clean skip-and-report, and a
|
|
28
|
-
* partial failure reports which tickets were and were not closed so the
|
|
29
|
-
* operator can finish by hand.
|
|
30
|
-
*
|
|
31
|
-
* The close also strips the source ticket's `agent::*` label (Story #5255).
|
|
32
|
-
* A retired ticket has no agent state, and the one it kept was read as live
|
|
33
|
-
* work: `agent::blocked` is the state a Story must be in to be re-planned, so
|
|
34
|
-
* this path closes exactly the tickets carrying it, and a closed-but-blocked
|
|
35
|
-
* child pinned its container Epic open on every rollup thereafter. The
|
|
36
|
-
* derivation in `ticketing/bulk.js` now ignores closed children's labels too —
|
|
37
|
-
* that half covers the tickets already closed and the ones closed by hand;
|
|
38
|
-
* this one stops new ones being written.
|
|
39
|
-
*
|
|
40
|
-
* Idempotency is keyed off the `superseded-by` structured-comment marker
|
|
41
|
-
* (`upsertStructuredComment`), not a bare `postComment`, so a re-run cannot
|
|
42
|
-
* double-comment.
|
|
2
|
+
* supersede-ops.js — close the `/mandrel-plan --tickets` source issues the
|
|
3
|
+
* authored Stories supersede. The `superseded-by` marker makes re-runs
|
|
4
|
+
* idempotent.
|
|
43
5
|
*
|
|
44
6
|
* @module lib/orchestration/plan-persist/supersede-ops
|
|
45
7
|
*/
|
|
@@ -53,41 +15,20 @@ import {
|
|
|
53
15
|
import { rollUpEpicForStory } from '../epic-rollup.js';
|
|
54
16
|
import { upsertStructuredComment } from '../ticketing.js';
|
|
55
17
|
|
|
56
|
-
/** Structured-comment type marking a source issue as superseded. */
|
|
57
18
|
const SUPERSEDED_BY_COMMENT_TYPE = 'superseded-by';
|
|
58
19
|
|
|
59
|
-
/**
|
|
60
|
-
* GitHub `state_reason` used when closing a superseded source issue.
|
|
61
|
-
*
|
|
62
|
-
* At persist time nothing has shipped — the issue will not be actioned in
|
|
63
|
-
* its own right, so `not_planned` (not `completed`) is the honest reason.
|
|
64
|
-
* The repo history was inconsistent here (#4211 used `completed`, #2870
|
|
65
|
-
* `not_planned`); this constant settles it.
|
|
66
|
-
*/
|
|
20
|
+
/** Nothing has shipped at persist time, so `not_planned`, not `completed`. */
|
|
67
21
|
export const SUPERSEDE_CLOSE_REASON = 'not_planned';
|
|
68
22
|
|
|
69
23
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* A retired ticket has no agent state. `agent::done` would be the wrong
|
|
73
|
-
* substitute — the work was re-planned, never delivered — so the label is
|
|
74
|
-
* removed rather than rewritten, and the ticket ends carrying only its
|
|
75
|
-
* `type::`/domain labels and the supersede comment that explains it.
|
|
24
|
+
* Stripped, not rewritten to `agent::done`: a retired ticket has no agent
|
|
25
|
+
* state, and a lingering `agent::blocked` pins its container Epic open.
|
|
76
26
|
*/
|
|
77
27
|
const AGENT_STATE_LABELS = Object.freeze(Object.values(AGENT_LABELS));
|
|
78
28
|
|
|
79
29
|
/**
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* Closing and clearing the state ride one write: two calls could leave the
|
|
83
|
-
* ticket closed but still wearing `agent::blocked`, which is the shape that
|
|
84
|
-
* pinned a container Epic open forever (Story #5255).
|
|
85
|
-
*
|
|
86
|
-
* A ticket with no `agent::*` label gets the bare close, unchanged from before
|
|
87
|
-
* that Story — `updateTicket` merges a `labels` mutation by reading the issue
|
|
88
|
-
* back, so an unconditional empty `remove` would buy a wasted round-trip per
|
|
89
|
-
* superseded ticket. `_ticketSnapshot` feeds that merge the copy
|
|
90
|
-
* `probeSourceTicket` already fetched.
|
|
30
|
+
* Close and strip `agent::*` in ONE write, so the ticket never ends closed
|
|
31
|
+
* but still blocked. No agent label → bare close, sparing a read-back.
|
|
91
32
|
*
|
|
92
33
|
* @param {{ labels?: unknown }} ticket The probe's fresh copy.
|
|
93
34
|
* @returns {object} Mutations for `provider.updateTicket`.
|
|
@@ -101,12 +42,7 @@ function supersedeCloseMutations(ticket) {
|
|
|
101
42
|
}
|
|
102
43
|
|
|
103
44
|
/**
|
|
104
|
-
* Coerce
|
|
105
|
-
*
|
|
106
|
-
* Accepts a bare issue number (`4525`), a numeric string (`"4525"`, `"#4525"`),
|
|
107
|
-
* or an object carrying an optional per-supersede note
|
|
108
|
-
* (`{ id: 4525, note: "…" }`). The note is what lets a Story record a
|
|
109
|
-
* *correction* to the source issue's analysis rather than template-only prose.
|
|
45
|
+
* Coerce a number, `"#N"` string, or `{ id, note }` into `{ id, note }`.
|
|
110
46
|
*
|
|
111
47
|
* @param {unknown} entry
|
|
112
48
|
* @param {string} slug Story slug, for error reporting.
|
|
@@ -137,9 +73,6 @@ function normalizeSupersedeEntry(entry, slug) {
|
|
|
137
73
|
}
|
|
138
74
|
|
|
139
75
|
/**
|
|
140
|
-
* Normalize a plan Story ticket's `supersedes[]` into `{ id, note }[]`.
|
|
141
|
-
* Absent / empty is a no-op returning `[]`.
|
|
142
|
-
*
|
|
143
76
|
* @param {object} ticket
|
|
144
77
|
* @param {string} slug
|
|
145
78
|
* @returns {Array<{ id: number, note: string|null }>}
|
|
@@ -167,11 +100,8 @@ export function normalizeSupersedes(ticket, slug) {
|
|
|
167
100
|
}
|
|
168
101
|
|
|
169
102
|
/**
|
|
170
|
-
* Normalize a source-ticket id list into deduped positive integers.
|
|
171
|
-
*
|
|
172
103
|
* @param {unknown} ids
|
|
173
|
-
* @param {string} [label] Channel
|
|
174
|
-
* envelope-derived failure does not blame the `--source-tickets` flag.
|
|
104
|
+
* @param {string} [label] Channel named in the error message.
|
|
175
105
|
* @returns {number[]}
|
|
176
106
|
*/
|
|
177
107
|
export function normalizeSourceTicketIds(ids, label = '--source-tickets') {
|
|
@@ -197,12 +127,6 @@ export function normalizeSourceTicketIds(ids, label = '--source-tickets') {
|
|
|
197
127
|
}
|
|
198
128
|
|
|
199
129
|
/**
|
|
200
|
-
* Pull the `--tickets` id set out of a `plan-context.js` envelope.
|
|
201
|
-
*
|
|
202
|
-
* The envelope's `sourceTickets[]` carries whole ticket records
|
|
203
|
-
* (`{ id, title, body, … }`); only the ids matter here. A non-`tickets`-mode
|
|
204
|
-
* envelope (seed / seed-file) has no source tickets and yields `[]`.
|
|
205
|
-
*
|
|
206
130
|
* @param {object|null} envelope
|
|
207
131
|
* @returns {number[]}
|
|
208
132
|
*/
|
|
@@ -222,21 +146,9 @@ function sameIdSet(a, b) {
|
|
|
222
146
|
}
|
|
223
147
|
|
|
224
148
|
/**
|
|
225
|
-
* Resolve
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
* (Story #4554):
|
|
229
|
-
*
|
|
230
|
-
* 1. `--source-tickets` when supplied — the explicit override for
|
|
231
|
-
* hand-driven runs. A disagreement with the envelope is warned about
|
|
232
|
-
* loudly (the operator is overriding what the run actually fetched)
|
|
233
|
-
* but honoured.
|
|
234
|
-
* 2. otherwise the envelope's `sourceTickets[]` — so the common
|
|
235
|
-
* `/mandrel-plan --tickets` path needs no flag at all.
|
|
236
|
-
* 3. otherwise empty, reported as `origin: 'none'`.
|
|
237
|
-
*
|
|
238
|
-
* `origin` is surfaced on the persist envelope so a run that superseded
|
|
239
|
-
* nothing says *why* rather than looking like a clean no-op.
|
|
149
|
+
* Resolve the source-ticket ids: an explicit `--source-tickets` wins (warned
|
|
150
|
+
* when it disagrees with the envelope), else the envelope's
|
|
151
|
+
* `sourceTickets[]`. `origin` lets a run that superseded nothing say why.
|
|
240
152
|
*
|
|
241
153
|
* @param {object} [args]
|
|
242
154
|
* @param {unknown} [args.explicitIds] Raw `--source-tickets` value.
|
|
@@ -279,8 +191,6 @@ function describeStoryIds(entries) {
|
|
|
279
191
|
}
|
|
280
192
|
|
|
281
193
|
/**
|
|
282
|
-
* Index which Story claims each source id.
|
|
283
|
-
*
|
|
284
194
|
* @param {Array<{ slug: string, supersedes?: Array<{ id: number }> }>} list
|
|
285
195
|
* @returns {Map<number, string[]>} id → claiming slugs, in draft order.
|
|
286
196
|
*/
|
|
@@ -298,31 +208,9 @@ function indexSupersedeClaims(list) {
|
|
|
298
208
|
}
|
|
299
209
|
|
|
300
210
|
/**
|
|
301
|
-
*
|
|
302
|
-
*
|
|
303
|
-
*
|
|
304
|
-
*
|
|
305
|
-
* - **Refused.** A Story claiming an id that was never a source ticket, and
|
|
306
|
-
* two Stories claiming the same id. Both name an intent the run cannot
|
|
307
|
-
* act on — the first would comment on and close an issue nobody asked
|
|
308
|
-
* about, the second cannot say which Story replaced it — so they fail
|
|
309
|
-
* closed, **before** `createIssue`, and no Story goes live against an
|
|
310
|
-
* inconsistent tracker.
|
|
311
|
-
* - **Assigned with a warning.** A source id no Story claimed. Every id
|
|
312
|
-
* passed to `--tickets` is being replaced by this plan by construction;
|
|
313
|
-
* which Story records it is a bookkeeping detail, and the primary Story
|
|
314
|
-
* is the answer the operator would have given. Refusing cost a whole
|
|
315
|
-
* re-author round to type back a fact the run already knew.
|
|
316
|
-
*
|
|
317
|
-
* Mutates the unclaimed ids onto the primary Story's `supersedes[]`.
|
|
318
|
-
*
|
|
319
|
-
* **`stories[0]` is the primary, and it is the *only* derivation of it**
|
|
320
|
-
* (Story #5361): `assemblePlanStories` hands this list over already sorted by
|
|
321
|
-
* `orderStoriesByDependencies`, which is the same order the create loop files
|
|
322
|
-
* the Stories in — so the `superseded-by` comment this assignment produces
|
|
323
|
-
* can never name a different Story from the checkpoint and the plan summary.
|
|
324
|
-
* A non-empty list is the caller's contract (assembly refuses an empty
|
|
325
|
-
* draft before it gets here).
|
|
211
|
+
* Runs before `createIssue`. A non-source or doubly-claimed id throws; an
|
|
212
|
+
* unclaimed source id goes to the primary Story (`stories[0]`, as the list
|
|
213
|
+
* arrives in create order) with a warning.
|
|
326
214
|
*
|
|
327
215
|
* @param {Array<{ slug: string, supersedes: Array<{ id: number, note: string|null }> }>} stories
|
|
328
216
|
* Dependency-ordered and non-empty.
|
|
@@ -371,12 +259,9 @@ export function resolveSupersedePartition(stories, sourceTicketIds = []) {
|
|
|
371
259
|
}
|
|
372
260
|
|
|
373
261
|
/**
|
|
374
|
-
* Render the supersede comment posted on a source issue.
|
|
375
|
-
*
|
|
376
262
|
* @param {object} args
|
|
377
263
|
* @param {{ id: number, title: string }} args.story The claiming Story.
|
|
378
|
-
* @param {string|null} [args.note]
|
|
379
|
-
* the Story — carries a correction to this issue's analysis.
|
|
264
|
+
* @param {string|null} [args.note] Correction to this issue's analysis.
|
|
380
265
|
* @param {number[]} args.sourceTicketIds Full `--tickets` argument.
|
|
381
266
|
* @returns {string}
|
|
382
267
|
*/
|
|
@@ -385,8 +270,6 @@ export function buildSupersedeCommentBody({
|
|
|
385
270
|
note = null,
|
|
386
271
|
sourceTicketIds,
|
|
387
272
|
}) {
|
|
388
|
-
// Story #4540 retired the plan-run label, which used to be listed here
|
|
389
|
-
// alongside the type/state labels.
|
|
390
273
|
const labels = ['`type::story`', '`agent::ready`'];
|
|
391
274
|
|
|
392
275
|
const lines = [
|
|
@@ -406,12 +289,7 @@ export function buildSupersedeCommentBody({
|
|
|
406
289
|
}
|
|
407
290
|
|
|
408
291
|
/**
|
|
409
|
-
*
|
|
410
|
-
*
|
|
411
|
-
* The ticket itself rides along so the close can strip the `agent::*` label
|
|
412
|
-
* without a second read: `updateTicket`'s label merge takes a
|
|
413
|
-
* `_ticketSnapshot` for exactly this, and this probe has already paid for the
|
|
414
|
-
* fresh copy.
|
|
292
|
+
* The ticket rides along so the close needs no second read.
|
|
415
293
|
*
|
|
416
294
|
* @returns {Promise<{ ok: true, state: string, ticket: object } | { ok: false, reason: string }>}
|
|
417
295
|
*/
|
|
@@ -470,18 +348,13 @@ async function closeOneSupersededTicket({
|
|
|
470
348
|
* @property {boolean} enabled
|
|
471
349
|
* @property {boolean} dryRun
|
|
472
350
|
* @property {string|null} reason Why the phase was skipped wholesale.
|
|
473
|
-
* @property {'flag'|'envelope'|'none'} [sourceTicketOrigin]
|
|
474
|
-
* source ids came from. Stamped by `runPlanPersist`, not this module.
|
|
351
|
+
* @property {'flag'|'envelope'|'none'} [sourceTicketOrigin] Stamped by `runPlanPersist`.
|
|
475
352
|
* @property {number[]} closed
|
|
476
353
|
* @property {Array<{ ticket: number, storySlug: string }>} planned Dry-run
|
|
477
|
-
* only
|
|
478
|
-
* `createStoryIssues` hands back a synthetic negative placeholder id. The
|
|
479
|
-
* slug is the only identifier that means anything before the writes land.
|
|
354
|
+
* only; keyed by slug because dry-run Story ids are placeholders.
|
|
480
355
|
* @property {Array<{ ticket: number, reason: string }>} skipped
|
|
481
356
|
* @property {Array<{ ticket: number, reason: string }>} failed
|
|
482
|
-
* @property {{ closed: number[], pending: number[] }} epicRollup
|
|
483
|
-
* Epics this phase's closes resolved. Empty on a dry run and on a phase that
|
|
484
|
-
* closed nothing.
|
|
357
|
+
* @property {{ closed: number[], pending: number[] }} epicRollup
|
|
485
358
|
*/
|
|
486
359
|
|
|
487
360
|
function emptyReport(overrides) {
|
|
@@ -499,22 +372,10 @@ function emptyReport(overrides) {
|
|
|
499
372
|
}
|
|
500
373
|
|
|
501
374
|
/**
|
|
502
|
-
* Re-derive the container Epic above every ticket
|
|
503
|
-
*
|
|
504
|
-
*
|
|
505
|
-
*
|
|
506
|
-
* its container open indefinitely: every child was closed, so no delivery
|
|
507
|
-
* would ever run and no land tail would ever fire the derivation. The Epic sat
|
|
508
|
-
* open above finished work until someone noticed.
|
|
509
|
-
*
|
|
510
|
-
* Runs **after** the closes land, never alongside them: the rollup reads each
|
|
511
|
-
* child's state back, so racing it against the writes it is meant to observe
|
|
512
|
-
* would derive from a tree half of which has not been written yet.
|
|
513
|
-
*
|
|
514
|
-
* Sequential, sharing one `skipEpicIds` set, because siblings share a
|
|
515
|
-
* container — without it the second ticket re-derives, and re-closes, the Epic
|
|
516
|
-
* the first already closed. `rollUpEpicForStory` never throws, so no guard is
|
|
517
|
-
* needed here beyond the phase-level one the caller already holds.
|
|
375
|
+
* Re-derive the container Epic above every closed ticket — no delivery will
|
|
376
|
+
* ever fire that rollup for a superseded cohort. Runs after the closes land
|
|
377
|
+
* (it reads child state back), and sequentially with one shared `skipEpicIds`
|
|
378
|
+
* so siblings do not re-close the same Epic.
|
|
518
379
|
*
|
|
519
380
|
* @param {{ closedIds: number[], provider: object, config?: object }} opts
|
|
520
381
|
* @returns {Promise<{ closed: number[], pending: number[] }>}
|
|
@@ -541,11 +402,8 @@ async function rollUpContainersFor({ closedIds, provider, config }) {
|
|
|
541
402
|
}
|
|
542
403
|
|
|
543
404
|
/**
|
|
544
|
-
* Comment on and close every superseded source ticket.
|
|
545
|
-
*
|
|
546
|
-
* **Never throws** and never fails the run — Stories are already live by the
|
|
547
|
-
* time this executes, so bookkeeping failures degrade to a report the
|
|
548
|
-
* operator can act on.
|
|
405
|
+
* Comment on and close every superseded source ticket. Never throws: Stories
|
|
406
|
+
* are already live, so failures degrade to a report.
|
|
549
407
|
*
|
|
550
408
|
* @param {object} args
|
|
551
409
|
* @param {object} args.provider
|
|
@@ -579,12 +437,9 @@ export async function closeSupersededTickets({
|
|
|
579
437
|
);
|
|
580
438
|
const units = collectSupersedeUnits(stories, createdBySlug);
|
|
581
439
|
|
|
582
|
-
//
|
|
583
|
-
//
|
|
584
|
-
//
|
|
585
|
-
// first-rejection-wins policy can never fire and no unit is abandoned
|
|
586
|
-
// because a sibling failed. Input order is preserved, so the report arrays
|
|
587
|
-
// below read exactly as the serial nested loop wrote them.
|
|
440
|
+
// The mapper never throws, so no unit is abandoned for a sibling's failure.
|
|
441
|
+
// Units are distinct tickets (the partition refused duplicates); within one
|
|
442
|
+
// the probe → comment → close sequence stays strictly ordered.
|
|
588
443
|
const outcomes = await concurrentMap(
|
|
589
444
|
units,
|
|
590
445
|
({ id, note, createdStory }) => {
|
|
@@ -600,13 +455,6 @@ export async function closeSupersededTickets({
|
|
|
600
455
|
sourceTicketIds: sources,
|
|
601
456
|
});
|
|
602
457
|
},
|
|
603
|
-
// The per-source-ticket close (Story #4952) fans out across **distinct**
|
|
604
|
-
// tickets — `resolveSupersedePartition` has already failed the run closed
|
|
605
|
-
// if two Stories claim the same id, so no two units in flight can touch
|
|
606
|
-
// the same issue. Within one unit the probe → comment → close sequence
|
|
607
|
-
// stays strictly ordered: commenting on an issue the probe reported
|
|
608
|
-
// closed, or closing one the comment never landed on, is the whole
|
|
609
|
-
// failure mode this phase is careful about.
|
|
610
458
|
{ concurrency: FANOUT_CONCURRENCY },
|
|
611
459
|
);
|
|
612
460
|
|
|
@@ -628,9 +476,6 @@ export async function closeSupersededTickets({
|
|
|
628
476
|
}
|
|
629
477
|
|
|
630
478
|
/**
|
|
631
|
-
* Flatten the per-Story `supersedes[]` maps into one list of close units, in
|
|
632
|
-
* the nested iteration order the report arrays are expected to follow.
|
|
633
|
-
*
|
|
634
479
|
* @param {Array<{ slug: string, supersedes?: Array<{ id: number, note: string|null }> }>|undefined} stories
|
|
635
480
|
* @param {Map<string, { slug: string, id: number, title: string }>} createdBySlug
|
|
636
481
|
* @returns {Array<{ id: number, note: string|null, createdStory: object|undefined }>}
|
|
@@ -647,8 +492,6 @@ function collectSupersedeUnits(stories, createdBySlug) {
|
|
|
647
492
|
}
|
|
648
493
|
|
|
649
494
|
/**
|
|
650
|
-
* File one unit's outcome onto the report.
|
|
651
|
-
*
|
|
652
495
|
* @param {SupersedeReport} report
|
|
653
496
|
* @param {{ id: number, createdStory: object|undefined }} unit
|
|
654
497
|
* @param {{ outcome: string, reason?: string }} result
|
|
@@ -674,9 +517,6 @@ function recordSupersedeOutcome(report, unit, result) {
|
|
|
674
517
|
}
|
|
675
518
|
|
|
676
519
|
/**
|
|
677
|
-
* Surface the supersede outcome on the console so a partial failure is
|
|
678
|
-
* visible without reading the JSON envelope.
|
|
679
|
-
*
|
|
680
520
|
* @param {SupersedeReport} report
|
|
681
521
|
*/
|
|
682
522
|
function logSupersedeReport(report) {
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wave-collision-gate.js — the split gate
|
|
3
|
-
*
|
|
4
|
-
* Kept out of `wave-serialisation.js` because it answers a different
|
|
5
|
-
* question. That module *predicts* what the dispatcher will do with a draft
|
|
6
|
-
* and renders the prediction as a receipt; this one decides whether the draft
|
|
7
|
-
* may be created at all, and so owns both the one enumeration the refusal and
|
|
8
|
-
* the receipt share and the shape reconciliation that enumeration needs.
|
|
2
|
+
* wave-collision-gate.js — the split gate: decides whether an N>1 draft may
|
|
3
|
+
* be created at all, where `wave-serialisation.js` only predicts.
|
|
9
4
|
*
|
|
10
5
|
* @module lib/orchestration/plan-persist/wave-collision-gate
|
|
11
6
|
*/
|
|
@@ -13,21 +8,9 @@
|
|
|
13
8
|
import { predictWaveSerialisation } from './wave-serialisation.js';
|
|
14
9
|
|
|
15
10
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* `assemblePlanStories` returns the persisted artifact — `{ slug, title,
|
|
20
|
-
* body, bodyObject, acceptance, depends_on, … }` — and carries the parsed
|
|
21
|
-
* `changes[]` inside `bodyObject`, not at the top level. `storyFootprint`
|
|
22
|
-
* reads `files` / `changes` / `changeset` only, so from Story #5313 (which
|
|
23
|
-
* retired the body scrape that had been widening the footprint out of the
|
|
24
|
-
* markdown) until this Story the production call saw an empty footprint for
|
|
25
|
-
* every assembled Story and predicted nothing — the unit fixtures passed a
|
|
26
|
-
* top-level `changes` and so could not show it. The prediction is now the
|
|
27
|
-
* split gate, and a gate that cannot see a declaration cannot fire, so the
|
|
28
|
-
* shapes are reconciled here rather than by widening the dispatcher's own
|
|
29
|
-
* predicate: the runtime's records (`resolve-stories.js`) already carry
|
|
30
|
-
* `changes` at the top level and pass through untouched.
|
|
11
|
+
* Assembled Stories carry `changes[]` inside `bodyObject`, but
|
|
12
|
+
* `storyFootprint` reads only top-level `files`/`changes`/`changeset` — lift
|
|
13
|
+
* it, or the gate sees an empty footprint and can never fire.
|
|
31
14
|
*
|
|
32
15
|
* @param {object} story
|
|
33
16
|
* @returns {object} The same record, with a top-level `changes` when one can
|
|
@@ -44,8 +27,6 @@ function withDeclaredFootprint(story) {
|
|
|
44
27
|
}
|
|
45
28
|
|
|
46
29
|
/**
|
|
47
|
-
* Render one refused pair as a report line.
|
|
48
|
-
*
|
|
49
30
|
* @param {{ wave: number, slugs: [string, string], paths: string[], source: string }} collision
|
|
50
31
|
* @returns {string}
|
|
51
32
|
*/
|
|
@@ -55,31 +36,10 @@ function formatCollision({ wave, slugs, paths, source }) {
|
|
|
55
36
|
}
|
|
56
37
|
|
|
57
38
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* default-single policy enforced by prose plus `assertAcceptancePartition`,
|
|
63
|
-
* which refused only byte-identical acceptance text across siblings — a shape
|
|
64
|
-
* model output does not produce. The measured result was a plan of 18 Stories
|
|
65
|
-
* whose own summary comment recorded 39 shared files across 14 same-wave
|
|
66
|
-
* Stories: the plan refuted its own parallelism claim, after persist, with
|
|
67
|
-
* nothing acting on it.
|
|
68
|
-
*
|
|
69
|
-
* So the gate is the dispatcher's own predicate rather than a proxy for it. A
|
|
70
|
-
* pair {@link predictWaveSerialisation} names is a pair
|
|
71
|
-
* `stories-wave-tick.js` will refuse to co-dispatch, so the split buys no
|
|
72
|
-
* parallelism while still paying a delivery session per Story. Two remedies,
|
|
73
|
-
* both the author's to take before anything is created: merge the pair into
|
|
74
|
-
* the one Story it already is, or order it with `depends_on` so the members
|
|
75
|
-
* land in different waves.
|
|
76
|
-
*
|
|
77
|
-
* **N=1 can never trip it.** A single-Story draft has no pair to score, so
|
|
78
|
-
* the prediction is empty by construction.
|
|
79
|
-
*
|
|
80
|
-
* The computed collisions are **returned** so the caller hands the same value
|
|
81
|
-
* to the plan-summary receipt instead of recomputing it — a recomputation is
|
|
82
|
-
* how the refusal and the receipt would come to disagree.
|
|
39
|
+
* Refuse an N>1 draft with any same-wave collision. The gate is the
|
|
40
|
+
* dispatcher's own predicate: a pair it names will never co-dispatch, so the
|
|
41
|
+
* split buys no parallelism. Collisions are returned so the summary receipt
|
|
42
|
+
* reuses them rather than recomputing (and disagreeing).
|
|
83
43
|
*
|
|
84
44
|
* @param {ReturnType<typeof import('./summary.js').buildWaveTable>} waveTable
|
|
85
45
|
* @param {Array<object>} stories The assembled Stories, in draft order.
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wave-serialisation.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Kept out of `summary.js` because it answers a different question. The
|
|
6
|
-
* summary module renders receipts persist already computed; this one runs the
|
|
7
|
-
* *runtime's* collision predicate over the assembled Story bodies to work out
|
|
8
|
-
* which of the table's promises the next tick will refuse to keep.
|
|
2
|
+
* wave-serialisation.js — predicts which of the wave table's parallelism
|
|
3
|
+
* promises the dispatcher will refuse to keep.
|
|
9
4
|
*
|
|
10
5
|
* @module lib/orchestration/plan-persist/wave-serialisation
|
|
11
6
|
*/
|
|
@@ -13,20 +8,9 @@
|
|
|
13
8
|
import { detectCollision } from '../../wave-runner/footprint.js';
|
|
14
9
|
|
|
15
10
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* The wave table answers a `depends_on` question, and the runtime answers a
|
|
20
|
-
* different one: `stories-wave-tick.js` withholds on {@link detectCollision}
|
|
21
|
-
* over the declared `changes[]` (Story #5313 retired the text scrape), so
|
|
22
|
-
* two same-wave Stories that both declare a path — a shared generated
|
|
23
|
-
* baseline, say — are shown in one order and dispatched one at a time. The
|
|
24
|
-
* table promised parallelism the next tick refused, with nothing anywhere
|
|
25
|
-
* reconciling the two.
|
|
26
|
-
*
|
|
27
|
-
* This runs the runtime's own exported predicate — not a reimplementation of
|
|
28
|
-
* it — pairwise within each wave, so the prediction cannot drift from the
|
|
29
|
-
* behaviour it predicts.
|
|
11
|
+
* Same-wave pairs the dispatch guard will refuse to co-dispatch, computed by
|
|
12
|
+
* running the runtime's own {@link detectCollision} pairwise — never a
|
|
13
|
+
* reimplementation — so the prediction cannot drift from the behaviour.
|
|
30
14
|
*
|
|
31
15
|
* @param {ReturnType<typeof buildWaveTable>} waveTable
|
|
32
16
|
* @param {Array<{ slug: string, title?: string, body?: string, spec?: string, changes?: Array }>} stories
|
|
@@ -61,13 +45,8 @@ export function predictWaveSerialisation(waveTable, stories, options = {}) {
|
|
|
61
45
|
}
|
|
62
46
|
|
|
63
47
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* Same shape as {@link renderSharedEditorLines} on purpose: both are caveats
|
|
67
|
-
* against the same promise, and an operator should read them the same way.
|
|
68
|
-
* The difference is what they know — the shared-editor pass names paths two
|
|
69
|
-
* Stories both *write*, this one names every pair the dispatcher will refuse
|
|
70
|
-
* to run together, glob declarations included.
|
|
48
|
+
* Same shape as {@link renderSharedEditorLines} on purpose: both caveat the
|
|
49
|
+
* same promise.
|
|
71
50
|
*
|
|
72
51
|
* @param {ReturnType<typeof predictWaveSerialisation>} collisions
|
|
73
52
|
* @returns {string[]}
|