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,39 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* 1. `changes[]` repair + ticket validator + file-assumption + DAG
|
|
9
|
-
* 2. Draft reachability (named soft failure, exit 3)
|
|
10
|
-
* 3. Same-wave collision refusal (`assertNoWaveCollisions`) + spec fold
|
|
11
|
-
* 4. Create Story issues (`type::story` + sanitized authored labels —
|
|
12
|
-
* deliberately NOT `agent::ready`), resumably via a plan fingerprint
|
|
13
|
-
* 5. Upsert `story-plan-state` on every created Story; upsert `plan-summary`
|
|
14
|
-
* on the primary Story
|
|
15
|
-
* 6. Flip every Story to `agent::ready` — the terminal step, so `ready`
|
|
16
|
-
* always implies "checkpoints written"
|
|
17
|
-
* 7. Comment on + close the superseded `--tickets` source issues
|
|
18
|
-
* (Story #4535) — bookkeeping only; never fails the run
|
|
19
|
-
* 8. Temp cleanup at terminal success + a stale-plan-dir reap
|
|
20
|
-
*
|
|
21
|
-
* **Why `agent::ready` moved to the end (Story #4541).** Issues used to be
|
|
22
|
-
* born `agent::ready` in the creating POST while the checkpoints were
|
|
23
|
-
* written afterwards. Anything picking a Story up in that window — or after
|
|
24
|
-
* a comment failure aborted the loop — read the checkpoint as `null`
|
|
25
|
-
* (`story-plan-state.js` degrades missing/malformed to `null`). Creating
|
|
26
|
-
* unlabelled, writing checkpoints, then flipping closes that race.
|
|
27
|
-
*
|
|
28
|
-
* **No authored risk artifact (Story #4542).** Persist neither requires nor
|
|
29
|
-
* accepts a risk verdict, derives no envelope from one, and computes no
|
|
30
|
-
* review routing. Review depth and the acceptance-critic mode are derived from
|
|
31
|
-
* the diff at close time (`review-depth.js#deriveChangeLevel`); `--force-review`
|
|
32
|
-
* is an explicit operator flag, recorded here as a receipt and never inferred.
|
|
33
|
-
*
|
|
34
|
-
* Hard cutover: no Epic parent, no reconciler, no `deliveryShape`, no
|
|
35
|
-
* `--amend` tree cascades. Those surfaces die with Stages 4–5 for any
|
|
36
|
-
* remaining epic-delivery readers.
|
|
2
|
+
* Flat Story persist. Hard gates refuse; everything else is a warning the
|
|
3
|
+
* dry-run lists. Order: validate → reachability → wave-collision gate →
|
|
4
|
+
* create (without `agent::ready`) → plan comment on every Story → flip to
|
|
5
|
+
* `agent::ready` last, so `ready` implies "plan comments written" → close
|
|
6
|
+
* superseded sources (never fails the run) → temp cleanup.
|
|
37
7
|
*
|
|
38
8
|
* @module lib/orchestration/plan-persist/run-plan-persist
|
|
39
9
|
*/
|
|
@@ -75,65 +45,37 @@ import {
|
|
|
75
45
|
createStoryIssues,
|
|
76
46
|
markStoriesReady,
|
|
77
47
|
} from './story-ops.js';
|
|
78
|
-
import {
|
|
79
|
-
buildPlanSummaryCommentBody,
|
|
80
|
-
buildWaveTable,
|
|
81
|
-
PLAN_SUMMARY_COMMENT_TYPE,
|
|
82
|
-
} from './summary.js';
|
|
48
|
+
import { buildPlanSummaryCommentBody, buildWaveTable } from './summary.js';
|
|
83
49
|
import { closeSupersededTickets } from './supersede-ops.js';
|
|
84
50
|
import { assertNoWaveCollisions } from './wave-collision-gate.js';
|
|
85
51
|
|
|
86
|
-
/**
|
|
87
|
-
const PLAN_CHECKPOINT_SCHEMA_VERSION_V2 = 2;
|
|
88
|
-
|
|
89
|
-
/** Structured-comment type for the per-plan Story checkpoint. */
|
|
52
|
+
/** Marker that makes a re-persist upsert the comment in place. */
|
|
90
53
|
const STORY_PLAN_STATE_TYPE = 'story-plan-state';
|
|
91
54
|
|
|
92
55
|
/**
|
|
93
|
-
*
|
|
56
|
+
* The one comment persist posts per Story, carrying the plan summary.
|
|
94
57
|
*
|
|
95
58
|
* @param {object} provider
|
|
96
59
|
* @param {number} storyId
|
|
97
|
-
* @param {
|
|
60
|
+
* @param {string} summary Must be non-empty.
|
|
61
|
+
* @returns {Promise<void>}
|
|
98
62
|
*/
|
|
99
|
-
export async function
|
|
63
|
+
export async function writePlanSummaryComment(provider, storyId, summary) {
|
|
100
64
|
if (!Number.isInteger(storyId)) {
|
|
101
|
-
throw new TypeError('
|
|
65
|
+
throw new TypeError('writePlanSummaryComment requires a numeric storyId');
|
|
66
|
+
}
|
|
67
|
+
const body = summary?.trim();
|
|
68
|
+
if (!body) {
|
|
69
|
+
throw new TypeError(
|
|
70
|
+
'writePlanSummaryComment requires a non-empty plan summary',
|
|
71
|
+
);
|
|
102
72
|
}
|
|
103
|
-
const body = [
|
|
104
|
-
'### story-plan-state',
|
|
105
|
-
'',
|
|
106
|
-
'```json',
|
|
107
|
-
JSON.stringify(
|
|
108
|
-
{
|
|
109
|
-
version: PLAN_CHECKPOINT_SCHEMA_VERSION_V2,
|
|
110
|
-
storyId,
|
|
111
|
-
...state,
|
|
112
|
-
},
|
|
113
|
-
null,
|
|
114
|
-
2,
|
|
115
|
-
),
|
|
116
|
-
'```',
|
|
117
|
-
].join('\n');
|
|
118
73
|
await upsertStructuredComment(provider, storyId, STORY_PLAN_STATE_TYPE, body);
|
|
119
|
-
return state;
|
|
120
74
|
}
|
|
121
75
|
|
|
122
76
|
/**
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
* Since Story #5312 the only hard refusal the validator batches into
|
|
126
|
-
* `errors[]` is a `deletes` naming a path absent at base; every other
|
|
127
|
-
* footprint probe — a `creates` / `refactors-existing` mismatch, a goal,
|
|
128
|
-
* acceptance or verify path absent at base — lands on `warnings[]`, which
|
|
129
|
-
* the dry-run prints and the persist proceeds past. The `changes[]` repairs
|
|
130
|
-
* the helper applied are reported alongside so the operator sees what was
|
|
131
|
-
* rewritten.
|
|
132
|
-
*
|
|
133
|
-
* The returned freshness counts feed the posted `plan-summary`'s freshness
|
|
134
|
-
* line: every warning is a reference the base branch disagreed with, so it
|
|
135
|
-
* counts as `stale` there rather than the comment reading "clean" on a run
|
|
136
|
-
* that had something to say.
|
|
77
|
+
* Throw on validator hard errors; return warnings (with applied `changes[]`
|
|
78
|
+
* repairs) and freshness counts for the summary.
|
|
137
79
|
*
|
|
138
80
|
* @returns {{ warnings: string[], freshness: { stale: number, ambiguous: number } }}
|
|
139
81
|
*/
|
|
@@ -156,10 +98,8 @@ function enforceTicketValidation(validated) {
|
|
|
156
98
|
}
|
|
157
99
|
|
|
158
100
|
/**
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
* actually read, `ambiguous` when none resolved in this checkout and the
|
|
162
|
-
* probes were skipped, since nothing was verified either way.
|
|
101
|
+
* Every validator warning counts `stale` when a base ref was read, else
|
|
102
|
+
* `ambiguous` (the probes were skipped, nothing was verified).
|
|
163
103
|
*
|
|
164
104
|
* @param {string|null} probeRef
|
|
165
105
|
* @param {string[]} warnings
|
|
@@ -170,18 +110,13 @@ function freshnessCounts(probeRef, warnings) {
|
|
|
170
110
|
return { stale: warnings.length, ambiguous: 0 };
|
|
171
111
|
}
|
|
172
112
|
|
|
173
|
-
/** How each text-hygiene finding kind names itself on the warning list. */
|
|
174
113
|
const TEXT_HYGIENE_LABELS = {
|
|
175
114
|
'open-question': 'open question in body',
|
|
176
115
|
'pinned-identifier': 'pinned identifier in acceptance[]',
|
|
177
116
|
};
|
|
178
117
|
|
|
179
118
|
/**
|
|
180
|
-
*
|
|
181
|
-
* operator-directed question persisted into a Story a non-interactive
|
|
182
|
-
* sub-agent executes, and an acceptance item pinning an internal symbol the
|
|
183
|
-
* advisory `changes[]` may reshape. Warnings the dry-run lists, never
|
|
184
|
-
* refusals.
|
|
119
|
+
* Advisory text-hygiene lints (warnings, never refusals).
|
|
185
120
|
*
|
|
186
121
|
* @param {object[]} rawStories
|
|
187
122
|
* @returns {string[]}
|
|
@@ -196,10 +131,6 @@ function collectTextHygieneWarnings(rawStories) {
|
|
|
196
131
|
}
|
|
197
132
|
|
|
198
133
|
/**
|
|
199
|
-
* Print every warning the run collected under one heading. The dry-run is
|
|
200
|
-
* where an operator reads these; the persist prints the same list so a
|
|
201
|
-
* `--chain-on-clean` run loses nothing.
|
|
202
|
-
*
|
|
203
134
|
* @param {string[]} warnings
|
|
204
135
|
* @returns {void}
|
|
205
136
|
*/
|
|
@@ -214,12 +145,8 @@ function logWarnings(warnings) {
|
|
|
214
145
|
}
|
|
215
146
|
|
|
216
147
|
/**
|
|
217
|
-
*
|
|
218
|
-
*
|
|
219
|
-
* `closeSupersededTickets` already swallows per-ticket failures, but this
|
|
220
|
-
* phase runs *after* `createIssue`, so an unexpected throw anywhere in it
|
|
221
|
-
* would leave the run half-done with Stories already live. Degrade to a
|
|
222
|
-
* reported failure instead.
|
|
148
|
+
* Runs after the Stories are live, so an unexpected throw degrades to a
|
|
149
|
+
* reported failure rather than a half-done run.
|
|
223
150
|
*
|
|
224
151
|
* @returns {Promise<import('./supersede-ops.js').SupersedeReport>}
|
|
225
152
|
*/
|
|
@@ -248,28 +175,11 @@ async function runSupersedePhase(args) {
|
|
|
248
175
|
}
|
|
249
176
|
|
|
250
177
|
/**
|
|
251
|
-
*
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
* fires once `runPlanPersist` has *resolved* — long after this comment body
|
|
257
|
-
* is composed. A plain `since`-filtered ledger read therefore summarized
|
|
258
|
-
* every run except the one being summarized, and on an otherwise-quiet
|
|
259
|
-
* ledger it rendered "plan-metrics: no invocations recorded" onto the very
|
|
260
|
-
* comment reporting the run. (The stdout envelope was always correct: its
|
|
261
|
-
* `attachPlanMetrics` read runs after the wrapper returns.)
|
|
262
|
-
*
|
|
263
|
-
* **The `finally` stays where it is.** It is what guarantees a persist that
|
|
264
|
-
* throws is still recorded, so moving the append earlier — or moving this
|
|
265
|
-
* read later, past the GitHub writes it feeds — would trade a cosmetic bug
|
|
266
|
-
* for a real one. Instead of racing it, fold in a synthetic record standing
|
|
267
|
-
* for the in-flight invocation. It is the same record the wrapper is about to
|
|
268
|
-
* write, minus a final duration; it cannot double-count, because the real one
|
|
269
|
-
* does not exist yet at this point in the pipeline.
|
|
270
|
-
*
|
|
271
|
-
* `ok: true` is honest here: this line is only ever composed on the success
|
|
272
|
-
* path, after `createStoryIssues` has returned.
|
|
178
|
+
* Plan-metrics line for the posted summary, scoped to this invocation. The
|
|
179
|
+
* run's own ledger record is appended by the wrapper's `finally` (which must
|
|
180
|
+
* stay there so a throwing persist is still recorded) only after this
|
|
181
|
+
* resolves, so fold in a synthetic in-flight record; it cannot double-count.
|
|
182
|
+
* `ok: true` holds because this runs only on the success path.
|
|
273
183
|
*
|
|
274
184
|
* @param {{ config: object, since: string, startedAt: string, mode: string }} args
|
|
275
185
|
* @returns {Promise<string|null>}
|
|
@@ -305,20 +215,13 @@ async function renderRunScopedPlanMetricsLine({
|
|
|
305
215
|
}
|
|
306
216
|
|
|
307
217
|
/**
|
|
308
|
-
* Re-run the
|
|
309
|
-
* (
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
* plan-time conflict analysis judged an artifact that is not the one persist
|
|
313
|
-
* writes — and the passes that scan `body.acceptance` / `body.verify` were
|
|
314
|
-
* inert on the canonical top-level authoring shape as a result. Findings the
|
|
315
|
-
* raw pass already reported are dropped so the same collision is not
|
|
316
|
-
* announced twice per run; the rest are returned for the plan-summary
|
|
317
|
-
* comment, which is where these findings stop being a stderr line nobody
|
|
318
|
-
* keeps. Every finding is advisory (Story #5312).
|
|
218
|
+
* Re-run the conflict passes over the assembled bodies — the artifact persist
|
|
219
|
+
* actually writes (the body-scanning passes are inert on the raw payload).
|
|
220
|
+
* Only findings the raw pass did not already report are surfaced; all are
|
|
221
|
+
* advisory.
|
|
319
222
|
*
|
|
320
223
|
* @param {{ stories: object[], rawFindings: object[] }} args
|
|
321
|
-
* @returns {object[]}
|
|
224
|
+
* @returns {object[]}
|
|
322
225
|
*/
|
|
323
226
|
function analyzeAssembledStories({ stories, rawFindings }) {
|
|
324
227
|
const findings = computeAssembledConflictFindings({ stories });
|
|
@@ -335,23 +238,9 @@ function analyzeAssembledStories({ stories, rawFindings }) {
|
|
|
335
238
|
}
|
|
336
239
|
|
|
337
240
|
/**
|
|
338
|
-
* Reap abandoned `plan-*` directories
|
|
339
|
-
*
|
|
340
|
-
*
|
|
341
|
-
* so every plan that failed a gate, was abandoned mid-authoring, or ran
|
|
342
|
-
* `--dry-run` left its directory behind forever. This sweeps the stragglers
|
|
343
|
-
* on each persist.
|
|
344
|
-
*
|
|
345
|
-
* Story #4794 folded the age-floored reap into the shared temp-retention
|
|
346
|
-
* engine — `planDirs` is one of its declared classes, so the plan path and
|
|
347
|
-
* the delivery path now converge on one classifier and one staleness floor
|
|
348
|
-
* (`delivery.tempRetention.staleDays`, still 7 days by default) instead of
|
|
349
|
-
* this module owning a private constant. Behaviour is unchanged: only
|
|
350
|
-
* `plan-*` directories are considered, the age test is the directory's own
|
|
351
|
-
* mtime, and the current run's `planDir` is excluded.
|
|
352
|
-
*
|
|
353
|
-
* Best-effort throughout: this is hygiene, never a reason to fail a run that
|
|
354
|
-
* has already created Stories.
|
|
241
|
+
* Reap abandoned `plan-*` directories (failed, abandoned, or dry-run plans)
|
|
242
|
+
* via the shared temp-retention staleness floor, excluding this run's.
|
|
243
|
+
* Best-effort hygiene.
|
|
355
244
|
*
|
|
356
245
|
* @param {{ config?: object, keepDir?: string|null, now?: number }} args
|
|
357
246
|
* @returns {Promise<{ reaped: string[] }>}
|
|
@@ -372,11 +261,6 @@ export async function reapStalePlanDirs({
|
|
|
372
261
|
}
|
|
373
262
|
|
|
374
263
|
/**
|
|
375
|
-
* Fail closed on a payload that cannot be persisted. Extracted from
|
|
376
|
-
* `runPlanPersist` (Story #4926) so the entry point carries the flow, not the
|
|
377
|
-
* guards. The reviewability budget that used to sit beside this check went
|
|
378
|
-
* with Story #5312 — a plan is as many Stories as the split policy yields.
|
|
379
|
-
*
|
|
380
264
|
* @param {unknown} rawStories
|
|
381
265
|
* @returns {void}
|
|
382
266
|
* @throws {Error} On an empty payload.
|
|
@@ -391,7 +275,7 @@ function assertPersistablePlan(rawStories) {
|
|
|
391
275
|
}
|
|
392
276
|
|
|
393
277
|
/**
|
|
394
|
-
*
|
|
278
|
+
* Orphans throw; a skip is ledgered.
|
|
395
279
|
*
|
|
396
280
|
* @param {{ status: string, reasons: string[], orphans?: object[] }} reachability
|
|
397
281
|
* @param {object} config
|
|
@@ -419,63 +303,23 @@ async function enforceReachability(reachability, config) {
|
|
|
419
303
|
}
|
|
420
304
|
|
|
421
305
|
/**
|
|
422
|
-
*
|
|
423
|
-
*
|
|
424
|
-
*
|
|
425
|
-
* (Story #4541). A dry run performs none of it.
|
|
426
|
-
*
|
|
427
|
-
* **The checkpoints fan out; the phase boundary does not** (Story #4952). The
|
|
428
|
-
* per-Story upserts are independent of one another and run under bounded
|
|
429
|
-
* concurrency, but the `await` on that whole fan-out is what keeps the
|
|
430
|
-
* Story #4541 invariant intact: *every* checkpoint is on its ticket before the
|
|
431
|
-
* first `agent::ready` flip is issued, so `ready` still means "fully
|
|
432
|
-
* persisted" and a `/mandrel-deliver` that picks a Story up cannot read a null
|
|
433
|
-
* checkpoint. Concurrency inside the phase is safe; overlapping the phases is
|
|
434
|
-
* the race this ordering exists to close.
|
|
306
|
+
* Plan comments fan out concurrently, but the whole fan-out is awaited before
|
|
307
|
+
* the first `agent::ready` flip, so `ready` always means "fully persisted".
|
|
308
|
+
* Never overlap the two phases.
|
|
435
309
|
*
|
|
436
310
|
* @param {object} args
|
|
437
311
|
* @returns {Promise<void>}
|
|
438
312
|
*/
|
|
439
|
-
async function persistStoryArtifacts({
|
|
440
|
-
provider,
|
|
441
|
-
created,
|
|
442
|
-
primary,
|
|
443
|
-
summaryBody,
|
|
444
|
-
}) {
|
|
445
|
-
const cohort = created.map((createdStory) => ({
|
|
446
|
-
slug: createdStory.slug,
|
|
447
|
-
id: createdStory.id,
|
|
448
|
-
}));
|
|
313
|
+
async function persistStoryArtifacts({ provider, created, summaryBody }) {
|
|
449
314
|
await concurrentMap(
|
|
450
315
|
created,
|
|
451
|
-
(story) =>
|
|
452
|
-
writeCheckpointV2(provider, story.id, {
|
|
453
|
-
persist: {
|
|
454
|
-
completedAt: new Date().toISOString(),
|
|
455
|
-
storyCount: created.length,
|
|
456
|
-
primaryStoryId: primary.id,
|
|
457
|
-
stories: cohort,
|
|
458
|
-
},
|
|
459
|
-
}),
|
|
460
|
-
// The per-Story checkpoint upserts (Story #4952): each targets a
|
|
461
|
-
// different issue and reads nothing another writes, so this loop was
|
|
462
|
-
// serial only by construction — but see {@link persistStoryArtifacts}
|
|
463
|
-
// for the phase ordering that is *not* incidental.
|
|
316
|
+
(story) => writePlanSummaryComment(provider, story.id, summaryBody),
|
|
464
317
|
{ concurrency: FANOUT_CONCURRENCY },
|
|
465
318
|
);
|
|
466
|
-
await upsertStructuredComment(
|
|
467
|
-
provider,
|
|
468
|
-
primary.id,
|
|
469
|
-
PLAN_SUMMARY_COMMENT_TYPE,
|
|
470
|
-
summaryBody,
|
|
471
|
-
);
|
|
472
319
|
await markStoriesReady({ provider, created });
|
|
473
320
|
}
|
|
474
321
|
|
|
475
322
|
/**
|
|
476
|
-
* Remove this run's plan directory on terminal success, then sweep the
|
|
477
|
-
* abandoned ones terminal-success cleanup can never reach (Story #4541).
|
|
478
|
-
*
|
|
479
323
|
* @param {{ config: object, planDir: string|null, skipCleanup: boolean }} args
|
|
480
324
|
* @returns {Promise<void>}
|
|
481
325
|
*/
|
|
@@ -491,9 +335,6 @@ async function cleanupPlanDirs({ config, planDir, skipCleanup }) {
|
|
|
491
335
|
}
|
|
492
336
|
|
|
493
337
|
/**
|
|
494
|
-
* Log the operator-facing persist epilogue: adoption, the ready primary, the
|
|
495
|
-
* deliver command, and the cohort grouping label.
|
|
496
|
-
*
|
|
497
338
|
* @param {{
|
|
498
339
|
* created: object[],
|
|
499
340
|
* primary: object,
|
|
@@ -522,11 +363,7 @@ function logPersistEpilogue({
|
|
|
522
363
|
Logger.info(
|
|
523
364
|
`[plan-persist] Deliver with: /mandrel-deliver ${created.map((s2) => s2.id).join(' ')}`,
|
|
524
365
|
);
|
|
525
|
-
//
|
|
526
|
-
// a delivery-resolution input (/mandrel-deliver stays ids-only, Story #4540).
|
|
527
|
-
// Gated on the ensure result: the label ensure degrades non-fatally, and
|
|
528
|
-
// advertising a filter GitHub just refused to create is worse than saying
|
|
529
|
-
// nothing (Story #5201). The derived id survives in the result envelope.
|
|
366
|
+
// Never advertise a filter for a label the ensure failed to create.
|
|
530
367
|
if (planRunLabelApplied) {
|
|
531
368
|
Logger.info(
|
|
532
369
|
`[plan-persist] Cohort grouping label: ${planRunLabel} — filter with ` +
|
|
@@ -536,8 +373,6 @@ function logPersistEpilogue({
|
|
|
536
373
|
}
|
|
537
374
|
|
|
538
375
|
/**
|
|
539
|
-
* Execute the flat Story persist end to end.
|
|
540
|
-
*
|
|
541
376
|
* @param {{
|
|
542
377
|
* provider: object,
|
|
543
378
|
* artifacts: {
|
|
@@ -580,16 +415,11 @@ export async function runPlanPersist({
|
|
|
580
415
|
sourceTicketIds = [],
|
|
581
416
|
sourceTicketOrigin = 'none',
|
|
582
417
|
closeSuperseded = true,
|
|
583
|
-
//
|
|
584
|
-
// ordinary shape: no Epic is created unless `/mandrel-plan` offered one
|
|
585
|
-
// above the threshold and the operator confirmed it.
|
|
418
|
+
// Optional container Epic; only set when the operator confirmed one.
|
|
586
419
|
epic = null,
|
|
587
420
|
} = opts;
|
|
588
421
|
|
|
589
|
-
//
|
|
590
|
-
// appends to the ledger is stamped at or after this instant, so filtering
|
|
591
|
-
// on it scopes the counts to *this* run rather than every plan ever run
|
|
592
|
-
// through the shared standalone ledger (Story #4541).
|
|
422
|
+
// Scopes the plan-metrics summary to this run's ledger entries.
|
|
593
423
|
const runStartedAt = opts.metricsSince ?? new Date().toISOString();
|
|
594
424
|
|
|
595
425
|
assertPersistablePlan(rawStories);
|
|
@@ -613,51 +443,38 @@ export async function runPlanPersist({
|
|
|
613
443
|
});
|
|
614
444
|
await enforceReachability(reachability, config);
|
|
615
445
|
|
|
616
|
-
//
|
|
617
|
-
//
|
|
446
|
+
// Outward references (`--epic <id>`, `#<id>` blockers) resolve before the
|
|
447
|
+
// first create, dry run included.
|
|
618
448
|
const adoptionTarget = await resolveCrossPlanLinks({
|
|
619
449
|
provider,
|
|
620
450
|
stories: rawStories,
|
|
621
451
|
epicId: opts.adoptEpicId ?? null,
|
|
622
452
|
});
|
|
623
453
|
|
|
624
|
-
// Inline Spec fold (Specs stay inline, never under docs/).
|
|
625
454
|
const seedContent = planContextEnvelope?.seed?.content ?? '';
|
|
626
|
-
const { stories: assembled } =
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
});
|
|
455
|
+
const { stories: assembled, warnings: supersedeWarnings } =
|
|
456
|
+
assemblePlanStories(rawStories, {
|
|
457
|
+
sharedSpec: techSpecContent,
|
|
458
|
+
sourceTicketIds,
|
|
459
|
+
// Audit footers carried onto every Story that did not attribute its own
|
|
460
|
+
// `provenance`; empty for a `--tickets` run.
|
|
461
|
+
provenanceSource: seedContent,
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
warnings.push(...supersedeWarnings);
|
|
465
|
+
logWarnings(supersedeWarnings);
|
|
638
466
|
|
|
639
|
-
//
|
|
640
|
-
// Story
|
|
641
|
-
// against, and an indexed run answers exact lookups from that pool without
|
|
642
|
-
// ever reaching the provider — so the provenance footers alone leave it
|
|
643
|
-
// invisible (Story #5307). A non-audit seed carries none: a no-op there.
|
|
467
|
+
// The dedup corpus is listed by `audit::*` label; footers alone leave the
|
|
468
|
+
// Story invisible to an indexed sweep.
|
|
644
469
|
const stories = withAuditLabels(assembled, seedContent);
|
|
645
470
|
|
|
646
|
-
// Story #5045: the cross-Story conflict passes re-run over the assembled,
|
|
647
|
-
// footer-stamped bodies — the artifact persist actually writes — before any
|
|
648
|
-
// GitHub call, so a policy upgrade still refuses the plan pre-creation.
|
|
649
471
|
const assembledConflicts = analyzeAssembledStories({
|
|
650
472
|
stories,
|
|
651
473
|
rawFindings: validated.findings,
|
|
652
474
|
});
|
|
653
475
|
|
|
654
|
-
//
|
|
655
|
-
//
|
|
656
|
-
// assembled bodies, so both can run before anything is written; they used
|
|
657
|
-
// to sit *after* creation, which is why the collision table could only ever
|
|
658
|
-
// be a receipt for a plan already live. The same computed value is handed
|
|
659
|
-
// to the summary rendering below rather than recomputed, so the refusal and
|
|
660
|
-
// the receipt can never disagree.
|
|
476
|
+
// The split gate runs before the first create; the same values feed the
|
|
477
|
+
// summary so the refusal and the receipt cannot disagree.
|
|
661
478
|
const waveTable = buildWaveTable(
|
|
662
479
|
stories.map((s) => ({
|
|
663
480
|
slug: s.slug,
|
|
@@ -666,12 +483,8 @@ export async function runPlanPersist({
|
|
|
666
483
|
})),
|
|
667
484
|
);
|
|
668
485
|
|
|
669
|
-
//
|
|
670
|
-
//
|
|
671
|
-
// the assembled bodies — the exact artifact the tick will read back off
|
|
672
|
-
// GitHub — so an N>1 draft it would serialize is refused here, and the
|
|
673
|
-
// summary comment names the serialisation instead of promising parallelism
|
|
674
|
-
// the next tick refuses. One enumeration feeds both.
|
|
486
|
+
// The dispatcher's own predicate over the assembled bodies, so a draft it
|
|
487
|
+
// would serialize is refused here rather than promised as parallel.
|
|
675
488
|
const waveCollisions = assertNoWaveCollisions(waveTable, stories, {
|
|
676
489
|
tempRoot: getPaths(config).tempRoot,
|
|
677
490
|
});
|
|
@@ -683,20 +496,10 @@ export async function runPlanPersist({
|
|
|
683
496
|
opts: { dryRun },
|
|
684
497
|
});
|
|
685
498
|
|
|
686
|
-
// What this run filed, recorded where the next audit sweep reads it
|
|
687
|
-
// (Story #5307). A dry run created nothing, and the call knows it.
|
|
688
499
|
recordAuditFilings({ stories, created, tickets: rawStories, dryRun });
|
|
689
500
|
|
|
690
501
|
const primary = created[0];
|
|
691
502
|
|
|
692
|
-
// Story #4541: `readPlanMetrics` is declared `(epicId, config)` but was
|
|
693
|
-
// called with `config` first, so the ledger path resolver received the
|
|
694
|
-
// config object as an `epicId` and threw its guard on every single run —
|
|
695
|
-
// a throw this try/catch then swallowed into a silently absent summary.
|
|
696
|
-
// v2 persist is always Epic-less, hence the explicit `null`. The `since`
|
|
697
|
-
// filter keeps the counts about this invocation, and the in-flight record
|
|
698
|
-
// is folded in because the wrapper has not written it yet — see
|
|
699
|
-
// `renderRunScopedPlanMetricsLine`.
|
|
700
503
|
const planMetricsLine = await renderRunScopedPlanMetricsLine({
|
|
701
504
|
config,
|
|
702
505
|
since: runStartedAt,
|
|
@@ -714,27 +517,16 @@ export async function runPlanPersist({
|
|
|
714
517
|
mode: 'stories',
|
|
715
518
|
planMetricsLine,
|
|
716
519
|
stories: created,
|
|
717
|
-
// Story #5045: the wave table promises what can run in parallel; the
|
|
718
|
-
// collisions the conflict passes found belong on the same surface, or the
|
|
719
|
-
// promise is the only half anyone reads.
|
|
720
520
|
conflictFindings: assembledConflicts,
|
|
721
521
|
waveCollisions,
|
|
722
522
|
});
|
|
723
523
|
|
|
724
524
|
if (!dryRun) {
|
|
725
|
-
await persistStoryArtifacts({
|
|
726
|
-
provider,
|
|
727
|
-
created,
|
|
728
|
-
primary,
|
|
729
|
-
summaryBody,
|
|
730
|
-
});
|
|
525
|
+
await persistStoryArtifacts({ provider, created, summaryBody });
|
|
731
526
|
}
|
|
732
527
|
|
|
733
|
-
//
|
|
734
|
-
//
|
|
735
|
-
// database ids, neither of which exists until the Stories are live. It is
|
|
736
|
-
// never load-bearing, so a failure here degrades to "no container" and the
|
|
737
|
-
// Stories still deliver by id.
|
|
528
|
+
// Last among the writes: the Epic needs the children's numbers and database
|
|
529
|
+
// ids. Never load-bearing — a failure degrades to "no container".
|
|
738
530
|
const containerEpic = await resolveContainerEpic({
|
|
739
531
|
provider,
|
|
740
532
|
adoptionTarget,
|
|
@@ -748,16 +540,12 @@ export async function runPlanPersist({
|
|
|
748
540
|
stories,
|
|
749
541
|
created,
|
|
750
542
|
sourceTicketIds,
|
|
751
|
-
//
|
|
752
|
-
// phase re-derives the container above it. It needs the config the rollup
|
|
753
|
-
// reads its board and operator handle from.
|
|
543
|
+
// Closing a source ticket re-derives its container Epic's rollup.
|
|
754
544
|
config,
|
|
755
545
|
dryRun,
|
|
756
546
|
closeSuperseded,
|
|
757
547
|
});
|
|
758
|
-
//
|
|
759
|
-
// says *why* (`none` = neither the envelope nor --source-tickets carried
|
|
760
|
-
// any) rather than reading as a clean no-op — Story #4554.
|
|
548
|
+
// Lets a run that superseded nothing say why.
|
|
761
549
|
supersede.sourceTicketOrigin = sourceTicketOrigin;
|
|
762
550
|
|
|
763
551
|
await cleanupPlanDirs({ config, planDir, skipCleanup });
|
|
@@ -775,15 +563,9 @@ export async function runPlanPersist({
|
|
|
775
563
|
forceReview,
|
|
776
564
|
reachability,
|
|
777
565
|
freshness,
|
|
778
|
-
// Story #5312: what the run rewrote and what it noticed. The dry-run is
|
|
779
|
-
// the review surface now that the footprint probes warn instead of
|
|
780
|
-
// refusing, so the list rides the result envelope, not just stderr.
|
|
781
566
|
warnings,
|
|
782
567
|
repairs: validated.repairs ?? [],
|
|
783
568
|
waveTable,
|
|
784
|
-
// Story #5265 AC-2/AC-4: both halves of what persist concluded but used
|
|
785
|
-
// to keep to itself — the `refactors-existing` declarations it rewrote,
|
|
786
|
-
// and the same-order pairs the dispatcher will serialize.
|
|
787
569
|
assumptionNormalizations: validated.normalizations ?? [],
|
|
788
570
|
waveCollisions,
|
|
789
571
|
supersede,
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Soft-finding reporting for plan-persist.
|
|
3
3
|
*
|
|
4
|
-
* Story #5312 retired the fan-out gate that shared this file: the delete
|
|
5
|
-
* blast-radius probe never refused a real plan, and its `--allow-large-fan-out`
|
|
6
|
-
* override was a flag nobody typed. What remains is the one surface that
|
|
7
|
-
* announces every advisory finding the validator produced, each under its
|
|
8
|
-
* own kind, so the operator reads a conflict as a conflict and a nudge as a
|
|
9
|
-
* nudge (Story #4907).
|
|
10
|
-
*
|
|
11
4
|
* @module lib/orchestration/plan-persist/soft-findings
|
|
12
5
|
*/
|
|
13
6
|
|
|
@@ -18,11 +11,8 @@ import {
|
|
|
18
11
|
} from '../ticket-validator-conflicts.js';
|
|
19
12
|
|
|
20
13
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* Only the {@link CONFLICT_KINDS} are cross-Story conflicts. Any other soft
|
|
24
|
-
* kind is a single-Story nudge, and announcing it as a conflict overstated it
|
|
25
|
-
* and taught readers to discount the whole channel.
|
|
14
|
+
* Only {@link CONFLICT_KINDS} are reported as conflicts; other soft kinds are
|
|
15
|
+
* single-Story advisories, so the channel is not overstated.
|
|
26
16
|
*
|
|
27
17
|
* @param {object[]} findings
|
|
28
18
|
* @param {string} [tag]
|