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,60 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* file-assumptions.js — Phase 8 path-assumption validator
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* decompose loop already uses.
|
|
10
|
-
*
|
|
11
|
-
* Under the 2-tier hierarchy (Epic → Story; Epic #3078 / #3238)
|
|
12
|
-
* the Story is the implementation unit — there is no `type::task` ticket
|
|
13
|
-
* layer — so the gate scans `type === 'story'` tickets and reads the
|
|
14
|
-
* `{ path, assumption }` entries inlined on each Story body.
|
|
15
|
-
*
|
|
16
|
-
* Rules (one finding per mismatched path). Story #5312 demoted every
|
|
17
|
-
* mismatch but one to a **warning** the dry-run lists and the persist
|
|
18
|
-
* proceeds past — `changes[]` is an advisory sketch the deliverer revises
|
|
19
|
-
* against the real tree, so refusing a plan on it cost re-authoring rounds
|
|
20
|
-
* for a footprint nobody was bound to:
|
|
21
|
-
* - `creates` + path **exists** → warning (Story may clobber).
|
|
22
|
-
* - `refactors-existing` (via `changes`) + path **absent and never
|
|
23
|
-
* tracked** at `baseBranchRef` → auto-normalized to `creates` with a
|
|
24
|
-
* logged warning (#4496 fix 5): a refactor declaration against a
|
|
25
|
-
* path with no history is deterministically a create.
|
|
26
|
-
* - `refactors-existing` (via `changes`) + path **absent but present in
|
|
27
|
-
* that ref's history** → warning naming the removing commit and, when
|
|
28
|
-
* git detects one, the rename target (Story #5265) — a plan authored
|
|
29
|
-
* against a file the tree deleted is worth saying out loud.
|
|
30
|
-
* - `exists` + path **absent** → warning (read dependency missing).
|
|
31
|
-
* - `deletes` + path **absent** → **error** (nothing to delete —
|
|
32
|
-
* the one declaration a deliverer cannot act on at all).
|
|
33
|
-
*
|
|
34
|
-
* Wave awareness (Story #3960): the base-branch-only rules above produce
|
|
35
|
-
* false signals once an earlier Story in the same epic creates (or deletes)
|
|
36
|
-
* a file before a later Story touches it. `validateStoryFileAssumptions`
|
|
37
|
-
* therefore validates each Story against the **simulated post-predecessor
|
|
38
|
-
* tree** — base-branch existence overlaid with the create/delete delta of
|
|
39
|
-
* the Story's transitive `depends_on` predecessors (the same reachability
|
|
40
|
-
* walk the conflict gate uses, imported from the shared
|
|
41
|
-
* `story-reachability.js` leaf rather than re-derived). Two extra
|
|
42
|
-
* wave-aware rules layer on top of the
|
|
43
|
-
* base-branch rules:
|
|
44
|
-
* - `creates` + path created by a **predecessor** → mismatch
|
|
45
|
-
* (`expected: 'refactors-existing'`) telling the planner to declare
|
|
46
|
-
* `refactors-existing` and naming the producing Story.
|
|
47
|
-
* - `refactors-existing` + path absent from base but created by a
|
|
48
|
-
* **predecessor** → validates clean (no false-positive base-branch
|
|
49
|
-
* "absent" mismatch).
|
|
50
|
-
* Concurrent same-path creates between Stories with no `depends_on` path are
|
|
51
|
-
* the shared-editor conflict gate's domain — that finding's rendering is
|
|
52
|
-
* cross-referenced (see `renderMismatch`), not duplicated here.
|
|
53
|
-
*
|
|
54
|
-
* String bullets: stories whose `body.changes` items are still bare
|
|
55
|
-
* strings are hard errors — they are pushed to `errors[]` by the
|
|
56
|
-
* validator's body-shape gate before this module runs. There is no
|
|
57
|
-
* silent skip or deprecation nudge.
|
|
2
|
+
* file-assumptions.js — Phase 8 path-assumption validator: every Story's
|
|
3
|
+
* `{ path, assumption }` entry in `body.changes` / `body.references` is
|
|
4
|
+
* checked against `baseBranchRef`, overlaid with the create/delete delta of
|
|
5
|
+
* the Story's transitive `depends_on` predecessors (the simulated
|
|
6
|
+
* post-predecessor tree). `changes[]` is an advisory sketch, so every
|
|
7
|
+
* mismatch is a warning except `deletes` on an absent path (nothing to act
|
|
8
|
+
* on), which is an error.
|
|
58
9
|
*/
|
|
59
10
|
|
|
60
11
|
import { gitSpawn } from '../git-utils.js';
|
|
@@ -64,12 +15,8 @@ import { computeStoryReachability } from './story-reachability.js';
|
|
|
64
15
|
import { isObjectPathEntry } from './task-body-validator.js';
|
|
65
16
|
|
|
66
17
|
/**
|
|
67
|
-
*
|
|
68
|
-
* `
|
|
69
|
-
* {@link ./ticket-validator.js#validateAcFreshness} so both gates share
|
|
70
|
-
* semantics. (Story #4811 deleted the third sharer, `spec-freshness.js`,
|
|
71
|
-
* along with the codebase snapshot it grounded; this gate — Phase 8 — is
|
|
72
|
-
* now the grounding gate and its behaviour is unchanged.)
|
|
18
|
+
* Existence probe at `baseBranchRef`; same semantics as
|
|
19
|
+
* `ticket-validator.js#validateAcFreshness`.
|
|
73
20
|
*
|
|
74
21
|
* @param {{ baseBranchRef: string, path: string, cwd?: string }} opts
|
|
75
22
|
* @returns {boolean}
|
|
@@ -85,16 +32,9 @@ function defaultGitRunner({ baseBranchRef, path, cwd }) {
|
|
|
85
32
|
}
|
|
86
33
|
|
|
87
34
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* `-M` reports a rename as `R<score>\t<old>\t<new>`. The scan is run over the
|
|
92
|
-
* commit's **whole** rename diff rather than a pathspec-limited one on
|
|
93
|
-
* purpose: rename detection pairs a delete with an add, and restricting the
|
|
94
|
-
* pathspec to the source path filters the add out, so git falls back to
|
|
95
|
-
* reporting a plain `D` and the target is lost. No matching `R` line means
|
|
96
|
-
* the path was deleted outright — still a removal, just without a successor
|
|
97
|
-
* to name.
|
|
35
|
+
* Find `path`'s rename target in a commit's `--name-status -M` output. The
|
|
36
|
+
* diff must be the whole commit, not pathspec-limited: limiting to the
|
|
37
|
+
* source path filters out the add half, so git reports a plain `D`.
|
|
98
38
|
*
|
|
99
39
|
* @param {string} stdout
|
|
100
40
|
* @param {string} path
|
|
@@ -113,20 +53,10 @@ function parseRenameTarget(stdout, path) {
|
|
|
113
53
|
}
|
|
114
54
|
|
|
115
55
|
/**
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
* I am actually creating") from a plan authored against stale documentation
|
|
121
|
-
* ("extend a file deleted three weeks ago"). Both look identical at the tip —
|
|
122
|
-
* the path is absent — and only history separates them. Injectable exactly
|
|
123
|
-
* like {@link defaultGitRunner} so the discrimination is unit-testable with
|
|
124
|
-
* no repository fixture.
|
|
125
|
-
*
|
|
126
|
-
* Fails **open**: an unreadable ref, a git that errors, or an empty history
|
|
127
|
-
* all report `hadHistory: false`, which preserves the pre-#5265
|
|
128
|
-
* auto-normalisation rather than manufacturing a hard error out of a probe
|
|
129
|
-
* failure.
|
|
56
|
+
* History probe: did `baseBranchRef` ever track `path`, and which commit
|
|
57
|
+
* removed it? Separates a mislabelled create from a plan written against a
|
|
58
|
+
* deleted file. Fails open (`hadHistory: false`) so a probe failure never
|
|
59
|
+
* becomes an error.
|
|
130
60
|
*
|
|
131
61
|
* @param {{ baseBranchRef: string, path: string, cwd?: string }} opts
|
|
132
62
|
* @returns {{ hadHistory: boolean, commit: string|null, renamedTo: string|null }}
|
|
@@ -152,15 +82,6 @@ function defaultHistoryRunner({ baseBranchRef, path, cwd }) {
|
|
|
152
82
|
}
|
|
153
83
|
|
|
154
84
|
/**
|
|
155
|
-
* Pull every `(path, assumption, source)` triple from a Story body.
|
|
156
|
-
* `source` is one of `'changes' | 'references'` so error messages can
|
|
157
|
-
* point the operator at the right list.
|
|
158
|
-
*
|
|
159
|
-
* Returns an empty array when the body is absent, a plain string, or
|
|
160
|
-
* carries no object-form entries — that's the legacy path. Callers use
|
|
161
|
-
* the resulting array's emptiness to decide whether to emit a
|
|
162
|
-
* deprecation warning for the Story.
|
|
163
|
-
*
|
|
164
85
|
* @param {object} story
|
|
165
86
|
* @returns {Array<{ path: string, assumption: string, source: 'changes' | 'references' }>}
|
|
166
87
|
*/
|
|
@@ -168,17 +89,12 @@ export function collectStoryAssumptionEntries(story) {
|
|
|
168
89
|
const out = [];
|
|
169
90
|
const body = story?.body;
|
|
170
91
|
|
|
171
|
-
//
|
|
172
|
-
// form emitted by `serialize()` from story-body.js), parse it first to
|
|
173
|
-
// extract the structured changes[] / references[] arrays. Without this,
|
|
174
|
-
// every story with a string body would be treated as the legacy case
|
|
175
|
-
// (no object-form entries) and the assumption gate would silently no-op.
|
|
92
|
+
// A serialized markdown body must be parsed, or the gate silently no-ops.
|
|
176
93
|
let structuredBody;
|
|
177
94
|
if (typeof body === 'string' && body.trim().length > 0) {
|
|
178
95
|
try {
|
|
179
96
|
structuredBody = parseStoryBody(body).body;
|
|
180
97
|
} catch {
|
|
181
|
-
// Unparseable body — treat as legacy (no assumptions to check).
|
|
182
98
|
return out;
|
|
183
99
|
}
|
|
184
100
|
} else if (body !== null && typeof body === 'object') {
|
|
@@ -213,11 +129,6 @@ export function collectStoryAssumptionEntries(story) {
|
|
|
213
129
|
}
|
|
214
130
|
|
|
215
131
|
/**
|
|
216
|
-
* Predicate: does the story have any string-form `body.changes` bullets
|
|
217
|
-
* left over after a partial migration? Used to decide whether to emit a
|
|
218
|
-
* per-story deprecation warning even when at least one object entry is
|
|
219
|
-
* present.
|
|
220
|
-
*
|
|
221
132
|
* @param {object} story
|
|
222
133
|
* @returns {boolean}
|
|
223
134
|
*/
|
|
@@ -229,21 +140,10 @@ export function hasLegacyChangeBullets(story) {
|
|
|
229
140
|
}
|
|
230
141
|
|
|
231
142
|
/**
|
|
232
|
-
* Render a
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* - `'present'` — base-branch read/refactor/delete target absent.
|
|
237
|
-
* - `'absent'` — base-branch `creates` target already exists.
|
|
238
|
-
* - `'refactors-existing'` — wave-aware: a transitive predecessor already
|
|
239
|
-
* creates this path, so the dependent Story should declare
|
|
240
|
-
* `refactors-existing` (Story #3960). Names the producing Story.
|
|
241
|
-
* - `'predecessor-conflict'` — wave-aware: a concurrent Story (no
|
|
242
|
-
* `depends_on` ordering) also creates this path. Cross-references the
|
|
243
|
-
* shared-editor conflict finding rather than re-deriving its prose.
|
|
244
|
-
* - `'present-was-removed'` — the base branch **once tracked** this path
|
|
245
|
-
* and no longer does (Story #5265). Names the removing commit, and the
|
|
246
|
-
* rename target when git detected one.
|
|
143
|
+
* Render a mismatch as a stable string (downstream tooling parses it),
|
|
144
|
+
* selected by `expected`: `present`, `absent`, `refactors-existing`
|
|
145
|
+
* (predecessor creates it), `predecessor-conflict` (unordered co-creator),
|
|
146
|
+
* `present-was-removed` (base branch removed it).
|
|
247
147
|
*
|
|
248
148
|
* @param {{ slug: string, source: string, path: string, assumption: string, expected: string, producerSlug?: string, removedInCommit?: string, renamedTo?: string|null }} mismatch
|
|
249
149
|
* @returns {string}
|
|
@@ -281,16 +181,9 @@ function renderMismatch({
|
|
|
281
181
|
}
|
|
282
182
|
|
|
283
183
|
/**
|
|
284
|
-
*
|
|
285
|
-
*
|
|
286
|
-
*
|
|
287
|
-
* existed and wrong for one the base branch used to track: "extend
|
|
288
|
-
* `<deleted file>`" is not a mechanical mislabel a rewrite can fix — it is a
|
|
289
|
-
* plan authored against documentation the tree has outgrown, and rewriting it
|
|
290
|
-
* to `creates` would resurrect a file somebody deliberately removed and
|
|
291
|
-
* propagate the stale premise into acceptance criteria nothing can satisfy.
|
|
292
|
-
* The removing commit is named because it is the shortest route to *what
|
|
293
|
-
* replaced it*.
|
|
184
|
+
* A refactor of a path the base branch once tracked is a plan written
|
|
185
|
+
* against stale docs; normalizing it to `creates` would resurrect a
|
|
186
|
+
* deliberately removed file. The removing commit points at its replacement.
|
|
294
187
|
*
|
|
295
188
|
* @param {{ slug: string, source: string, path: string, assumption: string, removedInCommit?: string, renamedTo?: string|null }} mismatch
|
|
296
189
|
* @returns {string}
|
|
@@ -310,10 +203,6 @@ function renderRemovedPathMismatch({
|
|
|
310
203
|
}
|
|
311
204
|
|
|
312
205
|
/**
|
|
313
|
-
* Render an auto-normalization (#4496 fix 5) into a stable warning string.
|
|
314
|
-
* Kept pure and exported through the report so callers log a
|
|
315
|
-
* self-explanatory line rather than re-deriving the rationale.
|
|
316
|
-
*
|
|
317
206
|
* @param {{ slug: string, source: string, path: string, assumption: string }} normalization
|
|
318
207
|
* @returns {string}
|
|
319
208
|
*/
|
|
@@ -322,13 +211,8 @@ function renderNormalization({ slug, source, path, assumption }) {
|
|
|
322
211
|
}
|
|
323
212
|
|
|
324
213
|
/**
|
|
325
|
-
* Index
|
|
326
|
-
*
|
|
327
|
-
* wave-aware simulated-tree overlay: a path created by a transitive
|
|
328
|
-
* predecessor is treated as present, a path deleted by one as absent.
|
|
329
|
-
*
|
|
330
|
-
* Only `changes`-sourced entries count — `references` describe read
|
|
331
|
-
* dependencies, never writes, so they cannot mutate the simulated tree.
|
|
214
|
+
* Index which Stories `creates` / `deletes` each path. Only `changes`
|
|
215
|
+
* entries count; `references` are reads and never mutate the tree.
|
|
332
216
|
*
|
|
333
217
|
* @param {object[]} stories
|
|
334
218
|
* @returns {{ creators: Map<string, string[]>, deleters: Map<string, string[]> }}
|
|
@@ -361,10 +245,6 @@ function indexPathMutations(stories) {
|
|
|
361
245
|
}
|
|
362
246
|
|
|
363
247
|
/**
|
|
364
|
-
* Resolve the first transitive predecessor of `story` that mutates `path`
|
|
365
|
-
* in the requested way (`creators` or `deleters` index). Returns the
|
|
366
|
-
* producing Story's slug, or `null` when no predecessor mutates the path.
|
|
367
|
-
*
|
|
368
248
|
* @param {Map<string, string[]>} index
|
|
369
249
|
* @param {string} path
|
|
370
250
|
* @param {Set<string>} predecessors Transitive `depends_on` slug set.
|
|
@@ -380,38 +260,16 @@ function predecessorMutator(index, path, predecessors) {
|
|
|
380
260
|
}
|
|
381
261
|
|
|
382
262
|
/**
|
|
383
|
-
* Validate every Story's
|
|
384
|
-
* post-predecessor tree
|
|
385
|
-
*
|
|
386
|
-
*
|
|
387
|
-
*
|
|
388
|
-
* {
|
|
389
|
-
* errors: string[] // a `deletes` naming an absent path, or a
|
|
390
|
-
* // legacy string-bullet body — the refusals
|
|
391
|
-
* warnings: string[] // every other mismatch (Story #5312) +
|
|
392
|
-
* // auto-normalization notices (#4496 fix 5)
|
|
393
|
-
* mismatches: object[] // structured payload for downstream tooling
|
|
394
|
-
* normalizations: object[] // `refactors-existing`→`creates`
|
|
395
|
-
* // auto-normalizations on base-untracked paths
|
|
396
|
-
* }
|
|
397
|
-
*
|
|
398
|
-
* Under the 2-tier hierarchy the Story is the implementation unit, so the
|
|
399
|
-
* gate scans `type === 'story'` tickets and reads the inline
|
|
400
|
-
* `{ path, assumption }` entries on each Story body.
|
|
401
|
-
*
|
|
402
|
-
* The function never throws on a probe failure — the runner is expected
|
|
403
|
-
* to return `false` for any unreadable git ref, which surfaces the path
|
|
404
|
-
* as a mismatch (for `refactors-existing` / `exists` / `deletes`) or as
|
|
405
|
-
* fresh (for `creates`). This matches the non-blocking, advisory shape
|
|
406
|
-
* of the Phase 7 freshness check.
|
|
263
|
+
* Validate every Story's file assumptions against the simulated
|
|
264
|
+
* post-predecessor tree. `errors` holds refusals (`deletes` on an absent
|
|
265
|
+
* path, legacy string bullets); `warnings` every other mismatch plus
|
|
266
|
+
* normalization notices. Never throws on a probe failure.
|
|
407
267
|
*
|
|
408
268
|
* @param {object} opts
|
|
409
269
|
* @param {object[]} opts.tickets
|
|
410
270
|
* @param {string} opts.baseBranchRef
|
|
411
271
|
* @param {Function} [opts.gitRunner] Existence probe at `baseBranchRef`.
|
|
412
|
-
* @param {Function} [opts.historyRunner]
|
|
413
|
-
* injectable exactly like `gitRunner`; returns
|
|
414
|
-
* `{ hadHistory, commit, renamedTo }`.
|
|
272
|
+
* @param {Function} [opts.historyRunner] Returns `{ hadHistory, commit, renamedTo }`.
|
|
415
273
|
* @param {string} [opts.cwd]
|
|
416
274
|
* @returns {{ errors: string[], warnings: string[], mismatches: Array, normalizations: Array }}
|
|
417
275
|
*/
|
|
@@ -444,10 +302,6 @@ export function validateStoryFileAssumptions(opts) {
|
|
|
444
302
|
cache: historyCache,
|
|
445
303
|
});
|
|
446
304
|
|
|
447
|
-
// Wave-aware setup (Story #3960): transitive predecessor sets over the
|
|
448
|
-
// story-level `depends_on` graph, plus per-path create/delete indices so
|
|
449
|
-
// each Story is validated against the simulated post-predecessor tree
|
|
450
|
-
// rather than the base branch alone.
|
|
451
305
|
const reach = computeStoryReachability(stories);
|
|
452
306
|
const { creators, deleters } = indexPathMutations(stories);
|
|
453
307
|
|
|
@@ -488,9 +342,7 @@ export function validateStoryFileAssumptions(opts) {
|
|
|
488
342
|
path,
|
|
489
343
|
predecessors,
|
|
490
344
|
);
|
|
491
|
-
//
|
|
492
|
-
// predecessor `creates` makes the path present, a predecessor
|
|
493
|
-
// `deletes` (with no predecessor create) makes it absent.
|
|
345
|
+
// A predecessor create wins over a predecessor delete.
|
|
494
346
|
let simulatedExists = baseExists;
|
|
495
347
|
if (predecessorCreator) simulatedExists = true;
|
|
496
348
|
else if (predecessorDeleter) simulatedExists = false;
|
|
@@ -504,9 +356,6 @@ export function validateStoryFileAssumptions(opts) {
|
|
|
504
356
|
predecessorCreator,
|
|
505
357
|
});
|
|
506
358
|
if (mismatch !== null) {
|
|
507
|
-
// Auto-normalization (#4496 fix 5): a deterministic
|
|
508
|
-
// `refactors-existing`→`creates` rewrite is a warning, never a
|
|
509
|
-
// rejection — genuine mismatches keep flowing to `errors`.
|
|
510
359
|
const { kind, finding } = classifyMismatch(mismatch, probeHistory);
|
|
511
360
|
if (kind === 'normalization') {
|
|
512
361
|
normalizations.push(finding);
|
|
@@ -517,13 +366,8 @@ export function validateStoryFileAssumptions(opts) {
|
|
|
517
366
|
routeMismatch(finding, { errors, warnings });
|
|
518
367
|
continue;
|
|
519
368
|
}
|
|
520
|
-
//
|
|
521
|
-
//
|
|
522
|
-
// The shared-editor conflict gate owns the canonical resolution; this
|
|
523
|
-
// gate surfaces the same signal in the assumption channel and
|
|
524
|
-
// cross-references that finding rather than re-deriving its prose.
|
|
525
|
-
// Only reached when `checkAssumption` returned clean — a base-branch
|
|
526
|
-
// clobber or a predecessor-create already produced a richer mismatch.
|
|
369
|
+
// Unordered co-creators: the shared-editor conflict gate owns the
|
|
370
|
+
// resolution; this only cross-references it.
|
|
527
371
|
if (assumption === 'creates') {
|
|
528
372
|
const concurrent = concurrentCoCreator({
|
|
529
373
|
creators,
|
|
@@ -551,9 +395,7 @@ export function validateStoryFileAssumptions(opts) {
|
|
|
551
395
|
}
|
|
552
396
|
|
|
553
397
|
/**
|
|
554
|
-
*
|
|
555
|
-
* a `deletes` on an absent path is the one declaration nothing can act on and
|
|
556
|
-
* stays an error; every other mismatch is advisory and lands on `warnings`.
|
|
398
|
+
* Only a `deletes` on an absent path is an error; the rest are warnings.
|
|
557
399
|
*
|
|
558
400
|
* @param {object} finding
|
|
559
401
|
* @param {{ errors: string[], warnings: string[] }} channels
|
|
@@ -565,14 +407,8 @@ function routeMismatch(finding, { errors, warnings }) {
|
|
|
565
407
|
}
|
|
566
408
|
|
|
567
409
|
/**
|
|
568
|
-
*
|
|
569
|
-
*
|
|
570
|
-
*
|
|
571
|
-
* `checkAssumption` marks a `changes`-sourced `refactors-existing` on an
|
|
572
|
-
* absent path with `normalizedTo: 'creates'` — the #4496 rescue. Whether that
|
|
573
|
-
* rescue actually applies is a *history* question the pure rules table cannot
|
|
574
|
-
* answer, so it is resolved here: no history keeps the rescue, history ending
|
|
575
|
-
* in a removal converts it into a refusal that names the commit.
|
|
410
|
+
* Decide whether a `normalizedTo: 'creates'` mismatch keeps its rescue: no
|
|
411
|
+
* history keeps it; history ending in a removal becomes a refusal.
|
|
576
412
|
*
|
|
577
413
|
* @param {object} mismatch
|
|
578
414
|
* @param {(path: string) => ({ commit: string|null, renamedTo: string|null }|null)} probeHistory
|
|
@@ -600,14 +436,8 @@ function classifyMismatch(mismatch, probeHistory) {
|
|
|
600
436
|
}
|
|
601
437
|
|
|
602
438
|
/**
|
|
603
|
-
* Memoized
|
|
604
|
-
*
|
|
605
|
-
*
|
|
606
|
-
* One cache per validation run, keyed on the path, because a plan commonly
|
|
607
|
-
* declares the same path across several Stories and the probe costs two git
|
|
608
|
-
* processes. A runner that throws is absorbed as "no history": the whole
|
|
609
|
-
* point of the discrimination is to *add* a refusal for a provable stale
|
|
610
|
-
* declaration, never to convert a probe failure into one.
|
|
439
|
+
* Memoized per run (the probe costs two git processes). A throwing runner
|
|
440
|
+
* means "no history" — a probe failure must never manufacture a refusal.
|
|
611
441
|
*
|
|
612
442
|
* @param {{ historyRunner: Function, baseBranchRef: string, path: string, cwd?: string, cache: Map<string, object|null> }} args
|
|
613
443
|
* @returns {{ commit: string|null, renamedTo: string|null }|null}
|
|
@@ -631,12 +461,8 @@ function probeRemoval({ historyRunner, baseBranchRef, path, cwd, cache }) {
|
|
|
631
461
|
}
|
|
632
462
|
|
|
633
463
|
/**
|
|
634
|
-
*
|
|
635
|
-
*
|
|
636
|
-
* `depends_on` ordering in either direction. Returns that Story's slug, or
|
|
637
|
-
* `null` when every co-creator is ordered relative to `slug` (predecessor
|
|
638
|
-
* or successor) — those are handled by the predecessor-create rule, not the
|
|
639
|
-
* concurrent-conflict rule.
|
|
464
|
+
* First other Story creating `path` with no `depends_on` ordering either
|
|
465
|
+
* way; ordered co-creators fall to the predecessor-create rule.
|
|
640
466
|
*
|
|
641
467
|
* @param {{ creators: Map<string, string[]>, path: string, slug: string, reach: Map<string, Set<string>> }} args
|
|
642
468
|
* @returns {string|null}
|
|
@@ -648,7 +474,6 @@ function concurrentCoCreator({ creators, path, slug, reach }) {
|
|
|
648
474
|
for (const other of slugs) {
|
|
649
475
|
if (other === slug) continue;
|
|
650
476
|
const otherPredecessors = reach.get(other) ?? new Set();
|
|
651
|
-
// Ordered in either direction → not concurrent.
|
|
652
477
|
if (myPredecessors.has(other)) continue;
|
|
653
478
|
if (otherPredecessors.has(slug)) continue;
|
|
654
479
|
return other;
|
|
@@ -657,18 +482,6 @@ function concurrentCoCreator({ creators, path, slug, reach }) {
|
|
|
657
482
|
}
|
|
658
483
|
|
|
659
484
|
/**
|
|
660
|
-
* Apply one assumption rule against the simulated post-predecessor tree and
|
|
661
|
-
* return a structured mismatch or `null` when the declared assumption
|
|
662
|
-
* matches. Extracted from `validateStoryFileAssumptions` so the rules table
|
|
663
|
-
* sits in one place that's trivially unit-testable.
|
|
664
|
-
*
|
|
665
|
-
* `baseExists` is the path's existence on the base branch; `simulatedExists`
|
|
666
|
-
* is `baseExists` overlaid with the create/delete delta of the Story's
|
|
667
|
-
* transitive predecessors. `predecessorCreator` (when non-null) is the slug
|
|
668
|
-
* of the predecessor Story that creates the path — used to distinguish a
|
|
669
|
-
* wave-aware `creates`-on-a-will-exist-path mismatch from the base-branch
|
|
670
|
-
* "already exists" mismatch, and to name the producing Story in the nudge.
|
|
671
|
-
*
|
|
672
485
|
* @param {{ slug: string, source: string, path: string, assumption: string, baseExists: boolean, simulatedExists: boolean, predecessorCreator: string|null }} args
|
|
673
486
|
* @returns {object|null}
|
|
674
487
|
*/
|
|
@@ -683,8 +496,6 @@ function checkAssumption({
|
|
|
683
496
|
}) {
|
|
684
497
|
switch (assumption) {
|
|
685
498
|
case 'creates':
|
|
686
|
-
// Base-branch clobber — the path already exists before any Story
|
|
687
|
-
// runs. Unchanged from the base-branch-only rule.
|
|
688
499
|
if (baseExists) {
|
|
689
500
|
return {
|
|
690
501
|
slug,
|
|
@@ -695,9 +506,6 @@ function checkAssumption({
|
|
|
695
506
|
actual: 'present',
|
|
696
507
|
};
|
|
697
508
|
}
|
|
698
|
-
// Wave-aware (Story #3960): a transitive predecessor already creates
|
|
699
|
-
// this path, so it exists in the simulated tree. Nudge the planner to
|
|
700
|
-
// declare `refactors-existing` and name the producing Story.
|
|
701
509
|
if (predecessorCreator) {
|
|
702
510
|
return {
|
|
703
511
|
slug,
|
|
@@ -711,18 +519,10 @@ function checkAssumption({
|
|
|
711
519
|
}
|
|
712
520
|
return null;
|
|
713
521
|
case 'refactors-existing':
|
|
714
|
-
// Validate against the simulated tree: a predecessor `creates` makes
|
|
715
|
-
// an otherwise-absent base path present, so `refactors-existing`
|
|
716
|
-
// against it is no longer a false-positive mismatch (Story #3960).
|
|
717
522
|
if (!simulatedExists) {
|
|
718
|
-
//
|
|
719
|
-
//
|
|
720
|
-
//
|
|
721
|
-
// downgrade to a normalization warning instead of rejecting. Two
|
|
722
|
-
// genuine mismatches stay hard errors: a `references`-sourced entry
|
|
723
|
-
// (a read dependency this Story does not author cannot be "created"
|
|
724
|
-
// here), and a base-TRACKED path a predecessor deletes (the absence
|
|
725
|
-
// is a plan-shape conflict, not an untracked-path misdeclaration).
|
|
523
|
+
// A `changes` refactor of a base-untracked path is deterministically
|
|
524
|
+
// a create. A `references` entry (not authored here) or a tracked
|
|
525
|
+
// path a predecessor deletes stays a genuine mismatch.
|
|
726
526
|
if (source === 'changes' && !baseExists) {
|
|
727
527
|
return {
|
|
728
528
|
slug,
|
|
@@ -746,8 +546,6 @@ function checkAssumption({
|
|
|
746
546
|
return null;
|
|
747
547
|
case 'exists':
|
|
748
548
|
case 'deletes':
|
|
749
|
-
// Same simulated-tree overlay as above (Story #3960); an absent path
|
|
750
|
-
// remains a genuine mismatch for both assumptions.
|
|
751
549
|
if (!simulatedExists) {
|
|
752
550
|
return {
|
|
753
551
|
slug,
|
|
@@ -760,9 +558,7 @@ function checkAssumption({
|
|
|
760
558
|
}
|
|
761
559
|
return null;
|
|
762
560
|
default:
|
|
763
|
-
//
|
|
764
|
-
// schema validator — defensive default so future enum additions
|
|
765
|
-
// surface as test failures rather than silent passes.
|
|
561
|
+
// Schema already rejects unknown values; fail loud on new enum members.
|
|
766
562
|
return {
|
|
767
563
|
slug,
|
|
768
564
|
source,
|
|
@@ -774,8 +570,4 @@ function checkAssumption({
|
|
|
774
570
|
}
|
|
775
571
|
}
|
|
776
572
|
|
|
777
|
-
/**
|
|
778
|
-
* Re-export the canonical assumption enum so callers can reach for the
|
|
779
|
-
* list without depending on task-body-validator's internals.
|
|
780
|
-
*/
|
|
781
573
|
export { FILE_ASSUMPTION_VALUES };
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* the PR probe, and the whole remote-only walk (Stories #4395, #5188).
|
|
4
|
-
*
|
|
5
|
-
* Split out of `branches.js` for the same reason `branches-reap.js` was:
|
|
6
|
-
* each phase file stays small enough to read in one pass. `branches.js`
|
|
7
|
-
* keeps the two walks' orchestration (`planCleanup`) and the reap
|
|
8
|
-
* (`executeCleanup`); this module owns what a branch with no reapable PR
|
|
9
|
-
* verdict is measured against.
|
|
2
|
+
* Branch-reap detection signals beyond the PR probe, and the remote-only walk.
|
|
10
3
|
*
|
|
11
4
|
* @module lib/orchestration/git-cleanup/phases/branches-detect
|
|
12
5
|
*/
|
|
@@ -25,21 +18,10 @@ export function skipEntryFromVerdict(branch, verdict) {
|
|
|
25
18
|
}
|
|
26
19
|
|
|
27
20
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* --write-tree` and, when the probe is conclusive and the merge is a
|
|
33
|
-
* no-op, classifies the branch as `content-merged` instead of falling
|
|
34
|
-
* through to the `not-merged` skip.
|
|
35
|
-
*
|
|
36
|
-
* `rev` is the revision handed to git, `branch` the short name every
|
|
37
|
-
* output reports. They differ on the remote-only path, where names are
|
|
38
|
-
* enumerated with the `<remote>/` prefix stripped: handing `git
|
|
39
|
-
* merge-tree` the bare short name resolves to no ref, so the probe would
|
|
40
|
-
* report `{ supported: false }` for every candidate and degrade the whole
|
|
41
|
-
* signal to silence. Defaulting `rev` to `branch` keeps the local walk
|
|
42
|
-
* unchanged.
|
|
21
|
+
* Last-resort signal: `content-merged` when merging the branch into base is a
|
|
22
|
+
* no-op, else a `not-merged` skip. `rev` is what git sees; on the remote-only
|
|
23
|
+
* walk it must be `<remote>/<branch>`, since the bare short name resolves to
|
|
24
|
+
* no ref and would silence the signal.
|
|
43
25
|
*/
|
|
44
26
|
export function evaluateContentEquivalence({
|
|
45
27
|
branch,
|
|
@@ -66,22 +48,9 @@ export function evaluateContentEquivalence({
|
|
|
66
48
|
}
|
|
67
49
|
|
|
68
50
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* used to return early on a `no-pr` verdict, recording the branch in
|
|
73
|
-
* neither `candidates[]` nor `skipped[]`, so a provably-merged orphan ref
|
|
74
|
-
* was absent from the rendered log and the `--json` envelope alike.
|
|
75
|
-
*
|
|
76
|
-
* `mergedRemote` is the `-r` ancestry set ({@link listRemoteMergedBranches}):
|
|
77
|
-
* the local `git branch --merged` listing that feeds the local cascade
|
|
78
|
-
* enumerates local heads only and can never contain a remote branch name.
|
|
79
|
-
* Both signals read the local object database, so the sweep stays offline.
|
|
80
|
-
*
|
|
81
|
-
* A hit carries a `detectedBy` distinct from the PR-detected
|
|
82
|
-
* `'remote-only'` — `'remote-git-merged'` for ancestry, and the existing
|
|
83
|
-
* `'content-merged'` for the weaker content signal, so every consumer that
|
|
84
|
-
* already treats that value as report-only keeps doing so here.
|
|
51
|
+
* Remote-only no-PR cascade: ancestry via the `-r` merged set (the local
|
|
52
|
+
* listing never contains remote names), then content-equivalence, else skip.
|
|
53
|
+
* Offline: both read the local object database.
|
|
85
54
|
*/
|
|
86
55
|
function evaluateRemoteOnlyNoPr({
|
|
87
56
|
branch,
|
|
@@ -106,13 +75,7 @@ function evaluateRemoteOnlyNoPr({
|
|
|
106
75
|
});
|
|
107
76
|
}
|
|
108
77
|
|
|
109
|
-
/**
|
|
110
|
-
* Story #5188 — resolve one remote-only branch's PR verdict into either a
|
|
111
|
-
* detection provenance or a skip. Split out of the walk so the loop reads
|
|
112
|
-
* as enumerate → resolve → record and every arm of the cascade is visibly
|
|
113
|
-
* total: each branch that passes the protected and filter checks leaves
|
|
114
|
-
* this function as exactly one of `{ detectedBy, prInfo }` or `{ skip }`.
|
|
115
|
-
*/
|
|
78
|
+
/** Total: always exactly one of `{ detectedBy, prInfo }` or `{ skip }`. */
|
|
116
79
|
function resolveRemoteOnlyBranch({ verdict, branch, rev, noPrArgs }) {
|
|
117
80
|
if (verdict.kind === 'skip') {
|
|
118
81
|
return { skip: skipEntryFromVerdict(branch, verdict) };
|