mandrel 2.60.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,51 +1,8 @@
|
|
|
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. **Risk gate ({@link deriveLightSuitability}).** The prompt's predicted
|
|
20
|
-
* footprint is judged for **risk** by the shared machinery
|
|
21
|
-
* ({@link module:lib/orchestration/complexity-gate.deriveStoryShape} over
|
|
22
|
-
* the `audit-rules.json` sensitive-path classes and the
|
|
23
|
-
* migration-with-consumers span) **and** a ledgered verdict carrying a
|
|
24
|
-
* recorded reason ({@link resolveLedgeredVerdict}). A tripped risk rule
|
|
25
|
-
* or an unrecorded reason fails closed to `full`.
|
|
26
|
-
* 2. **Nothing the caller declares about its own size decides (Story
|
|
27
|
-
* #5344).** The predicted-shape ceilings — declared change kinds, a
|
|
28
|
-
* magnitude bucket, an uncertainty bucket, a deployable span — are gone,
|
|
29
|
-
* along with the `warnings[]` Story #5313 had already demoted them to.
|
|
30
|
-
* They were self-declared by the agent asking to proceed, and once they
|
|
31
|
-
* only warned they decided nothing at all. What is left reads evidence:
|
|
32
|
-
* the predicted PATHS at the gate, and the actual diff at invariant 3.
|
|
33
|
-
* 3. **Diff-derived backstop ({@link checkLightDiffBackstop}).** After
|
|
34
|
-
* implementation the **actual** change set is re-checked with
|
|
35
|
-
* {@link module:lib/orchestration/review-depth.deriveChangeLevel} plus the
|
|
36
|
-
* implementation-only magnitude ceilings of {@link LIGHT_DIFF_CEILINGS} —
|
|
37
|
-
* the diff is the real scope signal, and since Story #5344 it is the ONLY
|
|
38
|
-
* size block on the path. Story #4856 moved it from a `maxFiles: 4`
|
|
39
|
-
* cardinality ceiling to changed lines over implementation files, and made
|
|
40
|
-
* a block **recycle** its receipt Story through `/mandrel-plan` tickets
|
|
41
|
-
* mode instead of orphaning it.
|
|
42
|
-
* 4. **Minimal receipt Story ({@link buildReceiptStoryTicket}).** A
|
|
43
|
-
* `type::story` ticket is authored inline so `refs #`, history, telemetry,
|
|
44
|
-
* and the `agent::executing -> agent::done` state machine survive.
|
|
45
|
-
*
|
|
46
|
-
* Every function here is pure and total: inputs in, decision out, no I/O and no
|
|
47
|
-
* throws (except {@link buildReceiptStoryTicket}, which rejects an empty
|
|
48
|
-
* 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.
|
|
49
6
|
*
|
|
50
7
|
* @module lib/orchestration/light-suitability
|
|
51
8
|
*/
|
|
@@ -54,25 +11,8 @@ import { deriveStoryShape, SHAPE_CODES } from './complexity-gate.js';
|
|
|
54
11
|
import { deriveChangeLevel } from './review-depth.js';
|
|
55
12
|
|
|
56
13
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* shape decision happened to record** (Story #4875).
|
|
60
|
-
*
|
|
61
|
-
* No re-slicing, shrinking, or operator answer satisfies one: a footprint
|
|
62
|
-
* intersecting a sensitive-path class routes `full` however small the change,
|
|
63
|
-
* and the diff backstop refuses the same footprint again at the end. But
|
|
64
|
-
* {@link deriveStoryShape} reports only the **first** rule a footprint trips,
|
|
65
|
-
* and it can reject on an unknown footprint (a glob, an absent acceptance
|
|
66
|
-
* list) before either risk rule is reached — so the recorded `code` is not a
|
|
67
|
-
* reliable answer to "is this risk or is this something I can fix?".
|
|
68
|
-
*
|
|
69
|
-
* The recovery is that the shape decision attaches the built risk shape to
|
|
70
|
-
* every footprint it can judge at all, and that shape carries the risk facts
|
|
71
|
-
* (`sensitiveClasses`, `migrationSpan`) whether or not a risk rule was the
|
|
72
|
-
* recorded one. Reading them here surfaces the objection first-hit reporting
|
|
73
|
-
* hides — the difference between a wasted session and a redirected one.
|
|
74
|
-
*
|
|
75
|
-
* 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.
|
|
76
16
|
*
|
|
77
17
|
* @param {{ shape?: { sensitiveClasses?: unknown, migrationSpan?: unknown } }} [decision]
|
|
78
18
|
* A {@link deriveStoryShape} return value.
|
|
@@ -118,28 +58,8 @@ function deriveUnwaivableRisk(decision) {
|
|
|
118
58
|
}
|
|
119
59
|
|
|
120
60
|
/**
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
* implementation half (Story #4856 — see
|
|
124
|
-
* {@link module:lib/orchestration/diff-magnitude} for the measured case and the
|
|
125
|
-
* companion-class boundary).
|
|
126
|
-
*
|
|
127
|
-
* The backstop reads ground truth, so it is where size is genuinely enforced;
|
|
128
|
-
* the prediction gate above it is a declaration and stays coarse (Story #4764).
|
|
129
|
-
* What changed is the **axis**: this used to be `maxFiles: 4`, a cardinality
|
|
130
|
-
* ceiling that rejected 79% of this repository's real merged work while passing
|
|
131
|
-
* a three-file 323-line rewrite.
|
|
132
|
-
*
|
|
133
|
-
* - `maxImplLines` — additions plus deletions across implementation files.
|
|
134
|
-
* Simulated over 41 merges, 1000 admits 83% of real work
|
|
135
|
-
* and rejects exactly the genuinely large changes.
|
|
136
|
-
* - `maxImplFiles` — implementation files touched, a *sprawl* tripwire rather
|
|
137
|
-
* than a size gate. Set to `DEFAULT_DIFF_WIDTH.softFiles`
|
|
138
|
-
* so the light path and `review-depth.js` stop holding two
|
|
139
|
-
* different definitions of a narrow diff.
|
|
140
|
-
*
|
|
141
|
-
* Framework constants, not knobs: a ceiling an operator could widen past what a
|
|
142
|
-
* 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.
|
|
143
63
|
*/
|
|
144
64
|
export const LIGHT_DIFF_CEILINGS = Object.freeze({
|
|
145
65
|
maxImplLines: 1000,
|
|
@@ -147,9 +67,7 @@ export const LIGHT_DIFF_CEILINGS = Object.freeze({
|
|
|
147
67
|
});
|
|
148
68
|
|
|
149
69
|
/**
|
|
150
|
-
*
|
|
151
|
-
* framework default for anything malformed — a stray `0`, `-1`, or `NaN` must
|
|
152
|
-
* never widen (or zero out) a light diff ceiling.
|
|
70
|
+
* A malformed ceiling falls back to the default, never widens or zeroes.
|
|
153
71
|
*
|
|
154
72
|
* @param {unknown} value
|
|
155
73
|
* @param {number} fallback
|
|
@@ -163,8 +81,6 @@ function normalizeCeiling(value, fallback) {
|
|
|
163
81
|
}
|
|
164
82
|
|
|
165
83
|
/**
|
|
166
|
-
* Resolve the effective diff ceilings from a caller-supplied partial override.
|
|
167
|
-
*
|
|
168
84
|
* @param {{ maxImplLines?: unknown, maxImplFiles?: unknown }} [ceilings]
|
|
169
85
|
* @returns {{ maxImplLines: number, maxImplFiles: number }}
|
|
170
86
|
*/
|
|
@@ -182,22 +98,7 @@ function resolveDiffCeilings(ceilings) {
|
|
|
182
98
|
}
|
|
183
99
|
|
|
184
100
|
/**
|
|
185
|
-
*
|
|
186
|
-
* whole of it. A prompt arriving with no reason fails closed to `full` — an
|
|
187
|
-
* unaudited "trust me, it's small" never buys the light path.
|
|
188
|
-
*
|
|
189
|
-
* Story #5344 removed the `--route lite|full` half. It was a second
|
|
190
|
-
* self-declaration on top of the reason, and it carried no information the
|
|
191
|
-
* reason did not: a caller writing a reason is claiming `lite`, and one that
|
|
192
|
-
* meant `full` would not be invoking this gate. What survives is the part that
|
|
193
|
-
* leaves a record a human can read afterwards.
|
|
194
|
-
*
|
|
195
|
-
* Story #5366 removed the `route` field this used to carry beside `recorded`.
|
|
196
|
-
* It was a second spelling of the same boolean — `recorded === false` IS the
|
|
197
|
-
* fail-closed route — and two fields that must agree are a chance for them
|
|
198
|
-
* not to.
|
|
199
|
-
*
|
|
200
|
-
* Pure and total.
|
|
101
|
+
* No recorded reason fails closed to `full`.
|
|
201
102
|
*
|
|
202
103
|
* @param {{ reason?: unknown }} [verdict]
|
|
203
104
|
* @returns {{
|
|
@@ -223,27 +124,8 @@ export function resolveLedgeredVerdict({ reason } = {}) {
|
|
|
223
124
|
}
|
|
224
125
|
|
|
225
126
|
/**
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
* satisfy by re-describing its own request: an **un-waivable risk rule** read
|
|
229
|
-
* off the predicted paths (a sensitive-path class, a migration paired with its
|
|
230
|
-
* consumers) and an **un-ledgered verdict** (no recorded reason). Everything
|
|
231
|
-
* else proceeds light and is bounded for real by
|
|
232
|
-
* {@link checkLightDiffBackstop} against the actual diff.
|
|
233
|
-
*
|
|
234
|
-
* Story #5344 removed the declared effort axes — `predictedKinds`,
|
|
235
|
-
* `predictedMagnitude`, `predictedUncertainty` — and the `warnings[]` Story
|
|
236
|
-
* #5313 had demoted them to. A bucket the caller picks about its own request
|
|
237
|
-
* is not a measurement, and once it only warned it was not even a gate.
|
|
238
|
-
* Story #5366 removed `predictedAcceptance` for the same reason from the
|
|
239
|
-
* other end: its zero-check was the only thing that read it, and the
|
|
240
|
-
* `--acceptance` flag that fed it clamped to a floor of one.
|
|
241
|
-
*
|
|
242
|
-
* The result reports `suitable` and nothing that restates it. The `route`
|
|
243
|
-
* field it used to carry was a second spelling of that same boolean, and no
|
|
244
|
-
* caller read it — {@link resolveLightGateOutcome} branches on `suitable`.
|
|
245
|
-
*
|
|
246
|
-
* 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}.
|
|
247
129
|
*
|
|
248
130
|
* @param {{
|
|
249
131
|
* predictedChanges?: unknown,
|
|
@@ -257,9 +139,7 @@ export function resolveLedgeredVerdict({ reason } = {}) {
|
|
|
257
139
|
* ledger: ReturnType<typeof resolveLedgeredVerdict>,
|
|
258
140
|
* unwaivable: ReturnType<typeof deriveUnwaivableRisk>,
|
|
259
141
|
* reasons: string[],
|
|
260
|
-
* }}
|
|
261
|
-
* even when the recorded `shape.code` is something else (Story #4875), so
|
|
262
|
-
* the operator learns at prediction time that no re-slicing can help.
|
|
142
|
+
* }}
|
|
263
143
|
*/
|
|
264
144
|
export function deriveLightSuitability({
|
|
265
145
|
predictedChanges,
|
|
@@ -282,17 +162,6 @@ export function deriveLightSuitability({
|
|
|
282
162
|
}
|
|
283
163
|
|
|
284
164
|
/**
|
|
285
|
-
* Resolve what the light gate does with a suitability decision (Story #4740
|
|
286
|
-
* AC-3; Story #5313; Story #5344).
|
|
287
|
-
*
|
|
288
|
-
* - suitable → `proceed-light`.
|
|
289
|
-
* - not suitable → `escalate-plan` — only an un-ledgered verdict or an
|
|
290
|
-
* un-waivable risk rule gets here, and neither has an
|
|
291
|
-
* answer an operator could give, so there is no
|
|
292
|
-
* attended/unattended split any more.
|
|
293
|
-
*
|
|
294
|
-
* Pure and total.
|
|
295
|
-
*
|
|
296
165
|
* @param {{
|
|
297
166
|
* suitability?: { suitable?: boolean, reasons?: string[] },
|
|
298
167
|
* }} [args]
|
|
@@ -326,43 +195,22 @@ export function resolveLightGateOutcome({ suitability } = {}) {
|
|
|
326
195
|
}
|
|
327
196
|
|
|
328
197
|
/**
|
|
329
|
-
*
|
|
330
|
-
*
|
|
331
|
-
*
|
|
332
|
-
* One value per blocked verdict, and the reason it exists is downstream: the
|
|
333
|
-
* refusal's friction category is derived from it
|
|
334
|
-
* ({@link module:lib/observability/runtime-friction.lightScopeRejectedCategory}),
|
|
335
|
-
* and the category is the ONLY key the retro composer separates buckets on.
|
|
336
|
-
* Under one bare category an empty-diff refusal and a `public-api` refusal
|
|
337
|
-
* aggregated into a single "recurred 2 times" follow-up with nothing in common
|
|
338
|
-
* (issue #5237) — the roll-up's shape fingerprint could not tell them apart
|
|
339
|
-
* either, because it hashes detail keys and every refusal carries the same set.
|
|
340
|
-
*
|
|
341
|
-
* Kept coarse on purpose: a class must be stable enough that N refusals of one
|
|
342
|
-
* cause still coalesce into the recurrence evidence the ceilings are
|
|
343
|
-
* 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.
|
|
344
200
|
*
|
|
345
201
|
* @typedef {{ reason: string, refusalClass: string }} Objection
|
|
346
202
|
*/
|
|
347
203
|
export const LIGHT_REFUSAL_CLASSES = Object.freeze({
|
|
348
|
-
/** The diff could not be enumerated, or enumerated to nothing. */
|
|
349
204
|
CHANGE_SET_UNKNOWN: 'change-set-unknown',
|
|
350
205
|
/** Enumerated-empty, but the worktree carries uncommitted changes. */
|
|
351
206
|
UNCOMMITTED_WORK: 'uncommitted-work',
|
|
352
|
-
/** The change set intersects a registered sensitive-path class. */
|
|
353
207
|
SENSITIVE_PATH: 'sensitive-path',
|
|
354
|
-
/** Sensitivity could not be classified, so non-sensitivity is unproven. */
|
|
355
208
|
SENSITIVITY_UNKNOWN: 'sensitivity-unknown',
|
|
356
|
-
/** The implementation magnitude could not be measured. */
|
|
357
209
|
MAGNITUDE_UNKNOWN: 'magnitude-unknown',
|
|
358
|
-
/** Measured magnitude exceeded a light ceiling. */
|
|
359
210
|
OVER_CEILING: 'over-ceiling',
|
|
360
211
|
});
|
|
361
212
|
|
|
362
213
|
/**
|
|
363
|
-
* Name the branch a commit-first refusal tells the agent to commit on, with a
|
|
364
|
-
* generic stand-in when the caller supplied none. Pure.
|
|
365
|
-
*
|
|
366
214
|
* @param {unknown} storyBranch
|
|
367
215
|
* @returns {string}
|
|
368
216
|
*/
|
|
@@ -372,29 +220,9 @@ function describeStoryBranch(storyBranch) {
|
|
|
372
220
|
}
|
|
373
221
|
|
|
374
222
|
/**
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
*
|
|
378
|
-
* when the diff intersects a sensitive-path class, exceeds an implementation
|
|
379
|
-
* ceiling, or cannot be measured. A clean result is the only path that lands
|
|
380
|
-
* light.
|
|
381
|
-
*
|
|
382
|
-
* Two inputs, two different scopes, and the difference is load-bearing:
|
|
383
|
-
*
|
|
384
|
-
* - `changedFiles` is the **full** change set, companions included, and is
|
|
385
|
-
* what sensitive-path derivation reads. Exempting a companion from the
|
|
386
|
-
* *count* must never exempt it from *risk* — a test file under a registered
|
|
387
|
-
* sensitive class still blocks.
|
|
388
|
-
* - `magnitude` is the implementation-only summary from
|
|
389
|
-
* {@link module:lib/orchestration/diff-magnitude.summarizeDiffMagnitude}.
|
|
390
|
-
* `null` means the magnitude could not be measured, which blocks: absence
|
|
391
|
-
* of evidence is not evidence the diff is small.
|
|
392
|
-
*
|
|
393
|
-
* Reuses close's own {@link module:lib/orchestration/review-depth.deriveChangeLevel}
|
|
394
|
-
* — one taxonomy, applied to the predicted shape at the gate and the actual
|
|
395
|
-
* diff here — so the two read points can never disagree about what is sensitive.
|
|
396
|
-
*
|
|
397
|
-
* 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.
|
|
398
226
|
*
|
|
399
227
|
* @param {{
|
|
400
228
|
* changedFiles?: unknown,
|
|
@@ -404,12 +232,7 @@ function describeStoryBranch(storyBranch) {
|
|
|
404
232
|
* selectSensitivePathClassesFn?: Function,
|
|
405
233
|
* storyBranch?: string,
|
|
406
234
|
* uncommittedWork?: boolean,
|
|
407
|
-
* }} [args] `uncommittedWork`
|
|
408
|
-
* backstop reads COMMITTED state, so an implemented-but-uncommitted run
|
|
409
|
-
* measures an empty diff, and the door for that is `git commit` — not an
|
|
410
|
-
* escalation. It only ever refines an enumerated-empty verdict's guidance;
|
|
411
|
-
* the verdict itself still blocks. `storyBranch` names the branch that
|
|
412
|
-
* guidance points at.
|
|
235
|
+
* }} [args] `uncommittedWork` only redirects guidance to `git commit`.
|
|
413
236
|
* @returns {{
|
|
414
237
|
* blocked: boolean,
|
|
415
238
|
* level: 'low'|'high'|null,
|
|
@@ -419,8 +242,7 @@ function describeStoryBranch(storyBranch) {
|
|
|
419
242
|
* ceilings: { maxImplLines: number, maxImplFiles: number },
|
|
420
243
|
* refusalClass: string|null,
|
|
421
244
|
* reasons: string[],
|
|
422
|
-
* }}
|
|
423
|
-
* {@link LIGHT_REFUSAL_CLASSES} value on every blocked one.
|
|
245
|
+
* }}
|
|
424
246
|
*/
|
|
425
247
|
export function checkLightDiffBackstop({
|
|
426
248
|
changedFiles,
|
|
@@ -437,11 +259,7 @@ export function checkLightDiffBackstop({
|
|
|
437
259
|
: null;
|
|
438
260
|
|
|
439
261
|
if (files === null || files.length === 0) {
|
|
440
|
-
//
|
|
441
|
-
// an unverifiable one, and blocking is right for both — but only one of
|
|
442
|
-
// them is about scope. The caller's probe distinguishes them; `files ===
|
|
443
|
-
// null` never can, because a `git diff` that failed outright is exactly
|
|
444
|
-
// the case where nothing about the change is known.
|
|
262
|
+
// `files === null` (git diff failed) can never be the uncommitted case.
|
|
445
263
|
const uncommitted = files !== null && uncommittedWork === true;
|
|
446
264
|
return {
|
|
447
265
|
blocked: true,
|
|
@@ -481,10 +299,8 @@ export function checkLightDiffBackstop({
|
|
|
481
299
|
fileCount: files.length,
|
|
482
300
|
magnitude: measured,
|
|
483
301
|
ceilings: resolved,
|
|
484
|
-
//
|
|
485
|
-
//
|
|
486
|
-
// sensitive-path refusal. That is the right way round — the ceiling is
|
|
487
|
-
// 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.
|
|
488
304
|
refusalClass: blocked ? objections[0].refusalClass : null,
|
|
489
305
|
reasons: blocked
|
|
490
306
|
? objections.map((objection) => objection.reason)
|
|
@@ -497,9 +313,6 @@ export function checkLightDiffBackstop({
|
|
|
497
313
|
}
|
|
498
314
|
|
|
499
315
|
/**
|
|
500
|
-
* Coerce a magnitude summary into non-negative integer counts, or `null` when
|
|
501
|
-
* it was not measurable. Pure.
|
|
502
|
-
*
|
|
503
316
|
* @param {unknown} magnitude
|
|
504
317
|
* @returns {{ implFiles: number, implLines: number }|null}
|
|
505
318
|
*/
|
|
@@ -512,8 +325,6 @@ function normalizeMagnitude(magnitude) {
|
|
|
512
325
|
}
|
|
513
326
|
|
|
514
327
|
/**
|
|
515
|
-
* Sensitivity objections, over the **full** change set. Pure.
|
|
516
|
-
*
|
|
517
328
|
* @param {{ level: 'low'|'high'|null, classes: string[] }} derived
|
|
518
329
|
* @returns {Objection[]}
|
|
519
330
|
*/
|
|
@@ -539,8 +350,6 @@ function describeSensitivity({ level, classes }) {
|
|
|
539
350
|
}
|
|
540
351
|
|
|
541
352
|
/**
|
|
542
|
-
* Magnitude objections, over the implementation half only. Pure.
|
|
543
|
-
*
|
|
544
353
|
* @param {{ implFiles: number, implLines: number }|null} measured
|
|
545
354
|
* @param {{ maxImplLines: number, maxImplFiles: number }} ceilings
|
|
546
355
|
* @returns {Objection[]}
|
|
@@ -571,12 +380,9 @@ function describeMagnitude(measured, ceilings) {
|
|
|
571
380
|
return objections;
|
|
572
381
|
}
|
|
573
382
|
|
|
574
|
-
/** Cap on a receipt slug's length — keep the branch/id readable. */
|
|
575
383
|
const RECEIPT_SLUG_MAX = 48;
|
|
576
384
|
|
|
577
385
|
/**
|
|
578
|
-
* Derive a stable, lowercase, hyphenated slug from a prompt.
|
|
579
|
-
*
|
|
580
386
|
* @param {string} text
|
|
581
387
|
* @returns {string}
|
|
582
388
|
*/
|
|
@@ -590,12 +396,10 @@ function slugifyPrompt(text) {
|
|
|
590
396
|
return slug === '' ? 'light-change' : slug;
|
|
591
397
|
}
|
|
592
398
|
|
|
593
|
-
/** Cap on a receipt title's length. */
|
|
594
399
|
const RECEIPT_TITLE_MAX = 72;
|
|
595
400
|
|
|
596
401
|
/**
|
|
597
|
-
*
|
|
598
|
-
* positive integer issue number, or `null` when absent/malformed.
|
|
402
|
+
* `#<n>`, `<n>` or a number → positive issue number, else `null`.
|
|
599
403
|
*
|
|
600
404
|
* @param {unknown} amends
|
|
601
405
|
* @returns {number|null}
|
|
@@ -615,8 +419,6 @@ function normalizeAmends(amends) {
|
|
|
615
419
|
}
|
|
616
420
|
|
|
617
421
|
/**
|
|
618
|
-
* One-line receipt title from the prompt, prefixed for an amendment.
|
|
619
|
-
*
|
|
620
422
|
* @param {string} text
|
|
621
423
|
* @param {number|null} amendsId
|
|
622
424
|
* @returns {string}
|
|
@@ -633,9 +435,7 @@ function deriveReceiptTitle(text, amendsId) {
|
|
|
633
435
|
}
|
|
634
436
|
|
|
635
437
|
/**
|
|
636
|
-
*
|
|
637
|
-
* for the receipt body. Every entry is recorded as `refactors-existing` — the
|
|
638
|
-
* conservative assumption, since the light path is not asserting creates.
|
|
438
|
+
* All `refactors-existing`: the light path does not assert creates.
|
|
639
439
|
*
|
|
640
440
|
* @param {unknown} changedFiles
|
|
641
441
|
* @returns {Array<{ path: string, assumption: string }>}
|
|
@@ -654,12 +454,7 @@ function toReceiptChanges(changedFiles) {
|
|
|
654
454
|
}
|
|
655
455
|
|
|
656
456
|
/**
|
|
657
|
-
*
|
|
658
|
-
* (Story #4740 AC-5) — the input `assemblePlanStories` / `createStoryIssues`
|
|
659
|
-
* consume, so the light path reuses the plan-persist story-creation surface
|
|
660
|
-
* rather than reimplementing issue authoring. The body carries the operator
|
|
661
|
-
* prompt (goal + spec) and the diff-derived footprint (`changes[]`), so
|
|
662
|
-
* history and `refs #<id>` on the commit survive.
|
|
457
|
+
* Minimal receipt Story in plan-persist's input shape; throws on empty prompt.
|
|
663
458
|
*
|
|
664
459
|
* @param {{
|
|
665
460
|
* prompt?: unknown,
|