mandrel 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,40 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* single-
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* The standalone workflow has no Epic-scoped dispatch manifest to serialise
|
|
7
|
-
* two operators driving the same Story, so a concurrent `single-story-init`
|
|
8
|
-
* could happily clobber another operator's in-flight run. This guard closes
|
|
9
|
-
* that gap by taking an exclusive, time-bounded lease on the Story ticket at
|
|
10
|
-
* init and clearing it at close:
|
|
11
|
-
*
|
|
12
|
-
* - `acquireStoryLease` — claim the Story for the resolved operator. A live
|
|
13
|
-
* **foreign** claim (the assignee is someone else and their heartbeat is
|
|
14
|
-
* within the TTL) is fatal: the guard throws a message naming the current
|
|
15
|
-
* owner so the operator knows who to coordinate with. Unclaimed,
|
|
16
|
-
* self-held, and stale-foreign claims all proceed (the primitive reclaims
|
|
17
|
-
* stale claims automatically).
|
|
18
|
-
* - `releaseStoryLease` — clear the Story assignment on a clean close, but
|
|
19
|
-
* only when the operator still holds it (the primitive no-ops a stale
|
|
20
|
-
* release so a late close never yanks a claim back from whoever took
|
|
21
|
-
* over).
|
|
22
|
-
*
|
|
23
|
-
* The guard is deliberately thin and provider-agnostic: it resolves the
|
|
24
|
-
* operator handle from config and delegates assignee mutation to the pure
|
|
25
|
-
* `ticket-lease.js` primitive.
|
|
26
|
-
*
|
|
27
|
-
* **Fail-closed (audit #3513, hard-wired by Story #5006).** The lease
|
|
28
|
-
* primitive used to reclaim a foreign claim whose heartbeat was older than a
|
|
29
|
-
* TTL — and with no heartbeat source, *every* foreign claim looked stale, so
|
|
30
|
-
* the guard silently reclaimed any foreign assignee and was inert as a
|
|
31
|
-
* concurrency guard. The guard worked around that by anchoring the heartbeat
|
|
32
|
-
* to `now`; Story #5006 deleted the TTL outright, so the fail-closed
|
|
33
|
-
* behaviour is now the primitive's own: a foreign assignee refuses the take
|
|
34
|
-
* (naming the current owner) unless the operator passes `--steal` to forcibly
|
|
35
|
-
* transfer it. A genuinely abandoned claim is cleared by hand (or `--steal`)
|
|
36
|
-
* rather than raced into automatically. Unclaimed and self-held tickets still
|
|
37
|
-
* proceed.
|
|
2
|
+
* Story lease for single-Story delivery: take the assignee lease at init,
|
|
3
|
+
* clear it at close, so two runs never drive one Story. Fail-closed — a
|
|
4
|
+
* foreign assignee refuses unless `--steal`.
|
|
38
5
|
*/
|
|
39
6
|
|
|
40
7
|
import {
|
|
@@ -44,21 +11,11 @@ import {
|
|
|
44
11
|
import { releaseLease } from './ticket-lease.js';
|
|
45
12
|
|
|
46
13
|
/**
|
|
47
|
-
*
|
|
48
|
-
* Routes through the shared lease-guard kernel
|
|
49
|
-
* (`lease-guard-shared.resolveOperatorFromCandidates`) so a leading `@` is
|
|
50
|
-
* stripped (the assignees API expects bare logins, not `@`-prefixed mentions)
|
|
51
|
-
* and the self-held-claim comparison matches. The standalone surface's
|
|
52
|
-
* missing-handle policy is `'throw'` (intentional divergence from the plan
|
|
53
|
-
* path's `'null'`): init has no best-effort leg that can degrade, so an
|
|
54
|
-
* unowned lease must refuse immediately.
|
|
14
|
+
* Missing-handle policy is `'throw'`: init has no best-effort leg to degrade.
|
|
55
15
|
*
|
|
56
|
-
* @param {object} config
|
|
16
|
+
* @param {object} config
|
|
57
17
|
* @returns {string} Bare operator handle.
|
|
58
|
-
* @throws {Error} When
|
|
59
|
-
* shipped `@[USERNAME]` placeholder (both normalise to `null`). Without an
|
|
60
|
-
* operator identity the lease has no owner to record, so the standalone
|
|
61
|
-
* path cannot safely serialise concurrent runs.
|
|
18
|
+
* @throws {Error} When `github.operatorHandle` is unset or the placeholder.
|
|
62
19
|
*/
|
|
63
20
|
export function resolveOperator(config) {
|
|
64
21
|
return resolveOperatorFromCandidates({
|
|
@@ -74,19 +31,12 @@ export function resolveOperator(config) {
|
|
|
74
31
|
}
|
|
75
32
|
|
|
76
33
|
/**
|
|
77
|
-
* Acquire (or re-affirm) the Story lease for the standalone path.
|
|
78
|
-
*
|
|
79
|
-
* **Fail-closed:** a foreign assignee refuses the take — the guard throws
|
|
80
|
-
* naming the current owner so the operator can coordinate. Pass
|
|
81
|
-
* `steal: true` (`--steal`) to forcibly transfer it. Unclaimed and self-held
|
|
82
|
-
* tickets proceed without a write.
|
|
83
|
-
*
|
|
84
34
|
* @param {object} opts
|
|
85
|
-
* @param {object} opts.provider
|
|
86
|
-
* @param {number} opts.storyId
|
|
87
|
-
* @param {object} opts.config
|
|
88
|
-
* @param {string} [opts.operator]
|
|
89
|
-
* @param {boolean} [opts.steal=false]
|
|
35
|
+
* @param {object} opts.provider
|
|
36
|
+
* @param {number} opts.storyId
|
|
37
|
+
* @param {object} opts.config
|
|
38
|
+
* @param {string} [opts.operator] Test override.
|
|
39
|
+
* @param {boolean} [opts.steal=false]
|
|
90
40
|
* @returns {Promise<{ acquired: boolean, owner: string, previousOwner: string|null, reason: string }>}
|
|
91
41
|
* @throws {Error} When a foreign claim refuses the acquire (no `steal`).
|
|
92
42
|
*/
|
|
@@ -113,15 +63,11 @@ export async function acquireStoryLease({
|
|
|
113
63
|
}
|
|
114
64
|
|
|
115
65
|
/**
|
|
116
|
-
* Release the Story lease on a clean close. No-ops (via the primitive) when
|
|
117
|
-
* the operator no longer holds the claim, so a late close never steals a
|
|
118
|
-
* claim back from whoever legitimately took over.
|
|
119
|
-
*
|
|
120
66
|
* @param {object} opts
|
|
121
|
-
* @param {object} opts.provider
|
|
122
|
-
* @param {number} opts.storyId
|
|
123
|
-
* @param {object} opts.config
|
|
124
|
-
* @param {string} [opts.operator]
|
|
67
|
+
* @param {object} opts.provider
|
|
68
|
+
* @param {number} opts.storyId
|
|
69
|
+
* @param {object} opts.config
|
|
70
|
+
* @param {string} [opts.operator] Test override.
|
|
125
71
|
* @returns {Promise<{ released: boolean, owner: string|null, reason: string }>}
|
|
126
72
|
*/
|
|
127
73
|
export async function releaseStoryLease({
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* serialized Story body is parsed with parse failures translated into the
|
|
5
|
-
* validator's operator-legible `ValidationError` shape. Both the gate that
|
|
6
|
-
* refuses a plan up front (`assertStoryBodiesParse`) and the per-call
|
|
7
|
-
* translating parser (`parseStoryBodyOrThrow`) the downstream validators
|
|
8
|
-
* lean on live here.
|
|
2
|
+
* The one place a Story body is parsed with failures translated into a
|
|
3
|
+
* `ValidationError` naming the section and entry.
|
|
9
4
|
*/
|
|
10
5
|
|
|
11
6
|
import { ValidationError } from '../errors/index.js';
|
|
@@ -15,16 +10,6 @@ import {
|
|
|
15
10
|
} from '../story-body/story-body.js';
|
|
16
11
|
|
|
17
12
|
/**
|
|
18
|
-
* Parse a Story's serialized markdown body, translating a
|
|
19
|
-
* `StoryBodyParseError` into a `ValidationError` that names the offending
|
|
20
|
-
* **section** and **entry** (Story #4541).
|
|
21
|
-
*
|
|
22
|
-
* `StoryBodyParseError` already carries `field` (the section the parser was
|
|
23
|
-
* reading) and `raw` (the entry text that failed); this lifts both into an
|
|
24
|
-
* operator-legible message and a structured `violation` payload so an
|
|
25
|
-
* authoring loop can point at the exact bullet instead of re-deriving it
|
|
26
|
-
* from a downstream freshness miss.
|
|
27
|
-
*
|
|
28
13
|
* @param {object} story Story whose `body` is a non-empty markdown string.
|
|
29
14
|
* @returns {object} The structured body.
|
|
30
15
|
* @throws {ValidationError} `code: 'story-body-unparseable'`.
|
|
@@ -53,14 +38,10 @@ export function parseStoryBodyOrThrow(story) {
|
|
|
53
38
|
}
|
|
54
39
|
|
|
55
40
|
/**
|
|
56
|
-
*
|
|
57
|
-
* either git-probe gate runs (Story #4541). Ordering matters: the freshness
|
|
58
|
-
* gate consults `body.changes` for its net-new whitelist, so an unparseable
|
|
59
|
-
* body used to reach the operator as a freshness miss naming declared paths.
|
|
41
|
+
* Must run before the git-probe gates, whose whitelist is the parsed body.
|
|
60
42
|
*
|
|
61
43
|
* @param {{ tickets: object[] }} opts
|
|
62
|
-
* @throws {ValidationError}
|
|
63
|
-
* offending Story.
|
|
44
|
+
* @throws {ValidationError} On the first offending Story.
|
|
64
45
|
*/
|
|
65
46
|
export function assertStoryBodiesParse({ tickets }) {
|
|
66
47
|
for (const story of (tickets ?? []).filter((t) => t.type === 'story')) {
|
|
@@ -1,50 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* baseline-upward-writeback.js — persist improved maintainability rows on the
|
|
3
|
-
* branch that earned them
|
|
3
|
+
* branch that earned them, as one `baseline-refresh:` commit ahead of the
|
|
4
|
+
* close gates. The diff-scoped ratchet only reds on regressions, so nothing
|
|
5
|
+
* else writes an improvement back.
|
|
4
6
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* partitions every compared row into `regressions` / `improvements` /
|
|
14
|
-
* `unchanged` / `additions`, and the enforcement path forwards `improvements`
|
|
15
|
-
* all the way to the report. Nothing persisted it. This module is that
|
|
16
|
-
* missing half — run from the close's `close-validation` phase, ahead of the
|
|
17
|
-
* gate chain, so the refreshed row lands in the branch's own PR.
|
|
18
|
-
*
|
|
19
|
-
* Shape borrowed from {@link ../story-close/format-autofix.js#runScopedFormatAutofix}:
|
|
20
|
-
* scope to the branch's changed-file set, fold the writes into one dedicated
|
|
21
|
-
* commit ahead of the gates, log the paths touched, and inject every
|
|
22
|
-
* git / baseline / scoring collaborator so the unit tests never spawn git
|
|
23
|
-
* (`.agents/rules/test-seams.md`).
|
|
24
|
-
*
|
|
25
|
-
* Four constraints bind the design, and every one of them is a "must not":
|
|
26
|
-
*
|
|
27
|
-
* 1. **Only `improvements` are written.** A regression must still fail the
|
|
28
|
-
* gate exactly as it does today. A write-back that could launder one
|
|
29
|
-
* makes the baseline actively worse than leaving it stale, so a regressed
|
|
30
|
-
* row is never in the written set — it is not filtered out downstream, it
|
|
31
|
-
* never enters.
|
|
32
|
-
* 2. **`maintainability` only.** CRAP's drift identity is
|
|
33
|
-
* `path::method@startLine`, which re-keys whenever anything above a
|
|
34
|
-
* method moves, so the same treatment there is churn rather than signal.
|
|
35
|
-
* That is exactly why the nightly watches maintainability alone.
|
|
36
|
-
* 3. **Changed files only — never a full-scope regeneration.** A full-scope
|
|
37
|
-
* write at land time would absorb unrelated drift from other branches
|
|
38
|
-
* into whichever PR happened to land next, and would fight the
|
|
39
|
-
* row-identity merge driver that exists to keep concurrent refreshes
|
|
40
|
-
* apart (Story #5215).
|
|
41
|
-
* 4. **Idempotent and silent.** No empty commit; a second close over the
|
|
42
|
-
* same tree finds nothing left to improve and commits nothing.
|
|
43
|
-
*
|
|
44
|
-
* The authored commit carries the `baseline-refresh:` marker
|
|
45
|
-
* `phases/refresh-ack.js` recognises, so the refreshed rows are vouched for
|
|
46
|
-
* rather than read as fresh drift, and its subject is conventional so
|
|
47
|
-
* commitlint accepts it.
|
|
7
|
+
* Invariants:
|
|
8
|
+
* 1. Only classifier `improvements` are written — a regression never enters
|
|
9
|
+
* the written set, so it still fails the gate.
|
|
10
|
+
* 2. Maintainability only: CRAP rows re-key on `method@startLine` when code
|
|
11
|
+
* above moves, so write-back there is churn.
|
|
12
|
+
* 3. Changed files only — a full-scope write would absorb other branches'
|
|
13
|
+
* drift into whichever PR lands next.
|
|
14
|
+
* 4. Idempotent: no empty commit.
|
|
48
15
|
*/
|
|
49
16
|
|
|
50
17
|
import path from 'node:path';
|
|
@@ -72,25 +39,16 @@ import {
|
|
|
72
39
|
|
|
73
40
|
const TAG = '[baseline-writeback]';
|
|
74
41
|
|
|
75
|
-
/** The one kind this module touches. See constraint 2 in the preamble. */
|
|
76
42
|
const KIND = 'maintainability';
|
|
77
43
|
|
|
78
|
-
/**
|
|
79
|
-
* Absolute drift tolerance when the gate configures none. Mirrors
|
|
80
|
-
* `drift-detector.js`'s `KIND_SPECS.maintainability.defaultTolerance`, so the
|
|
81
|
-
* per-PR write-back and the nightly full-scope check agree on what counts as
|
|
82
|
-
* movement rather than float noise.
|
|
83
|
-
*/
|
|
44
|
+
/** Matches the drift detector's maintainability default tolerance. */
|
|
84
45
|
const DEFAULT_TOLERANCE = 0.5;
|
|
85
46
|
|
|
86
|
-
/** Files the maintainability scorer can measure at all. */
|
|
87
47
|
const SCORABLE = /\.(?:m?[jt]sx?)$/i;
|
|
88
48
|
|
|
89
49
|
/**
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* softer "nothing came of it". `no-scored-rows`, `no-improvements` and
|
|
93
|
-
* `unchanged` are deliberately absent: those are outcomes of a run.
|
|
50
|
+
* Skips that fire before any scoring, so `ran: false` means exactly "a guard
|
|
51
|
+
* stopped this"; outcome reasons are deliberately absent.
|
|
94
52
|
*/
|
|
95
53
|
const GUARD_REASONS = new Set([
|
|
96
54
|
'gate-disabled',
|
|
@@ -102,10 +60,7 @@ const GUARD_REASONS = new Set([
|
|
|
102
60
|
]);
|
|
103
61
|
|
|
104
62
|
/**
|
|
105
|
-
*
|
|
106
|
-
* ratchet already refuses to red on, so writing it back would be churn — and
|
|
107
|
-
* churn on a file every concurrent branch also touches is the one cost this
|
|
108
|
-
* step must not add.
|
|
63
|
+
* Deltas under the tolerance are float noise; writing them is churn.
|
|
109
64
|
*
|
|
110
65
|
* @param {object|undefined} gate resolved `delivery.quality.gates.maintainability`
|
|
111
66
|
* @returns {number}
|
|
@@ -120,17 +75,9 @@ function resolveTolerance(gate) {
|
|
|
120
75
|
}
|
|
121
76
|
|
|
122
77
|
/**
|
|
123
|
-
* Read the
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* flattens `tolerance` to a bare number, so reading it would silently make the
|
|
127
|
-
* gate un-disablable and every configured tolerance unreadable. `evaluate.js`
|
|
128
|
-
* receives this same declared block as its `gateBlock`, which is what keeps
|
|
129
|
-
* the write-back's notion of "moved" identical to the gate's.
|
|
130
|
-
*
|
|
131
|
-
* Tolerates a resolver that throws (a malformed config under a tmp cwd). An
|
|
132
|
-
* unresolvable config reads as "framework defaults", which enable the gate —
|
|
133
|
-
* the same reading `projections/advisories.js#isEnabled` applies.
|
|
78
|
+
* Read the DECLARED `quality.gates[kind]` block, not the `quality[kind]`
|
|
79
|
+
* projection, which drops `enabled` and flattens `tolerance`. A resolver that
|
|
80
|
+
* throws reads as framework defaults (gate enabled).
|
|
134
81
|
*
|
|
135
82
|
* @param {object|undefined} config
|
|
136
83
|
* @returns {object|undefined}
|
|
@@ -144,10 +91,8 @@ function resolveGate(config) {
|
|
|
144
91
|
}
|
|
145
92
|
|
|
146
93
|
/**
|
|
147
|
-
*
|
|
148
|
-
* committed rows are
|
|
149
|
-
* the writer applies, which is what makes the two sides comparable at all.
|
|
150
|
-
* A row the writer itself would refuse is dropped rather than compared.
|
|
94
|
+
* Project scorer output through the writer's own `projectRow` so scored and
|
|
95
|
+
* committed rows are comparable; unprojectable rows are dropped.
|
|
151
96
|
*
|
|
152
97
|
* @param {Array<object>} rows
|
|
153
98
|
* @returns {Array<{ path: string, mi: number }>}
|
|
@@ -166,24 +111,10 @@ function projectRows(rows) {
|
|
|
166
111
|
}
|
|
167
112
|
|
|
168
113
|
/**
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* kind's `removedRowPolicy`, which for maintainability pushes an
|
|
174
|
-
* **improvement** ("the file is gone, so its debt is gone too"). That policy
|
|
175
|
-
* is correct for a full-scope compare and catastrophic for a scoped one: every
|
|
176
|
-
* untouched file in the repo would arrive here as an improvement and be
|
|
177
|
-
* rewritten from a score nobody computed. Narrowing the base to the scored
|
|
178
|
-
* keys means every comparison has both sides, so the removed-row arm cannot
|
|
179
|
-
* fire at all — and the `head === null` guard below makes that structural
|
|
180
|
-
* rather than incidental.
|
|
181
|
-
*
|
|
182
|
-
* `additions` — a scored file with no committed row — is likewise excluded:
|
|
183
|
-
* constraint 1 admits only what the classifier calls an improvement, and a new
|
|
184
|
-
* file's row is the ordinary refresh path's business, not this step's.
|
|
185
|
-
*
|
|
186
|
-
* Pure.
|
|
114
|
+
* The base side is narrowed to scored paths: maintainability's
|
|
115
|
+
* `removedRowPolicy` counts a missing head row as an improvement, which in a
|
|
116
|
+
* scoped compare would rewrite every untouched file. `additions` are excluded
|
|
117
|
+
* too. Pure.
|
|
187
118
|
*
|
|
188
119
|
* @param {{ scoredRows: Array<object>, baselineRows: Array<object>, tolerance: number }} opts
|
|
189
120
|
* @returns {Array<{ path: string, mi: number }>} the head rows to persist
|
|
@@ -211,10 +142,8 @@ function selectImprovedRows({ scoredRows, baselineRows, tolerance }) {
|
|
|
211
142
|
}
|
|
212
143
|
|
|
213
144
|
/**
|
|
214
|
-
*
|
|
215
|
-
*
|
|
216
|
-
* out of a close transcript, this does not — and `check-baseline-drift.js`'s
|
|
217
|
-
* remedy text asks a `baseline-refresh:` commit to carry a non-empty body.
|
|
145
|
+
* One before → after line per row: the durable record of what was touched
|
|
146
|
+
* (a `baseline-refresh:` commit must carry a non-empty body).
|
|
218
147
|
*
|
|
219
148
|
* @param {Array<{ path: string, mi: number }>} improved
|
|
220
149
|
* @param {Array<object>} baselineRows
|
|
@@ -238,11 +167,9 @@ function buildCommitBody(improved, baselineRows) {
|
|
|
238
167
|
}
|
|
239
168
|
|
|
240
169
|
/**
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
* everything but the Story id so it cannot drift past commitlint's 100-char
|
|
245
|
-
* subject cap.
|
|
170
|
+
* Conventional for commitlint, carrying the `baseline-refresh:` marker that
|
|
171
|
+
* `refresh-ack.js` recognises, and fixed-length apart from the id so it stays
|
|
172
|
+
* under the 100-char cap.
|
|
246
173
|
*
|
|
247
174
|
* @param {number|string} storyId
|
|
248
175
|
* @returns {string}
|
|
@@ -252,14 +179,8 @@ function buildCommitSubject(storyId) {
|
|
|
252
179
|
}
|
|
253
180
|
|
|
254
181
|
/**
|
|
255
|
-
* Stage the
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
* On a commit failure the written file is restored, because everything
|
|
259
|
-
* downstream — base-sync, the push, the gate chain's own reads — assumes the
|
|
260
|
-
* close left the worktree clean. A half-applied write-back that survives as an
|
|
261
|
-
* uncommitted edit would silently change what the gates score without ever
|
|
262
|
-
* reaching the PR.
|
|
182
|
+
* Stage and commit the baseline file with hooks enabled. On a rejected commit
|
|
183
|
+
* the file is reset to HEAD so the close leaves a clean tree.
|
|
263
184
|
*
|
|
264
185
|
* @param {{ cwd: string, git: Function, relPath: string, subject: string, body: string }} opts
|
|
265
186
|
* @returns {{ sha: string }}
|
|
@@ -272,13 +193,8 @@ function commitBaseline({ cwd, git, relPath, subject, body }) {
|
|
|
272
193
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
273
194
|
});
|
|
274
195
|
} catch (err) {
|
|
275
|
-
// `
|
|
276
|
-
//
|
|
277
|
-
// rejected commit it restored the file to the value it was meant to be
|
|
278
|
-
// rolled back FROM. The rollback was a no-op that looked like one, and the
|
|
279
|
-
// rewritten row survived as a staged edit into whatever the gates scored
|
|
280
|
-
// next. `restore --staged --worktree` resets both to HEAD, which is what
|
|
281
|
-
// "leave the tree as the close found it" actually means.
|
|
196
|
+
// `checkout --` would restore from the index `git add` just overwrote —
|
|
197
|
+
// a silent no-op. Reset both index and worktree to HEAD.
|
|
282
198
|
git(['restore', '--staged', '--worktree', '--', relPath], {
|
|
283
199
|
cwd,
|
|
284
200
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -294,22 +210,11 @@ function commitBaseline({ cwd, git, relPath, subject, body }) {
|
|
|
294
210
|
}
|
|
295
211
|
|
|
296
212
|
/**
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
*
|
|
300
|
-
*
|
|
301
|
-
*
|
|
302
|
-
* whose history we then refuse to touch.
|
|
303
|
-
*
|
|
304
|
-
* The dirty-tree guard is the same refusal `runScopedFormatAutofix` makes and
|
|
305
|
-
* for the same reason, sharpened to one path: this step's only write target is
|
|
306
|
-
* the baseline file, and it commits that file by name. An uncommitted edit
|
|
307
|
-
* sitting on it — a hand-run `maintainability:reanchor`, a half-resolved merge,
|
|
308
|
-
* an operator mid-edit — would be swept into a `baseline-refresh:` commit
|
|
309
|
-
* authored by close and attributed to rows this branch improved. That commit is
|
|
310
|
-
* the one `refresh-ack.js` VOUCHES for, so an absorbed edit is not merely
|
|
311
|
-
* unrelated: it arrives pre-acknowledged, which is the precise laundering this
|
|
312
|
-
* whole Story exists to close.
|
|
213
|
+
* Guards that must hold before scoring; returns a skip reason or `null`.
|
|
214
|
+
* The branch check runs before any write. The dirty-tree check refuses an
|
|
215
|
+
* uncommitted edit on the baseline file, which would otherwise be swept into
|
|
216
|
+
* a `baseline-refresh:` commit that `refresh-ack.js` vouches for — i.e.
|
|
217
|
+
* laundered.
|
|
313
218
|
*
|
|
314
219
|
* @param {{ gate: object|undefined, workTree: string, storyBranch: string, git: Function, changed: string[], relPath: string }} ctx
|
|
315
220
|
* @returns {string|null}
|
|
@@ -324,11 +229,7 @@ function precheck({ gate, workTree, storyBranch, git, changed, relPath }) {
|
|
|
324
229
|
}
|
|
325
230
|
|
|
326
231
|
/**
|
|
327
|
-
*
|
|
328
|
-
*
|
|
329
|
-
* Fails CLOSED on an unreadable status: a step that cannot tell whether it is
|
|
330
|
-
* about to absorb someone else's edit must not proceed, and skipping costs
|
|
331
|
-
* only a stale upward row that the nightly full-scope re-score still catches.
|
|
232
|
+
* Fails CLOSED on unreadable status; skipping only costs a stale upward row.
|
|
332
233
|
*
|
|
333
234
|
* @param {{ workTree: string, git: Function, relPath: string }} ctx
|
|
334
235
|
* @returns {boolean}
|
|
@@ -342,16 +243,8 @@ function isDirty({ workTree, git, relPath }) {
|
|
|
342
243
|
}
|
|
343
244
|
|
|
344
245
|
/**
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
* `origin/<baseBranch>` when the remote-tracking ref exists, the local branch
|
|
348
|
-
* otherwise. A local `main` in a long-lived checkout — and in every Story
|
|
349
|
-
* worktree, which is seeded once and never pulled again — drifts behind the
|
|
350
|
-
* remote, and a stale base widens the three-dot range to include commits that
|
|
351
|
-
* landed on the base after the branch forked. Every file in that widening is
|
|
352
|
-
* then scored and written back by whichever Story happens to close next, which
|
|
353
|
-
* is precisely the "absorb unrelated drift into the next PR" failure
|
|
354
|
-
* constraint 3 in the preamble forbids.
|
|
246
|
+
* Prefer `origin/<base>`: a stale local base (worktrees never pull it) widens
|
|
247
|
+
* the three-dot range to files landed after the fork, violating invariant 3.
|
|
355
248
|
*
|
|
356
249
|
* @param {{ workTree: string, git: Function, baseBranch: string }} ctx
|
|
357
250
|
* @returns {string}
|
|
@@ -373,14 +266,9 @@ function resolveScopeBase({ workTree, git, baseBranch }) {
|
|
|
373
266
|
}
|
|
374
267
|
|
|
375
268
|
/**
|
|
376
|
-
* Persist improved
|
|
377
|
-
*
|
|
378
|
-
*
|
|
379
|
-
* Every no-op is reported by name rather than silently: `gate-disabled`,
|
|
380
|
-
* `no-changed-files`, `wrong-branch`, `dirty-tree`, `no-baseline`,
|
|
381
|
-
* `no-scored-rows`, `no-improvements`, `unchanged`. The caller logs the reason and proceeds —
|
|
382
|
-
* this step is never allowed to fail a close, because `check-baselines` is
|
|
383
|
-
* still the gate and this is only the refresh half of the loop.
|
|
269
|
+
* Persist improved rows for the branch's changed files as one commit. Every
|
|
270
|
+
* no-op returns a named `reason`; this step never fails a close —
|
|
271
|
+
* `check-baselines` remains the gate.
|
|
384
272
|
*
|
|
385
273
|
* @param {{
|
|
386
274
|
* cwd: string,
|
|
@@ -425,12 +313,8 @@ export async function runBaselineUpwardWriteback({
|
|
|
425
313
|
throw new Error('runBaselineUpwardWriteback: storyBranch is required');
|
|
426
314
|
|
|
427
315
|
const workTree = worktreePath || cwd;
|
|
428
|
-
//
|
|
429
|
-
//
|
|
430
|
-
// non-zero exit. Adapt rather than reach for `node:child_process` directly —
|
|
431
|
-
// the shared surface owns the stdout ceiling, `shell: false` and error
|
|
432
|
-
// normalisation, and `tests/enforcement/child-process-imports.test.js`
|
|
433
|
-
// enforces that.
|
|
316
|
+
// Adapt `gitSync(cwd, ...args)` to the `(args, opts)` shape format-autofix
|
|
317
|
+
// expects; direct `node:child_process` use is forbidden by an enforcement test.
|
|
434
318
|
const git = (args, opts = {}) => gitSync(opts.cwd ?? workTree, ...args);
|
|
435
319
|
const gate = resolveGate(config);
|
|
436
320
|
|
|
@@ -487,11 +371,9 @@ export async function runBaselineUpwardWriteback({
|
|
|
487
371
|
}
|
|
488
372
|
|
|
489
373
|
/**
|
|
490
|
-
* Write
|
|
491
|
-
*
|
|
492
|
-
* scorer so
|
|
493
|
-
* canonicalization, `mergeRows` (which preserves every out-of-scope row
|
|
494
|
-
* byte-for-byte), rollup, envelope stamping and the atomic write.
|
|
374
|
+
* Write through `refreshBaseline` (which owns canonicalization, out-of-scope
|
|
375
|
+
* row preservation and the atomic write), passing the computed rows as its
|
|
376
|
+
* scorer so files are scored once, then commit.
|
|
495
377
|
*
|
|
496
378
|
* @returns {Promise<{ ran: boolean, committed: boolean, sha?: string, improvedPaths?: string[], reason?: string }>}
|
|
497
379
|
*/
|
|
@@ -514,9 +396,6 @@ async function persist({
|
|
|
514
396
|
scopeFiles: improvedPaths,
|
|
515
397
|
scorer: () => improved,
|
|
516
398
|
});
|
|
517
|
-
// The writer short-circuits on structural equality, so `wrote: false` means
|
|
518
|
-
// the committed rows already carried these values — nothing to commit, and
|
|
519
|
-
// nothing worth a log line above debug.
|
|
520
399
|
if (!wrote) return skip(logger, 'unchanged');
|
|
521
400
|
|
|
522
401
|
const { sha } = commitBaseline({
|
|
@@ -535,9 +414,6 @@ async function persist({
|
|
|
535
414
|
}
|
|
536
415
|
|
|
537
416
|
/**
|
|
538
|
-
* Report a no-op by name. Every skip is `info`-level: none of them is a
|
|
539
|
-
* problem, and the close transcript already carries one line per phase.
|
|
540
|
-
*
|
|
541
417
|
* @param {object} logger
|
|
542
418
|
* @param {string} reason
|
|
543
419
|
*/
|
|
@@ -546,11 +422,7 @@ function skip(logger, reason) {
|
|
|
546
422
|
return { ran: !GUARD_REASONS.has(reason), committed: false, reason };
|
|
547
423
|
}
|
|
548
424
|
|
|
549
|
-
/**
|
|
550
|
-
* Default committed-row loader — the schema-validating reader, so a baseline
|
|
551
|
-
* this module would refuse to compare against is reported as `no-baseline`
|
|
552
|
-
* rather than half-read.
|
|
553
|
-
*/
|
|
425
|
+
/** Schema-validating read; an unreadable baseline reports `no-baseline`. */
|
|
554
426
|
function defaultLoadBaselineRows({ cwd }) {
|
|
555
427
|
try {
|
|
556
428
|
return loadBaselineEnvelope(KIND, { cwd })?.rows ?? null;
|
|
@@ -559,7 +431,6 @@ function defaultLoadBaselineRows({ cwd }) {
|
|
|
559
431
|
}
|
|
560
432
|
}
|
|
561
433
|
|
|
562
|
-
/** Default on-disk location of the maintainability baseline. */
|
|
563
434
|
function defaultResolveWritePath({ cwd }) {
|
|
564
435
|
return baselineReaderInternals.resolveBaselinePath(KIND, { cwd });
|
|
565
436
|
}
|
|
@@ -1,35 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* context-budget-writeback.js —
|
|
3
|
-
*
|
|
2
|
+
* context-budget-writeback.js — when the tree measures under its recorded
|
|
3
|
+
* context-budget totals, write the lower totals back as one
|
|
4
|
+
* `baseline-refresh:` commit on the Story branch, so a stale total can't
|
|
5
|
+
* silently absorb the next growth.
|
|
4
6
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* paid for the trim twice: once in the edit and once in the red gate whose
|
|
8
|
-
* only remedy was a hand-run `--update`. Story #5313 reverses that rule —
|
|
9
|
-
* shrinkage exits 0 and is reported — and this module answers the concern
|
|
10
|
-
* the rule existed for: a stale recorded total silently absorbs the next
|
|
11
|
-
* growth. When the tree the close is scoring measures under its recorded
|
|
12
|
-
* totals, the lower totals are written back into
|
|
13
|
-
* `baselines/context-budget.json` and folded into one `baseline-refresh:`
|
|
14
|
-
* commit on the Story branch, so the gain lands in the branch's own PR.
|
|
7
|
+
* Runs at the pre-gate seam, not post-land: the only sanctioned landing is
|
|
8
|
+
* branch → PR → `main`, so a post-land write would commit to the base branch.
|
|
15
9
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* **pre-gate write-back seam** (`phases/pre-gate-steps.js`, beside the
|
|
20
|
-
* maintainability write-back of Story #5224) instead: the only sanctioned
|
|
21
|
-
* landing is the Story branch → PR → `main`, so a post-land write would have
|
|
22
|
-
* to commit straight to the base branch. Writing on the branch ahead of the
|
|
23
|
-
* gates keeps the row inside the PR the gates score and lets
|
|
24
|
-
* `refresh-ack.js` vouch for it through the same `baseline-refresh:` marker.
|
|
25
|
-
*
|
|
26
|
-
* Constraints, each a "must not":
|
|
27
|
-
*
|
|
28
|
-
* 1. **Only a downward move is written.** Growth past tolerance and an
|
|
29
|
-
* unbacked recorded row must still fail `check-context-budget.js` exactly
|
|
30
|
-
* as before; when either is present this step skips and the gate speaks.
|
|
31
|
-
* 2. **Idempotent and silent.** No shrink, no write, no commit.
|
|
32
|
-
* 3. **Never fails the close.** Every failure is a named skip.
|
|
10
|
+
* Only a downward move is written — any growth or unbacked row skips and
|
|
11
|
+
* leaves `check-context-budget.js` to fail. Idempotent; every failure is a
|
|
12
|
+
* named skip, never a failed close.
|
|
33
13
|
*/
|
|
34
14
|
|
|
35
15
|
import fs from 'node:fs';
|
|
@@ -47,12 +27,10 @@ import { Logger as DefaultLogger } from '../../Logger.js';
|
|
|
47
27
|
|
|
48
28
|
const TAG = '[context-budget-writeback]';
|
|
49
29
|
|
|
50
|
-
/** Repo-relative location of the committed budget. */
|
|
51
30
|
const BASELINE_REL_PATH = 'baselines/context-budget.json';
|
|
52
31
|
|
|
53
32
|
/**
|
|
54
|
-
*
|
|
55
|
-
* marker `refresh-ack.js` recognises, fixed-length but for the Story id.
|
|
33
|
+
* Carries the `baseline-refresh:` marker `refresh-ack.js` recognises.
|
|
56
34
|
*
|
|
57
35
|
* @param {number|string} storyId
|
|
58
36
|
* @returns {string}
|
|
@@ -62,8 +40,6 @@ function buildCommitSubject(storyId) {
|
|
|
62
40
|
}
|
|
63
41
|
|
|
64
42
|
/**
|
|
65
|
-
* One line per tier that moved down, before → after.
|
|
66
|
-
*
|
|
67
43
|
* @param {Array<{ tier: string, current: number, baseline: number }>} shrunk
|
|
68
44
|
* @returns {string}
|
|
69
45
|
*/
|
|
@@ -78,8 +54,6 @@ function buildCommitBody(shrunk) {
|
|
|
78
54
|
}
|
|
79
55
|
|
|
80
56
|
/**
|
|
81
|
-
* Report a no-op by name.
|
|
82
|
-
*
|
|
83
57
|
* @param {object} logger
|
|
84
58
|
* @param {string} reason
|
|
85
59
|
*/
|
|
@@ -89,7 +63,7 @@ function skip(logger, reason) {
|
|
|
89
63
|
}
|
|
90
64
|
|
|
91
65
|
/**
|
|
92
|
-
*
|
|
66
|
+
* Returns a skip reason or `null`.
|
|
93
67
|
*
|
|
94
68
|
* @param {{ workTree: string, storyBranch: string, git: Function, relPath: string }} ctx
|
|
95
69
|
* @returns {string|null}
|
|
@@ -140,10 +114,6 @@ function commitBaseline({ workTree, git, relPath, envelope, storyId, shrunk }) {
|
|
|
140
114
|
}
|
|
141
115
|
|
|
142
116
|
/**
|
|
143
|
-
* Write the lower context-budget totals back on the Story branch.
|
|
144
|
-
*
|
|
145
|
-
* Total: a throw anywhere is a named skip, never a failed close.
|
|
146
|
-
*
|
|
147
117
|
* @param {{
|
|
148
118
|
* cwd: string,
|
|
149
119
|
* worktreePath?: string|null,
|