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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://github.com/dsj1984/mandrel/blob/main/.agents/schemas/story-deliver-terminal.schema.json",
|
|
4
4
|
"title": "story-deliver-terminal",
|
|
5
|
-
"description": "The single terminal envelope a Story delivery invocation emits (Story #4543). Before this schema, the delivery tail had two divergent prose return contracts — one in .agents/workflows/helpers/deliver-story.md, a different one in .agents/agents/story-worker.md — and neither was validated by anything, so a caller could not tell a landed Story from a parked one without re-probing GitHub. This is the SSOT both now reference rather than restate. status is exactly one of landed | pending | blocked | failed | escalated; phase names where the run ended; tail carries per-step booleans so a partial-tail degradation is visible without failing an otherwise-landed merge; nextCommand names the single command that resumes or remediates the run, drawn from the same vocabulary deliver-recover.js prints. escalated (Story #4746) is the one status emitted BEFORE a Story exists — /deliver-light's suitability gate refusing
|
|
5
|
+
"description": "The single terminal envelope a Story delivery invocation emits (Story #4543). Before this schema, the delivery tail had two divergent prose return contracts — one in .agents/workflows/helpers/deliver-story.md, a different one in .agents/agents/story-worker.md — and neither was validated by anything, so a caller could not tell a landed Story from a parked one without re-probing GitHub. This is the SSOT both now reference rather than restate. status is exactly one of landed | pending | blocked | failed | escalated; phase names where the run ended; tail carries per-step booleans so a partial-tail degradation is visible without failing an otherwise-landed merge; nextCommand names the single command that resumes or remediates the run, drawn from the same vocabulary deliver-recover.js prints. escalated (Story #4746) is the one status emitted BEFORE a Story exists — /deliver-light's suitability gate refusing a prompt — which is why storyId is null exactly there and non-null everywhere else.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"kind",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"status": {
|
|
23
23
|
"type": "string",
|
|
24
|
-
"description": "landed — the PR merged, the Story is agent::done, and the post-land tail was attempted. pending — a bounded wait expired with the PR still in flight; NO label was mutated and no merge.unlanded event was emitted, so the run is resumable via nextCommand. blocked — a classified hard block; the Story carries agent::blocked and blocked.blockClass names the class. failed — a phase crashed; phase names which one. escalated —
|
|
24
|
+
"description": "landed — the PR merged, the Story is agent::done, and the post-land tail was attempted. pending — a bounded wait expired with the PR still in flight; NO label was mutated and no merge.unlanded event was emitted, so the run is resumable via nextCommand. blocked — a classified hard block; the Story carries agent::blocked and blocked.blockClass names the class. failed — a phase crashed; phase names which one. escalated — /deliver-light's suitability gate refused a prompt on an un-waivable risk rule or an un-ledgered verdict; nothing was created and the LIGHT PATH ends here, nextCommand naming the /mandrel-plan invocation that owns the work instead. Story #5344 narrowed what refuses (the predicted-shape ceilings are gone) and loosened what follows (that command may be run in the same session, seeded with escalation.reasons) without touching this shape.",
|
|
25
25
|
"enum": ["landed", "pending", "blocked", "failed", "escalated"]
|
|
26
26
|
},
|
|
27
27
|
"phase": {
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
},
|
|
180
180
|
"nextCommand": {
|
|
181
181
|
"type": ["string", "null"],
|
|
182
|
-
"description": "The single command that advances this work from where it stopped, or null when status === \"landed\" and nothing remains. Shares its vocabulary with deliver-recover.js so recovery and normal resumption speak one language. For status escalated it is the /mandrel-plan invocation
|
|
182
|
+
"description": "The single command that advances this work from where it stopped, or null when status === \"landed\" and nothing remains. Shares its vocabulary with deliver-recover.js so recovery and normal resumption speak one language. For status escalated it is the /mandrel-plan invocation that owns the work — the one case where the command is a slash command rather than a script, because the work needs planning, not resumption. Story #4746 required it to run in a FRESH session; Story #5344 permits the same session when it is seeded with escalation.reasons, and helpers/deliver-light.md carries the seeding contract.",
|
|
183
183
|
"minLength": 1
|
|
184
184
|
},
|
|
185
185
|
"elapsedSeconds": { "type": "number", "minimum": 0 },
|
|
@@ -194,6 +194,16 @@
|
|
|
194
194
|
},
|
|
195
195
|
"additionalProperties": false
|
|
196
196
|
},
|
|
197
|
+
"lockWait": {
|
|
198
|
+
"type": ["object", "null"],
|
|
199
|
+
"description": "Story #5377 — full-suite lock accounting for this close: how long its gates waited, in total, for another full suite on the same host to release the lock, and whether a wait expired. null when the close never waited. Distinct from waitBudget, which is merge-wait accounting only. An expired wait inside close spawns nothing, and the close ends pending at phase close-validation with nextCommand re-running close.",
|
|
200
|
+
"required": ["waitedSeconds", "expired"],
|
|
201
|
+
"properties": {
|
|
202
|
+
"waitedSeconds": { "type": "number", "minimum": 0 },
|
|
203
|
+
"expired": { "type": "boolean" }
|
|
204
|
+
},
|
|
205
|
+
"additionalProperties": false
|
|
206
|
+
},
|
|
197
207
|
"timestamp": { "type": "string", "format": "date-time" }
|
|
198
208
|
},
|
|
199
209
|
"allOf": [
|
|
@@ -40,10 +40,11 @@
|
|
|
40
40
|
"check-baselines",
|
|
41
41
|
"check-baselines-independent",
|
|
42
42
|
"check-baselines-coverage",
|
|
43
|
+
"quality-preview",
|
|
43
44
|
"check-maintainability",
|
|
44
45
|
"check-crap"
|
|
45
46
|
],
|
|
46
|
-
"description": "Stable gate identifier. Closed enum — additions require a schema bump. Must be a superset of every gate name buildDefaultGates() can emit (lib/close-validation/gates.js); tests/close-validation-gates-enum.test.js pins that gate-list ⊆ enum invariant. `coverage-capture` and `check-baselines` are the real close-validation gates (Story #4697); `check-baselines-independent` / `check-baselines-coverage` are the split pair the gate registers as when its enabled-kind set resolves (Story #5172), with `check-baselines` kept as both the unsplit fail-closed fallback and the historical name; `check-maintainability` / `check-crap` are the retired per-kind gates (Story #2210) kept so historical evidence records still validate."
|
|
47
|
+
"description": "Stable gate identifier. Closed enum — additions require a schema bump. Must be a superset of every gate name buildDefaultGates() can emit (lib/close-validation/gates.js); tests/close-validation-gates-enum.test.js pins that gate-list ⊆ enum invariant. `coverage-capture` and `check-baselines` are the real close-validation gates (Story #4697); `check-baselines-independent` / `check-baselines-coverage` are the split pair the gate registers as when its enabled-kind set resolves (Story #5172), with `check-baselines` kept as both the unsplit fail-closed fallback and the historical name; `quality-preview` replays the pre-push CRAP-scope preview at close, registered beside `coverage-capture` (Story #5378); `check-maintainability` / `check-crap` are the retired per-kind gates (Story #2210) kept so historical evidence records still validate."
|
|
47
48
|
},
|
|
48
49
|
"commitSha": {
|
|
49
50
|
"type": "string",
|
|
@@ -5,22 +5,32 @@ invoked indirectly by `npm run …`, slash-command workflows
|
|
|
5
5
|
(`.agents/workflows/*.md`), or Husky / GitHub Actions hooks; you rarely
|
|
6
6
|
need to call them by hand.
|
|
7
7
|
|
|
8
|
-
This file is **not** an exhaustive index of the ~
|
|
8
|
+
This file is **not** an exhaustive index of the ~65 top-level entrypoints —
|
|
9
9
|
it is the orientation pointer for the directory. Every script documents
|
|
10
10
|
its own flags under `--help`, and each is reachable from a real caller:
|
|
11
11
|
search `package.json` scripts, `.agents/workflows/`, and the Husky /
|
|
12
|
-
GitHub Actions surfaces first.
|
|
13
|
-
caller set mechanically, so a CLI no invoker names is dead, not
|
|
14
|
-
operator-only.
|
|
12
|
+
GitHub Actions surfaces first.
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
14
|
+
**Only consumer-facing tooling ships here.** Every top-level CLI in this
|
|
15
|
+
directory is named by a consumer surface — a workflow, skill, rule, agent
|
|
16
|
+
file, template, `instructions.md`, the package's `bin/` / `lib/`, or a
|
|
17
|
+
string `lib/bootstrap/` writes into a consumer's `package.json` or hooks.
|
|
18
|
+
Mandrel's own contributor tooling (its lint and verify aggregates, test
|
|
19
|
+
diagnostics, CI-only ratchets and baseline-maintenance utilities) lives in
|
|
20
|
+
the repository's root `scripts/` directory, which is outside the npm
|
|
21
|
+
`files` array and never reaches a consumer. Mandrel's CI enforces that
|
|
22
|
+
boundary: a top-level CLI here that no consumer surface names fails it,
|
|
23
|
+
and so does any file under `.agents/` importing from outside `.agents/`.
|
|
24
|
+
|
|
25
|
+
The one script an operator-facing workflow drives **by name, repeatedly**, is
|
|
26
|
+
[`deliver-run.js`](deliver-run.js): one beat of a multi-Story
|
|
27
|
+
`/mandrel-deliver` run — it ticks the ready set from live state, writes each
|
|
28
|
+
ready Story's dispatch prompt under `<tempRoot>/run-<id>/`, keeps the run
|
|
29
|
+
ledger that replaces hand-maintained dispatch bookkeeping, and renders the
|
|
30
|
+
`single-story-close.js` command for every hand-off. Everything else in the
|
|
31
|
+
delivery chain (`resolve-stories.js`, `single-story-init.js`,
|
|
32
|
+
`single-story-close.js`, `stories-wave-tick.js`) is reached through it or
|
|
33
|
+
through a workflow step.
|
|
24
34
|
|
|
25
35
|
## See Also
|
|
26
36
|
|
|
@@ -28,7 +38,7 @@ still exits 2.
|
|
|
28
38
|
- [`/docs/architecture.md`](../../docs/architecture.md) — system
|
|
29
39
|
architecture; the "Key Scripts" section lists the standard
|
|
30
40
|
orchestration entrypoints.
|
|
31
|
-
- [
|
|
41
|
+
- [`docs/quality-gates.md`](https://github.com/dsj1984/mandrel/blob/main/docs/quality-gates.md) — coverage,
|
|
32
42
|
CRAP, and maintainability baselines + floors.
|
|
33
43
|
- `package.json` `scripts` — the canonical list of standard CLIs
|
|
34
44
|
(`test`, `verify`, `coverage:update`, …).
|
|
@@ -1,76 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* acceptance-eval.js — bounded per-Story acceptance
|
|
4
|
+
* acceptance-eval.js — bounded per-Story acceptance gate. The deterministic
|
|
5
|
+
* scorer of the round's single authored verdict: validate it against the
|
|
6
|
+
* schema (malformed is a hard error), decide `proceed | redraft | block` under
|
|
7
|
+
* `delivery.acceptanceEval.maxRounds`, emit an `acceptance-eval` signal, and
|
|
8
|
+
* print one JSON envelope. Only `block` exits non-zero; the ticket transition
|
|
9
|
+
* stays the workflow's job.
|
|
5
10
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* emits one verdict file per round
|
|
12
|
-
* (`.agents/schemas/acceptance-eval-verdict.schema.json`). This CLI is the
|
|
13
|
-
* deterministic SCORER of that single authored verdict — it validates and
|
|
14
|
-
* decides, it never re-scores the criteria as an independent additional
|
|
15
|
-
* pass — turning the verdict into the loop's next action:
|
|
16
|
-
*
|
|
17
|
-
* 1. Validate the verdict file against the verdict JSON Schema (a
|
|
18
|
-
* malformed verdict is a hard error — the loop refuses to guess).
|
|
19
|
-
* 2. Decide `proceed | redraft | block` from the per-criterion verdicts
|
|
20
|
-
* and the resolved redraft budget (`delivery.acceptanceEval.maxRounds`;
|
|
21
|
-
* `0` means the verdict is scored once with no redraft round).
|
|
22
|
-
* 3. Emit one per-criterion `acceptance-eval` signal into the retro /
|
|
23
|
-
* feedback substrate so the retro and `/mandrel-plan` Phase 0 feedback
|
|
24
|
-
* fetch can see which acceptance items needed rework and the round
|
|
25
|
-
* count.
|
|
26
|
-
* 4. Print a single JSON envelope and exit:
|
|
27
|
-
* - `proceed` → exit 0; the workflow flips the Story to `closing`.
|
|
28
|
-
* - `redraft` → exit 0; the workflow reworks the flagged criteria
|
|
29
|
-
* and re-runs the critic pass for the next round.
|
|
30
|
-
* - `block` → exit non-zero; the workflow transitions the Story
|
|
31
|
-
* to `agent::blocked`, posts a `friction` comment naming the
|
|
32
|
-
* unmet criteria, and stops. It never silently proceeds to close.
|
|
33
|
-
*
|
|
34
|
-
* The ticket transition / friction-comment authoring stays the workflow
|
|
35
|
-
* agent's job (via `story-phase.js --phase blocked` + `diagnose-friction.js`)
|
|
36
|
-
* — this CLI is the decision + signal boundary, mirroring how the existing
|
|
37
|
-
* gates separate decision from ticket mutation.
|
|
38
|
-
*
|
|
39
|
-
* One invocation shape: per-Story. The diff is one Story's; round scoping
|
|
40
|
-
* is per Story off the Story's `signals.ndjson`. (v2.0.0 removed the Epic
|
|
41
|
-
* tier along with the per-AC-cluster `--epic <id> --cluster <id>` mode that
|
|
42
|
-
* scored an Epic `## Acceptance Table` against a `main..epic/<id>` diff.)
|
|
43
|
-
*
|
|
44
|
-
* One gate call per round (Story #4951). A round may fan out into N parallel
|
|
45
|
-
* maker-blind cluster critics, but their per-cluster verdicts are merged by
|
|
46
|
-
* the caller into ONE verdict — `criteria[]` in acceptance-array order — and
|
|
47
|
-
* scored here exactly once. Invoking the gate per cluster instead would burn
|
|
48
|
-
* one Story-level round per cluster (distinct fingerprints defeat the replay
|
|
49
|
-
* guard) and race the `signals.ndjson` round ledger. The gate reads the
|
|
50
|
-
* Story's own `acceptance[]` count off its body (Story #5313) and rejects a
|
|
51
|
-
* verdict whose `criteria[]` length differs **before** scoring, so the
|
|
52
|
-
* mistake costs no round. `--expected-criteria` is still accepted but is
|
|
53
|
-
* redundant with the derived count: when both are known they must agree.
|
|
54
|
-
* An inline-owned verdict is one file scored in one call — the cluster
|
|
55
|
-
* merge applies only to fresh critics.
|
|
56
|
-
*
|
|
57
|
-
* CLI:
|
|
58
|
-
* --story <id> Story ID (required).
|
|
59
|
-
* --verdict <path> Path to the round's verdict JSON (required).
|
|
60
|
-
* --expected-criteria <n> Optional; must equal the Story's acceptance[]
|
|
61
|
-
* count when the body is readable.
|
|
62
|
-
* --no-signal Suppress the signal emit (tests).
|
|
63
|
-
*
|
|
64
|
-
* Stdout: a single JSON envelope
|
|
65
|
-
* { storyId, epicId, fullSuiteVerifyCommands[], decision, round, cap,
|
|
66
|
-
* capReached, totalCriteria, metCount, unmetCriteria[], signalEmitted,
|
|
67
|
-
* replay, verdictFingerprint }
|
|
68
|
-
* (`epicId` is retained as a always-null field for envelope stability.)
|
|
69
|
-
*
|
|
70
|
-
* Reading is free (Story #4874): re-invoking the gate over a verdict the
|
|
71
|
-
* ledger has already scored replays that round (`replay: true`,
|
|
72
|
-
* `signalEmitted: false`) instead of consuming one, so an unchanged verdict
|
|
73
|
-
* can never escalate from `redraft` to `block` by being looked at twice.
|
|
11
|
+
* One verdict, one gate call per round, covering every `acceptance[]` item in
|
|
12
|
+
* order — the count is read off the Story body and a mismatch is rejected
|
|
13
|
+
* before scoring, so it costs no round. Re-scoring an already-scored verdict
|
|
14
|
+
* replays its round (`replay: true`) and never escalates. `epicId` is an
|
|
15
|
+
* always-null envelope field kept for stability.
|
|
74
16
|
*
|
|
75
17
|
* @see .agents/scripts/lib/orchestration/acceptance-eval-decision.js
|
|
76
18
|
* @see .agents/schemas/acceptance-eval-verdict.schema.json
|
|
@@ -111,13 +53,8 @@ const VERDICT_SCHEMA_PATH = path.resolve(
|
|
|
111
53
|
);
|
|
112
54
|
|
|
113
55
|
/**
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* Deliberately **not** memoised in a module-level variable: a module-level
|
|
117
|
-
* cache is reset only on re-import, so it silently defeats the `io` seam below
|
|
118
|
-
* (the second caller's injected reader is never consulted) and makes parallel
|
|
119
|
-
* test isolation impossible — `.agents/rules/test-seams.md` rule 3. The gate
|
|
120
|
-
* compiles the schema once per CLI run, so there is nothing to memoise.
|
|
56
|
+
* Deliberately not memoised: a module-level cache would bypass the `io` seam
|
|
57
|
+
* for every later caller. One compile per CLI run.
|
|
121
58
|
*
|
|
122
59
|
* @param {string} [schemaPath]
|
|
123
60
|
* @param {{ readFileSync: typeof readFileSync }} [io]
|
|
@@ -134,10 +71,7 @@ function getVerdictValidator(
|
|
|
134
71
|
}
|
|
135
72
|
|
|
136
73
|
/**
|
|
137
|
-
*
|
|
138
|
-
* any violation so the loop never acts on a malformed verdict.
|
|
139
|
-
*
|
|
140
|
-
* Exported for tests.
|
|
74
|
+
* Throws on any schema violation.
|
|
141
75
|
*
|
|
142
76
|
* @param {unknown} verdict
|
|
143
77
|
* @param {{ schemaPath?: string, io?: { readFileSync: typeof readFileSync } }} [opts]
|
|
@@ -179,22 +113,14 @@ function parseCliArgs(argv) {
|
|
|
179
113
|
};
|
|
180
114
|
}
|
|
181
115
|
|
|
182
|
-
/**
|
|
183
|
-
* The merge contract, stated once so both the flag error and the coverage
|
|
184
|
-
* error name the same shape the caller has to produce.
|
|
185
|
-
*/
|
|
186
116
|
const MERGE_CONTRACT =
|
|
187
|
-
'One round =
|
|
188
|
-
|
|
189
|
-
'
|
|
117
|
+
'One round = ONE verdict -> ONE gate call: the verdict must carry one ' +
|
|
118
|
+
'criteria[] record per acceptance[] item, in acceptance-array order, ' +
|
|
119
|
+
'before scoring.';
|
|
190
120
|
|
|
191
121
|
/**
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
* already read. Total: any failure — no provider, an unreadable ticket, an
|
|
195
|
-
* unparseable body — yields `null`, which routes the caller to the flag (when
|
|
196
|
-
* passed) and otherwise to a stated, logged skip. It never manufactures a
|
|
197
|
-
* count.
|
|
122
|
+
* The Story body's `acceptance[]` count; any failure yields `null`, never a
|
|
123
|
+
* manufactured count.
|
|
198
124
|
*
|
|
199
125
|
* @param {{ storyId: number, config: object }} args
|
|
200
126
|
* @param {{ createProviderFn?: typeof createProvider, parseBodyFn?: typeof parseStoryBody }} [deps]
|
|
@@ -218,9 +144,7 @@ export async function readStoryAcceptanceCount(
|
|
|
218
144
|
}
|
|
219
145
|
|
|
220
146
|
/**
|
|
221
|
-
*
|
|
222
|
-
* derived count is authoritative; a flag that disagrees with it is a wiring
|
|
223
|
-
* error worth failing on rather than a value to prefer silently.
|
|
147
|
+
* The derived count wins; a disagreeing flag is a wiring error and throws.
|
|
224
148
|
*
|
|
225
149
|
* @param {{ derived: number|null, flagged: number|null }} args
|
|
226
150
|
* @returns {number|null}
|
|
@@ -236,10 +160,7 @@ export function reconcileExpectedCriteria({ derived, flagged }) {
|
|
|
236
160
|
}
|
|
237
161
|
|
|
238
162
|
/**
|
|
239
|
-
* The count
|
|
240
|
-
* reconciled with the optional flag, with a stated skip when neither is
|
|
241
|
-
* readable (Story #5313). Split out of `runAcceptanceEvalCli` so the CLI
|
|
242
|
-
* body's own branching stays inside its committed cyclomatic budget.
|
|
163
|
+
* The coverage count, with a logged skip when neither source is readable.
|
|
243
164
|
*
|
|
244
165
|
* @param {{ storyId: number, config: object, flagged: number|null, readAcceptanceCountImpl: typeof readStoryAcceptanceCount, logger: { warn?: Function } }} args
|
|
245
166
|
* @returns {Promise<number|null>}
|
|
@@ -262,22 +183,14 @@ async function resolveExpectedCriteriaCount({
|
|
|
262
183
|
}
|
|
263
184
|
|
|
264
185
|
/**
|
|
265
|
-
*
|
|
266
|
-
* `null` when the flag is absent. Since Story #5313 the gate derives the
|
|
267
|
-
* count from the Story body; the flag remains accepted for callers that
|
|
268
|
-
* still pass it and is checked against the derived value.
|
|
269
|
-
*
|
|
270
|
-
* Exported for tests.
|
|
186
|
+
* `--expected-criteria` as a positive integer, or `null` when absent.
|
|
271
187
|
*
|
|
272
188
|
* @param {string|null|undefined} raw
|
|
273
189
|
* @returns {number|null}
|
|
274
190
|
*/
|
|
275
191
|
export function resolveExpectedCriteria(raw) {
|
|
276
192
|
if (raw === null || raw === undefined) return null;
|
|
277
|
-
// Digits only
|
|
278
|
-
// resolved to 4 — a guard whose entire job is to reject a wrong-sized
|
|
279
|
-
// verdict was itself accepting a malformed count, and a typo'd `--expected-
|
|
280
|
-
// criteria` would then wave through a verdict of the wrong length.
|
|
193
|
+
// Digits only — `parseInt('4abc')` is 4, which would wave a typo through.
|
|
281
194
|
const text = String(raw).trim();
|
|
282
195
|
const expected = /^\d+$/.test(text) ? Number(text) : Number.NaN;
|
|
283
196
|
if (!Number.isInteger(expected) || expected < 1) {
|
|
@@ -289,13 +202,8 @@ export function resolveExpectedCriteria(raw) {
|
|
|
289
202
|
}
|
|
290
203
|
|
|
291
204
|
/**
|
|
292
|
-
* Reject a verdict
|
|
293
|
-
*
|
|
294
|
-
* Called **before** `runAcceptanceEval`, which is where the round ledger is
|
|
295
|
-
* read and appended — so a partial cluster verdict handed to the gate by
|
|
296
|
-
* mistake costs no round and can never escalate a `redraft` into a `block`.
|
|
297
|
-
*
|
|
298
|
-
* Exported for tests.
|
|
205
|
+
* Reject a verdict not covering exactly `expectedCriteria` criteria — before
|
|
206
|
+
* the round ledger is touched, so the mistake costs no round.
|
|
299
207
|
*
|
|
300
208
|
* @param {object} verdict — schema-validated verdict.
|
|
301
209
|
* @param {number|null} expectedCriteria — `null` disables the assertion.
|
|
@@ -312,17 +220,9 @@ export function assertCriteriaCoverage(verdict, expectedCriteria) {
|
|
|
312
220
|
}
|
|
313
221
|
|
|
314
222
|
/**
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
* The intended `verify[]` shape is scoped entries **plus** the one credited
|
|
319
|
-
* full-suite run the worker makes before the hand-off push. A full-suite
|
|
320
|
-
* command sitting in `verify[]` is the misshapen case: it either re-pays for
|
|
321
|
-
* the credited run or, worse, gets skipped as "already covered" without
|
|
322
|
-
* anyone saying so. The gate is where every round's evidence passes through,
|
|
323
|
-
* so it is where the shape is called out.
|
|
324
|
-
*
|
|
325
|
-
* Exported for tests.
|
|
223
|
+
* Distinct full-suite commands in the verdict's `verify[]` evidence — a
|
|
224
|
+
* misshapen `verify[]` that re-pays (or silently skips) the one credited
|
|
225
|
+
* full-suite run.
|
|
326
226
|
*
|
|
327
227
|
* @param {object} verdict — schema-validated verdict.
|
|
328
228
|
* @returns {string[]} distinct offending commands, in first-seen order.
|
|
@@ -341,13 +241,6 @@ export function collectFullSuiteVerifyCommands(verdict) {
|
|
|
341
241
|
}
|
|
342
242
|
|
|
343
243
|
/**
|
|
344
|
-
* Surface the misshapen-`verify[]` warning, if there is one.
|
|
345
|
-
*
|
|
346
|
-
* Extracted from `runAcceptanceEvalCli` rather than inlined: the CLI shell is
|
|
347
|
-
* already the file's worst-CRAP method, and a branch added there costs more
|
|
348
|
-
* than the same branch in a small, fully-covered helper. Module-private: it is
|
|
349
|
-
* reached through the CLI shell, which is where the tests drive it.
|
|
350
|
-
*
|
|
351
244
|
* @param {object} verdict — schema-validated verdict.
|
|
352
245
|
* @param {{ warn?: Function }} logger
|
|
353
246
|
* @returns {string[]} the offending commands (empty when the shape is fine).
|
|
@@ -364,20 +257,15 @@ function warnOnFullSuiteVerify(verdict, logger) {
|
|
|
364
257
|
}
|
|
365
258
|
|
|
366
259
|
/**
|
|
367
|
-
*
|
|
368
|
-
*
|
|
369
|
-
* Exported for tests so the decision + signal path can be exercised
|
|
370
|
-
* without spawning the CLI.
|
|
260
|
+
* Decide, emit the signal, and compose the envelope.
|
|
371
261
|
*
|
|
372
262
|
* @param {object} args
|
|
373
263
|
* @param {number} args.storyId
|
|
374
264
|
* @param {object} args.verdict — validated verdict object.
|
|
375
265
|
* @param {object} args.config — resolved `.agentrc.json`.
|
|
376
266
|
* @param {boolean} args.emitSignal
|
|
377
|
-
* @param {number} [args.round] —
|
|
378
|
-
*
|
|
379
|
-
* signals in the Story's `signals.ndjson` (Story #4019); the verdict's
|
|
380
|
-
* self-reported `round` is never load-bearing for the cap.
|
|
267
|
+
* @param {number} [args.round] — override (tests); otherwise derived from the
|
|
268
|
+
* signals ledger, never from the verdict's self-reported round.
|
|
381
269
|
* @param {object} [deps]
|
|
382
270
|
* @param {Function} [deps.appendSignalFn]
|
|
383
271
|
* @param {Function} [deps.resolveRoundFn]
|
|
@@ -395,9 +283,7 @@ export async function runAcceptanceEval(
|
|
|
395
283
|
} = deps;
|
|
396
284
|
const { maxRounds } = getAcceptanceEval(config);
|
|
397
285
|
const verdictFingerprint = fingerprintFn(verdict);
|
|
398
|
-
//
|
|
399
|
-
// reports the round that verdict was scored under and appends nothing, so
|
|
400
|
-
// observation alone can never advance the counter or escalate a redraft.
|
|
286
|
+
// An already-scored verdict replays its round and appends nothing.
|
|
401
287
|
const resolved = resolveRoundFn({
|
|
402
288
|
epicId: null,
|
|
403
289
|
storyId,
|
|
@@ -432,8 +318,7 @@ export async function runAcceptanceEval(
|
|
|
432
318
|
config,
|
|
433
319
|
});
|
|
434
320
|
} catch (err) {
|
|
435
|
-
//
|
|
436
|
-
// take down the gate. The decision still stands.
|
|
321
|
+
// Best-effort: a failed signal write never takes down the gate.
|
|
437
322
|
Logger.warn(
|
|
438
323
|
`acceptance-eval: failed to append signal: ${
|
|
439
324
|
err instanceof Error ? err.message : String(err)
|
|
@@ -461,28 +346,16 @@ export async function runAcceptanceEval(
|
|
|
461
346
|
evidence: c.evidence,
|
|
462
347
|
})),
|
|
463
348
|
signalEmitted,
|
|
464
|
-
// True when this invocation re-read a verdict the ledger had already
|
|
465
|
-
// scored: the round was replayed, not advanced, and nothing was appended.
|
|
466
349
|
replay,
|
|
467
350
|
verdictFingerprint,
|
|
468
351
|
};
|
|
469
352
|
|
|
470
|
-
// `block` is the only non-zero exit: the loop has exhausted its bounded
|
|
471
|
-
// budget with criteria still unmet, and the workflow must escalate to
|
|
472
|
-
// `agent::blocked` rather than proceed to close.
|
|
473
353
|
const exitCode = outcome.decision === 'block' ? 1 : 0;
|
|
474
354
|
return { envelope, exitCode };
|
|
475
355
|
}
|
|
476
356
|
|
|
477
357
|
/**
|
|
478
|
-
*
|
|
479
|
-
* envelope. Extracted from the `main` shell so the whole error table (missing
|
|
480
|
-
* flags, unreadable verdict, non-JSON verdict, storyId mismatch, block) is
|
|
481
|
-
* reachable without spawning the CLI or writing a real verdict file.
|
|
482
|
-
*
|
|
483
|
-
* Every seam on the optional final `deps` parameter defaults to the real
|
|
484
|
-
* implementation (`.agents/rules/test-seams.md` rules 1-2, 4), so `main` and
|
|
485
|
-
* every production invocation are unchanged.
|
|
358
|
+
* CLI core: argv → verdict → validation → coverage → decision → envelope.
|
|
486
359
|
*
|
|
487
360
|
* @param {string[]} [argv]
|
|
488
361
|
* @param {{
|
|
@@ -544,9 +417,6 @@ export async function runAcceptanceEvalCli(
|
|
|
544
417
|
|
|
545
418
|
const verdict = validateVerdictImpl(parsed);
|
|
546
419
|
|
|
547
|
-
// Story #4951 / #5313: a merged verdict must cover every acceptance[] item,
|
|
548
|
-
// and the count comes from the Story body itself. This runs before the
|
|
549
|
-
// round ledger is touched, so a partial cluster verdict is a free mistake.
|
|
550
420
|
const config = resolveConfigImpl();
|
|
551
421
|
const expected = await resolveExpectedCriteriaCount({
|
|
552
422
|
storyId,
|
|
@@ -557,17 +427,13 @@ export async function runAcceptanceEvalCli(
|
|
|
557
427
|
});
|
|
558
428
|
assertCriteriaCoverage(verdict, expected);
|
|
559
429
|
|
|
560
|
-
// A verdict whose embedded storyId disagrees with the CLI flag is a
|
|
561
|
-
// wiring error worth failing on, not a silent mismatch.
|
|
562
430
|
if (Number.isInteger(verdict.storyId) && verdict.storyId !== storyId) {
|
|
563
431
|
throw new Error(
|
|
564
432
|
`acceptance-eval: verdict storyId (${verdict.storyId}) does not match --story ${storyId}.`,
|
|
565
433
|
);
|
|
566
434
|
}
|
|
567
435
|
|
|
568
|
-
//
|
|
569
|
-
// from the envelope, so it fires for the real decision path and for every
|
|
570
|
-
// caller that injects its own scorer.
|
|
436
|
+
// From the validated verdict, so it fires even with an injected scorer.
|
|
571
437
|
warnOnFullSuiteVerify(verdict, logger);
|
|
572
438
|
|
|
573
439
|
const { envelope, exitCode } = await runAcceptanceEvalImpl({
|