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,89 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/light-suitability.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* mandrel-bench 2.12.0 forensics attributed the framework arm's cost to
|
|
8
|
-
* **session multiplication** — repeated cold framework boots (2 for a one-file
|
|
9
|
-
* greenfield build, 4 for a change request) — where the bare control does
|
|
10
|
-
* comparable small work in a single session, lacking only the quality gates
|
|
11
|
-
* and the landing guarantee. `/deliver-light` closes that gap: one session
|
|
12
|
-
* straight to execution from an operator prompt, landing through the
|
|
13
|
-
* **unchanged** `single-story-close.js` path. This module is the reusable
|
|
14
|
-
* decision core the light workflow drives; it owns **no** git, branch, PR, or
|
|
15
|
-
* label mutation — those stay in the shared engine scripts.
|
|
16
|
-
*
|
|
17
|
-
* ## Four invariants keep it proportional, not a planning bypass
|
|
18
|
-
*
|
|
19
|
-
* 1. **Suitability gate ({@link deriveLightSuitability}).** The prompt's
|
|
20
|
-
* predicted footprint is judged by the **shared shape machinery**
|
|
21
|
-
* ({@link module:lib/orchestration/complexity-gate.deriveStoryShape} over
|
|
22
|
-
* {@link module:lib/orchestration/complexity-gate.STORY_SHAPE_CEILINGS})
|
|
23
|
-
* **and** a ledgered model verdict carrying a recorded reason
|
|
24
|
-
* ({@link resolveLedgeredVerdict}). Both must agree on `lite`; either
|
|
25
|
-
* falling short fails closed to `full`. The shape axes are effort and
|
|
26
|
-
* risk — distinct change kinds, a coarse magnitude bucket, uncertainty,
|
|
27
|
-
* and epic-scope span — never artifact counts (Story #4764), so this gate
|
|
28
|
-
* is deliberately **coarse**: it rejects clearly-epic work, and invariant
|
|
29
|
-
* 3 below does the real enforcement against ground truth.
|
|
30
|
-
* 2. **The predicted shape is a warning, not a gate ({@link
|
|
31
|
-
* resolveLightGateOutcome}, Story #5313).** An over-ceiling prediction
|
|
32
|
-
* proceeds light with a `warnings[]` entry naming the exceeded axis — the
|
|
33
|
-
* prediction is a guess, and invariant 3 bounds the real change set. Only
|
|
34
|
-
* the two things no re-slicing can fix still refuse: an un-ledgered
|
|
35
|
-
* verdict and an un-waivable risk rule (a sensitive-path class or a
|
|
36
|
-
* migration span), which route `full` through an `escalated` terminal.
|
|
37
|
-
* The former `ask-operator` outcome and its `--operator-proceed-light`
|
|
38
|
-
* answer are gone with the gate they answered.
|
|
39
|
-
* 3. **Diff-derived backstop ({@link checkLightDiffBackstop}).** After
|
|
40
|
-
* implementation the **actual** change set is re-checked with
|
|
41
|
-
* {@link module:lib/orchestration/review-depth.deriveChangeLevel} plus the
|
|
42
|
-
* implementation-only magnitude ceilings of {@link LIGHT_DIFF_CEILINGS} —
|
|
43
|
-
* the diff is the real scope signal — and an over-ceiling diff is blocked
|
|
44
|
-
* rather than landed silently. Story #4856 moved this from a `maxFiles: 4`
|
|
45
|
-
* cardinality ceiling to changed lines over implementation files, and made
|
|
46
|
-
* a block **recycle** its receipt Story through `/mandrel-plan` tickets mode
|
|
47
|
-
* instead of orphaning it.
|
|
48
|
-
* 4. **Minimal receipt Story ({@link buildReceiptStoryTicket}).** A
|
|
49
|
-
* `type::story` ticket is authored inline so `refs #`, history, telemetry,
|
|
50
|
-
* and the `agent::executing -> agent::done` state machine survive.
|
|
51
|
-
*
|
|
52
|
-
* Every function here is pure and total: inputs in, decision out, no I/O and no
|
|
53
|
-
* throws (except {@link buildReceiptStoryTicket}, which rejects an empty
|
|
54
|
-
* prompt — a receipt with no prompt has nothing to record).
|
|
2
|
+
* lib/orchestration/light-suitability.js — pure `/deliver-light` decision
|
|
3
|
+
* core (no git/PR/label mutation). Nothing the caller declares about its own
|
|
4
|
+
* size decides: the gate reads risk off predicted paths plus a recorded
|
|
5
|
+
* reason, and the diff backstop is the only size block.
|
|
55
6
|
*
|
|
56
7
|
* @module lib/orchestration/light-suitability
|
|
57
8
|
*/
|
|
58
9
|
|
|
59
|
-
import {
|
|
60
|
-
deriveStoryShape,
|
|
61
|
-
SHAPE_CODES,
|
|
62
|
-
STORY_SHAPE_CEILINGS,
|
|
63
|
-
} from './complexity-gate.js';
|
|
10
|
+
import { deriveStoryShape, SHAPE_CODES } from './complexity-gate.js';
|
|
64
11
|
import { deriveChangeLevel } from './review-depth.js';
|
|
65
12
|
|
|
66
13
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* shape decision happened to record** (Story #4875).
|
|
70
|
-
*
|
|
71
|
-
* No re-slicing, shrinking, or operator answer satisfies one: a footprint
|
|
72
|
-
* intersecting a sensitive-path class routes `full` however small the change,
|
|
73
|
-
* and the diff backstop refuses the same footprint again at the end. But
|
|
74
|
-
* {@link deriveStoryShape} reports only the **first** rule a shape trips and
|
|
75
|
-
* evaluates the ceiling rules first, so a prompt tripping both `change-kinds`
|
|
76
|
-
* and `sensitive-path` is reported as a size objection — which reads as
|
|
77
|
-
* appealable, is waivable by an attended operator, and sends the work all the
|
|
78
|
-
* way to an implementation the backstop then refuses.
|
|
79
|
-
*
|
|
80
|
-
* The recovery is that the shape decision attaches the built effort shape to
|
|
81
|
-
* every footprint it can judge at all, and that shape carries the risk facts
|
|
82
|
-
* (`sensitiveClasses`, `migrationSpan`) whether or not a risk rule fired.
|
|
83
|
-
* Reading them here surfaces the objection first-hit reporting hides — the
|
|
84
|
-
* difference between a wasted session and a redirected one.
|
|
85
|
-
*
|
|
86
|
-
* Pure and total.
|
|
14
|
+
* Read from the risk shape, not the recorded `code`: first-hit reporting can
|
|
15
|
+
* hide a risk rule behind a fixable one.
|
|
87
16
|
*
|
|
88
17
|
* @param {{ shape?: { sensitiveClasses?: unknown, migrationSpan?: unknown } }} [decision]
|
|
89
18
|
* A {@link deriveStoryShape} return value.
|
|
@@ -129,28 +58,8 @@ function deriveUnwaivableRisk(decision) {
|
|
|
129
58
|
}
|
|
130
59
|
|
|
131
60
|
/**
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* implementation half (Story #4856 — see
|
|
135
|
-
* {@link module:lib/orchestration/diff-magnitude} for the measured case and the
|
|
136
|
-
* companion-class boundary).
|
|
137
|
-
*
|
|
138
|
-
* The backstop reads ground truth, so it is where size is genuinely enforced;
|
|
139
|
-
* the prediction gate above it is a declaration and stays coarse (Story #4764).
|
|
140
|
-
* What changed is the **axis**: this used to be `maxFiles: 4`, a cardinality
|
|
141
|
-
* ceiling that rejected 79% of this repository's real merged work while passing
|
|
142
|
-
* a three-file 323-line rewrite.
|
|
143
|
-
*
|
|
144
|
-
* - `maxImplLines` — additions plus deletions across implementation files.
|
|
145
|
-
* Simulated over 41 merges, 1000 admits 83% of real work
|
|
146
|
-
* and rejects exactly the genuinely large changes.
|
|
147
|
-
* - `maxImplFiles` — implementation files touched, a *sprawl* tripwire rather
|
|
148
|
-
* than a size gate. Set to `DEFAULT_DIFF_WIDTH.softFiles`
|
|
149
|
-
* so the light path and `review-depth.js` stop holding two
|
|
150
|
-
* different definitions of a narrow diff.
|
|
151
|
-
*
|
|
152
|
-
* Framework constants, not knobs: a ceiling an operator could widen past what a
|
|
153
|
-
* single session safely absorbs is a ceiling that fails silently.
|
|
61
|
+
* Implementation-half ceilings (companions exempt); `maxImplFiles` matches
|
|
62
|
+
* `DEFAULT_DIFF_WIDTH.softFiles`. Constants: a widenable ceiling fails silently.
|
|
154
63
|
*/
|
|
155
64
|
export const LIGHT_DIFF_CEILINGS = Object.freeze({
|
|
156
65
|
maxImplLines: 1000,
|
|
@@ -158,9 +67,7 @@ export const LIGHT_DIFF_CEILINGS = Object.freeze({
|
|
|
158
67
|
});
|
|
159
68
|
|
|
160
69
|
/**
|
|
161
|
-
*
|
|
162
|
-
* framework default for anything malformed — a stray `0`, `-1`, or `NaN` must
|
|
163
|
-
* never widen (or zero out) a light diff ceiling.
|
|
70
|
+
* A malformed ceiling falls back to the default, never widens or zeroes.
|
|
164
71
|
*
|
|
165
72
|
* @param {unknown} value
|
|
166
73
|
* @param {number} fallback
|
|
@@ -174,8 +81,6 @@ function normalizeCeiling(value, fallback) {
|
|
|
174
81
|
}
|
|
175
82
|
|
|
176
83
|
/**
|
|
177
|
-
* Resolve the effective diff ceilings from a caller-supplied partial override.
|
|
178
|
-
*
|
|
179
84
|
* @param {{ maxImplLines?: unknown, maxImplFiles?: unknown }} [ceilings]
|
|
180
85
|
* @returns {{ maxImplLines: number, maxImplFiles: number }}
|
|
181
86
|
*/
|
|
@@ -193,96 +98,51 @@ function resolveDiffCeilings(ceilings) {
|
|
|
193
98
|
}
|
|
194
99
|
|
|
195
100
|
/**
|
|
196
|
-
*
|
|
197
|
-
* contract: a `lite` route counts **only** with a non-empty recorded reason. A lite claim
|
|
198
|
-
* without a recorded reason, or any non-`lite` route, fails closed to `full` —
|
|
199
|
-
* an unaudited "trust me, it's small" never buys the light path.
|
|
200
|
-
*
|
|
201
|
-
* Pure and total.
|
|
101
|
+
* No recorded reason fails closed to `full`.
|
|
202
102
|
*
|
|
203
|
-
* @param {{
|
|
103
|
+
* @param {{ reason?: unknown }} [verdict]
|
|
204
104
|
* @returns {{
|
|
205
|
-
* route: 'lite'|'full',
|
|
206
105
|
* reason: string|null,
|
|
207
106
|
* recorded: boolean,
|
|
208
107
|
* note: string,
|
|
209
108
|
* }}
|
|
210
109
|
*/
|
|
211
|
-
export function resolveLedgeredVerdict({
|
|
110
|
+
export function resolveLedgeredVerdict({ reason } = {}) {
|
|
212
111
|
const recordedReason = typeof reason === 'string' ? reason.trim() : '';
|
|
213
|
-
if (route !== 'lite') {
|
|
214
|
-
return {
|
|
215
|
-
route: 'full',
|
|
216
|
-
reason: recordedReason || null,
|
|
217
|
-
recorded: recordedReason !== '',
|
|
218
|
-
note: 'model verdict is not lite — standard /mandrel-plan route',
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
112
|
if (recordedReason === '') {
|
|
222
113
|
return {
|
|
223
|
-
route: 'full',
|
|
224
114
|
reason: null,
|
|
225
115
|
recorded: false,
|
|
226
|
-
note: '
|
|
116
|
+
note: 'no recorded reason — fails closed to full (the light verdict must be ledgered)',
|
|
227
117
|
};
|
|
228
118
|
}
|
|
229
119
|
return {
|
|
230
|
-
route: 'lite',
|
|
231
120
|
reason: recordedReason,
|
|
232
121
|
recorded: true,
|
|
233
|
-
note: `
|
|
122
|
+
note: `light verdict (recorded reason): ${recordedReason}`,
|
|
234
123
|
};
|
|
235
124
|
}
|
|
236
125
|
|
|
237
126
|
/**
|
|
238
|
-
*
|
|
239
|
-
*
|
|
240
|
-
* verdict must **both** agree on `lite`; anything else — clearly-epic work, a
|
|
241
|
-
* sensitive-path footprint, an unledgered verdict — resolves to `full` (the
|
|
242
|
-
* conservative default that routes the operator to `/mandrel-plan`).
|
|
243
|
-
*
|
|
244
|
-
* The predicted axes are declared by the caller: `predictedKinds` (the distinct
|
|
245
|
-
* kinds of change; absent, each entry's `assumption` is its kind, so N
|
|
246
|
-
* instances of one mechanical edit count once), `predictedMagnitude`
|
|
247
|
-
* (`trivial` | `moderate` | `substantial`), and `predictedUncertainty`
|
|
248
|
-
* (`determined` | `needs-design`). A malformed bucket fails closed; an absent
|
|
249
|
-
* one carries no signal, because a marginal footprint must not be rejected on
|
|
250
|
-
* counts the diff backstop is the right place to enforce.
|
|
251
|
-
*
|
|
252
|
-
* Pure and total: never throws, never mutates its inputs.
|
|
127
|
+
* Refuses only on un-waivable risk or an un-ledgered verdict; size is bounded
|
|
128
|
+
* later by {@link checkLightDiffBackstop}.
|
|
253
129
|
*
|
|
254
130
|
* @param {{
|
|
255
131
|
* predictedChanges?: unknown,
|
|
256
|
-
*
|
|
257
|
-
* predictedKinds?: unknown,
|
|
258
|
-
* predictedMagnitude?: unknown,
|
|
259
|
-
* predictedUncertainty?: unknown,
|
|
260
|
-
* verdict?: { route?: unknown, reason?: unknown },
|
|
132
|
+
* verdict?: { reason?: unknown },
|
|
261
133
|
* injectedRules?: object,
|
|
262
134
|
* selectSensitivePathClassesFn?: Function,
|
|
263
135
|
* }} [args]
|
|
264
136
|
* @returns {{
|
|
265
137
|
* suitable: boolean,
|
|
266
|
-
* route: 'lite'|'full',
|
|
267
138
|
* shape: ReturnType<typeof deriveStoryShape>,
|
|
268
139
|
* ledger: ReturnType<typeof resolveLedgeredVerdict>,
|
|
269
140
|
* unwaivable: ReturnType<typeof deriveUnwaivableRisk>,
|
|
270
|
-
* ceilings: typeof STORY_SHAPE_CEILINGS,
|
|
271
141
|
* reasons: string[],
|
|
272
|
-
*
|
|
273
|
-
* }} `unwaivable` names an absolute risk rule the predicted footprint trips
|
|
274
|
-
* even when the recorded `shape.code` is a size prediction (Story #4875), so
|
|
275
|
-
* the operator learns at prediction time that no re-slicing can help.
|
|
276
|
-
* `warnings` carries the predicted-shape objection when the shape is past a
|
|
277
|
-
* light ceiling (Story #5313): it names the exceeded axis, and it never
|
|
278
|
-
* decides `suitable` — the diff backstop bounds the real change set.
|
|
142
|
+
* }}
|
|
279
143
|
*/
|
|
280
144
|
export function deriveLightSuitability({
|
|
281
145
|
predictedChanges,
|
|
282
|
-
predictedAcceptance,
|
|
283
|
-
predictedKinds,
|
|
284
|
-
predictedMagnitude,
|
|
285
|
-
predictedUncertainty,
|
|
286
146
|
verdict,
|
|
287
147
|
injectedRules,
|
|
288
148
|
selectSensitivePathClassesFn,
|
|
@@ -290,72 +150,23 @@ export function deriveLightSuitability({
|
|
|
290
150
|
const ledger = resolveLedgeredVerdict(verdict ?? {});
|
|
291
151
|
const shape = deriveStoryShape({
|
|
292
152
|
changes: predictedChanges,
|
|
293
|
-
acceptance: predictedAcceptance,
|
|
294
|
-
kinds: predictedKinds,
|
|
295
|
-
magnitude: predictedMagnitude,
|
|
296
|
-
uncertainty: predictedUncertainty,
|
|
297
153
|
injectedRules,
|
|
298
154
|
selectSensitivePathClassesFn,
|
|
299
155
|
});
|
|
300
156
|
const unwaivable = deriveUnwaivableRisk(shape);
|
|
301
|
-
|
|
302
|
-
// decisive on its own — a sensitive footprint can never be lite — and the
|
|
303
|
-
// ledgered verdict must still be lite; everything the shape ceilings say is
|
|
304
|
-
// carried as a warning for the operator and bounded for real by the backstop.
|
|
305
|
-
const suitable = ledger.route === 'lite' && !unwaivable.present;
|
|
157
|
+
const suitable = ledger.recorded && !unwaivable.present;
|
|
306
158
|
const reasons = [`shape: ${shape.reasons[0]}`];
|
|
307
159
|
if (unwaivable.present) reasons.push(unwaivable.reason);
|
|
308
160
|
reasons.push(`verdict: ${ledger.note}`);
|
|
309
|
-
return {
|
|
310
|
-
suitable,
|
|
311
|
-
route: suitable ? 'lite' : 'full',
|
|
312
|
-
shape,
|
|
313
|
-
ledger,
|
|
314
|
-
unwaivable,
|
|
315
|
-
ceilings: STORY_SHAPE_CEILINGS,
|
|
316
|
-
reasons,
|
|
317
|
-
warnings: shapeWarnings(shape),
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* The predicted-shape objection as a warning (Story #5313): one entry naming
|
|
323
|
-
* the exceeded axis (`shape.code`) and the shape's own reason, or none when
|
|
324
|
-
* the prediction is within every light ceiling.
|
|
325
|
-
*
|
|
326
|
-
* @param {ReturnType<typeof deriveStoryShape>} shape
|
|
327
|
-
* @returns {string[]}
|
|
328
|
-
*/
|
|
329
|
-
function shapeWarnings(shape) {
|
|
330
|
-
if (shape?.route === 'lite') return [];
|
|
331
|
-
const axis = shape?.code ?? 'unknown';
|
|
332
|
-
const reason = shape?.reasons?.[0] ?? 'no reason recorded';
|
|
333
|
-
return [
|
|
334
|
-
`predicted shape exceeds a light ceiling on "${axis}": ${reason} — ` +
|
|
335
|
-
'proceeding light; the diff backstop bounds the actual change set',
|
|
336
|
-
];
|
|
161
|
+
return { suitable, shape, ledger, unwaivable, reasons };
|
|
337
162
|
}
|
|
338
163
|
|
|
339
164
|
/**
|
|
340
|
-
* Resolve what the light gate does with a suitability decision (Story #4740
|
|
341
|
-
* AC-3; Story #5313).
|
|
342
|
-
*
|
|
343
|
-
* - suitable → `proceed-light`, carrying the predicted-shape
|
|
344
|
-
* `warnings[]` (possibly empty) so an over-ceiling
|
|
345
|
-
* prediction is stated, never silent.
|
|
346
|
-
* - not suitable → `escalate-plan` — only an un-ledgered verdict or an
|
|
347
|
-
* un-waivable risk rule gets here, and neither has an
|
|
348
|
-
* answer an operator could give, so there is no
|
|
349
|
-
* attended/unattended split any more.
|
|
350
|
-
*
|
|
351
|
-
* Pure and total.
|
|
352
|
-
*
|
|
353
165
|
* @param {{
|
|
354
|
-
* suitability?: { suitable?: boolean, reasons?: string[]
|
|
166
|
+
* suitability?: { suitable?: boolean, reasons?: string[] },
|
|
355
167
|
* }} [args]
|
|
356
168
|
* @returns {{
|
|
357
169
|
* action: 'proceed-light'|'escalate-plan',
|
|
358
|
-
* warnings: string[],
|
|
359
170
|
* reasons: string[],
|
|
360
171
|
* }}
|
|
361
172
|
*/
|
|
@@ -363,71 +174,43 @@ export function resolveLightGateOutcome({ suitability } = {}) {
|
|
|
363
174
|
const reasons = Array.isArray(suitability?.reasons)
|
|
364
175
|
? [...suitability.reasons]
|
|
365
176
|
: [];
|
|
366
|
-
const warnings = Array.isArray(suitability?.warnings)
|
|
367
|
-
? [...suitability.warnings]
|
|
368
|
-
: [];
|
|
369
177
|
|
|
370
178
|
if (suitability?.suitable === true) {
|
|
371
179
|
return {
|
|
372
180
|
action: 'proceed-light',
|
|
373
|
-
warnings,
|
|
374
181
|
reasons: [
|
|
375
182
|
...reasons,
|
|
376
|
-
|
|
377
|
-
? 'ledgered verdict lite and no un-waivable risk — proceeding light with a predicted-shape warning'
|
|
378
|
-
: 'predicted shape and ledgered verdict both lite — proceed light',
|
|
183
|
+
'ledgered verdict recorded and no un-waivable risk rule fired — proceed light; the diff backstop bounds the actual change set',
|
|
379
184
|
],
|
|
380
185
|
};
|
|
381
186
|
}
|
|
382
187
|
|
|
383
188
|
return {
|
|
384
189
|
action: 'escalate-plan',
|
|
385
|
-
warnings,
|
|
386
190
|
reasons: [
|
|
387
191
|
...reasons,
|
|
388
|
-
'the
|
|
192
|
+
'the verdict is un-ledgered or an un-waivable risk rule fired — fails closed to /mandrel-plan (never silently proceeds light)',
|
|
389
193
|
],
|
|
390
194
|
};
|
|
391
195
|
}
|
|
392
196
|
|
|
393
197
|
/**
|
|
394
|
-
*
|
|
395
|
-
*
|
|
396
|
-
*
|
|
397
|
-
* One value per blocked verdict, and the reason it exists is downstream: the
|
|
398
|
-
* refusal's friction category is derived from it
|
|
399
|
-
* ({@link module:lib/observability/runtime-friction.lightScopeRejectedCategory}),
|
|
400
|
-
* and the category is the ONLY key the retro composer separates buckets on.
|
|
401
|
-
* Under one bare category an empty-diff refusal and a `public-api` refusal
|
|
402
|
-
* aggregated into a single "recurred 2 times" follow-up with nothing in common
|
|
403
|
-
* (issue #5237) — the roll-up's shape fingerprint could not tell them apart
|
|
404
|
-
* either, because it hashes detail keys and every refusal carries the same set.
|
|
405
|
-
*
|
|
406
|
-
* Kept coarse on purpose: a class must be stable enough that N refusals of one
|
|
407
|
-
* cause still coalesce into the recurrence evidence the ceilings are
|
|
408
|
-
* recalibrated from.
|
|
198
|
+
* One class per blocked verdict; retro buckets split only on the friction
|
|
199
|
+
* category derived from it. Kept coarse so repeats of one cause coalesce.
|
|
409
200
|
*
|
|
410
201
|
* @typedef {{ reason: string, refusalClass: string }} Objection
|
|
411
202
|
*/
|
|
412
203
|
export const LIGHT_REFUSAL_CLASSES = Object.freeze({
|
|
413
|
-
/** The diff could not be enumerated, or enumerated to nothing. */
|
|
414
204
|
CHANGE_SET_UNKNOWN: 'change-set-unknown',
|
|
415
205
|
/** Enumerated-empty, but the worktree carries uncommitted changes. */
|
|
416
206
|
UNCOMMITTED_WORK: 'uncommitted-work',
|
|
417
|
-
/** The change set intersects a registered sensitive-path class. */
|
|
418
207
|
SENSITIVE_PATH: 'sensitive-path',
|
|
419
|
-
/** Sensitivity could not be classified, so non-sensitivity is unproven. */
|
|
420
208
|
SENSITIVITY_UNKNOWN: 'sensitivity-unknown',
|
|
421
|
-
/** The implementation magnitude could not be measured. */
|
|
422
209
|
MAGNITUDE_UNKNOWN: 'magnitude-unknown',
|
|
423
|
-
/** Measured magnitude exceeded a light ceiling. */
|
|
424
210
|
OVER_CEILING: 'over-ceiling',
|
|
425
211
|
});
|
|
426
212
|
|
|
427
213
|
/**
|
|
428
|
-
* Name the branch a commit-first refusal tells the agent to commit on, with a
|
|
429
|
-
* generic stand-in when the caller supplied none. Pure.
|
|
430
|
-
*
|
|
431
214
|
* @param {unknown} storyBranch
|
|
432
215
|
* @returns {string}
|
|
433
216
|
*/
|
|
@@ -437,29 +220,9 @@ function describeStoryBranch(storyBranch) {
|
|
|
437
220
|
}
|
|
438
221
|
|
|
439
222
|
/**
|
|
440
|
-
*
|
|
441
|
-
*
|
|
442
|
-
*
|
|
443
|
-
* when the diff intersects a sensitive-path class, exceeds an implementation
|
|
444
|
-
* ceiling, or cannot be measured. A clean result is the only path that lands
|
|
445
|
-
* light.
|
|
446
|
-
*
|
|
447
|
-
* Two inputs, two different scopes, and the difference is load-bearing:
|
|
448
|
-
*
|
|
449
|
-
* - `changedFiles` is the **full** change set, companions included, and is
|
|
450
|
-
* what sensitive-path derivation reads. Exempting a companion from the
|
|
451
|
-
* *count* must never exempt it from *risk* — a test file under a registered
|
|
452
|
-
* sensitive class still blocks.
|
|
453
|
-
* - `magnitude` is the implementation-only summary from
|
|
454
|
-
* {@link module:lib/orchestration/diff-magnitude.summarizeDiffMagnitude}.
|
|
455
|
-
* `null` means the magnitude could not be measured, which blocks: absence
|
|
456
|
-
* of evidence is not evidence the diff is small.
|
|
457
|
-
*
|
|
458
|
-
* Reuses close's own {@link module:lib/orchestration/review-depth.deriveChangeLevel}
|
|
459
|
-
* — one taxonomy, applied to the predicted shape at the gate and the actual
|
|
460
|
-
* diff here — so the two read points can never disagree about what is sensitive.
|
|
461
|
-
*
|
|
462
|
-
* Pure and total.
|
|
223
|
+
* Re-check the ACTUAL diff; anything unmeasurable blocks. `changedFiles` is
|
|
224
|
+
* the full set — a companion exempt from the count is never exempt from
|
|
225
|
+
* risk. Shares close's `deriveChangeLevel`, so gate and backstop agree.
|
|
463
226
|
*
|
|
464
227
|
* @param {{
|
|
465
228
|
* changedFiles?: unknown,
|
|
@@ -469,12 +232,7 @@ function describeStoryBranch(storyBranch) {
|
|
|
469
232
|
* selectSensitivePathClassesFn?: Function,
|
|
470
233
|
* storyBranch?: string,
|
|
471
234
|
* uncommittedWork?: boolean,
|
|
472
|
-
* }} [args] `uncommittedWork`
|
|
473
|
-
* backstop reads COMMITTED state, so an implemented-but-uncommitted run
|
|
474
|
-
* measures an empty diff, and the door for that is `git commit` — not an
|
|
475
|
-
* escalation. It only ever refines an enumerated-empty verdict's guidance;
|
|
476
|
-
* the verdict itself still blocks. `storyBranch` names the branch that
|
|
477
|
-
* guidance points at.
|
|
235
|
+
* }} [args] `uncommittedWork` only redirects guidance to `git commit`.
|
|
478
236
|
* @returns {{
|
|
479
237
|
* blocked: boolean,
|
|
480
238
|
* level: 'low'|'high'|null,
|
|
@@ -484,8 +242,7 @@ function describeStoryBranch(storyBranch) {
|
|
|
484
242
|
* ceilings: { maxImplLines: number, maxImplFiles: number },
|
|
485
243
|
* refusalClass: string|null,
|
|
486
244
|
* reasons: string[],
|
|
487
|
-
* }}
|
|
488
|
-
* {@link LIGHT_REFUSAL_CLASSES} value on every blocked one.
|
|
245
|
+
* }}
|
|
489
246
|
*/
|
|
490
247
|
export function checkLightDiffBackstop({
|
|
491
248
|
changedFiles,
|
|
@@ -502,11 +259,7 @@ export function checkLightDiffBackstop({
|
|
|
502
259
|
: null;
|
|
503
260
|
|
|
504
261
|
if (files === null || files.length === 0) {
|
|
505
|
-
//
|
|
506
|
-
// an unverifiable one, and blocking is right for both — but only one of
|
|
507
|
-
// them is about scope. The caller's probe distinguishes them; `files ===
|
|
508
|
-
// null` never can, because a `git diff` that failed outright is exactly
|
|
509
|
-
// the case where nothing about the change is known.
|
|
262
|
+
// `files === null` (git diff failed) can never be the uncommitted case.
|
|
510
263
|
const uncommitted = files !== null && uncommittedWork === true;
|
|
511
264
|
return {
|
|
512
265
|
blocked: true,
|
|
@@ -546,10 +299,8 @@ export function checkLightDiffBackstop({
|
|
|
546
299
|
fileCount: files.length,
|
|
547
300
|
magnitude: measured,
|
|
548
301
|
ceilings: resolved,
|
|
549
|
-
//
|
|
550
|
-
//
|
|
551
|
-
// sensitive-path refusal. That is the right way round — the ceiling is
|
|
552
|
-
// recalibratable, the sensitive path is not.
|
|
302
|
+
// Order is precedence: sensitivity wins over magnitude, since a ceiling
|
|
303
|
+
// is recalibratable and a sensitive path is not.
|
|
553
304
|
refusalClass: blocked ? objections[0].refusalClass : null,
|
|
554
305
|
reasons: blocked
|
|
555
306
|
? objections.map((objection) => objection.reason)
|
|
@@ -562,9 +313,6 @@ export function checkLightDiffBackstop({
|
|
|
562
313
|
}
|
|
563
314
|
|
|
564
315
|
/**
|
|
565
|
-
* Coerce a magnitude summary into non-negative integer counts, or `null` when
|
|
566
|
-
* it was not measurable. Pure.
|
|
567
|
-
*
|
|
568
316
|
* @param {unknown} magnitude
|
|
569
317
|
* @returns {{ implFiles: number, implLines: number }|null}
|
|
570
318
|
*/
|
|
@@ -577,8 +325,6 @@ function normalizeMagnitude(magnitude) {
|
|
|
577
325
|
}
|
|
578
326
|
|
|
579
327
|
/**
|
|
580
|
-
* Sensitivity objections, over the **full** change set. Pure.
|
|
581
|
-
*
|
|
582
328
|
* @param {{ level: 'low'|'high'|null, classes: string[] }} derived
|
|
583
329
|
* @returns {Objection[]}
|
|
584
330
|
*/
|
|
@@ -604,8 +350,6 @@ function describeSensitivity({ level, classes }) {
|
|
|
604
350
|
}
|
|
605
351
|
|
|
606
352
|
/**
|
|
607
|
-
* Magnitude objections, over the implementation half only. Pure.
|
|
608
|
-
*
|
|
609
353
|
* @param {{ implFiles: number, implLines: number }|null} measured
|
|
610
354
|
* @param {{ maxImplLines: number, maxImplFiles: number }} ceilings
|
|
611
355
|
* @returns {Objection[]}
|
|
@@ -636,12 +380,9 @@ function describeMagnitude(measured, ceilings) {
|
|
|
636
380
|
return objections;
|
|
637
381
|
}
|
|
638
382
|
|
|
639
|
-
/** Cap on a receipt slug's length — keep the branch/id readable. */
|
|
640
383
|
const RECEIPT_SLUG_MAX = 48;
|
|
641
384
|
|
|
642
385
|
/**
|
|
643
|
-
* Derive a stable, lowercase, hyphenated slug from a prompt.
|
|
644
|
-
*
|
|
645
386
|
* @param {string} text
|
|
646
387
|
* @returns {string}
|
|
647
388
|
*/
|
|
@@ -655,12 +396,10 @@ function slugifyPrompt(text) {
|
|
|
655
396
|
return slug === '' ? 'light-change' : slug;
|
|
656
397
|
}
|
|
657
398
|
|
|
658
|
-
/** Cap on a receipt title's length. */
|
|
659
399
|
const RECEIPT_TITLE_MAX = 72;
|
|
660
400
|
|
|
661
401
|
/**
|
|
662
|
-
*
|
|
663
|
-
* positive integer issue number, or `null` when absent/malformed.
|
|
402
|
+
* `#<n>`, `<n>` or a number → positive issue number, else `null`.
|
|
664
403
|
*
|
|
665
404
|
* @param {unknown} amends
|
|
666
405
|
* @returns {number|null}
|
|
@@ -680,8 +419,6 @@ function normalizeAmends(amends) {
|
|
|
680
419
|
}
|
|
681
420
|
|
|
682
421
|
/**
|
|
683
|
-
* One-line receipt title from the prompt, prefixed for an amendment.
|
|
684
|
-
*
|
|
685
422
|
* @param {string} text
|
|
686
423
|
* @param {number|null} amendsId
|
|
687
424
|
* @returns {string}
|
|
@@ -698,9 +435,7 @@ function deriveReceiptTitle(text, amendsId) {
|
|
|
698
435
|
}
|
|
699
436
|
|
|
700
437
|
/**
|
|
701
|
-
*
|
|
702
|
-
* for the receipt body. Every entry is recorded as `refactors-existing` — the
|
|
703
|
-
* conservative assumption, since the light path is not asserting creates.
|
|
438
|
+
* All `refactors-existing`: the light path does not assert creates.
|
|
704
439
|
*
|
|
705
440
|
* @param {unknown} changedFiles
|
|
706
441
|
* @returns {Array<{ path: string, assumption: string }>}
|
|
@@ -719,12 +454,7 @@ function toReceiptChanges(changedFiles) {
|
|
|
719
454
|
}
|
|
720
455
|
|
|
721
456
|
/**
|
|
722
|
-
*
|
|
723
|
-
* (Story #4740 AC-5) — the input `assemblePlanStories` / `createStoryIssues`
|
|
724
|
-
* consume, so the light path reuses the plan-persist story-creation surface
|
|
725
|
-
* rather than reimplementing issue authoring. The body carries the operator
|
|
726
|
-
* prompt (goal + spec) and the diff-derived footprint (`changes[]`), so
|
|
727
|
-
* history and `refs #<id>` on the commit survive.
|
|
457
|
+
* Minimal receipt Story in plan-persist's input shape; throws on empty prompt.
|
|
728
458
|
*
|
|
729
459
|
* @param {{
|
|
730
460
|
* prompt?: unknown,
|