mandrel 2.59.0 → 2.61.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 +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- 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 +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- 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 +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- 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 +57 -49
- 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 +7 -19
- 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 +39 -121
- 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 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- 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 +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- 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 +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- 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 -124
- 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 +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- 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 +123 -191
- 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 +22 -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 +28 -156
- 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 +121 -157
- 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 +118 -462
- 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 +37 -307
- 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/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- 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 +16 -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 +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- 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 -91
- 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 +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- 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 +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- 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 +136 -486
- 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 +96 -0
- 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 +180 -273
- 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 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- 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 -135
- 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 +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- 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 +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- 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 +67 -209
- 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 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- 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 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- 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/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- 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/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- 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 +60 -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 +326 -523
- 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 +17 -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 +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- 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/schemas/model-attribution.schema.json +0 -53
- 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 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- 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/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- 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 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* summary
|
|
3
|
-
*
|
|
4
|
-
* Upserts a single `plan-summary` structured comment on the primary Story
|
|
5
|
-
* at terminal success. Carries the persist receipts — including whether the
|
|
6
|
-
* operator forced a review stop — and the dry-run `depends_on` ordering table
|
|
7
|
-
* for the rare N>1 plan.
|
|
8
|
-
*
|
|
9
|
-
* Story #4542 removed the risk / review-routing line: no risk level, gate
|
|
10
|
-
* decision, or acceptance disposition is computed at plan time any more, so
|
|
11
|
-
* 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.
|
|
12
4
|
*
|
|
13
5
|
* @module lib/orchestration/plan-persist/summary
|
|
14
6
|
*/
|
|
@@ -17,13 +9,6 @@ import { computeStoryWaves } from '../dependency-analyzer.js';
|
|
|
17
9
|
import { renderPredictedSerialisationLines } from './wave-serialisation.js';
|
|
18
10
|
|
|
19
11
|
/**
|
|
20
|
-
* Structured-comment type for the persist summary.
|
|
21
|
-
*/
|
|
22
|
-
export const PLAN_SUMMARY_COMMENT_TYPE = 'plan-summary';
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Compute the dry-run wave assignment for a validated ticket set.
|
|
26
|
-
*
|
|
27
12
|
* @param {Array<{ slug: string, title?: string, depends_on?: string[] }>} tickets
|
|
28
13
|
* @returns {Array<{ wave: number, stories: Array<{ slug: string, title: string }> }>}
|
|
29
14
|
*/
|
|
@@ -67,21 +52,11 @@ function renderWaveTableLines(waveTable) {
|
|
|
67
52
|
}
|
|
68
53
|
|
|
69
54
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* The wave table is a promise about parallelism — "these Stories can run
|
|
73
|
-
* together". `computeSharedEditorFindings` knows exactly where that promise
|
|
74
|
-
* breaks down: a path two same-wave Stories both write will conflict on every
|
|
75
|
-
* merge after the first. Until now those findings degraded to a `Logger.warn`
|
|
76
|
-
* on stderr and were discarded, so the comment carried the optimistic half of
|
|
77
|
-
* the analysis and none of the caveat. Rendering them here puts the promise
|
|
78
|
-
* and its known exceptions on one durable surface.
|
|
79
|
-
*
|
|
80
|
-
* Advisory by default and labelled as such — `planning.failOnSharedEditors`
|
|
81
|
-
* 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.
|
|
82
57
|
*
|
|
83
58
|
* @param {object[]|null} conflictFindings
|
|
84
|
-
* @returns {string[]}
|
|
59
|
+
* @returns {string[]}
|
|
85
60
|
*/
|
|
86
61
|
function renderSharedEditorLines(conflictFindings) {
|
|
87
62
|
const shared = (
|
|
@@ -114,8 +89,6 @@ function renderSharedEditorLines(conflictFindings) {
|
|
|
114
89
|
}
|
|
115
90
|
|
|
116
91
|
/**
|
|
117
|
-
* Build the `plan-summary` structured-comment 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,22 +127,19 @@ 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(' ')}`
|
|
169
139
|
: '/mandrel-deliver <storyId> [<storyId> ...]';
|
|
170
140
|
|
|
171
141
|
return [
|
|
172
|
-
|
|
142
|
+
`#### 📋 Plan Summary — Story #${epicId} is \`agent::ready\``,
|
|
173
143
|
'',
|
|
174
144
|
`- ${ticketCount} Story ticket(s) persisted: ${storyList}.`,
|
|
175
145
|
...reviewLines,
|
|
@@ -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. **`assertSupersedePartition`** — a plan-time, fail-closed check that
|
|
19
|
-
* runs *before* any GitHub write. Same fail-closed shape as the
|
|
20
|
-
* every id passed to `--tickets` must be claimed by exactly one Story,
|
|
21
|
-
* and no Story may claim an id that was not a source ticket. A partial
|
|
22
|
-
* supersede map is a planning error, not something to paper over at
|
|
23
|
-
* write time.
|
|
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,18 +191,10 @@ function describeStoryIds(entries) {
|
|
|
279
191
|
}
|
|
280
192
|
|
|
281
193
|
/**
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
* Runs **before** `createIssue` so a mis-authored map never leaves Stories
|
|
285
|
-
* live against an inconsistent tracker.
|
|
286
|
-
*
|
|
287
|
-
* @param {Array<{ slug: string, supersedes: Array<{ id: number }> }>} stories
|
|
288
|
-
* @param {number[]} sourceTicketIds Ids passed to `/mandrel-plan --tickets`.
|
|
194
|
+
* @param {Array<{ slug: string, supersedes?: Array<{ id: number }> }>} list
|
|
195
|
+
* @returns {Map<number, string[]>} id → claiming slugs, in draft order.
|
|
289
196
|
*/
|
|
290
|
-
|
|
291
|
-
const list = Array.isArray(stories) ? stories : [];
|
|
292
|
-
const sources = new Set(sourceTicketIds);
|
|
293
|
-
|
|
197
|
+
function indexSupersedeClaims(list) {
|
|
294
198
|
/** @type {Map<number, string[]>} */
|
|
295
199
|
const claims = new Map();
|
|
296
200
|
for (const story of list) {
|
|
@@ -300,9 +204,25 @@ export function assertSupersedePartition(stories, sourceTicketIds = []) {
|
|
|
300
204
|
claims.set(id, owners);
|
|
301
205
|
}
|
|
302
206
|
}
|
|
207
|
+
return claims;
|
|
208
|
+
}
|
|
303
209
|
|
|
304
|
-
|
|
210
|
+
/**
|
|
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.
|
|
214
|
+
*
|
|
215
|
+
* @param {Array<{ slug: string, supersedes: Array<{ id: number, note: string|null }> }>} stories
|
|
216
|
+
* Dependency-ordered and non-empty.
|
|
217
|
+
* @param {number[]} sourceTicketIds Ids passed to `/mandrel-plan --tickets`.
|
|
218
|
+
* @returns {string[]} One warning per id assigned by default.
|
|
219
|
+
*/
|
|
220
|
+
export function resolveSupersedePartition(stories, sourceTicketIds = []) {
|
|
221
|
+
const list = Array.isArray(stories) ? stories : [];
|
|
222
|
+
const sources = new Set(sourceTicketIds);
|
|
223
|
+
const claims = indexSupersedeClaims(list);
|
|
305
224
|
|
|
225
|
+
const errors = [];
|
|
306
226
|
for (const [id, owners] of claims) {
|
|
307
227
|
if (owners.length > 1) {
|
|
308
228
|
errors.push(
|
|
@@ -317,32 +237,31 @@ export function assertSupersedePartition(stories, sourceTicketIds = []) {
|
|
|
317
237
|
);
|
|
318
238
|
}
|
|
319
239
|
}
|
|
320
|
-
|
|
321
|
-
for (const id of sources) {
|
|
322
|
-
if (!claims.has(id)) {
|
|
323
|
-
errors.push(
|
|
324
|
-
`source ticket #${id} is not claimed by any Story's supersedes[] — ` +
|
|
325
|
-
'a partial supersede map is a planning error. Claim it, or drop it ' +
|
|
326
|
-
'from --tickets.',
|
|
327
|
-
);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
240
|
if (errors.length > 0) {
|
|
332
241
|
throw new Error(
|
|
333
242
|
`[plan-persist] supersede partition failed with ${errors.length} ` +
|
|
334
243
|
`error(s):\n${errors.map((e) => ` - ${e}`).join('\n')}`,
|
|
335
244
|
);
|
|
336
245
|
}
|
|
246
|
+
|
|
247
|
+
const primary = list[0];
|
|
248
|
+
const warnings = [];
|
|
249
|
+
for (const id of sources) {
|
|
250
|
+
if (claims.has(id)) continue;
|
|
251
|
+
primary.supersedes = [...(primary.supersedes ?? []), { id, note: null }];
|
|
252
|
+
warnings.push(
|
|
253
|
+
`source ticket #${id} was claimed by no Story's supersedes[] — ` +
|
|
254
|
+
`assigned to the primary Story "${primary.slug}". Author the claim ` +
|
|
255
|
+
'explicitly if another Story is the one that replaces it.',
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
return warnings;
|
|
337
259
|
}
|
|
338
260
|
|
|
339
261
|
/**
|
|
340
|
-
* Render the supersede comment posted on a source issue.
|
|
341
|
-
*
|
|
342
262
|
* @param {object} args
|
|
343
263
|
* @param {{ id: number, title: string }} args.story The claiming Story.
|
|
344
|
-
* @param {string|null} [args.note]
|
|
345
|
-
* the Story — carries a correction to this issue's analysis.
|
|
264
|
+
* @param {string|null} [args.note] Correction to this issue's analysis.
|
|
346
265
|
* @param {number[]} args.sourceTicketIds Full `--tickets` argument.
|
|
347
266
|
* @returns {string}
|
|
348
267
|
*/
|
|
@@ -351,8 +270,6 @@ export function buildSupersedeCommentBody({
|
|
|
351
270
|
note = null,
|
|
352
271
|
sourceTicketIds,
|
|
353
272
|
}) {
|
|
354
|
-
// Story #4540 retired the plan-run label, which used to be listed here
|
|
355
|
-
// alongside the type/state labels.
|
|
356
273
|
const labels = ['`type::story`', '`agent::ready`'];
|
|
357
274
|
|
|
358
275
|
const lines = [
|
|
@@ -372,12 +289,7 @@ export function buildSupersedeCommentBody({
|
|
|
372
289
|
}
|
|
373
290
|
|
|
374
291
|
/**
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
* The ticket itself rides along so the close can strip the `agent::*` label
|
|
378
|
-
* without a second read: `updateTicket`'s label merge takes a
|
|
379
|
-
* `_ticketSnapshot` for exactly this, and this probe has already paid for the
|
|
380
|
-
* fresh copy.
|
|
292
|
+
* The ticket rides along so the close needs no second read.
|
|
381
293
|
*
|
|
382
294
|
* @returns {Promise<{ ok: true, state: string, ticket: object } | { ok: false, reason: string }>}
|
|
383
295
|
*/
|
|
@@ -436,18 +348,13 @@ async function closeOneSupersededTicket({
|
|
|
436
348
|
* @property {boolean} enabled
|
|
437
349
|
* @property {boolean} dryRun
|
|
438
350
|
* @property {string|null} reason Why the phase was skipped wholesale.
|
|
439
|
-
* @property {'flag'|'envelope'|'none'} [sourceTicketOrigin]
|
|
440
|
-
* source ids came from. Stamped by `runPlanPersist`, not this module.
|
|
351
|
+
* @property {'flag'|'envelope'|'none'} [sourceTicketOrigin] Stamped by `runPlanPersist`.
|
|
441
352
|
* @property {number[]} closed
|
|
442
353
|
* @property {Array<{ ticket: number, storySlug: string }>} planned Dry-run
|
|
443
|
-
* only
|
|
444
|
-
* `createStoryIssues` hands back a synthetic negative placeholder id. The
|
|
445
|
-
* slug is the only identifier that means anything before the writes land.
|
|
354
|
+
* only; keyed by slug because dry-run Story ids are placeholders.
|
|
446
355
|
* @property {Array<{ ticket: number, reason: string }>} skipped
|
|
447
356
|
* @property {Array<{ ticket: number, reason: string }>} failed
|
|
448
|
-
* @property {{ closed: number[], pending: number[] }} epicRollup
|
|
449
|
-
* Epics this phase's closes resolved. Empty on a dry run and on a phase that
|
|
450
|
-
* closed nothing.
|
|
357
|
+
* @property {{ closed: number[], pending: number[] }} epicRollup
|
|
451
358
|
*/
|
|
452
359
|
|
|
453
360
|
function emptyReport(overrides) {
|
|
@@ -465,22 +372,10 @@ function emptyReport(overrides) {
|
|
|
465
372
|
}
|
|
466
373
|
|
|
467
374
|
/**
|
|
468
|
-
* Re-derive the container Epic above every ticket
|
|
469
|
-
*
|
|
470
|
-
*
|
|
471
|
-
*
|
|
472
|
-
* its container open indefinitely: every child was closed, so no delivery
|
|
473
|
-
* would ever run and no land tail would ever fire the derivation. The Epic sat
|
|
474
|
-
* open above finished work until someone noticed.
|
|
475
|
-
*
|
|
476
|
-
* Runs **after** the closes land, never alongside them: the rollup reads each
|
|
477
|
-
* child's state back, so racing it against the writes it is meant to observe
|
|
478
|
-
* would derive from a tree half of which has not been written yet.
|
|
479
|
-
*
|
|
480
|
-
* Sequential, sharing one `skipEpicIds` set, because siblings share a
|
|
481
|
-
* container — without it the second ticket re-derives, and re-closes, the Epic
|
|
482
|
-
* the first already closed. `rollUpEpicForStory` never throws, so no guard is
|
|
483
|
-
* 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.
|
|
484
379
|
*
|
|
485
380
|
* @param {{ closedIds: number[], provider: object, config?: object }} opts
|
|
486
381
|
* @returns {Promise<{ closed: number[], pending: number[] }>}
|
|
@@ -507,11 +402,8 @@ async function rollUpContainersFor({ closedIds, provider, config }) {
|
|
|
507
402
|
}
|
|
508
403
|
|
|
509
404
|
/**
|
|
510
|
-
* Comment on and close every superseded source ticket.
|
|
511
|
-
*
|
|
512
|
-
* **Never throws** and never fails the run — Stories are already live by the
|
|
513
|
-
* time this executes, so bookkeeping failures degrade to a report the
|
|
514
|
-
* 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.
|
|
515
407
|
*
|
|
516
408
|
* @param {object} args
|
|
517
409
|
* @param {object} args.provider
|
|
@@ -545,12 +437,9 @@ export async function closeSupersededTickets({
|
|
|
545
437
|
);
|
|
546
438
|
const units = collectSupersedeUnits(stories, createdBySlug);
|
|
547
439
|
|
|
548
|
-
//
|
|
549
|
-
//
|
|
550
|
-
//
|
|
551
|
-
// first-rejection-wins policy can never fire and no unit is abandoned
|
|
552
|
-
// because a sibling failed. Input order is preserved, so the report arrays
|
|
553
|
-
// 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.
|
|
554
443
|
const outcomes = await concurrentMap(
|
|
555
444
|
units,
|
|
556
445
|
({ id, note, createdStory }) => {
|
|
@@ -566,13 +455,6 @@ export async function closeSupersededTickets({
|
|
|
566
455
|
sourceTicketIds: sources,
|
|
567
456
|
});
|
|
568
457
|
},
|
|
569
|
-
// The per-source-ticket close (Story #4952) fans out across **distinct**
|
|
570
|
-
// tickets — `assertSupersedePartition` has already failed the run closed
|
|
571
|
-
// if two Stories claim the same id, so no two units in flight can touch
|
|
572
|
-
// the same issue. Within one unit the probe → comment → close sequence
|
|
573
|
-
// stays strictly ordered: commenting on an issue the probe reported
|
|
574
|
-
// closed, or closing one the comment never landed on, is the whole
|
|
575
|
-
// failure mode this phase is careful about.
|
|
576
458
|
{ concurrency: FANOUT_CONCURRENCY },
|
|
577
459
|
);
|
|
578
460
|
|
|
@@ -594,9 +476,6 @@ export async function closeSupersededTickets({
|
|
|
594
476
|
}
|
|
595
477
|
|
|
596
478
|
/**
|
|
597
|
-
* Flatten the per-Story `supersedes[]` maps into one list of close units, in
|
|
598
|
-
* the nested iteration order the report arrays are expected to follow.
|
|
599
|
-
*
|
|
600
479
|
* @param {Array<{ slug: string, supersedes?: Array<{ id: number, note: string|null }> }>|undefined} stories
|
|
601
480
|
* @param {Map<string, { slug: string, id: number, title: string }>} createdBySlug
|
|
602
481
|
* @returns {Array<{ id: number, note: string|null, createdStory: object|undefined }>}
|
|
@@ -613,8 +492,6 @@ function collectSupersedeUnits(stories, createdBySlug) {
|
|
|
613
492
|
}
|
|
614
493
|
|
|
615
494
|
/**
|
|
616
|
-
* File one unit's outcome onto the report.
|
|
617
|
-
*
|
|
618
495
|
* @param {SupersedeReport} report
|
|
619
496
|
* @param {{ id: number, createdStory: object|undefined }} unit
|
|
620
497
|
* @param {{ outcome: string, reason?: string }} result
|
|
@@ -640,9 +517,6 @@ function recordSupersedeOutcome(report, unit, result) {
|
|
|
640
517
|
}
|
|
641
518
|
|
|
642
519
|
/**
|
|
643
|
-
* Surface the supersede outcome on the console so a partial failure is
|
|
644
|
-
* visible without reading the JSON envelope.
|
|
645
|
-
*
|
|
646
520
|
* @param {SupersedeReport} report
|
|
647
521
|
*/
|
|
648
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[]}
|