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,24 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/local-lens-review.js — the Story-scope local-lens pass
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* the lens pass each carry one reason to change. The spine
|
|
6
|
-
* (`runStoryReviewCore`) owns the single per-close-run diff enumeration and the
|
|
7
|
-
* `runCodeReview` invocation; this module owns lens selection + materialization.
|
|
8
|
-
*
|
|
9
|
-
* Shift-left tier (Epic #4405): local concerns are cheap to decide on a single
|
|
10
|
-
* Story's diff, so the maker-blind Story-scope review runs its matched local
|
|
11
|
-
* lenses here, inside the story-close subprocess, rather than paying a deeper
|
|
12
|
-
* pass at Epic close.
|
|
2
|
+
* phases/local-lens-review.js — the Story-scope local-lens pass: selects the
|
|
3
|
+
* local lenses matching the Story diff and materializes their prompts. The
|
|
4
|
+
* review spine (`runStoryReviewCore`) owns diff enumeration and code review.
|
|
13
5
|
*/
|
|
14
6
|
|
|
15
7
|
import {
|
|
16
8
|
evaluateLensDiffFloor,
|
|
17
|
-
resolveLensDiffFloor,
|
|
18
9
|
runAuditSuite,
|
|
19
10
|
selectLocalLenses,
|
|
20
11
|
} from '../../../audit-suite/index.js';
|
|
21
|
-
import { resolveConfig } from '../../../config-resolver.js';
|
|
22
12
|
import { gitSpawn } from '../../../git-utils.js';
|
|
23
13
|
import {
|
|
24
14
|
emitRuntimeFriction,
|
|
@@ -26,35 +16,12 @@ import {
|
|
|
26
16
|
} from '../../../observability/runtime-friction.js';
|
|
27
17
|
import { computeChangeSet } from '../../change-set.js';
|
|
28
18
|
|
|
29
|
-
/**
|
|
30
|
-
* The review depth the Story-scope local-lens pass runs at. Fixed for this
|
|
31
|
-
* tier — it is not risk-scaled like the code-review pillar depth.
|
|
32
|
-
*
|
|
33
|
-
* Module-local: it is an implementation detail of {@link runLocalLensReview}
|
|
34
|
-
* (it rides out on the returned envelope's `depth` field), not a public seam.
|
|
35
|
-
* Tests assert the observable `'light'` on that envelope rather than importing
|
|
36
|
-
* the constant, so it stays off the public surface (Story #4603).
|
|
37
|
-
*/
|
|
19
|
+
/** Fixed for this tier; not risk-scaled. */
|
|
38
20
|
const STORY_SCOPE_LENS_DEPTH = 'light';
|
|
39
21
|
|
|
40
22
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* substituted prompt body to a scoped artifact file; the default review
|
|
44
|
-
* provider is a mechanical sweep that never reads them, so the artifacts are
|
|
45
|
-
* inert unless the close's stdout tells the host to walk them. This mirrors
|
|
46
|
-
* the plan-run audit-roster comment's "host MUST walk each" contract
|
|
47
|
-
* (`run-epilogue.js`): the close names each artifact path and the host reads
|
|
48
|
-
* each one against the diff.
|
|
49
|
-
*
|
|
50
|
-
* Pure: derives the block from the `runAuditSuite` envelope's `workflows[]`,
|
|
51
|
-
* keeping only entries that actually wrote an artifact. Returns `null` when no
|
|
52
|
-
* artifact was written (nothing to walk), so the caller emits nothing.
|
|
53
|
-
*
|
|
54
|
-
* Module-local: an implementation detail of {@link runLocalLensReview}, whose
|
|
55
|
-
* host-MUST-walk output rides out on the `progress` stream. Exercised through
|
|
56
|
-
* that public entry point (assert the progress lines name each artifact path)
|
|
57
|
-
* rather than imported directly, so it adds no production-dead public export.
|
|
23
|
+
* Roster of materialized lens-prompt artifacts the host MUST walk — the
|
|
24
|
+
* default review provider never reads them, so without this they are inert.
|
|
58
25
|
*
|
|
59
26
|
* @param {object|null} materialized the `runAuditSuite` result envelope.
|
|
60
27
|
* @returns {string|null} the roster block, or `null` when there is nothing to walk.
|
|
@@ -71,12 +38,7 @@ function renderLensArtifactRoster(materialized) {
|
|
|
71
38
|
}
|
|
72
39
|
|
|
73
40
|
/**
|
|
74
|
-
*
|
|
75
|
-
* (Story #4627). Resolves the `{{changedFiles}}` token from the actual Story
|
|
76
|
-
* diff (newline-joined, the shape the lens templates' `## Scope` block reads)
|
|
77
|
-
* and the `{{ticketId}}` token from the Story id when known. Both are built-in
|
|
78
|
-
* substitution keys (`substitutions.js#BUILT_IN_SUBSTITUTION_KEYS`), so the
|
|
79
|
-
* runner accepts them without a per-lens `substitutionKeys` declaration.
|
|
41
|
+
* Built-in substitution keys, so no per-lens declaration is needed.
|
|
80
42
|
*
|
|
81
43
|
* @param {{ changedFiles: string[], storyId?: number|string|null }} args
|
|
82
44
|
* @returns {Record<string, string>}
|
|
@@ -90,26 +52,14 @@ function buildLensSubstitutions({ changedFiles, storyId }) {
|
|
|
90
52
|
}
|
|
91
53
|
|
|
92
54
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
* `files: string[]|null` envelope to this phase's historical `[]`-on-failure
|
|
96
|
-
* contract: the lens roster treats "nothing changed" and "diff unknown"
|
|
97
|
-
* identically, because an unknown diff matches no `filePatterns` and therefore
|
|
98
|
-
* adds no lens work either way.
|
|
99
|
-
*
|
|
100
|
-
* Best-effort and total — never throws, mirroring the advisory posture of the
|
|
101
|
-
* surrounding review phase. Retained as the self-enumeration fallback for
|
|
102
|
-
* {@link runLocalLensReview} when no change set is injected.
|
|
55
|
+
* Never throws: an unknown diff returns `[]`, which matches no lens, same as
|
|
56
|
+
* an empty one.
|
|
103
57
|
*
|
|
104
58
|
* @param {{
|
|
105
59
|
* baseRef: string,
|
|
106
60
|
* headRef: string,
|
|
107
61
|
* gitSpawnFn?: import('../../change-set.js').GitSpawnFn,
|
|
108
62
|
* }} args
|
|
109
|
-
* Module-local (Story #4603): a private fallback of {@link runLocalLensReview},
|
|
110
|
-
* exercised through that public entry point rather than imported directly, so it
|
|
111
|
-
* adds no public export a production path fails to reach.
|
|
112
|
-
*
|
|
113
63
|
* @returns {string[]} Changed file paths, or `[]` on any failure.
|
|
114
64
|
*/
|
|
115
65
|
function enumerateChangedFiles({ baseRef, headRef, gitSpawnFn = gitSpawn }) {
|
|
@@ -117,28 +67,9 @@ function enumerateChangedFiles({ baseRef, headRef, gitSpawnFn = gitSpawn }) {
|
|
|
117
67
|
}
|
|
118
68
|
|
|
119
69
|
/**
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
* The distinction between `null` and `undefined` is load-bearing and mirrors
|
|
124
|
-
* the sibling contract in `orchestration/code-review.js#resolveInjectedChangedFiles`:
|
|
125
|
-
*
|
|
126
|
-
* - **array** — the caller's change set; use it verbatim.
|
|
127
|
-
* - **`null`** — the caller (`runStoryReviewCore`) already tried and the
|
|
128
|
-
* diff is unenumerable. Re-running git here would only fail
|
|
129
|
-
* again, so degrade straight to the fail-safe empty roster.
|
|
130
|
-
* - **`undefined`** — nobody enumerated (standalone callers), so the shared
|
|
131
|
-
* enumerator runs as the fallback.
|
|
132
|
-
*
|
|
133
|
-
* The prior `Array.isArray()` discriminator collapsed `null` and `undefined`
|
|
134
|
-
* into one branch and re-spawned git on the unenumerable path, contradicting the
|
|
135
|
-
* spine's documented "the one enumeration per close run" invariant.
|
|
136
|
-
*
|
|
137
|
-
* Module-local (Story #4603): a private detail of {@link runLocalLensReview}.
|
|
138
|
-
* The three-state contract is asserted through that public entry point (does an
|
|
139
|
-
* injected `null` re-spawn git? does `undefined` self-enumerate?), so it needs
|
|
140
|
-
* no public export — keeping the fix from re-introducing the very kind of
|
|
141
|
-
* production-dead public symbol this Story's ratchet root-cause is about.
|
|
70
|
+
* Three-state injection: an array is used verbatim; `null` means the spine
|
|
71
|
+
* already failed to enumerate, so don't re-spawn git; `undefined` means
|
|
72
|
+
* nobody enumerated, so self-enumerate.
|
|
142
73
|
*
|
|
143
74
|
* @param {{
|
|
144
75
|
* changedFiles: string[]|null|undefined,
|
|
@@ -161,40 +92,11 @@ function resolveLensChangeSet({
|
|
|
161
92
|
}
|
|
162
93
|
|
|
163
94
|
/**
|
|
164
|
-
* Run the Story-scope
|
|
165
|
-
* `
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
* A diff that matches no local lens adds **no** lens work: the roster is empty
|
|
171
|
-
* and `runAuditSuite` is never invoked. Best-effort and total — a git or
|
|
172
|
-
* materialization failure degrades to `{ skipped: true, lenses: [] }` and is
|
|
173
|
-
* logged via `progress`, matching the advisory posture the review phase already
|
|
174
|
-
* takes for provider/transport failures.
|
|
175
|
-
*
|
|
176
|
-
* Story #4593 — `changedFiles` is injected by `runStoryReviewCore`, which
|
|
177
|
-
* computes the change set once per close run and hands the same list to this
|
|
178
|
-
* pass and to `runCodeReview`. Self-enumeration is the **fallback only**, kept
|
|
179
|
-
* for standalone callers that supply no list; see {@link resolveLensChangeSet}
|
|
180
|
-
* for the three-state contract.
|
|
181
|
-
*
|
|
182
|
-
* Story #4627 — the pass now delivers lens **content** to a reader. It threads
|
|
183
|
-
* `{{changedFiles}}` / `{{ticketId}}` substitutions and an `artifactPrefix`
|
|
184
|
-
* into `runAuditSuite` so each matched lens's substituted prompt body is
|
|
185
|
-
* written to a scoped artifact under the run's audit output dir, then emits a
|
|
186
|
-
* host-MUST-walk roster of those artifact paths to the close's stdout. Before
|
|
187
|
-
* this the default review provider dropped the materialized envelope, so the
|
|
188
|
-
* pass was a progress log line with no reader.
|
|
189
|
-
*
|
|
190
|
-
* Story #4699 — the **lens diff-floor**. When the caller supplies a known
|
|
191
|
-
* `changedLineCount` and the diff sits strictly below the configured floor
|
|
192
|
-
* (`delivery.review.lensDiffFloor`, default 40) with zero sensitive-path
|
|
193
|
-
* hits, the pass records the matched roster but skips materialization
|
|
194
|
-
* entirely (`skipped: true` with the lenses retained and a `floorSkip`
|
|
195
|
-
* verdict) — the maker-blind code-review pillar and every hard gate are
|
|
196
|
-
* untouched. An unknown line count, a disabled floor, or a sensitive-path
|
|
197
|
-
* hit all fail open to the full materialization.
|
|
95
|
+
* Run the maker-blind Story-scope lens pass (called only from
|
|
96
|
+
* `runStoryReviewCore`). No matching lens → no lens work. A diff below the
|
|
97
|
+
* lens diff-floor with no sensitive-path hits records the roster but skips
|
|
98
|
+
* materialization; an unknown line count fails open. Advisory: any failure
|
|
99
|
+
* degrades to a skipped envelope plus a friction signal.
|
|
198
100
|
*
|
|
199
101
|
* @param {{
|
|
200
102
|
* baseRef: string,
|
|
@@ -209,7 +111,6 @@ function resolveLensChangeSet({
|
|
|
209
111
|
* gitSpawnFn?: import('../../change-set.js').GitSpawnFn,
|
|
210
112
|
* selectLocalLensesFn?: typeof selectLocalLenses,
|
|
211
113
|
* runAuditSuiteFn?: typeof runAuditSuite,
|
|
212
|
-
* resolveConfigFn?: typeof resolveConfig,
|
|
213
114
|
* evaluateLensDiffFloorFn?: typeof evaluateLensDiffFloor,
|
|
214
115
|
* emitToolDegradationFn?: typeof emitRuntimeFriction,
|
|
215
116
|
* }} args
|
|
@@ -235,7 +136,6 @@ export async function runLocalLensReview({
|
|
|
235
136
|
gitSpawnFn = gitSpawn,
|
|
236
137
|
selectLocalLensesFn = selectLocalLenses,
|
|
237
138
|
runAuditSuiteFn = runAuditSuite,
|
|
238
|
-
resolveConfigFn = resolveConfig,
|
|
239
139
|
evaluateLensDiffFloorFn = evaluateLensDiffFloor,
|
|
240
140
|
emitToolDegradationFn = emitRuntimeFriction,
|
|
241
141
|
}) {
|
|
@@ -263,16 +163,11 @@ export async function runLocalLensReview({
|
|
|
263
163
|
return empty;
|
|
264
164
|
}
|
|
265
165
|
|
|
266
|
-
//
|
|
267
|
-
// selection so a floor-skip still records WHICH lenses it skipped —
|
|
268
|
-
// the findings-yield ledger needs the roster either way.
|
|
166
|
+
// After selection so a floor-skip still records which lenses it skipped.
|
|
269
167
|
const floorVerdict = evaluateLensDiffFloorFn({
|
|
270
168
|
changedFiles,
|
|
271
169
|
changedLineCount,
|
|
272
|
-
floor:
|
|
273
|
-
typeof lensDiffFloor === 'number'
|
|
274
|
-
? lensDiffFloor
|
|
275
|
-
: resolveLensDiffFloor(safeResolveConfig(resolveConfigFn)),
|
|
170
|
+
floor: lensDiffFloor,
|
|
276
171
|
});
|
|
277
172
|
if (floorVerdict.skip) {
|
|
278
173
|
progress(
|
|
@@ -290,8 +185,7 @@ export async function runLocalLensReview({
|
|
|
290
185
|
artifactPaths: [],
|
|
291
186
|
};
|
|
292
187
|
}
|
|
293
|
-
//
|
|
294
|
-
// shared audit output dir cannot clobber each other's prompts.
|
|
188
|
+
// Story-scoped names so concurrent closes can't clobber each other.
|
|
295
189
|
const effectivePrefix =
|
|
296
190
|
artifactPrefix ?? (storyId != null ? `story-${storyId}` : 'story-scope');
|
|
297
191
|
const materialized = await runAuditSuiteFn({
|
|
@@ -317,10 +211,7 @@ export async function runLocalLensReview({
|
|
|
317
211
|
artifactPaths,
|
|
318
212
|
};
|
|
319
213
|
} catch (err) {
|
|
320
|
-
//
|
|
321
|
-
// fail the close. Log, route the tool-execution degradation to friction
|
|
322
|
-
// telemetry (Story #4699 — degradations are operational signals, not
|
|
323
|
-
// findings), and degrade to a skipped envelope.
|
|
214
|
+
// Degradations are operational signals (friction), not findings.
|
|
324
215
|
progress(
|
|
325
216
|
progressTag,
|
|
326
217
|
`⚠️ local lens pass failed (continuing without it): ${err?.message ?? err}`,
|
|
@@ -336,24 +227,8 @@ export async function runLocalLensReview({
|
|
|
336
227
|
},
|
|
337
228
|
});
|
|
338
229
|
} catch {
|
|
339
|
-
// Observability must never fail the close
|
|
230
|
+
// Observability must never fail the close.
|
|
340
231
|
}
|
|
341
232
|
return empty;
|
|
342
233
|
}
|
|
343
234
|
}
|
|
344
|
-
|
|
345
|
-
/**
|
|
346
|
-
* Resolve config for the floor read without letting a resolver failure
|
|
347
|
-
* fail the (advisory) lens pass. Module-local: a degraded config simply
|
|
348
|
-
* yields the framework-default floor.
|
|
349
|
-
*
|
|
350
|
-
* @param {typeof resolveConfig} resolveConfigFn
|
|
351
|
-
* @returns {object|undefined}
|
|
352
|
-
*/
|
|
353
|
-
function safeResolveConfig(resolveConfigFn) {
|
|
354
|
-
try {
|
|
355
|
-
return resolveConfigFn();
|
|
356
|
-
} catch {
|
|
357
|
-
return undefined;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/review-core.js — the shared Story-scope review spine
|
|
3
|
-
*
|
|
4
|
-
* Extracted from the Epic-era `phases/code-review.js` (Story #4603) so the
|
|
5
|
-
* spine belonged to neither close path. `runStoryReviewCore` is the one
|
|
6
|
-
* implementation `runCodeReview` is called through; since Story #5006 retired
|
|
7
|
-
* the Epic-attached phase, its sole caller is the v2 standalone path
|
|
8
|
-
* (`single-story-close/phases/code-review.js#runStoryScopeReview`). It stays
|
|
9
|
-
* here — the shared-spine contract (Story #3653) is what keeps the maker-blind
|
|
10
|
-
* review invocation out of a phase file.
|
|
2
|
+
* phases/review-core.js — the shared Story-scope review spine; keeps the
|
|
3
|
+
* maker-blind `runCodeReview` invocation out of any phase file.
|
|
11
4
|
*/
|
|
12
5
|
|
|
13
6
|
import { countChangedLines } from '../../../audit-suite/index.js';
|
|
@@ -18,35 +11,15 @@ import { runCodeReview } from '../../code-review.js';
|
|
|
18
11
|
import { runLocalLensReview } from './local-lens-review.js';
|
|
19
12
|
|
|
20
13
|
/**
|
|
21
|
-
*
|
|
22
|
-
* the
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* this function propagates throws rather than swallowing them, because the
|
|
26
|
-
* two callers have different advisory postures:
|
|
27
|
-
*
|
|
28
|
-
* - Epic-attached close: swallows throws (non-blocking advisory, same as
|
|
29
|
-
* `refresh.js`).
|
|
30
|
-
* - Standalone close: propagates throws (a review failure stops the close).
|
|
14
|
+
* Run the local-lens pass and `runCodeReview` over one change set and return
|
|
15
|
+
* the review result. Throws propagate; the caller picks the advisory posture.
|
|
16
|
+
* Review depth is derived by `runCodeReview` from the changed files and is
|
|
17
|
+
* input-only — it never alters the output envelope.
|
|
31
18
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* never alters the review's output envelope or the posted structured-comment
|
|
37
|
-
* body.
|
|
38
|
-
*
|
|
39
|
-
* Story #4593 — this spine is the **single injection point** for the change set.
|
|
40
|
-
* It enumerates `baseRef...headRef` exactly once via {@link computeChangeSet}
|
|
41
|
-
* and threads the resulting list into both the local-lens pass and
|
|
42
|
-
* `runCodeReview`, which otherwise each enumerated the diff for themselves. Both
|
|
43
|
-
* consumers ultimately route through `deriveChangeLevel`, so feeding them one
|
|
44
|
-
* list is what makes the lens roster and the review depth provably agree about
|
|
45
|
-
* what changed — even when a commit lands between the two calls.
|
|
46
|
-
*
|
|
47
|
-
* Story #4603 — the invariant now holds on the failure path too: an unenumerable
|
|
48
|
-
* diff injects an explicit `null`, and both consumers distinguish that from
|
|
49
|
-
* `undefined` ("nobody enumerated") rather than re-spawning git.
|
|
19
|
+
* The diff is enumerated exactly once here and injected into both consumers,
|
|
20
|
+
* so lens roster and review depth agree on what changed even if a commit
|
|
21
|
+
* lands in between. An unenumerable diff injects `null` ("already tried"),
|
|
22
|
+
* which both consumers honour without re-spawning git.
|
|
50
23
|
*
|
|
51
24
|
* @param {{
|
|
52
25
|
* storyId: number|string,
|
|
@@ -63,10 +36,8 @@ import { runLocalLensReview } from './local-lens-review.js';
|
|
|
63
36
|
* countChangedLinesFn?: typeof countChangedLines,
|
|
64
37
|
* appendFindingsYieldFn?: typeof appendFindingsYield,
|
|
65
38
|
* }} args
|
|
66
|
-
* @returns {Promise<object>}
|
|
67
|
-
*
|
|
68
|
-
* outcome (Epic #4405, Story #4409) and the `changeSet` this run computed
|
|
69
|
-
* (Story #4593).
|
|
39
|
+
* @returns {Promise<object>} The `runCodeReview` result plus
|
|
40
|
+
* `localLensReview` and the computed `changeSet`.
|
|
70
41
|
*/
|
|
71
42
|
export async function runStoryReviewCore({
|
|
72
43
|
storyId,
|
|
@@ -85,17 +56,10 @@ export async function runStoryReviewCore({
|
|
|
85
56
|
}) {
|
|
86
57
|
const storyIdNum = Number(storyId);
|
|
87
58
|
|
|
88
|
-
// The one enumeration per close run. Every consumer below is injected from
|
|
89
|
-
// this list; none of them re-derives the diff. `files` is `null` when the
|
|
90
|
-
// diff is unenumerable — an explicit "already tried" signal both consumers
|
|
91
|
-
// honour without retrying (Story #4603).
|
|
92
59
|
const changeSet = computeChangeSetFn({ baseRef, headRef, gitSpawnFn });
|
|
93
60
|
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
// non-empty set: a null/empty set already yields an empty lens roster, so
|
|
97
|
-
// a second git spawn would buy nothing. `null` = count unknown → the
|
|
98
|
-
// floor fails open (no skip).
|
|
61
|
+
// Line count for the lens diff-floor, probed only for a non-empty file set;
|
|
62
|
+
// `null` = unknown, and the floor fails open.
|
|
99
63
|
const changedLineCount =
|
|
100
64
|
Array.isArray(changeSet.files) && changeSet.files.length > 0
|
|
101
65
|
? countChangedLinesFn({ baseRef, headRef, gitSpawnFn })
|
|
@@ -118,11 +82,6 @@ export async function runStoryReviewCore({
|
|
|
118
82
|
opts.commentTargetId = commentTargetId;
|
|
119
83
|
}
|
|
120
84
|
|
|
121
|
-
// Shift-left local-lens pass (Epic #4405). Runs matched local lenses at
|
|
122
|
-
// `light` depth against the actual Story diff, inside this close-subprocess
|
|
123
|
-
// spine so the maker never grades its own work. Advisory — it never blocks
|
|
124
|
-
// the close and its outcome rides on the returned envelope for downstream
|
|
125
|
-
// consumers.
|
|
126
85
|
const localLensReview = await runLocalLensReviewFn({
|
|
127
86
|
baseRef,
|
|
128
87
|
headRef,
|
|
@@ -136,9 +95,7 @@ export async function runStoryReviewCore({
|
|
|
136
95
|
|
|
137
96
|
const result = await runCodeReviewFn(opts);
|
|
138
97
|
|
|
139
|
-
//
|
|
140
|
-
// pass produced (or floor-skipped) so the roster can later be tuned on
|
|
141
|
-
// measurement. Best-effort: a ledger failure never fails the review.
|
|
98
|
+
// Best-effort findings-yield ledger, for tuning the roster on measurement.
|
|
142
99
|
try {
|
|
143
100
|
const yieldEntries = buildLensYieldEntries(localLensReview);
|
|
144
101
|
if (yieldEntries !== null) {
|
|
@@ -160,15 +117,7 @@ export async function runStoryReviewCore({
|
|
|
160
117
|
}
|
|
161
118
|
|
|
162
119
|
/**
|
|
163
|
-
*
|
|
164
|
-
* (Story #4699). One entry per lens in the matched roster: the lens name,
|
|
165
|
-
* the count of materialization findings attributed to it, and whether the
|
|
166
|
-
* diff-floor skipped its materialization. Returns `null` when the roster is
|
|
167
|
-
* empty (nothing ran, nothing skipped — no record to write).
|
|
168
|
-
*
|
|
169
|
-
* Module-local: an implementation detail of {@link runStoryReviewCore},
|
|
170
|
-
* asserted through the appended record's shape rather than imported
|
|
171
|
-
* directly.
|
|
120
|
+
* One findings-yield entry per matched lens; `null` for an empty roster.
|
|
172
121
|
*
|
|
173
122
|
* @param {object|null|undefined} localLensReview
|
|
174
123
|
* @returns {Array<{ lens: string, findings: number, skippedByFloor: boolean }>|null}
|
|
@@ -1,30 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* story-deliver-terminal
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* the contract's shape and vocabulary, and this module holds the one thing
|
|
7
|
-
* the writer must never depend on at call time: the filesystem.
|
|
8
|
-
*
|
|
9
|
-
* That separation is the fix, not just tidiness. `single-story-close.js`
|
|
10
|
-
* invoked by a *worktree-relative* path runs the Story worktree's own copy of
|
|
11
|
-
* the script and then **reaps that worktree** as one of its phases. The schema
|
|
12
|
-
* used to be read lazily, on the first envelope build — which happens after
|
|
13
|
-
* the reap — so the read hit a path that no longer existed. The throw landed
|
|
14
|
-
* inside the close CLI's error path, so a Story whose PR had merged, whose
|
|
15
|
-
* label was `agent::done`, and whose post-land tail was green exited non-zero
|
|
16
|
-
* emitting NO envelope at all: the delivery engine's documented return
|
|
17
|
-
* contract lost to a success, recoverable only by a second close run from the
|
|
18
|
-
* main checkout.
|
|
19
|
-
*
|
|
20
|
-
* Two guarantees close that, and both live here:
|
|
21
|
-
*
|
|
22
|
-
* 1. The schema is read and parsed ONCE, at module load. The parsed schema
|
|
23
|
-
* outlives the file, so what happens to the directory afterwards is
|
|
24
|
-
* irrelevant. Compilation stays lazy — it needs no filesystem — so an
|
|
25
|
-
* import costs one small read and nothing else.
|
|
26
|
-
* 2. An unreadable schema DEGRADES validation rather than throwing. A
|
|
27
|
-
* schema violation still fails loudly; see {@link validateTerminalEnvelope}.
|
|
2
|
+
* Load `story-deliver-terminal.schema.json` and validate envelopes. The schema
|
|
3
|
+
* is read ONCE at module load: close may run from a worktree it later reaps,
|
|
4
|
+
* so a lazy read after the reap would lose the envelope. An unreadable schema
|
|
5
|
+
* degrades validation rather than throwing.
|
|
28
6
|
*/
|
|
29
7
|
|
|
30
8
|
import fs from 'node:fs';
|
|
@@ -36,14 +14,6 @@ import addFormats from 'ajv-formats';
|
|
|
36
14
|
|
|
37
15
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
38
16
|
|
|
39
|
-
/**
|
|
40
|
-
* Absolute path to the shipped schema — the SSOT this module reads.
|
|
41
|
-
*
|
|
42
|
-
* Module-private, like every other `SCHEMA_PATH` in the tree
|
|
43
|
-
* (`validation-evidence.js`, `signal-validator.js`): the path is an
|
|
44
|
-
* implementation detail of loading, and callers want the verdict, not the
|
|
45
|
-
* location.
|
|
46
|
-
*/
|
|
47
17
|
const SCHEMA_PATH = path.resolve(
|
|
48
18
|
__dirname,
|
|
49
19
|
'..',
|
|
@@ -54,9 +24,7 @@ const SCHEMA_PATH = path.resolve(
|
|
|
54
24
|
);
|
|
55
25
|
|
|
56
26
|
/**
|
|
57
|
-
*
|
|
58
|
-
* on the returned source and degrades validation downstream, because importing
|
|
59
|
-
* this module must never be what breaks a delivery.
|
|
27
|
+
* Never throws: importing this module must never break a delivery.
|
|
60
28
|
*
|
|
61
29
|
* @returns {{ schema: object|null, error: string|null }}
|
|
62
30
|
*/
|
|
@@ -71,28 +39,17 @@ function loadSchemaSource() {
|
|
|
71
39
|
}
|
|
72
40
|
}
|
|
73
41
|
|
|
74
|
-
/**
|
|
75
|
-
* The schema, read and parsed at module load. Deliberately eager — see the
|
|
76
|
-
* module header for the failure that made it so.
|
|
77
|
-
*
|
|
78
|
-
* @type {{ schema: object|null, error: string|null }}
|
|
79
|
-
*/
|
|
42
|
+
/** @type {{ schema: object|null, error: string|null }} */
|
|
80
43
|
const SCHEMA_SOURCE = loadSchemaSource();
|
|
81
44
|
|
|
82
45
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* A `WeakMap` rather than one module-level slot so an injected `schemaSource`
|
|
86
|
-
* (the test seam) can never poison the validator the production path memoizes.
|
|
46
|
+
* Keyed by source so an injected test source never poisons production's.
|
|
87
47
|
*
|
|
88
48
|
* @type {WeakMap<object, Function>}
|
|
89
49
|
*/
|
|
90
50
|
const VALIDATORS = new WeakMap();
|
|
91
51
|
|
|
92
52
|
/**
|
|
93
|
-
* Compile (once per source) and return the terminal-envelope validator, or
|
|
94
|
-
* `null` when the source carries no usable schema.
|
|
95
|
-
*
|
|
96
53
|
* @param {{ schema: object|null }} source
|
|
97
54
|
* @returns {Function|null}
|
|
98
55
|
*/
|
|
@@ -110,13 +67,8 @@ function getValidator(source) {
|
|
|
110
67
|
let _unvalidatedWarned = false;
|
|
111
68
|
|
|
112
69
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* Written straight to stderr rather than through `Logger.warn` for the same
|
|
116
|
-
* reason `emitTerminalEnvelope` bypasses `Logger.info`: the envelope itself is
|
|
117
|
-
* unsuppressible, so the notice that one was not checked has to be too. Under
|
|
118
|
-
* `AGENT_LOG_LEVEL=silent` a level-gated warning would vanish and the degrade
|
|
119
|
-
* would be invisible.
|
|
70
|
+
* Once per process, straight to stderr: like the envelope itself, the notice
|
|
71
|
+
* must survive `AGENT_LOG_LEVEL=silent`.
|
|
120
72
|
*
|
|
121
73
|
* @param {string|null|undefined} error
|
|
122
74
|
* @returns {void}
|
|
@@ -132,20 +84,12 @@ function warnUnvalidated(error) {
|
|
|
132
84
|
}
|
|
133
85
|
|
|
134
86
|
/**
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* When the schema is unavailable the result reports `validated: false` and
|
|
138
|
-
* `valid: true` — a **deliberate degrade**, not an oversight. Losing the shape
|
|
139
|
-
* check costs a guard against a malformed envelope; throwing here costs the
|
|
140
|
-
* envelope entirely, and the envelope is the documented return contract of the
|
|
141
|
-
* delivery engine. An unvalidated terminal a caller can act on beats no
|
|
142
|
-
* terminal at all, so the unreadable-schema case degrades and says so on
|
|
143
|
-
* stderr while a schema *violation* still fails loudly at the writer.
|
|
87
|
+
* With no schema: `valid: true, validated: false` — deliberately, since an
|
|
88
|
+
* unvalidated envelope beats none. A violation still fails at the writer.
|
|
144
89
|
*
|
|
145
90
|
* @param {object} envelope
|
|
146
91
|
* @param {{ schemaSource?: { schema: object|null, error: string|null } }} [opts]
|
|
147
|
-
*
|
|
148
|
-
* module-level source.
|
|
92
|
+
* Test seam.
|
|
149
93
|
* @returns {{ valid: boolean, errors: string[], validated: boolean }}
|
|
150
94
|
*/
|
|
151
95
|
export function validateTerminalEnvelope(
|