mandrel 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* run
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* 1. Selects the cross-Story audit lens roster over the combined landed
|
|
6
|
-
* tip vs base (deterministic `selectAudits` — host walks lenses).
|
|
7
|
-
* 2. Rolls up friction follow-ups across every Story in the run and
|
|
8
|
-
* files/posts them on the primary Story.
|
|
9
|
-
* 3. Reports what the per-Story land tails left the run's container Epics
|
|
10
|
-
* in — closed, or still open (Story #5139; read-only since #5280).
|
|
11
|
-
*
|
|
12
|
-
* There is no inert planner-only path: `planRunEpilogue` enumerates steps
|
|
13
|
-
* and `runPlanRunEpilogue` executes them. Single-Story runs skip the
|
|
14
|
-
* epilogue (`applicable: false`).
|
|
2
|
+
* Per-run closeout after the last Story of a multi-Story run lands: optional
|
|
3
|
+
* audit roster, friction roll-up, and a read-only container-Epic report.
|
|
4
|
+
* Single-Story runs are `applicable: false`.
|
|
15
5
|
*
|
|
16
6
|
* @module lib/orchestration/run-epilogue
|
|
17
7
|
*/
|
|
@@ -33,18 +23,8 @@ import {
|
|
|
33
23
|
import { upsertStructuredComment } from './ticketing.js';
|
|
34
24
|
|
|
35
25
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* A fourth step — a cross-Story spec/acceptance coherence check — was removed
|
|
39
|
-
* in Story #5341: it re-read every Story body to post a comment nothing read
|
|
40
|
-
* back, on the one run shape (N>1) where that re-read costs the most. ADR
|
|
41
|
-
* `20260917-5341` carries the reasoning.
|
|
42
|
-
*
|
|
43
|
-
* `audit-roster` is **opt-in** since Story #5343 (`--audit-roster`): it is
|
|
44
|
-
* the one step that asks the host to spend a sub-agent per selected lens,
|
|
45
|
-
* and a run whose operator did not ask for an audit sweep paid that cost —
|
|
46
|
-
* plus a `plan-run-audit-roster` comment nobody acted on — on every N>1 run.
|
|
47
|
-
* The other two steps are reporting and stay on by default.
|
|
26
|
+
* Step kinds in execution order. `audit-roster` is opt-in (`--audit-roster`)
|
|
27
|
+
* because it costs a sub-agent per lens; the other two are reporting.
|
|
48
28
|
*
|
|
49
29
|
* @type {readonly ['audit-roster', 'follow-up-rollup', 'epic-close']}
|
|
50
30
|
*/
|
|
@@ -55,25 +35,9 @@ export const RUN_EPILOGUE_STEP_KINDS = Object.freeze([
|
|
|
55
35
|
]);
|
|
56
36
|
|
|
57
37
|
/**
|
|
58
|
-
* Report which container Epics
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* **It derives nothing and writes nothing.** It used to: it walked every Story
|
|
62
|
-
* and re-ran the full rollup, closing containers itself. That made sense while
|
|
63
|
-
* the rollup only fired on the edges someone had wired, and the epilogue was
|
|
64
|
-
* the backstop for the ones that were missed. Every child state change is now
|
|
65
|
-
* an edge — init, post-land, the supersede close — so by the time the last
|
|
66
|
-
* Story of a run has landed, its container has already been derived from a
|
|
67
|
-
* complete child set by that Story's own land tail. Re-deriving here would ask
|
|
68
|
-
* the same question a second time and answer it identically, at the cost of a
|
|
69
|
-
* full re-read per Story and a second writer on the same issue.
|
|
70
|
-
*
|
|
71
|
-
* What survives is the report, which is why the step exists at all: one place
|
|
72
|
-
* an operator reads to see what a multi-Story run did to its containers. A
|
|
73
|
-
* pending Epic here is a real signal — it means a land tail's rollup declined
|
|
74
|
-
* to close, and the tail's own outcome says why.
|
|
75
|
-
*
|
|
76
|
-
* Non-fatal throughout: a container it cannot read is simply not reported.
|
|
38
|
+
* Report which container Epics are closed vs still open. Read-only: each land
|
|
39
|
+
* tail already derived its container, so a pending Epic here means a tail's
|
|
40
|
+
* rollup declined to close. Unreadable containers are omitted.
|
|
77
41
|
*
|
|
78
42
|
* @param {{ stories: string[], provider: object }} opts
|
|
79
43
|
* @returns {Promise<{ kind: string, closed: number[], pending: number[] }>}
|
|
@@ -81,8 +45,7 @@ export const RUN_EPILOGUE_STEP_KINDS = Object.freeze([
|
|
|
81
45
|
async function executeEpicClose({ stories, provider }) {
|
|
82
46
|
const closed = new Set();
|
|
83
47
|
const pending = new Set();
|
|
84
|
-
// Siblings share a container:
|
|
85
|
-
// of the run's Stories point at it.
|
|
48
|
+
// Siblings share a container: report each Epic once.
|
|
86
49
|
const seen = new Set();
|
|
87
50
|
|
|
88
51
|
for (const raw of stories) {
|
|
@@ -108,11 +71,8 @@ async function executeEpicClose({ stories, provider }) {
|
|
|
108
71
|
}
|
|
109
72
|
|
|
110
73
|
/**
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
* One request per Story via the declared parent port. Degrades to null on any
|
|
114
|
-
* failure and on a provider without the port — this is a report, and a
|
|
115
|
-
* container it could not read is better omitted than guessed at.
|
|
74
|
+
* Null on any failure or a provider without `getParentIssue` — omitted, never
|
|
75
|
+
* guessed.
|
|
116
76
|
*
|
|
117
77
|
* @param {{ storyId: number, provider: object }} opts
|
|
118
78
|
* @returns {Promise<object|null>}
|
|
@@ -165,14 +125,10 @@ function normalizeStoryIds(stories) {
|
|
|
165
125
|
}
|
|
166
126
|
|
|
167
127
|
/**
|
|
168
|
-
* Enumerate the ordered epilogue steps for a completed run.
|
|
169
|
-
*
|
|
170
128
|
* @param {object} args
|
|
171
129
|
* @param {string} args.planRunId
|
|
172
130
|
* @param {Array<string|number|{ id?: string|number, slug?: string }>} args.stories
|
|
173
|
-
* @param {boolean} [args.auditRoster]
|
|
174
|
-
* (Story #5343). Default `false`: the roster spawns auditors and posts a
|
|
175
|
-
* comment the operator has to act on, so it runs only when asked for.
|
|
131
|
+
* @param {boolean} [args.auditRoster] Default `false`.
|
|
176
132
|
* @returns {object}
|
|
177
133
|
*/
|
|
178
134
|
export function planRunEpilogue({
|
|
@@ -199,9 +155,7 @@ export function planRunEpilogue({
|
|
|
199
155
|
};
|
|
200
156
|
}
|
|
201
157
|
|
|
202
|
-
// Positional
|
|
203
|
-
// stable adhoc id from the sorted Story set so the epilogue still
|
|
204
|
-
// anchors comments / audit roster without requiring `--run`.
|
|
158
|
+
// Positional delivery has no plan-run label: synthesize a stable adhoc id.
|
|
205
159
|
const effectiveRunId =
|
|
206
160
|
runId ??
|
|
207
161
|
`adhoc-${[...ids].sort((a, b) => Number(a) - Number(b)).join('-')}`;
|
|
@@ -237,10 +191,7 @@ export function planRunEpilogue({
|
|
|
237
191
|
}
|
|
238
192
|
|
|
239
193
|
/**
|
|
240
|
-
*
|
|
241
|
-
* run's landed squash-merges. The epilogue fires immediately after the run's
|
|
242
|
-
* last Story lands, so the run's merges sit within the first handful of
|
|
243
|
-
* commits; the limit only bounds the pathological case.
|
|
194
|
+
* The run's merges sit near the tip; this only bounds the pathological case.
|
|
244
195
|
* @type {number}
|
|
245
196
|
*/
|
|
246
197
|
const BASE_SCAN_LIMIT = 500;
|
|
@@ -249,8 +200,7 @@ const BASE_SCAN_LIMIT = 500;
|
|
|
249
200
|
const FIELD_SEP = '\x1f';
|
|
250
201
|
|
|
251
202
|
/**
|
|
252
|
-
*
|
|
253
|
-
* records, newest-first.
|
|
203
|
+
* Newest-first.
|
|
254
204
|
*
|
|
255
205
|
* @param {object} args
|
|
256
206
|
* @param {string} args.cwd
|
|
@@ -300,35 +250,12 @@ function readFirstParentHistory({ cwd, baseRef, scanLimit, git }) {
|
|
|
300
250
|
return { ok: true, commits };
|
|
301
251
|
}
|
|
302
252
|
|
|
303
|
-
/**
|
|
304
|
-
* One trailing `(#<n>)` / `(refs #<n>)` marker, anchored at the end of what
|
|
305
|
-
* is left of a subject after the markers to its right have been peeled off.
|
|
306
|
-
*/
|
|
307
253
|
const TRAILING_MARKER_RE = /\s*\((?:refs\s+)?#(\d+)\)$/;
|
|
308
254
|
|
|
309
255
|
/**
|
|
310
|
-
* Peel the
|
|
311
|
-
*
|
|
312
|
-
*
|
|
313
|
-
* title `normalizePrTitle` writes ends with `(#<storyId>)`, and GitHub's
|
|
314
|
-
* squash appends ` (#<prNumber>)` to it — so a landed Story merge reads
|
|
315
|
-
* `<subject> (#<storyId>) (#<prNumber>)` and the Story's own marker is the
|
|
316
|
-
* *second-to-last* marker, not the last one. Both are returned; the caller
|
|
317
|
-
* decides which ids it cares about.
|
|
318
|
-
*
|
|
319
|
-
* Why the trailing run rather than a substring scan (the bug this replaces):
|
|
320
|
-
* `subject.includes('(#101)')` matched the id **anywhere**, so an unrelated
|
|
321
|
-
* later commit quoting an old marker — canonically a revert, whose subject
|
|
322
|
-
* embeds the reverted title verbatim: `revert: "fix: x (#101) (#900)" (#950)`
|
|
323
|
-
* — anchored the run on a far-older commit and inflated the roster diff with
|
|
324
|
-
* everything in between. Peeling from the right stops at the first character
|
|
325
|
-
* that is not part of a marker (the closing quote, above), so a quoted marker
|
|
326
|
-
* is structurally out of reach.
|
|
327
|
-
*
|
|
328
|
-
* The `refs #` form is accepted because it is the other PR-title shape this
|
|
329
|
-
* repo's own history carries (`feat(x): … (refs #4575) (#4582)`) — the
|
|
330
|
-
* `refs #<id>` convention from `rules/git-conventions.md`. A plain substring
|
|
331
|
-
* scan for `(#4575)` never matched those at all.
|
|
256
|
+
* Peel the trailing run of `(#<n>)` / `(refs #<n>)` markers off a squash
|
|
257
|
+
* subject (`<title> (#<storyId>) (#<prNumber>)`). Only the trailing run
|
|
258
|
+
* counts, so a revert quoting an old title can't anchor the run on an ancient commit.
|
|
332
259
|
*
|
|
333
260
|
* @param {string} subject
|
|
334
261
|
* @returns {number[]} Marker ids, right-to-left (PR number first).
|
|
@@ -345,27 +272,15 @@ function trailingMarkerIds(subject) {
|
|
|
345
272
|
}
|
|
346
273
|
|
|
347
274
|
/**
|
|
348
|
-
*
|
|
349
|
-
*
|
|
350
|
-
*
|
|
351
|
-
*
|
|
352
|
-
* *after* the run's last Story lands, so HEAD in the main checkout is either
|
|
353
|
-
* `origin/main` itself or an ancestor of it. The three-dot merge-base is then
|
|
354
|
-
* HEAD, and the diff is empty **by construction** — it never reported the
|
|
355
|
-
* run's real diff. Rolling HEAD back does not help, so branch-reaping /
|
|
356
|
-
* cleanup ordering is not the cause; the refs being compared are.
|
|
357
|
-
*
|
|
358
|
-
* The derivation walks the base ref's first-parent history for the run's
|
|
359
|
-
* landed squash-merges. Every Story PR title carries a `(#<storyId>)` suffix
|
|
360
|
-
* (guaranteed by `normalizePrTitle` in the close pipeline) and GitHub uses the
|
|
361
|
-
* PR title as the squash subject, so the marker is a reliable, offline handle
|
|
362
|
-
* that does **not** depend on the Story branches still existing. The earliest
|
|
363
|
-
* such merge's first parent is the pre-run base.
|
|
275
|
+
* The commit the base pointed at before the run's first Story landed: the
|
|
276
|
+
* first parent of the earliest first-parent squash-merge carrying a run
|
|
277
|
+
* Story's `(#<storyId>)` marker. `origin/main...HEAD` would be empty by
|
|
278
|
+
* construction, since the epilogue runs after the last land.
|
|
364
279
|
*
|
|
365
280
|
* @param {object} args
|
|
366
|
-
* @param {Array<string|number>} args.stories
|
|
281
|
+
* @param {Array<string|number>} args.stories
|
|
367
282
|
* @param {string} args.cwd
|
|
368
|
-
* @param {string} [args.baseRef] -
|
|
283
|
+
* @param {string} [args.baseRef] - e.g. `origin/main`.
|
|
369
284
|
* @param {number} [args.scanLimit]
|
|
370
285
|
* @param {{ gitSpawn: Function }} [args.git]
|
|
371
286
|
* @returns {{ resolved: true, baseSha: string, mergeSha: string, storyId: number, baseRef: string }
|
|
@@ -395,8 +310,7 @@ export function resolveRunBaseSha({
|
|
|
395
310
|
return { resolved: false, baseRef, reason: history.reason };
|
|
396
311
|
}
|
|
397
312
|
|
|
398
|
-
//
|
|
399
|
-
// *earliest* merge belonging to the run.
|
|
313
|
+
// Walk oldest-first so the first hit is the run's earliest merge.
|
|
400
314
|
const wanted = new Set(ids);
|
|
401
315
|
for (let i = history.commits.length - 1; i >= 0; i -= 1) {
|
|
402
316
|
const commit = history.commits[i];
|
|
@@ -431,8 +345,6 @@ export function resolveRunBaseSha({
|
|
|
431
345
|
}
|
|
432
346
|
|
|
433
347
|
/**
|
|
434
|
-
* List the files the run changed: `<pre-run base>...<baseRef>`.
|
|
435
|
-
*
|
|
436
348
|
* @returns {{ ok: true, files: string[] } | { ok: false, reason: string }}
|
|
437
349
|
*/
|
|
438
350
|
function listChangedFiles({ cwd, baseSha, headRef, git }) {
|
|
@@ -461,8 +373,7 @@ function listChangedFiles({ cwd, baseSha, headRef, git }) {
|
|
|
461
373
|
}
|
|
462
374
|
|
|
463
375
|
/**
|
|
464
|
-
*
|
|
465
|
-
* be computed. Never conflates "could not compute" with "zero files changed".
|
|
376
|
+
* Never conflates "could not compute" with "zero files changed".
|
|
466
377
|
*
|
|
467
378
|
* @returns {{ resolved: boolean, changedFiles: string[], baseSha: string|null,
|
|
468
379
|
* mergeSha: string|null, baseRef: string, reason: string|null }}
|
|
@@ -506,8 +417,7 @@ function resolveCombinedDiff({ stories, cwd, baseRef, git }) {
|
|
|
506
417
|
}
|
|
507
418
|
|
|
508
419
|
/**
|
|
509
|
-
*
|
|
510
|
-
* loud failure, never as `Changed files considered: 0`.
|
|
420
|
+
* An unresolved base reads as a loud failure, never as zero files.
|
|
511
421
|
*
|
|
512
422
|
* @param {ReturnType<typeof resolveCombinedDiff>} diff
|
|
513
423
|
* @returns {string[]}
|
|
@@ -544,12 +454,6 @@ function resolveBaseRef(config) {
|
|
|
544
454
|
}
|
|
545
455
|
|
|
546
456
|
/**
|
|
547
|
-
* Render the `plan-run-audit-roster` comment body.
|
|
548
|
-
*
|
|
549
|
-
* Split out of `executeAuditRoster` in Story #5341: the executor's job is to
|
|
550
|
-
* resolve the diff and select the lenses, and a hundred lines of rendering
|
|
551
|
-
* between those two facts and the result is what hid them.
|
|
552
|
-
*
|
|
553
457
|
* @param {object} args
|
|
554
458
|
* @returns {string}
|
|
555
459
|
*/
|
|
@@ -573,11 +477,7 @@ function renderAuditRosterBody({
|
|
|
573
477
|
? selectedAudits.map((lens) => `- \`${lens}\``)
|
|
574
478
|
: ['- _(none — docs-only or no matching change-set lenses)_']),
|
|
575
479
|
'',
|
|
576
|
-
//
|
|
577
|
-
// how to dispatch them, which made a serial walk (and a nested
|
|
578
|
-
// coordinator) fully compliant with it. The lenses are read-only and share
|
|
579
|
-
// no write paths, so they are the textbook independent fan-out; naming the
|
|
580
|
-
// shape here is what turns that from an option into the instruction.
|
|
480
|
+
// Lenses are read-only and independent; state the fan-out shape explicitly.
|
|
581
481
|
'**Dispatch shape (MUST): flat, parallel, one turn.** Spawn one ' +
|
|
582
482
|
'`auditor` sub-agent per lens listed above and issue every one of those ' +
|
|
583
483
|
'spawns in a SINGLE turn — no nested fan-out, no serial walk. A ' +
|
|
@@ -624,11 +524,8 @@ async function executeAuditRoster({
|
|
|
624
524
|
baseRef: resolveBaseRef(config),
|
|
625
525
|
git,
|
|
626
526
|
});
|
|
627
|
-
//
|
|
628
|
-
//
|
|
629
|
-
// Stories merged, so every range it could name (`main...HEAD`) is empty by
|
|
630
|
-
// construction; asking for one is how the roster came to select lenses from
|
|
631
|
-
// zero files while printing the correct file list beside them (Story #4571).
|
|
527
|
+
// Pass the resolved change set, never a range: post-merge, any range
|
|
528
|
+
// `selectAudits` could derive is empty by construction.
|
|
632
529
|
const lensGrounding = diff.resolved ? 'diff' : 'keyword-only';
|
|
633
530
|
let selectedAudits = [];
|
|
634
531
|
if (Number.isInteger(primaryId) && primaryId > 0) {
|
|
@@ -667,14 +564,9 @@ async function executeAuditRoster({
|
|
|
667
564
|
return {
|
|
668
565
|
kind: 'audit-roster',
|
|
669
566
|
selectedAudits,
|
|
670
|
-
//
|
|
671
|
-
// (`diff`) or, with no resolvable base, from the primary Story's prose
|
|
672
|
-
// alone (`keyword-only`). The two are not interchangeable: a keyword-only
|
|
673
|
-
// roster cannot select a lens that declares no keywords, so its silence
|
|
674
|
-
// about a lens says nothing about the code.
|
|
567
|
+
// A keyword-only roster's silence about a lens says nothing about the code.
|
|
675
568
|
lensGrounding,
|
|
676
|
-
// `null
|
|
677
|
-
// "the run genuinely changed nothing".
|
|
569
|
+
// `null`, not `0`, when unresolved.
|
|
678
570
|
changedFileCount: diff.resolved ? diff.changedFiles.length : null,
|
|
679
571
|
changedFiles: diff.resolved ? diff.changedFiles : null,
|
|
680
572
|
baseResolution: {
|
|
@@ -688,16 +580,6 @@ async function executeAuditRoster({
|
|
|
688
580
|
}
|
|
689
581
|
|
|
690
582
|
/**
|
|
691
|
-
* Compose the run-scope routed proposals.
|
|
692
|
-
*
|
|
693
|
-
* Story #4850 — `runToken` and `anchorStoryIds` are INPUTS. This used to
|
|
694
|
-
* compose with the primary Story's numeric id standing in for the run and then
|
|
695
|
-
* rewrite the rendered title/body by regex over a `plan-run \d+` substring,
|
|
696
|
-
* which meant the composer's own wording could not be changed without silently
|
|
697
|
-
* breaking the patch. `anchorStoryIds` is what lets the composer tell a corpus
|
|
698
|
-
* confined to this run from one spanning the whole surviving window, so it
|
|
699
|
-
* never titles the latter as if it were the former.
|
|
700
|
-
*
|
|
701
583
|
* @param {object} args
|
|
702
584
|
* @returns {object}
|
|
703
585
|
*/
|
|
@@ -722,8 +604,6 @@ function composeRunProposals({
|
|
|
722
604
|
}
|
|
723
605
|
|
|
724
606
|
/**
|
|
725
|
-
* Hand the run-scope proposals to the graduator (injectable for tests).
|
|
726
|
-
*
|
|
727
607
|
* @param {object} args
|
|
728
608
|
* @returns {Promise<object>}
|
|
729
609
|
*/
|
|
@@ -741,8 +621,6 @@ function fileRunProposals({
|
|
|
741
621
|
provider,
|
|
742
622
|
config,
|
|
743
623
|
currentRepo: repos.currentRepo,
|
|
744
|
-
// The resolved bucket object, not a re-split of the slug: routing is
|
|
745
|
-
// decided once in `github/framework-repo.js`.
|
|
746
624
|
frameworkRepo: repos.repos.framework,
|
|
747
625
|
platformRepo: repos.repos.platform,
|
|
748
626
|
routedProposals: proposals,
|
|
@@ -758,9 +636,6 @@ async function executeFollowUpRollup({
|
|
|
758
636
|
cwd,
|
|
759
637
|
graduateFn = graduateRetroProposals,
|
|
760
638
|
}) {
|
|
761
|
-
// Shared with the story-scoped gather (Story #4649): `storyId` + `details`
|
|
762
|
-
// are what the composer's recovery-netting keys on, and two hand-rolled
|
|
763
|
-
// copies of this loop are how they got dropped in the first place.
|
|
764
639
|
const { signals, window: frictionWindow } = await gatherRunFrictionSignals(
|
|
765
640
|
stories,
|
|
766
641
|
config,
|
|
@@ -816,9 +691,6 @@ async function executeFollowUpRollup({
|
|
|
816
691
|
}
|
|
817
692
|
|
|
818
693
|
/**
|
|
819
|
-
* Render the run-scope roll-up and publish it — the one place that decides
|
|
820
|
-
* where it goes.
|
|
821
|
-
*
|
|
822
694
|
* @param {object} args
|
|
823
695
|
* @returns {Promise<void>}
|
|
824
696
|
*/
|
|
@@ -839,12 +711,7 @@ async function publishRunRollup({
|
|
|
839
711
|
storyId: primaryId,
|
|
840
712
|
proposals,
|
|
841
713
|
graduated,
|
|
842
|
-
// Story #4578 — the run's Story count is what lets an empty roll-up
|
|
843
|
-
// render as a flagged claim ("0 signals across N Stories") rather than
|
|
844
|
-
// as "nothing to follow up".
|
|
845
714
|
storyCount,
|
|
846
|
-
// Story #4828 — and the corpus is what lets a zero-proposal or
|
|
847
|
-
// zero-filed roll-up name what it saw instead of rendering as clean.
|
|
848
715
|
signalCount,
|
|
849
716
|
categories,
|
|
850
717
|
}).replace(
|
|
@@ -861,10 +728,8 @@ async function publishRunRollup({
|
|
|
861
728
|
}
|
|
862
729
|
|
|
863
730
|
/**
|
|
864
|
-
*
|
|
865
|
-
*
|
|
866
|
-
* every suspicion the roll-up can raise, and the reporting shape is what
|
|
867
|
-
* callers read, not how it was gathered.
|
|
731
|
+
* The step result carries every suspect flag so the CLI never regexes the
|
|
732
|
+
* comment body.
|
|
868
733
|
*
|
|
869
734
|
* @param {object} args
|
|
870
735
|
* @returns {object}
|
|
@@ -884,31 +749,14 @@ function buildRollupStepResult({
|
|
|
884
749
|
signalCount: signals.length,
|
|
885
750
|
storyCount,
|
|
886
751
|
filed: graduated.filed?.length ?? 0,
|
|
887
|
-
//
|
|
888
|
-
// it dropped. `signalCount` alone cannot distinguish "the window is bounded
|
|
889
|
-
// at 30 days and 40 rows aged out" from "nothing older exists", and an
|
|
890
|
-
// operator triaging a roll-up needs to know which corpus produced it.
|
|
752
|
+
// What the age window excluded, so a bounded corpus is distinguishable.
|
|
891
753
|
frictionWindow,
|
|
892
|
-
// Story #4828 — everything below is what the roll-up saw and what became
|
|
893
|
-
// of it. The pre-#4828 result reported `signalCount` and `filed` and
|
|
894
|
-
// nothing in between, so nine signals routing into one proposal whose
|
|
895
|
-
// every filing attempt errored rendered as `{signalCount: 9, filed: 0,
|
|
896
|
-
// discarded: []}` — arithmetically consistent, and indistinguishable from
|
|
897
|
-
// a run with nothing to do.
|
|
898
754
|
proposalCount,
|
|
899
|
-
// The categories the corpus actually contained, so a zero-proposal
|
|
900
|
-
// roll-up names its own input rather than asserting emptiness.
|
|
901
755
|
categories,
|
|
902
756
|
filingErrors: Array.isArray(graduated.errors) ? graduated.errors : [],
|
|
903
757
|
filingSkipped: outcome.blockingSkipReasons,
|
|
904
|
-
// Signals in, nothing out — not even a below-threshold row.
|
|
905
758
|
zeroProposalSuspect: outcome.zeroProposals,
|
|
906
|
-
// Proposals cleared the threshold and the filer produced none of them.
|
|
907
759
|
unfiledProposalSuspect: outcome.unfiledProposals,
|
|
908
|
-
// Story #4824 — a roll-up that discards every candidate must still name
|
|
909
|
-
// what it discarded. Rendering that as "nothing to follow up" is how a
|
|
910
|
-
// defect recurring once per Story survived eighteen consecutive Stories.
|
|
911
|
-
// Surfaced on the step result so the CLI need not regex the comment body.
|
|
912
760
|
discarded: proposals.discarded.map((item) => ({
|
|
913
761
|
category: item.category,
|
|
914
762
|
occurrences: item.occurrences,
|
|
@@ -917,16 +765,12 @@ function buildRollupStepResult({
|
|
|
917
765
|
tools: item.tools ?? [],
|
|
918
766
|
fingerprint: item.fingerprint ?? null,
|
|
919
767
|
})),
|
|
920
|
-
// Story #4578 — zero signals across a multi-Story run is a claim, not a
|
|
921
|
-
// clean bill of health. Surfaced on the step result so the CLI can warn
|
|
922
|
-
// the operator without re-deriving it from the comment prose.
|
|
923
768
|
emptyRollupSuspect: signals.length === 0 && storyCount > 1,
|
|
924
769
|
};
|
|
925
770
|
}
|
|
926
771
|
|
|
927
772
|
/**
|
|
928
|
-
*
|
|
929
|
-
* failures are collected into `errors[]`.
|
|
773
|
+
* Throws only on programmer misuse; step failures collect into `errors[]`.
|
|
930
774
|
*
|
|
931
775
|
* @param {object} args
|
|
932
776
|
* @param {string} args.planRunId
|
|
@@ -934,13 +778,10 @@ function buildRollupStepResult({
|
|
|
934
778
|
* @param {object} args.provider
|
|
935
779
|
* @param {object} [args.config]
|
|
936
780
|
* @param {string} [args.cwd]
|
|
937
|
-
* @param {{ gitSpawn: Function }} [args.git]
|
|
938
|
-
* @param {typeof selectAudits} [args.selectAuditsFn]
|
|
939
|
-
* @param {typeof graduateRetroProposals} [args.graduateFn]
|
|
940
|
-
*
|
|
941
|
-
* (Story #4828) without spawning a real `gh`.
|
|
942
|
-
* @param {boolean} [args.auditRoster] Opt into the audit-roster step
|
|
943
|
-
* (Story #5343); default `false`.
|
|
781
|
+
* @param {{ gitSpawn: Function }} [args.git]
|
|
782
|
+
* @param {typeof selectAudits} [args.selectAuditsFn]
|
|
783
|
+
* @param {typeof graduateRetroProposals} [args.graduateFn]
|
|
784
|
+
* @param {boolean} [args.auditRoster] Default `false`.
|
|
944
785
|
* @returns {Promise<object>}
|
|
945
786
|
*/
|
|
946
787
|
export async function runPlanRunEpilogue({
|
|
@@ -1,54 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* seeds `story-<id>` from `project.baseBranch`; `single-story-close` used to
|
|
7
|
-
* re-resolve the SAME key and run close-validation, format-autofix, the gate
|
|
8
|
-
* baseline and base-sync against its own second answer. Nothing pinned the
|
|
9
|
-
* first value and nothing checked the two agreed — and the window between
|
|
10
|
-
* them is however long implementation takes. A concurrent session editing
|
|
11
|
-
* `.agentrc.json` / `.agentrc.local.json` mid-run therefore base-synced a
|
|
12
|
-
* Story against a base it was never seeded from, which surfaced only as an
|
|
13
|
-
* ordinary content conflict with nothing pointing at config.
|
|
14
|
-
*
|
|
15
|
-
* The base a Story was seeded from is a property of **that run**, not of
|
|
16
|
-
* whatever the config file says later. So init pins it and close reads the
|
|
17
|
-
* pin back.
|
|
18
|
-
*
|
|
19
|
-
* ## Where the pin lives
|
|
20
|
-
*
|
|
21
|
-
* The init envelope on disk — `<tempRoot>/orchestration/story-init-result-<id>.log`,
|
|
22
|
-
* written by `single-story-init.js` via `emitTerseResult`. Story #5343 retired
|
|
23
|
-
* the `story-init` ticket comment (the delivery-comment diet), so the envelope
|
|
24
|
-
* is the pin's home; it is written before init returns and read at close, well
|
|
25
|
-
* before the post-land tail purges the temp tree.
|
|
26
|
-
*
|
|
27
|
-
* That is a hard cutover, not a dual read. The envelope is written by the same
|
|
28
|
-
* process, in the same run, that seeds the branch — so if it is gone, the temp
|
|
29
|
-
* tree was reaped and this is a much later close, exactly the case a stale
|
|
30
|
-
* `story-init` comment would have answered with equal uncertainty. A missing
|
|
31
|
-
* pin is never a refusal: it degrades to the currently-resolved config with a
|
|
32
|
-
* loud, announced warning, and close simply cannot confirm the base.
|
|
33
|
-
*
|
|
34
|
-
* ## Adding another run-scoped key
|
|
35
|
-
*
|
|
36
|
-
* Add one row to `RUN_SCOPED_CONFIG_KEYS`. Both halves — the pin init writes
|
|
37
|
-
* and the comparison close makes — enumerate that registry, so a new key
|
|
38
|
-
* needs no second mechanism, no reader change and no writer change. Only
|
|
39
|
-
* `baseBranch` is enforced today because only its corruption is destructive
|
|
40
|
-
* (a wrong base merged into the Story branch permanently contaminates the
|
|
41
|
-
* branch and its PR diff); ceremony profile, quality floors and the
|
|
42
|
-
* concurrency cap are deliberately NOT pinned here.
|
|
2
|
+
* Pin the config a delivery run was seeded from (in the init envelope) and
|
|
3
|
+
* fail closed at close when the config changed underneath it — a concurrent
|
|
4
|
+
* edit would otherwise base-sync the Story onto a base it was never seeded
|
|
5
|
+
* from. A missing pin degrades to current config with a loud warning.
|
|
43
6
|
*/
|
|
44
7
|
|
|
45
8
|
import { readRunScopedPin } from './story-init-envelope.js';
|
|
46
9
|
|
|
47
10
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* file. `read` resolves the key from a resolved config (including its
|
|
51
|
-
* default); `label` is the dotted config path the operator has to go fix.
|
|
11
|
+
* Keys whose value belongs to the seeding run. Only `baseBranch`: a wrong base
|
|
12
|
+
* permanently contaminates the branch. Init and close both walk this registry.
|
|
52
13
|
*
|
|
53
14
|
* @type {Record<string, { read: (config: object) => unknown, label: string }>}
|
|
54
15
|
*/
|
|
@@ -60,14 +21,8 @@ const RUN_SCOPED_CONFIG_KEYS = {
|
|
|
60
21
|
};
|
|
61
22
|
|
|
62
23
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* on its init envelope so close can compare against it later.
|
|
66
|
-
*
|
|
67
|
-
* @param {object} config Resolved config (`resolveConfig` output).
|
|
68
|
-
* @param {typeof RUN_SCOPED_CONFIG_KEYS} [keys] Registry override — the
|
|
69
|
-
* default is the module registry; supplying one is how a caller (or a test)
|
|
70
|
-
* exercises the registry-driven property without a second mechanism.
|
|
24
|
+
* @param {object} config Resolved config.
|
|
25
|
+
* @param {typeof RUN_SCOPED_CONFIG_KEYS} [keys]
|
|
71
26
|
* @returns {Record<string, unknown>} the pinned values, keyed by config key.
|
|
72
27
|
*/
|
|
73
28
|
export function pinRunScopedConfig(config, keys = RUN_SCOPED_CONFIG_KEYS) {
|
|
@@ -79,14 +34,7 @@ export function pinRunScopedConfig(config, keys = RUN_SCOPED_CONFIG_KEYS) {
|
|
|
79
34
|
}
|
|
80
35
|
|
|
81
36
|
/**
|
|
82
|
-
*
|
|
83
|
-
* one registry row at a time. Split out of `resolveRunScopedConfig` so the
|
|
84
|
-
* row walk and the three outcomes it feeds (confirmed / conflict / unpinned)
|
|
85
|
-
* read separately.
|
|
86
|
-
*
|
|
87
|
-
* A row the receipt pins nothing for is `unpinned`, not a conflict: an older
|
|
88
|
-
* receipt simply predates that registry row, and falling back to current
|
|
89
|
-
* config for it is correct as long as the fallback is announced.
|
|
37
|
+
* A row with no pinned value is `unpinned` (an older receipt), not a conflict.
|
|
90
38
|
*
|
|
91
39
|
* @param {{
|
|
92
40
|
* pinned: Record<string, unknown>,
|
|
@@ -119,11 +67,6 @@ function comparePinToCurrent({ pinned: pin, current, keys }) {
|
|
|
119
67
|
}
|
|
120
68
|
|
|
121
69
|
/**
|
|
122
|
-
* Build the refusal message for a mid-run config change. Names BOTH values
|
|
123
|
-
* for every conflicting key — the pinned one and the one config resolves to
|
|
124
|
-
* now — because "which base was this branch actually seeded from" is the
|
|
125
|
-
* question the operator could not previously answer.
|
|
126
|
-
*
|
|
127
70
|
* @param {{ storyId: number, conflicts: Array<{ label: string, pinned: unknown, current: unknown }> }} args
|
|
128
71
|
* @returns {string}
|
|
129
72
|
*/
|
|
@@ -144,14 +87,8 @@ function formatRunScopedConflict({ storyId, conflicts }) {
|
|
|
144
87
|
}
|
|
145
88
|
|
|
146
89
|
/**
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
* Throws on disagreement — fail closed, before any gate, format-autofix or
|
|
151
|
-
* base-sync has run, with both values named. Never silently prefers either
|
|
152
|
-
* side: preferring the pin would base-sync correctly but hide a config change
|
|
153
|
-
* the operator needs to know about, and preferring current config is the bug
|
|
154
|
-
* this module exists to close.
|
|
90
|
+
* Throws on disagreement, before any gate or base-sync runs — silently
|
|
91
|
+
* preferring either side would hide the config change.
|
|
155
92
|
*
|
|
156
93
|
* @param {{
|
|
157
94
|
* storyId: number,
|
|
@@ -165,9 +102,7 @@ function formatRunScopedConflict({ storyId, conflicts }) {
|
|
|
165
102
|
* confirmed: boolean,
|
|
166
103
|
* receiptStatus: string,
|
|
167
104
|
* warning: string|null,
|
|
168
|
-
* }>} `confirmed`
|
|
169
|
-
* agreed with current config — i.e. when downstream remediation may safely
|
|
170
|
-
* assume the pinned value is the one in play.
|
|
105
|
+
* }>} `confirmed` only when every key was pinned and agreed.
|
|
171
106
|
*/
|
|
172
107
|
export async function resolveRunScopedConfig({
|
|
173
108
|
storyId,
|
|
@@ -180,8 +115,7 @@ export async function resolveRunScopedConfig({
|
|
|
180
115
|
const receipt = readPinFn({ storyId: Number(storyId), config });
|
|
181
116
|
|
|
182
117
|
if (!receipt) {
|
|
183
|
-
//
|
|
184
|
-
// announced, because a silent one reintroduces exactly the bug above.
|
|
118
|
+
// Not an error, but never a silent fallback.
|
|
185
119
|
const warning =
|
|
186
120
|
`Run-scoped config could not be read from the run's init envelope ` +
|
|
187
121
|
`(no runScopedConfig pin for Story #${storyId}); falling back to the ` +
|
|
@@ -227,8 +161,6 @@ export async function resolveRunScopedConfig({
|
|
|
227
161
|
}
|
|
228
162
|
|
|
229
163
|
/**
|
|
230
|
-
* Render `label=value` pairs for the operator-facing lines above.
|
|
231
|
-
*
|
|
232
164
|
* @param {Record<string, unknown>} values
|
|
233
165
|
* @param {typeof RUN_SCOPED_CONFIG_KEYS} keys
|
|
234
166
|
* @returns {string}
|
|
@@ -1,45 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* close-note.js — the human-readable `note` on close's result record
|
|
3
|
-
* (Story #5266).
|
|
2
|
+
* close-note.js — the human-readable `note` on close's result record.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* into `story-close-result-<id>.log` **beside `merged: false`**, while the
|
|
11
|
-
* schema-validated terminal envelope correctly reported
|
|
12
|
-
* `status: pending, phase: confirm-merge`. That log is what close's summary
|
|
13
|
-
* line points the operator at, so the contradiction is what gets read first:
|
|
14
|
-
* a merge that never happened, reported as confirmed.
|
|
15
|
-
*
|
|
16
|
-
* The invariant this module exists to hold:
|
|
17
|
-
*
|
|
18
|
-
* > **No note may assert a state the same object denies.**
|
|
19
|
-
*
|
|
20
|
-
* Every branch below is therefore derived from the result's OWN
|
|
21
|
-
* `merged` / `directMerged` / `autoMergeEnabled` / `landCompleted` fields —
|
|
22
|
-
* the ones the note ships next to — so no input can produce a note that
|
|
23
|
-
* contradicts them. Story #5279 added the fourth, because `merged: true`
|
|
24
|
-
* used to imply the flip, the issue close and the post-land tail: a direct
|
|
25
|
-
* squash-merge under `--no-wait-merge`, and a merge whose `agent::done` write
|
|
26
|
-
* failed, now reach it with none of the three, and reusing the confirmed
|
|
27
|
-
* wording for them would reintroduce the defect above one field over. The
|
|
28
|
-
* unmerged branches deliberately claim nothing about the Story's label state
|
|
29
|
-
* either: close's ending may be `pending` OR `blocked` with the same
|
|
30
|
-
* `merged: false`, and the terminal envelope is the authority on which. They
|
|
31
|
-
* also avoid the merge-completion vocabulary entirely — no `agent::done`, no
|
|
32
|
-
* "the merge confirms" — so that a reader skimming for those words cannot
|
|
33
|
-
* take a next-step instruction for a report of what happened.
|
|
4
|
+
* Invariant: no note may assert a state the same object denies, so every
|
|
5
|
+
* branch derives from the result's own fields. A merge is not a completed
|
|
6
|
+
* land (`landCompleted`), and the unmerged branches claim nothing about label
|
|
7
|
+
* state and avoid merge-completion vocabulary — the terminal envelope is the
|
|
8
|
+
* authority on pending vs blocked.
|
|
34
9
|
*/
|
|
35
10
|
|
|
36
11
|
/**
|
|
37
|
-
* The one line the note is not allowed to get wrong.
|
|
38
|
-
*
|
|
39
12
|
* @param {{ merged?: boolean, directMerged?: boolean,
|
|
40
13
|
* autoMergeEnabled?: boolean, landCompleted?: boolean }} result
|
|
41
14
|
* `landCompleted` — did THIS run flip `agent::done`, close the issue and
|
|
42
|
-
* run the post-land tail? Defaults to `merged
|
|
15
|
+
* run the post-land tail? Defaults to `merged`.
|
|
43
16
|
* @returns {string}
|
|
44
17
|
*/
|
|
45
18
|
export function deriveCloseNote({
|