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
|
@@ -3,7 +3,6 @@ import { normalizeOwnedProvenance } from '../findings/provenance-field.js';
|
|
|
3
3
|
import { detectCycle } from '../Graph.js';
|
|
4
4
|
import { gitSpawn } from '../git-utils.js';
|
|
5
5
|
|
|
6
|
-
import { Logger } from '../Logger.js';
|
|
7
6
|
import { validateStoryFileAssumptions } from './file-assumptions.js';
|
|
8
7
|
import { isExternalDependencyRef } from './plan-persist/external-deps.js';
|
|
9
8
|
import {
|
|
@@ -13,27 +12,18 @@ import {
|
|
|
13
12
|
import { computeConflictFindings } from './ticket-validator-conflicts.js';
|
|
14
13
|
|
|
15
14
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* the decomposer's tasks legitimately reference. Anchoring on the leading dot
|
|
19
|
-
* for `.agents` and a word boundary for `lib`/`tests` keeps URLs, image paths,
|
|
20
|
-
* and unrelated prose ("library", "testimonial", "established") from being
|
|
21
|
-
* scanned as fictitious file references.
|
|
22
|
-
*
|
|
23
|
-
* The regex is intentionally global + multi-match per body string so a single
|
|
24
|
-
* Task naming several files surfaces every miss in one error.
|
|
15
|
+
* Code-asset paths under `.agents/scripts`, `lib`, `tests`. The leading
|
|
16
|
+
* delimiter keeps URLs and prose ("library") out. Global: every miss surfaces.
|
|
25
17
|
*/
|
|
26
18
|
const FRESHNESS_PATH_RE =
|
|
27
19
|
/(?:^|[\s`([<])(\.agents\/scripts|lib|tests)\/[\w./-]+\.js\b/g;
|
|
28
20
|
|
|
29
21
|
function collectPathsFromText(text, paths) {
|
|
30
22
|
if (!text || typeof text !== 'string') return;
|
|
31
|
-
// Reset lastIndex on the shared regex literal between calls.
|
|
32
23
|
FRESHNESS_PATH_RE.lastIndex = 0;
|
|
33
24
|
let match = FRESHNESS_PATH_RE.exec(text);
|
|
34
25
|
while (match !== null) {
|
|
35
|
-
//
|
|
36
|
-
// delimiter — slice it off so the path is a clean repo-relative reference.
|
|
26
|
+
// Slice off the leading delimiter the match includes.
|
|
37
27
|
const captured = match[0];
|
|
38
28
|
const rootStart = captured.indexOf(match[1]);
|
|
39
29
|
paths.add(captured.slice(rootStart));
|
|
@@ -41,38 +31,6 @@ function collectPathsFromText(text, paths) {
|
|
|
41
31
|
}
|
|
42
32
|
}
|
|
43
33
|
|
|
44
|
-
/**
|
|
45
|
-
* Resolve every acceptance line a Story declares, across both authoring
|
|
46
|
-
* shapes (Story #4541).
|
|
47
|
-
*
|
|
48
|
-
* The canonical shape is a **serialized string body** with the criteria at
|
|
49
|
-
* the ticket's **top level** — the machine contract persist syncs into the
|
|
50
|
-
* body. `validateAcceptanceSubjectPrefix` used to read `body.acceptance` on
|
|
51
|
-
* an object body only, so on every real plan it scanned nothing and the gate
|
|
52
|
-
* silently passed. Union both sources (deduplicated) so the gate fires on
|
|
53
|
-
* whichever surface the author used.
|
|
54
|
-
*
|
|
55
|
-
* @param {object} story
|
|
56
|
-
* @returns {string[]}
|
|
57
|
-
*/
|
|
58
|
-
function resolveAcceptanceLines(story) {
|
|
59
|
-
const lines = new Set();
|
|
60
|
-
if (Array.isArray(story?.acceptance)) {
|
|
61
|
-
for (const item of story.acceptance) lines.add(String(item ?? ''));
|
|
62
|
-
}
|
|
63
|
-
const body = story?.body;
|
|
64
|
-
let bodyAcceptance = null;
|
|
65
|
-
if (typeof body === 'string' && body.trim().length > 0) {
|
|
66
|
-
bodyAcceptance = parseStoryBodyOrThrow(story).acceptance;
|
|
67
|
-
} else if (body !== null && typeof body === 'object') {
|
|
68
|
-
bodyAcceptance = body.acceptance;
|
|
69
|
-
}
|
|
70
|
-
if (Array.isArray(bodyAcceptance)) {
|
|
71
|
-
for (const item of bodyAcceptance) lines.add(String(item ?? ''));
|
|
72
|
-
}
|
|
73
|
-
return [...lines];
|
|
74
|
-
}
|
|
75
|
-
|
|
76
34
|
function collectTaskPathReferences(task) {
|
|
77
35
|
const paths = new Set();
|
|
78
36
|
const body = task.body;
|
|
@@ -85,8 +43,7 @@ function collectTaskPathReferences(task) {
|
|
|
85
43
|
for (const item of arr) collectPathsFromText(String(item ?? ''), paths);
|
|
86
44
|
}
|
|
87
45
|
}
|
|
88
|
-
// Some planner shapes carry
|
|
89
|
-
// bodies — scan it defensively.
|
|
46
|
+
// Some planner shapes carry top-level `acceptance` even on string bodies.
|
|
90
47
|
if (Array.isArray(task.acceptance)) {
|
|
91
48
|
for (const item of task.acceptance) {
|
|
92
49
|
collectPathsFromText(String(item ?? ''), paths);
|
|
@@ -96,48 +53,17 @@ function collectTaskPathReferences(task) {
|
|
|
96
53
|
}
|
|
97
54
|
|
|
98
55
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* Three shapes are accepted:
|
|
105
|
-
*
|
|
106
|
-
* 1. **Canonical string body** — the body is a markdown string produced by
|
|
107
|
-
* `serialize()` from `story-body.js`. Parsed via `parse()` to extract
|
|
108
|
-
* the structured `changes[]` and `references[]` arrays. This is the
|
|
109
|
-
* shape emitted by the decomposer after Story #3302.
|
|
110
|
-
* 2. **Legacy string bullets** — `"<path>: <verb> <object>"` inside an
|
|
111
|
-
* object body's `changes[]`. The regex `FRESHNESS_PATH_RE` picks the
|
|
112
|
-
* path out of the prose.
|
|
113
|
-
* 3. **Object form** — `{ path: "<path>", assumption: "creates" | ... }`,
|
|
114
|
-
* introduced by Story #2636 as the canonical declaration shape and
|
|
115
|
-
* documented in `lib/templates/decomposer-prompts.js`. The path is
|
|
116
|
-
* trusted verbatim.
|
|
117
|
-
*
|
|
118
|
-
* Only `body.changes` (and `body.references`) is consulted —
|
|
119
|
-
* `body.goal`, `body.acceptance`, and `body.verify` are deliberately
|
|
120
|
-
* excluded so the gate continues to flag a planner that hallucinates a
|
|
121
|
-
* fictitious file in narrative copy without declaring it in the
|
|
122
|
-
* changes/references contract.
|
|
56
|
+
* Paths a Story declares in `changes[]` / `references[]` — exempt from the
|
|
57
|
+
* freshness probe since they may be net-new. Accepts a serialized markdown
|
|
58
|
+
* body, string bullets, or `{ path, assumption }` objects. Goal / acceptance
|
|
59
|
+
* / verify are deliberately excluded so undeclared narrative paths still flag.
|
|
123
60
|
*/
|
|
124
61
|
function collectTaskChangesPaths(task) {
|
|
125
62
|
const paths = new Set();
|
|
126
63
|
const body = task.body;
|
|
127
64
|
|
|
128
|
-
//
|
|
129
|
-
//
|
|
130
|
-
// arrays before scanning. Without this, a string body causes the
|
|
131
|
-
// object-form branch below to fall through on every item, leaving the
|
|
132
|
-
// freshness gate blind to declared paths.
|
|
133
|
-
//
|
|
134
|
-
// Story #4541: a parse failure is NOT swallowed here. Swallowing it
|
|
135
|
-
// returned an empty whitelist, so a single malformed `## Changes` entry
|
|
136
|
-
// surfaced downstream as "files do not exist at main" naming the very
|
|
137
|
-
// paths the Story *had* declared — a misdiagnosis that cost two authoring
|
|
138
|
-
// round-trips. `assertStoryBodiesParse` runs before the freshness gate and
|
|
139
|
-
// owns that failure with a named error; the throw here is the same error
|
|
140
|
-
// for any caller that drives `validateAcFreshness` directly.
|
|
65
|
+
// A parse failure throws rather than yielding an empty whitelist, which
|
|
66
|
+
// would misreport every declared path as missing.
|
|
141
67
|
if (typeof body === 'string' && body.trim().length > 0) {
|
|
142
68
|
const parsed = parseStoryBodyOrThrow(task);
|
|
143
69
|
for (const arrName of ['changes', 'references']) {
|
|
@@ -179,14 +105,6 @@ function collectTaskChangesPaths(task) {
|
|
|
179
105
|
return paths;
|
|
180
106
|
}
|
|
181
107
|
|
|
182
|
-
/**
|
|
183
|
-
* Default git probe: returns true when `path` exists at `ref` in the cwd repo.
|
|
184
|
-
* Uses `git cat-file -e <ref>:<path>` which is the standard low-cost existence
|
|
185
|
-
* check (no blob materialisation, no tree walk in node).
|
|
186
|
-
*
|
|
187
|
-
* Callers may inject their own runner with the same `(ref, path) => boolean`
|
|
188
|
-
* signature for unit tests.
|
|
189
|
-
*/
|
|
190
108
|
function defaultGitRunner({ baseBranchRef, path, cwd }) {
|
|
191
109
|
const result = gitSpawn(
|
|
192
110
|
cwd ?? process.cwd(),
|
|
@@ -198,13 +116,9 @@ function defaultGitRunner({ baseBranchRef, path, cwd }) {
|
|
|
198
116
|
}
|
|
199
117
|
|
|
200
118
|
/**
|
|
201
|
-
*
|
|
202
|
-
* `"${baseBranchRef}:${path}"`. The wrapper is created once per
|
|
203
|
-
* `validateAndNormalizeTickets` call and threaded into both
|
|
204
|
-
* `validateAcFreshness` and `validateStoryFileAssumptions` so the two gates
|
|
205
|
-
* share a single probe cache rather than maintaining independent ones.
|
|
119
|
+
* One cache shared by the freshness and file-assumption gates.
|
|
206
120
|
*
|
|
207
|
-
* @param {Function} runner -
|
|
121
|
+
* @param {Function} runner - `({ baseBranchRef, path, cwd }) => boolean`.
|
|
208
122
|
* @returns {Function} A memoized probe with the same signature.
|
|
209
123
|
*/
|
|
210
124
|
function makeMemoizedGitRunner(runner) {
|
|
@@ -221,22 +135,14 @@ function makeMemoizedGitRunner(runner) {
|
|
|
221
135
|
}
|
|
222
136
|
|
|
223
137
|
/**
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
* means the planner named a file it is about to create without declaring it,
|
|
227
|
-
* or a stale reference — worth saying, not worth refusing on: Story #5312
|
|
228
|
-
* demoted this gate from a throw to the **warning list** the dry-run prints,
|
|
229
|
-
* because the paths a goal or acceptance line names are prose the deliverer
|
|
230
|
-
* reads against the real tree, never a contract the validator can hold it to.
|
|
231
|
-
*
|
|
232
|
-
* Only Stories are scanned — they are the implementation unit; the Epic
|
|
233
|
-
* carries narrative copy, not implementation paths.
|
|
138
|
+
* Warn (never refuse) on Story-referenced code paths absent at the base:
|
|
139
|
+
* narrative paths are prose, not a contract the validator can enforce.
|
|
234
140
|
*
|
|
235
141
|
* @param {object} opts
|
|
236
|
-
* @param {object[]} opts.tickets
|
|
237
|
-
* @param {string} opts.baseBranchRef
|
|
238
|
-
* @param {Function} [opts.gitRunner]
|
|
239
|
-
* @param {string} [opts.cwd]
|
|
142
|
+
* @param {object[]} opts.tickets
|
|
143
|
+
* @param {string} opts.baseBranchRef
|
|
144
|
+
* @param {Function} [opts.gitRunner]
|
|
145
|
+
* @param {string} [opts.cwd]
|
|
240
146
|
* @returns {string[]} One warning line per missing reference, empty when clean.
|
|
241
147
|
*/
|
|
242
148
|
export function validateAcFreshness({
|
|
@@ -251,11 +157,7 @@ export function validateAcFreshness({
|
|
|
251
157
|
);
|
|
252
158
|
}
|
|
253
159
|
const stories = (tickets ?? []).filter((t) => t.type === 'story');
|
|
254
|
-
//
|
|
255
|
-
// path the planner has declared in `changes` is considered intentional
|
|
256
|
-
// (net-new or about-to-be-modified) and the git probe is skipped for it
|
|
257
|
-
// — otherwise the freshness gate would reject the very test/source file
|
|
258
|
-
// a Story is meant to create, even when the Story is well-formed.
|
|
160
|
+
// Declared paths (any Story) are intentional and skip the probe.
|
|
259
161
|
const expectedNewPaths = new Set();
|
|
260
162
|
for (const story of stories) {
|
|
261
163
|
for (const path of collectTaskChangesPaths(story)) {
|
|
@@ -263,8 +165,6 @@ export function validateAcFreshness({
|
|
|
263
165
|
}
|
|
264
166
|
}
|
|
265
167
|
const misses = [];
|
|
266
|
-
// Cache per-path probe results — sibling Stories frequently cite the same
|
|
267
|
-
// helper module; avoid re-spawning git for each repeat.
|
|
268
168
|
const probeCache = new Map();
|
|
269
169
|
for (const story of stories) {
|
|
270
170
|
const refs = collectTaskPathReferences(story);
|
|
@@ -283,155 +183,24 @@ export function validateAcFreshness({
|
|
|
283
183
|
return misses.map((m) => renderMissLine(m, baseBranchRef));
|
|
284
184
|
}
|
|
285
185
|
|
|
286
|
-
/**
|
|
287
|
-
* Allowed leading Conventional-Commits types. Mirrors the `changelog-sections`
|
|
288
|
-
* keys in `release-please-config.json` and the `type-enum` list in
|
|
289
|
-
* `commitlint.config.js`. When a planner LLM prescribes a commit subject in a
|
|
290
|
-
* Task acceptance item via the "Commit subject begins with '<prefix>:'" form,
|
|
291
|
-
* the captured prefix must reduce to one of these types (optionally followed
|
|
292
|
-
* by a `(scope)` qualifier) — anything else fails commitlint locally and
|
|
293
|
-
* release-please's changelog parser on `main`, so the decompose is rejected
|
|
294
|
-
* before the Story branch is ever cut.
|
|
295
|
-
*
|
|
296
|
-
* Epic #2501 introduced this guard after the legacy `baseline-refresh`
|
|
297
|
-
* leading-token prescription created a wave of commit-msg hook failures
|
|
298
|
-
* across story-deliver sub-agents. See
|
|
299
|
-
* `.agents/skills/core/gates-and-baselines/SKILL.md` for the canonical refresh
|
|
300
|
-
* shape (Conventional-Commits subject + `baseline-refresh: true` body
|
|
301
|
-
* trailer).
|
|
302
|
-
*/
|
|
303
|
-
const ALLOWED_COMMIT_TYPES = new Set([
|
|
304
|
-
'feat',
|
|
305
|
-
'fix',
|
|
306
|
-
'chore',
|
|
307
|
-
'refactor',
|
|
308
|
-
'perf',
|
|
309
|
-
'docs',
|
|
310
|
-
'style',
|
|
311
|
-
'test',
|
|
312
|
-
'build',
|
|
313
|
-
'ci',
|
|
314
|
-
'revert',
|
|
315
|
-
]);
|
|
316
|
-
|
|
317
|
-
/**
|
|
318
|
-
* Regex matching the canonical "Commit subject begins with '<prefix>:'"
|
|
319
|
-
* prescription shape the planner emits in `body.acceptance[]` entries.
|
|
320
|
-
* The leading quote is captured loosely (single, double, or backtick) so the
|
|
321
|
-
* three quoting styles the decomposer LLM has historically emitted all
|
|
322
|
-
* match. The captured group is the prefix token *without* the trailing
|
|
323
|
-
* colon — callers normalize by stripping an optional `(scope)` qualifier
|
|
324
|
-
* before comparing against the allowed-types set.
|
|
325
|
-
*/
|
|
326
|
-
const SUBJECT_PREFIX_RE = /Commit subject begins with ['"`]([^'"`]+):['"`]/g;
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Scan every Story's `body.acceptance[]` for "Commit subject begins with
|
|
330
|
-
* '<prefix>:'" prescriptions and reject the decompose when any captured
|
|
331
|
-
* prefix is not a valid Conventional-Commits type.
|
|
332
|
-
*
|
|
333
|
-
* A captured prefix of the form `chore(baselines)` is accepted — the
|
|
334
|
-
* leading `chore` is in the allowed-types set, and the `(scope)` qualifier
|
|
335
|
-
* is the standard Conventional-Commits scope shape. A captured prefix of
|
|
336
|
-
* the form `baseline-refresh` is rejected because no Conventional-Commits
|
|
337
|
-
* type starts with that token.
|
|
338
|
-
*
|
|
339
|
-
* Only acceptance criteria are scanned; `body.goal` / `body.verify` /
|
|
340
|
-
* `body.changes` are not commit-subject prescriptions by convention and
|
|
341
|
-
* scanning them would surface false positives from prose that happens to
|
|
342
|
-
* quote a forbidden prefix while explaining why it's forbidden.
|
|
343
|
-
*
|
|
344
|
-
* Both authoring shapes are covered (Story #4541): the canonical top-level
|
|
345
|
-
* `acceptance[]` on a serialized string body, and the pre-serialize
|
|
346
|
-
* `body.acceptance[]` object shape. Scanning only the latter made the gate
|
|
347
|
-
* inert on every real plan.
|
|
348
|
-
*
|
|
349
|
-
* @param {object} opts
|
|
350
|
-
* @param {object[]} opts.tickets - Validated ticket hierarchy.
|
|
351
|
-
* @throws {ValidationError} when one or more Story acceptance items
|
|
352
|
-
* prescribe a forbidden subject prefix. The error carries
|
|
353
|
-
* `code: 'forbidden-subject-prefix'` and a `violations[]` payload
|
|
354
|
-
* listing each `{ slug, prefix, line }` so the decompose loop can
|
|
355
|
-
* surface the exact offending text to the operator.
|
|
356
|
-
*/
|
|
357
|
-
export function validateAcceptanceSubjectPrefix({ tickets }) {
|
|
358
|
-
const violations = [];
|
|
359
|
-
const stories = (tickets ?? []).filter((t) => t.type === 'story');
|
|
360
|
-
for (const story of stories) {
|
|
361
|
-
for (const line of resolveAcceptanceLines(story)) {
|
|
362
|
-
// Reset the global regex between iterations.
|
|
363
|
-
SUBJECT_PREFIX_RE.lastIndex = 0;
|
|
364
|
-
let match = SUBJECT_PREFIX_RE.exec(line);
|
|
365
|
-
while (match !== null) {
|
|
366
|
-
const rawPrefix = match[1];
|
|
367
|
-
// Strip an optional `(scope)` qualifier — `chore(baselines)` reduces
|
|
368
|
-
// to `chore` for the allowed-types check.
|
|
369
|
-
const type = rawPrefix.replace(/\(.*\)$/, '').trim();
|
|
370
|
-
if (!ALLOWED_COMMIT_TYPES.has(type)) {
|
|
371
|
-
violations.push({
|
|
372
|
-
slug: story.slug ?? '<unknown>',
|
|
373
|
-
prefix: rawPrefix,
|
|
374
|
-
line,
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
match = SUBJECT_PREFIX_RE.exec(line);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
if (violations.length === 0) return;
|
|
382
|
-
const allowed = [...ALLOWED_COMMIT_TYPES].join('|');
|
|
383
|
-
const lines = violations
|
|
384
|
-
.map(
|
|
385
|
-
(v) =>
|
|
386
|
-
` - "${v.slug}" → forbidden subject prefix "${v.prefix}:" in acceptance item: ${v.line}`,
|
|
387
|
-
)
|
|
388
|
-
.join('\n');
|
|
389
|
-
const err = new ValidationError(
|
|
390
|
-
`Cross-Validation Failed: ${violations.length} Story acceptance item(s) prescribe a non-Conventional-Commits subject prefix:\n${lines}\n\nAllowed leading types: ${allowed}. Use a Conventional-Commits subject (e.g. "chore(baselines): refresh ...") and a body trailer (e.g. "baseline-refresh: true") for machine-readable markers. See Epic #2501.`,
|
|
391
|
-
{ violations },
|
|
392
|
-
);
|
|
393
|
-
err.code = 'forbidden-subject-prefix';
|
|
394
|
-
throw err;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* Render one missing-path warning with a remediation hint pointing at the
|
|
399
|
-
* Story's `changes[]`. For `tests/**` paths we suggest the explicit
|
|
400
|
-
* "add the test file" verb; for everything else we emit a generic hint
|
|
401
|
-
* since the planner knows whether the path is net-new or a typo.
|
|
402
|
-
*/
|
|
403
186
|
function renderMissLine({ slug, path }, baseBranchRef) {
|
|
404
187
|
const verb = path.startsWith('tests/') ? 'add test file' : 'create';
|
|
405
188
|
return `Story "${slug}" references ${path}, which does not exist at ${baseBranchRef} — if net-new, declare {"path":"${path}","assumption":"creates"} in changes[] (${verb}); otherwise fix the typo or stale reference.`;
|
|
406
189
|
}
|
|
407
190
|
|
|
408
191
|
/**
|
|
409
|
-
*
|
|
192
|
+
* Hierarchy, cycle and parse checks throw. The returned array also carries
|
|
193
|
+
* non-enumerable `findings` (advisory conflicts), `errors` (a `deletes` of a
|
|
194
|
+
* path absent at base), `warnings` (demoted footprint probes) and
|
|
195
|
+
* `normalizations` (`refactors-existing`→`creates` rewrites).
|
|
410
196
|
*
|
|
411
|
-
*
|
|
412
|
-
* - `findings` — the advisory cross-Story conflict findings.
|
|
413
|
-
* - `errors` — human-readable strings, one per hard refusal: a `deletes`
|
|
414
|
-
* naming a path absent at base (prefixed `File assumption mismatch:`).
|
|
415
|
-
* The hierarchy/cycle/parse checks continue to throw.
|
|
416
|
-
* - `warnings` — the demoted footprint probes (Story #5312): a `creates`
|
|
417
|
-
* or `refactors-existing` mismatch, a goal/acceptance/verify path absent
|
|
418
|
-
* at base. Listed by the dry-run; the persist proceeds.
|
|
419
|
-
* - `normalizations` — the `refactors-existing`→`creates` rewrites applied.
|
|
420
|
-
*
|
|
421
|
-
* @param {object[]} tickets - Array of ticket objects parsed from LLM output.
|
|
197
|
+
* @param {object[]} tickets
|
|
422
198
|
* @param {object} [opts]
|
|
423
|
-
* @param {string} [opts.baseBranchRef] -
|
|
424
|
-
* @param {Function} [opts.gitRunner]
|
|
425
|
-
* @param {string} [opts.cwd]
|
|
199
|
+
* @param {string} [opts.baseBranchRef] - Enables the base-branch probes.
|
|
200
|
+
* @param {Function} [opts.gitRunner]
|
|
201
|
+
* @param {string} [opts.cwd]
|
|
426
202
|
* @returns {object[] & { findings: object[], errors: string[], warnings: string[], normalizations: object[] }}
|
|
427
203
|
*/
|
|
428
|
-
/**
|
|
429
|
-
* Internal helpers extracted from `validateAndNormalizeTickets` so each
|
|
430
|
-
* stage can be unit-tested in isolation and the orchestration method stays
|
|
431
|
-
* at a low cyclomatic complexity. Exported via the `_internal` bundle at
|
|
432
|
-
* the bottom of the module for tests; production callers should keep
|
|
433
|
-
* using `validateAndNormalizeTickets`.
|
|
434
|
-
*/
|
|
435
204
|
|
|
436
205
|
function indexTicketsBySlug(tickets) {
|
|
437
206
|
const ticketBySlug = new Map();
|
|
@@ -446,9 +215,7 @@ function indexTicketsBySlug(tickets) {
|
|
|
446
215
|
}
|
|
447
216
|
ticketBySlug.set(t.slug, t);
|
|
448
217
|
}
|
|
449
|
-
// External `#<id>` refs
|
|
450
|
-
// not nodes in this run's graph — they cannot close a cycle back into a
|
|
451
|
-
// Story that does not exist yet, so they are not edges here.
|
|
218
|
+
// External `#<id>` refs are tracker issues, not graph nodes — no cycle.
|
|
452
219
|
slugAdjacency.set(
|
|
453
220
|
t.slug,
|
|
454
221
|
(t.depends_on ?? []).filter((d) => !isExternalDependencyRef(d)),
|
|
@@ -458,12 +225,7 @@ function indexTicketsBySlug(tickets) {
|
|
|
458
225
|
return { ticketBySlug, stories, slugAdjacency };
|
|
459
226
|
}
|
|
460
227
|
|
|
461
|
-
/**
|
|
462
|
-
* 2-tier invariant (Story #4041): the decomposer emits Stories only — every
|
|
463
|
-
* ticket in the backlog must be `type: "story"` and at least one must be
|
|
464
|
-
* present. Any other type (the retired `feature`/`task` tiers, or planner
|
|
465
|
-
* hallucinations) HARD-rejects the decomposition.
|
|
466
|
-
*/
|
|
228
|
+
/** Every ticket must be `type: "story"`, and at least one must exist. */
|
|
467
229
|
function assertAllTicketsAreStories({ tickets, stories }) {
|
|
468
230
|
const nonStories = (tickets ?? []).filter((t) => t.type !== 'story');
|
|
469
231
|
if (nonStories.length > 0) {
|
|
@@ -482,57 +244,43 @@ function assertAllTicketsAreStories({ tickets, stories }) {
|
|
|
482
244
|
}
|
|
483
245
|
|
|
484
246
|
/**
|
|
485
|
-
*
|
|
486
|
-
*
|
|
487
|
-
* implementation unit and acceptance / verify live on the Story body
|
|
488
|
-
* rather than in child Task tickets.
|
|
489
|
-
*
|
|
490
|
-
* Both arrays must be present, be actual arrays, and contain at least
|
|
491
|
-
* one entry. Either alone is insufficient — a Story with only
|
|
492
|
-
* `acceptance[]` (no `verify[]`) cannot be implemented without a
|
|
493
|
-
* verification handle, and a Story with only `verify[]` (no
|
|
494
|
-
* `acceptance[]`) carries no observable criterion. Requiring both is the
|
|
495
|
-
* inline-contract invariant every Story must satisfy.
|
|
247
|
+
* Only `acceptance[]` is required: a Story with no criterion is
|
|
248
|
+
* unimplementable, while an empty `verify[]` is merely a warning.
|
|
496
249
|
*/
|
|
497
|
-
function
|
|
250
|
+
function hasInlineAcceptance(story) {
|
|
498
251
|
if (story === null || typeof story !== 'object') return false;
|
|
499
|
-
const { acceptance
|
|
500
|
-
return (
|
|
501
|
-
Array.isArray(acceptance) &&
|
|
502
|
-
acceptance.length > 0 &&
|
|
503
|
-
Array.isArray(verify) &&
|
|
504
|
-
verify.length > 0
|
|
505
|
-
);
|
|
252
|
+
const { acceptance } = story;
|
|
253
|
+
return Array.isArray(acceptance) && acceptance.length > 0;
|
|
506
254
|
}
|
|
507
255
|
|
|
508
256
|
function assertEveryStoryHasInlineContract({ stories }) {
|
|
509
|
-
|
|
510
|
-
// unit and MUST carry a non-empty inline contract — top-level
|
|
511
|
-
// `acceptance[]` AND `verify[]`. A Story missing either is the legacy
|
|
512
|
-
// 4-tier shape that expected child Tasks; there is no Task tier any
|
|
513
|
-
// more, so such a Story is unimplementable and the decompose is
|
|
514
|
-
// rejected outright.
|
|
515
|
-
const missing = stories.filter((s) => !hasInlineAcceptanceAndVerify(s));
|
|
257
|
+
const missing = stories.filter((s) => !hasInlineAcceptance(s));
|
|
516
258
|
if (missing.length === 0) return;
|
|
517
259
|
const list = missing.map((s) => `"${s.title}" (${s.slug})`).join(', ');
|
|
518
260
|
throw new Error(
|
|
519
|
-
`Cross-Validation Failed: ${missing.length} Story/Stories lack an inline acceptance
|
|
261
|
+
`Cross-Validation Failed: ${missing.length} Story/Stories lack an inline acceptance contract: ${list}. Every Story must carry a non-empty top-level acceptance[] — the outcomes a PR reviewer confirms once it lands.`,
|
|
520
262
|
);
|
|
521
263
|
}
|
|
522
264
|
|
|
523
265
|
/**
|
|
524
|
-
*
|
|
525
|
-
*
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
266
|
+
* @param {object[]} stories
|
|
267
|
+
* @returns {string[]}
|
|
268
|
+
*/
|
|
269
|
+
function collectMissingVerifyWarnings(stories) {
|
|
270
|
+
return (stories ?? [])
|
|
271
|
+
.filter((s) => !Array.isArray(s?.verify) || s.verify.length === 0)
|
|
272
|
+
.map(
|
|
273
|
+
(s) =>
|
|
274
|
+
`Story "${s.slug ?? s.title ?? '<unknown>'}" lists no verify[] entry — ` +
|
|
275
|
+
'the deliverer and the acceptance critic have no mechanical check to ' +
|
|
276
|
+
'read as evidence. Add the exact command or test path unless the ' +
|
|
277
|
+
'Story genuinely has none.',
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Fail malformed `provenance` here: at the stamper a silent drop looks like a
|
|
283
|
+
* Story owning nothing. Absent is valid (inherits the seed-wide union).
|
|
536
284
|
*
|
|
537
285
|
* @param {{ stories: object[] }} args
|
|
538
286
|
* @throws {Error} naming each malformed field.
|
|
@@ -559,8 +307,7 @@ function assertNoUnknownDeps({ tickets, ticketBySlug }) {
|
|
|
559
307
|
const unknownDeps = [];
|
|
560
308
|
for (const t of tickets) {
|
|
561
309
|
for (const depSlug of t.depends_on ?? []) {
|
|
562
|
-
//
|
|
563
|
-
// (`assertExternalDependenciesResolvable`), never against this backlog.
|
|
310
|
+
// External refs resolve against the tracker at persist.
|
|
564
311
|
if (isExternalDependencyRef(depSlug)) continue;
|
|
565
312
|
if (!ticketBySlug.has(depSlug)) {
|
|
566
313
|
unknownDeps.push({ slug: t.slug, title: t.title, dep: depSlug });
|
|
@@ -593,10 +340,6 @@ function attachFindingsAndErrors(
|
|
|
593
340
|
['findings', findings],
|
|
594
341
|
['errors', errors],
|
|
595
342
|
['warnings', warnings],
|
|
596
|
-
// Story #5265: the auto-normalizations the assumption gate applied. They
|
|
597
|
-
// used to end at a `Logger.warn` and die with the process, so persist's
|
|
598
|
-
// emitted result reported a plan whose declarations it had silently
|
|
599
|
-
// rewritten as if nothing had been rewritten.
|
|
600
343
|
['normalizations', normalizations],
|
|
601
344
|
]) {
|
|
602
345
|
Object.defineProperty(tickets, key, {
|
|
@@ -618,36 +361,16 @@ export function validateAndNormalizeTickets(tickets, opts = {}) {
|
|
|
618
361
|
|
|
619
362
|
assertAcyclic(slugAdjacency);
|
|
620
363
|
|
|
621
|
-
//
|
|
622
|
-
//
|
|
623
|
-
// subject-prefix scan and the freshness gate: each parses the body, and
|
|
624
|
-
// the freshness gate's net-new whitelist comes from `body.changes`, so a
|
|
625
|
-
// malformed body used to surface as a stale-path miss naming the paths the
|
|
626
|
-
// Story had legitimately declared.
|
|
364
|
+
// Must precede the freshness gate, whose whitelist comes from the parsed
|
|
365
|
+
// body — a malformed body would otherwise read as stale paths.
|
|
627
366
|
assertStoryBodiesParse({ tickets });
|
|
628
367
|
|
|
629
|
-
// Reject any Task acceptance item that prescribes a non-Conventional-Commits
|
|
630
|
-
// subject prefix (e.g. legacy "Commit subject begins with 'baseline-refresh:'"
|
|
631
|
-
// from pre-Epic-#2501 planner output). Runs before the freshness gate so
|
|
632
|
-
// the failure mode is reported up-front rather than after a git probe.
|
|
633
|
-
validateAcceptanceSubjectPrefix({ tickets });
|
|
634
|
-
|
|
635
|
-
// Hoist a single memoized (ref, path) → boolean probe shared across both
|
|
636
|
-
// git-probe gates below. Without this, `validateAcFreshness` and
|
|
637
|
-
// `validateStoryFileAssumptions` each maintain an independent cache, so a
|
|
638
|
-
// path that appears in both the AC-freshness scan and the file-assumption
|
|
639
|
-
// scan spawns two `git cat-file` processes. The memoizing wrapper captures
|
|
640
|
-
// results by `"${baseBranchRef}:${path}"` key so the second gate reuses
|
|
641
|
-
// the first's results without any additional git I/O.
|
|
642
368
|
const sharedGitRunner = opts.baseBranchRef
|
|
643
369
|
? makeMemoizedGitRunner(opts.gitRunner ?? defaultGitRunner)
|
|
644
370
|
: null;
|
|
645
371
|
|
|
646
|
-
const warnings = [];
|
|
647
|
-
//
|
|
648
|
-
// warning the dry-run lists, not a refusal. Skipped when the caller omits
|
|
649
|
-
// `baseBranchRef` so unit tests keep their semantics; production
|
|
650
|
-
// call-sites always pass it.
|
|
372
|
+
const warnings = [...collectMissingVerifyWarnings(stories)];
|
|
373
|
+
// Base probes run only with `baseBranchRef` (production always passes it).
|
|
651
374
|
if (opts.baseBranchRef) {
|
|
652
375
|
warnings.push(
|
|
653
376
|
...validateAcFreshness({
|
|
@@ -659,10 +382,7 @@ export function validateAndNormalizeTickets(tickets, opts = {}) {
|
|
|
659
382
|
);
|
|
660
383
|
}
|
|
661
384
|
|
|
662
|
-
//
|
|
663
|
-
// declared `{ path, assumption }` against the actual state of the base
|
|
664
|
-
// branch. A `deletes` on an absent path batches into the validator's
|
|
665
|
-
// errors envelope; every other mismatch is a warning (Story #5312).
|
|
385
|
+
// Only a `deletes` of an absent path is an error; other mismatches warn.
|
|
666
386
|
let assumptionErrors = [];
|
|
667
387
|
let assumptionNormalizations = [];
|
|
668
388
|
if (opts.baseBranchRef) {
|
|
@@ -677,9 +397,7 @@ export function validateAndNormalizeTickets(tickets, opts = {}) {
|
|
|
677
397
|
assumptionNormalizations = assumptionReport.normalizations ?? [];
|
|
678
398
|
}
|
|
679
399
|
|
|
680
|
-
//
|
|
681
|
-
// graph. Every finding is advisory; the persist surfaces them and the
|
|
682
|
-
// plan summary renders the shared-editor class beside the wave table.
|
|
400
|
+
// Conflict findings are advisory.
|
|
683
401
|
const findings = computeConflictFindings({ stories });
|
|
684
402
|
const errors = assumptionErrors.map((e) => `File assumption mismatch: ${e}`);
|
|
685
403
|
|
|
@@ -702,5 +420,6 @@ export const _internal = {
|
|
|
702
420
|
assertNoUnknownDeps,
|
|
703
421
|
assertAcyclic,
|
|
704
422
|
attachFindingsAndErrors,
|
|
705
|
-
|
|
423
|
+
hasInlineAcceptance,
|
|
424
|
+
collectMissingVerifyWarnings,
|
|
706
425
|
};
|