mandrel 2.60.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 +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/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 +83 -239
- 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 +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 +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 +25 -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
|
@@ -12,27 +12,18 @@ import {
|
|
|
12
12
|
import { computeConflictFindings } from './ticket-validator-conflicts.js';
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* the decomposer's tasks legitimately reference. Anchoring on the leading dot
|
|
18
|
-
* for `.agents` and a word boundary for `lib`/`tests` keeps URLs, image paths,
|
|
19
|
-
* and unrelated prose ("library", "testimonial", "established") from being
|
|
20
|
-
* scanned as fictitious file references.
|
|
21
|
-
*
|
|
22
|
-
* The regex is intentionally global + multi-match per body string so a single
|
|
23
|
-
* Task naming several files surfaces every miss in one error.
|
|
15
|
+
* Code-asset paths under `.agents/scripts`, `lib`, `tests`. The leading
|
|
16
|
+
* delimiter keeps URLs and prose ("library") out. Global: every miss surfaces.
|
|
24
17
|
*/
|
|
25
18
|
const FRESHNESS_PATH_RE =
|
|
26
19
|
/(?:^|[\s`([<])(\.agents\/scripts|lib|tests)\/[\w./-]+\.js\b/g;
|
|
27
20
|
|
|
28
21
|
function collectPathsFromText(text, paths) {
|
|
29
22
|
if (!text || typeof text !== 'string') return;
|
|
30
|
-
// Reset lastIndex on the shared regex literal between calls.
|
|
31
23
|
FRESHNESS_PATH_RE.lastIndex = 0;
|
|
32
24
|
let match = FRESHNESS_PATH_RE.exec(text);
|
|
33
25
|
while (match !== null) {
|
|
34
|
-
//
|
|
35
|
-
// delimiter — slice it off so the path is a clean repo-relative reference.
|
|
26
|
+
// Slice off the leading delimiter the match includes.
|
|
36
27
|
const captured = match[0];
|
|
37
28
|
const rootStart = captured.indexOf(match[1]);
|
|
38
29
|
paths.add(captured.slice(rootStart));
|
|
@@ -52,8 +43,7 @@ function collectTaskPathReferences(task) {
|
|
|
52
43
|
for (const item of arr) collectPathsFromText(String(item ?? ''), paths);
|
|
53
44
|
}
|
|
54
45
|
}
|
|
55
|
-
// Some planner shapes carry
|
|
56
|
-
// bodies — scan it defensively.
|
|
46
|
+
// Some planner shapes carry top-level `acceptance` even on string bodies.
|
|
57
47
|
if (Array.isArray(task.acceptance)) {
|
|
58
48
|
for (const item of task.acceptance) {
|
|
59
49
|
collectPathsFromText(String(item ?? ''), paths);
|
|
@@ -63,48 +53,17 @@ function collectTaskPathReferences(task) {
|
|
|
63
53
|
}
|
|
64
54
|
|
|
65
55
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
* Three shapes are accepted:
|
|
72
|
-
*
|
|
73
|
-
* 1. **Canonical string body** — the body is a markdown string produced by
|
|
74
|
-
* `serialize()` from `story-body.js`. Parsed via `parse()` to extract
|
|
75
|
-
* the structured `changes[]` and `references[]` arrays. This is the
|
|
76
|
-
* shape emitted by the decomposer after Story #3302.
|
|
77
|
-
* 2. **Legacy string bullets** — `"<path>: <verb> <object>"` inside an
|
|
78
|
-
* object body's `changes[]`. The regex `FRESHNESS_PATH_RE` picks the
|
|
79
|
-
* path out of the prose.
|
|
80
|
-
* 3. **Object form** — `{ path: "<path>", assumption: "creates" | ... }`,
|
|
81
|
-
* introduced by Story #2636 as the canonical declaration shape and
|
|
82
|
-
* documented in `lib/templates/decomposer-prompts.js`. The path is
|
|
83
|
-
* trusted verbatim.
|
|
84
|
-
*
|
|
85
|
-
* Only `body.changes` (and `body.references`) is consulted —
|
|
86
|
-
* `body.goal`, `body.acceptance`, and `body.verify` are deliberately
|
|
87
|
-
* excluded so the gate continues to flag a planner that hallucinates a
|
|
88
|
-
* fictitious file in narrative copy without declaring it in the
|
|
89
|
-
* changes/references contract.
|
|
56
|
+
* Paths a Story declares in `changes[]` / `references[]` — exempt from the
|
|
57
|
+
* freshness probe since they may be net-new. Accepts a serialized markdown
|
|
58
|
+
* body, string bullets, or `{ path, assumption }` objects. Goal / acceptance
|
|
59
|
+
* / verify are deliberately excluded so undeclared narrative paths still flag.
|
|
90
60
|
*/
|
|
91
61
|
function collectTaskChangesPaths(task) {
|
|
92
62
|
const paths = new Set();
|
|
93
63
|
const body = task.body;
|
|
94
64
|
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
// arrays before scanning. Without this, a string body causes the
|
|
98
|
-
// object-form branch below to fall through on every item, leaving the
|
|
99
|
-
// freshness gate blind to declared paths.
|
|
100
|
-
//
|
|
101
|
-
// Story #4541: a parse failure is NOT swallowed here. Swallowing it
|
|
102
|
-
// returned an empty whitelist, so a single malformed `## Changes` entry
|
|
103
|
-
// surfaced downstream as "files do not exist at main" naming the very
|
|
104
|
-
// paths the Story *had* declared — a misdiagnosis that cost two authoring
|
|
105
|
-
// round-trips. `assertStoryBodiesParse` runs before the freshness gate and
|
|
106
|
-
// owns that failure with a named error; the throw here is the same error
|
|
107
|
-
// for any caller that drives `validateAcFreshness` directly.
|
|
65
|
+
// A parse failure throws rather than yielding an empty whitelist, which
|
|
66
|
+
// would misreport every declared path as missing.
|
|
108
67
|
if (typeof body === 'string' && body.trim().length > 0) {
|
|
109
68
|
const parsed = parseStoryBodyOrThrow(task);
|
|
110
69
|
for (const arrName of ['changes', 'references']) {
|
|
@@ -146,14 +105,6 @@ function collectTaskChangesPaths(task) {
|
|
|
146
105
|
return paths;
|
|
147
106
|
}
|
|
148
107
|
|
|
149
|
-
/**
|
|
150
|
-
* Default git probe: returns true when `path` exists at `ref` in the cwd repo.
|
|
151
|
-
* Uses `git cat-file -e <ref>:<path>` which is the standard low-cost existence
|
|
152
|
-
* check (no blob materialisation, no tree walk in node).
|
|
153
|
-
*
|
|
154
|
-
* Callers may inject their own runner with the same `(ref, path) => boolean`
|
|
155
|
-
* signature for unit tests.
|
|
156
|
-
*/
|
|
157
108
|
function defaultGitRunner({ baseBranchRef, path, cwd }) {
|
|
158
109
|
const result = gitSpawn(
|
|
159
110
|
cwd ?? process.cwd(),
|
|
@@ -165,13 +116,9 @@ function defaultGitRunner({ baseBranchRef, path, cwd }) {
|
|
|
165
116
|
}
|
|
166
117
|
|
|
167
118
|
/**
|
|
168
|
-
*
|
|
169
|
-
* `"${baseBranchRef}:${path}"`. The wrapper is created once per
|
|
170
|
-
* `validateAndNormalizeTickets` call and threaded into both
|
|
171
|
-
* `validateAcFreshness` and `validateStoryFileAssumptions` so the two gates
|
|
172
|
-
* share a single probe cache rather than maintaining independent ones.
|
|
119
|
+
* One cache shared by the freshness and file-assumption gates.
|
|
173
120
|
*
|
|
174
|
-
* @param {Function} runner -
|
|
121
|
+
* @param {Function} runner - `({ baseBranchRef, path, cwd }) => boolean`.
|
|
175
122
|
* @returns {Function} A memoized probe with the same signature.
|
|
176
123
|
*/
|
|
177
124
|
function makeMemoizedGitRunner(runner) {
|
|
@@ -188,22 +135,14 @@ function makeMemoizedGitRunner(runner) {
|
|
|
188
135
|
}
|
|
189
136
|
|
|
190
137
|
/**
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
* means the planner named a file it is about to create without declaring it,
|
|
194
|
-
* or a stale reference — worth saying, not worth refusing on: Story #5312
|
|
195
|
-
* demoted this gate from a throw to the **warning list** the dry-run prints,
|
|
196
|
-
* because the paths a goal or acceptance line names are prose the deliverer
|
|
197
|
-
* reads against the real tree, never a contract the validator can hold it to.
|
|
198
|
-
*
|
|
199
|
-
* Only Stories are scanned — they are the implementation unit; the Epic
|
|
200
|
-
* carries narrative copy, not implementation paths.
|
|
138
|
+
* Warn (never refuse) on Story-referenced code paths absent at the base:
|
|
139
|
+
* narrative paths are prose, not a contract the validator can enforce.
|
|
201
140
|
*
|
|
202
141
|
* @param {object} opts
|
|
203
|
-
* @param {object[]} opts.tickets
|
|
204
|
-
* @param {string} opts.baseBranchRef
|
|
205
|
-
* @param {Function} [opts.gitRunner]
|
|
206
|
-
* @param {string} [opts.cwd]
|
|
142
|
+
* @param {object[]} opts.tickets
|
|
143
|
+
* @param {string} opts.baseBranchRef
|
|
144
|
+
* @param {Function} [opts.gitRunner]
|
|
145
|
+
* @param {string} [opts.cwd]
|
|
207
146
|
* @returns {string[]} One warning line per missing reference, empty when clean.
|
|
208
147
|
*/
|
|
209
148
|
export function validateAcFreshness({
|
|
@@ -218,11 +157,7 @@ export function validateAcFreshness({
|
|
|
218
157
|
);
|
|
219
158
|
}
|
|
220
159
|
const stories = (tickets ?? []).filter((t) => t.type === 'story');
|
|
221
|
-
//
|
|
222
|
-
// path the planner has declared in `changes` is considered intentional
|
|
223
|
-
// (net-new or about-to-be-modified) and the git probe is skipped for it
|
|
224
|
-
// — otherwise the freshness gate would reject the very test/source file
|
|
225
|
-
// a Story is meant to create, even when the Story is well-formed.
|
|
160
|
+
// Declared paths (any Story) are intentional and skip the probe.
|
|
226
161
|
const expectedNewPaths = new Set();
|
|
227
162
|
for (const story of stories) {
|
|
228
163
|
for (const path of collectTaskChangesPaths(story)) {
|
|
@@ -230,8 +165,6 @@ export function validateAcFreshness({
|
|
|
230
165
|
}
|
|
231
166
|
}
|
|
232
167
|
const misses = [];
|
|
233
|
-
// Cache per-path probe results — sibling Stories frequently cite the same
|
|
234
|
-
// helper module; avoid re-spawning git for each repeat.
|
|
235
168
|
const probeCache = new Map();
|
|
236
169
|
for (const story of stories) {
|
|
237
170
|
const refs = collectTaskPathReferences(story);
|
|
@@ -250,44 +183,24 @@ export function validateAcFreshness({
|
|
|
250
183
|
return misses.map((m) => renderMissLine(m, baseBranchRef));
|
|
251
184
|
}
|
|
252
185
|
|
|
253
|
-
/**
|
|
254
|
-
* Render one missing-path warning with a remediation hint pointing at the
|
|
255
|
-
* Story's `changes[]`. For `tests/**` paths we suggest the explicit
|
|
256
|
-
* "add the test file" verb; for everything else we emit a generic hint
|
|
257
|
-
* since the planner knows whether the path is net-new or a typo.
|
|
258
|
-
*/
|
|
259
186
|
function renderMissLine({ slug, path }, baseBranchRef) {
|
|
260
187
|
const verb = path.startsWith('tests/') ? 'add test file' : 'create';
|
|
261
188
|
return `Story "${slug}" references ${path}, which does not exist at ${baseBranchRef} — if net-new, declare {"path":"${path}","assumption":"creates"} in changes[] (${verb}); otherwise fix the typo or stale reference.`;
|
|
262
189
|
}
|
|
263
190
|
|
|
264
191
|
/**
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
* - `errors` — human-readable strings, one per hard refusal: a `deletes`
|
|
270
|
-
* naming a path absent at base (prefixed `File assumption mismatch:`).
|
|
271
|
-
* The hierarchy/cycle/parse checks continue to throw.
|
|
272
|
-
* - `warnings` — the demoted footprint probes (Story #5312): a `creates`
|
|
273
|
-
* or `refactors-existing` mismatch, a goal/acceptance/verify path absent
|
|
274
|
-
* at base. Listed by the dry-run; the persist proceeds.
|
|
275
|
-
* - `normalizations` — the `refactors-existing`→`creates` rewrites applied.
|
|
192
|
+
* Hierarchy, cycle and parse checks throw. The returned array also carries
|
|
193
|
+
* non-enumerable `findings` (advisory conflicts), `errors` (a `deletes` of a
|
|
194
|
+
* path absent at base), `warnings` (demoted footprint probes) and
|
|
195
|
+
* `normalizations` (`refactors-existing`→`creates` rewrites).
|
|
276
196
|
*
|
|
277
|
-
* @param {object[]} tickets
|
|
197
|
+
* @param {object[]} tickets
|
|
278
198
|
* @param {object} [opts]
|
|
279
|
-
* @param {string} [opts.baseBranchRef] -
|
|
280
|
-
* @param {Function} [opts.gitRunner]
|
|
281
|
-
* @param {string} [opts.cwd]
|
|
199
|
+
* @param {string} [opts.baseBranchRef] - Enables the base-branch probes.
|
|
200
|
+
* @param {Function} [opts.gitRunner]
|
|
201
|
+
* @param {string} [opts.cwd]
|
|
282
202
|
* @returns {object[] & { findings: object[], errors: string[], warnings: string[], normalizations: object[] }}
|
|
283
203
|
*/
|
|
284
|
-
/**
|
|
285
|
-
* Internal helpers extracted from `validateAndNormalizeTickets` so each
|
|
286
|
-
* stage can be unit-tested in isolation and the orchestration method stays
|
|
287
|
-
* at a low cyclomatic complexity. Exported via the `_internal` bundle at
|
|
288
|
-
* the bottom of the module for tests; production callers should keep
|
|
289
|
-
* using `validateAndNormalizeTickets`.
|
|
290
|
-
*/
|
|
291
204
|
|
|
292
205
|
function indexTicketsBySlug(tickets) {
|
|
293
206
|
const ticketBySlug = new Map();
|
|
@@ -302,9 +215,7 @@ function indexTicketsBySlug(tickets) {
|
|
|
302
215
|
}
|
|
303
216
|
ticketBySlug.set(t.slug, t);
|
|
304
217
|
}
|
|
305
|
-
// External `#<id>` refs
|
|
306
|
-
// not nodes in this run's graph — they cannot close a cycle back into a
|
|
307
|
-
// Story that does not exist yet, so they are not edges here.
|
|
218
|
+
// External `#<id>` refs are tracker issues, not graph nodes — no cycle.
|
|
308
219
|
slugAdjacency.set(
|
|
309
220
|
t.slug,
|
|
310
221
|
(t.depends_on ?? []).filter((d) => !isExternalDependencyRef(d)),
|
|
@@ -314,12 +225,7 @@ function indexTicketsBySlug(tickets) {
|
|
|
314
225
|
return { ticketBySlug, stories, slugAdjacency };
|
|
315
226
|
}
|
|
316
227
|
|
|
317
|
-
/**
|
|
318
|
-
* 2-tier invariant (Story #4041): the decomposer emits Stories only — every
|
|
319
|
-
* ticket in the backlog must be `type: "story"` and at least one must be
|
|
320
|
-
* present. Any other type (the retired `feature`/`task` tiers, or planner
|
|
321
|
-
* hallucinations) HARD-rejects the decomposition.
|
|
322
|
-
*/
|
|
228
|
+
/** Every ticket must be `type: "story"`, and at least one must exist. */
|
|
323
229
|
function assertAllTicketsAreStories({ tickets, stories }) {
|
|
324
230
|
const nonStories = (tickets ?? []).filter((t) => t.type !== 'story');
|
|
325
231
|
if (nonStories.length > 0) {
|
|
@@ -338,16 +244,8 @@ function assertAllTicketsAreStories({ tickets, stories }) {
|
|
|
338
244
|
}
|
|
339
245
|
|
|
340
246
|
/**
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
* implementation unit and its criteria live on the Story rather than in
|
|
344
|
-
* child Task tickets.
|
|
345
|
-
*
|
|
346
|
-
* Story #5342 narrowed the invariant to `acceptance[]` alone. A Story with
|
|
347
|
-
* no observable criterion is genuinely unimplementable and nothing
|
|
348
|
-
* downstream can recover it; an empty `verify[]` only means the deliverer
|
|
349
|
-
* picks the commands, which the close gate chain runs regardless — so that
|
|
350
|
-
* half is a warning ({@link collectMissingVerifyWarnings}), not a refusal.
|
|
247
|
+
* Only `acceptance[]` is required: a Story with no criterion is
|
|
248
|
+
* unimplementable, while an empty `verify[]` is merely a warning.
|
|
351
249
|
*/
|
|
352
250
|
function hasInlineAcceptance(story) {
|
|
353
251
|
if (story === null || typeof story !== 'object') return false;
|
|
@@ -365,13 +263,6 @@ function assertEveryStoryHasInlineContract({ stories }) {
|
|
|
365
263
|
}
|
|
366
264
|
|
|
367
265
|
/**
|
|
368
|
-
* One warning per Story with no `verify[]` entry (Story #5342).
|
|
369
|
-
*
|
|
370
|
-
* Demoted from the hard refusal above: an absent verify list costs the
|
|
371
|
-
* acceptance critic its cheapest evidence, which is worth saying on the
|
|
372
|
-
* dry-run, but it never makes the Story unimplementable — the deliverer
|
|
373
|
-
* derives the commands and the close gate chain runs either way.
|
|
374
|
-
*
|
|
375
266
|
* @param {object[]} stories
|
|
376
267
|
* @returns {string[]}
|
|
377
268
|
*/
|
|
@@ -388,18 +279,8 @@ function collectMissingVerifyWarnings(stories) {
|
|
|
388
279
|
}
|
|
389
280
|
|
|
390
281
|
/**
|
|
391
|
-
*
|
|
392
|
-
*
|
|
393
|
-
* The field decides which audit identities persist stamps into a Story body,
|
|
394
|
-
* so a malformed entry has to fail at the validator rather than at the
|
|
395
|
-
* stamper: by the time assembly runs, an unnoticed drop is indistinguishable
|
|
396
|
-
* from a Story that legitimately owns nothing — and the cost lands a whole
|
|
397
|
-
* sweep later, when the next audit re-files work this plan already tracked.
|
|
398
|
-
*
|
|
399
|
-
* Absence is valid and common: a Story with no `provenance` inherits the
|
|
400
|
-
* whole-seed union carry, which is the recall-safe default.
|
|
401
|
-
*
|
|
402
|
-
* Errors are batched across the backlog so one pass names every offender.
|
|
282
|
+
* Fail malformed `provenance` here: at the stamper a silent drop looks like a
|
|
283
|
+
* Story owning nothing. Absent is valid (inherits the seed-wide union).
|
|
403
284
|
*
|
|
404
285
|
* @param {{ stories: object[] }} args
|
|
405
286
|
* @throws {Error} naming each malformed field.
|
|
@@ -426,8 +307,7 @@ function assertNoUnknownDeps({ tickets, ticketBySlug }) {
|
|
|
426
307
|
const unknownDeps = [];
|
|
427
308
|
for (const t of tickets) {
|
|
428
309
|
for (const depSlug of t.depends_on ?? []) {
|
|
429
|
-
//
|
|
430
|
-
// (`assertExternalDependenciesResolvable`), never against this backlog.
|
|
310
|
+
// External refs resolve against the tracker at persist.
|
|
431
311
|
if (isExternalDependencyRef(depSlug)) continue;
|
|
432
312
|
if (!ticketBySlug.has(depSlug)) {
|
|
433
313
|
unknownDeps.push({ slug: t.slug, title: t.title, dep: depSlug });
|
|
@@ -460,10 +340,6 @@ function attachFindingsAndErrors(
|
|
|
460
340
|
['findings', findings],
|
|
461
341
|
['errors', errors],
|
|
462
342
|
['warnings', warnings],
|
|
463
|
-
// Story #5265: the auto-normalizations the assumption gate applied. They
|
|
464
|
-
// used to end at a `Logger.warn` and die with the process, so persist's
|
|
465
|
-
// emitted result reported a plan whose declarations it had silently
|
|
466
|
-
// rewritten as if nothing had been rewritten.
|
|
467
343
|
['normalizations', normalizations],
|
|
468
344
|
]) {
|
|
469
345
|
Object.defineProperty(tickets, key, {
|
|
@@ -485,29 +361,16 @@ export function validateAndNormalizeTickets(tickets, opts = {}) {
|
|
|
485
361
|
|
|
486
362
|
assertAcyclic(slugAdjacency);
|
|
487
363
|
|
|
488
|
-
//
|
|
489
|
-
//
|
|
490
|
-
// freshness gate: it parses the body, and its net-new whitelist comes from
|
|
491
|
-
// `body.changes`, so a malformed body used to surface as a stale-path miss
|
|
492
|
-
// naming the paths the Story had legitimately declared.
|
|
364
|
+
// Must precede the freshness gate, whose whitelist comes from the parsed
|
|
365
|
+
// body — a malformed body would otherwise read as stale paths.
|
|
493
366
|
assertStoryBodiesParse({ tickets });
|
|
494
367
|
|
|
495
|
-
// Hoist a single memoized (ref, path) → boolean probe shared across both
|
|
496
|
-
// git-probe gates below. Without this, `validateAcFreshness` and
|
|
497
|
-
// `validateStoryFileAssumptions` each maintain an independent cache, so a
|
|
498
|
-
// path that appears in both the AC-freshness scan and the file-assumption
|
|
499
|
-
// scan spawns two `git cat-file` processes. The memoizing wrapper captures
|
|
500
|
-
// results by `"${baseBranchRef}:${path}"` key so the second gate reuses
|
|
501
|
-
// the first's results without any additional git I/O.
|
|
502
368
|
const sharedGitRunner = opts.baseBranchRef
|
|
503
369
|
? makeMemoizedGitRunner(opts.gitRunner ?? defaultGitRunner)
|
|
504
370
|
: null;
|
|
505
371
|
|
|
506
372
|
const warnings = [...collectMissingVerifyWarnings(stories)];
|
|
507
|
-
//
|
|
508
|
-
// warning the dry-run lists, not a refusal. Skipped when the caller omits
|
|
509
|
-
// `baseBranchRef` so unit tests keep their semantics; production
|
|
510
|
-
// call-sites always pass it.
|
|
373
|
+
// Base probes run only with `baseBranchRef` (production always passes it).
|
|
511
374
|
if (opts.baseBranchRef) {
|
|
512
375
|
warnings.push(
|
|
513
376
|
...validateAcFreshness({
|
|
@@ -519,10 +382,7 @@ export function validateAndNormalizeTickets(tickets, opts = {}) {
|
|
|
519
382
|
);
|
|
520
383
|
}
|
|
521
384
|
|
|
522
|
-
//
|
|
523
|
-
// declared `{ path, assumption }` against the actual state of the base
|
|
524
|
-
// branch. A `deletes` on an absent path batches into the validator's
|
|
525
|
-
// errors envelope; every other mismatch is a warning (Story #5312).
|
|
385
|
+
// Only a `deletes` of an absent path is an error; other mismatches warn.
|
|
526
386
|
let assumptionErrors = [];
|
|
527
387
|
let assumptionNormalizations = [];
|
|
528
388
|
if (opts.baseBranchRef) {
|
|
@@ -537,9 +397,7 @@ export function validateAndNormalizeTickets(tickets, opts = {}) {
|
|
|
537
397
|
assumptionNormalizations = assumptionReport.normalizations ?? [];
|
|
538
398
|
}
|
|
539
399
|
|
|
540
|
-
//
|
|
541
|
-
// graph. Every finding is advisory; the persist surfaces them and the
|
|
542
|
-
// plan summary renders the shared-editor class beside the wave table.
|
|
400
|
+
// Conflict findings are advisory.
|
|
543
401
|
const findings = computeConflictFindings({ stories });
|
|
544
402
|
const errors = assumptionErrors.map((e) => `File assumption mismatch: ${e}`);
|
|
545
403
|
|