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,36 +2,10 @@
|
|
|
2
2
|
/* node:coverage ignore file */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* 2. Appends a structured `friction` record to the per-Story
|
|
10
|
-
* `signals.ndjson` stream via `signals-writer.appendSignal` (when
|
|
11
|
-
* both `--story` and `--epic` can be resolved).
|
|
12
|
-
*
|
|
13
|
-
* In v5 (Epic #1030), friction is a **local NDJSON signal**, not a GitHub
|
|
14
|
-
* comment. The detector posts no comments; the analyzer reads the NDJSON
|
|
15
|
-
* stream out-of-band. See Tech Spec #1032 §observability.
|
|
16
|
-
*
|
|
17
|
-
* Usage:
|
|
18
|
-
* node diagnose-friction.js [--story <STORY_ID>] \
|
|
19
|
-
* [--epic <EPIC_ID>] --cmd <cmd> <args...>
|
|
20
|
-
*
|
|
21
|
-
* `--cmd` consumes the remaining argv as separate words and spawns them with
|
|
22
|
-
* no shell. Quoting the whole command as one string is a usage error, not
|
|
23
|
-
* friction — it is refused loudly and writes no ledger row.
|
|
24
|
-
*
|
|
25
|
-
* Story/Epic resolution order:
|
|
26
|
-
* 1. CLI flags (--story, --epic).
|
|
27
|
-
* 2. Environment vars (STORY_ID, EPIC_ID / SPRINT_ID).
|
|
28
|
-
*
|
|
29
|
-
* If neither story nor epic can be resolved, the script still prints
|
|
30
|
-
* diagnostic suggestions but skips the signal write (a missing signal is
|
|
31
|
-
* preferable to a halted runner — see signals-writer best-effort contract).
|
|
32
|
-
*
|
|
33
|
-
* @see docs/v5-implementation-plan.md Sprint 3E
|
|
34
|
-
* @see .agents/scripts/lib/observability/signals-writer.js
|
|
5
|
+
* Diagnostic interceptor: runs a command (argv words, no shell) and on
|
|
6
|
+
* failure prints remediation and appends a local `friction` NDJSON signal —
|
|
7
|
+
* never a ticket comment. With no resolvable Story the write is skipped: a
|
|
8
|
+
* missing signal beats a halted runner.
|
|
35
9
|
*/
|
|
36
10
|
import { spawnSync } from 'node:child_process';
|
|
37
11
|
import crypto from 'node:crypto';
|
|
@@ -41,10 +15,6 @@ import { getLimits, resolveConfig } from './lib/config-resolver.js';
|
|
|
41
15
|
import { Logger } from './lib/Logger.js';
|
|
42
16
|
import { appendSignal } from './lib/observability/signals-writer.js';
|
|
43
17
|
|
|
44
|
-
// ---------------------------------------------------------------------------
|
|
45
|
-
// Helpers
|
|
46
|
-
// ---------------------------------------------------------------------------
|
|
47
|
-
|
|
48
18
|
function parseArguments(args) {
|
|
49
19
|
let storyId = null;
|
|
50
20
|
let epicId = null;
|
|
@@ -63,10 +33,7 @@ function parseArguments(args) {
|
|
|
63
33
|
}
|
|
64
34
|
|
|
65
35
|
/**
|
|
66
|
-
*
|
|
67
|
-
* (any-match) wins. Table-driven so adding a new pattern doesn't grow the
|
|
68
|
-
* cyclomatic complexity of `classifyFrictionCategory`.
|
|
69
|
-
*
|
|
36
|
+
* First rule with any matching marker wins.
|
|
70
37
|
* @type {ReadonlyArray<{markers: string[], category: string, remediation: string}>}
|
|
71
38
|
*/
|
|
72
39
|
const FRICTION_RULES = [
|
|
@@ -104,51 +71,28 @@ function classifyFrictionCategory(errorOutput) {
|
|
|
104
71
|
}
|
|
105
72
|
|
|
106
73
|
/**
|
|
107
|
-
* `spawnSync`'s
|
|
108
|
-
* SIGTERM observed here almost always means the interceptor's configured
|
|
109
|
-
* `executionTimeoutMs` bound fired. Any other signal — a `SIGKILL` from the
|
|
110
|
-
* OOM killer, an operator `kill -9` — originated outside this process.
|
|
111
|
-
*
|
|
74
|
+
* `spawnSync`'s timeout kills with SIGTERM; any other signal came from outside.
|
|
112
75
|
* @type {string}
|
|
113
76
|
*/
|
|
114
77
|
const INTERCEPTOR_TIMEOUT_SIGNAL = 'SIGTERM';
|
|
115
78
|
|
|
116
79
|
/**
|
|
117
|
-
* A
|
|
118
|
-
*
|
|
119
|
-
* discriminator is `result.error.code`, so a SIGTERM carrying this code is a
|
|
120
|
-
* buffer overflow and must never be reported as a timeout (Story #4915).
|
|
121
|
-
*
|
|
80
|
+
* A maxBuffer overflow is also a SIGTERM; only this error code tells it
|
|
81
|
+
* apart from a timeout.
|
|
122
82
|
* @type {string}
|
|
123
83
|
*/
|
|
124
84
|
const OVERFLOW_ERROR_CODE = 'ENOBUFS';
|
|
125
85
|
|
|
126
|
-
/** Shell convention for "the process died by signal N": exit `128 + N`. */
|
|
127
86
|
const SIGNAL_EXIT_BASE = 128;
|
|
128
87
|
|
|
129
88
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* (Story #4851).
|
|
135
|
-
*
|
|
136
|
-
* Which signal fired is the diagnostic value: SIGTERM points at one of the
|
|
137
|
-
* interceptor's own bounds, anything else at the host. A SIGTERM splits again
|
|
138
|
-
* on `error.code`: `ENOBUFS` means the output blew past `executionMaxBuffer`,
|
|
139
|
-
* anything else means `executionTimeoutMs` fired. Recording that plus the
|
|
140
|
-
* bound itself is what makes the row actionable to a consumer who cannot edit
|
|
141
|
-
* the materialized framework tree.
|
|
142
|
-
*
|
|
143
|
-
* Deliberately module-local and pure — exporting it for tests would fail the
|
|
144
|
-
* `--production` dead-exports ratchet, and folding it into `main` would spend
|
|
145
|
-
* the file's per-file maintainability-delta headroom. The CLI contract is the
|
|
146
|
-
* seam the unit tests drive.
|
|
147
|
-
*
|
|
89
|
+
* For a `null` status, which must never reach `process.exit` (null exits 0).
|
|
90
|
+
* SIGTERM + ENOBUFS = buffer overflow, SIGTERM otherwise = timeout, any other
|
|
91
|
+
* signal = the host. Kept module-local: exporting it for tests would trip the
|
|
92
|
+
* `--production` dead-exports gate.
|
|
148
93
|
* @param {{signal: (string|null), error?: {message?: string, code?: string}}}
|
|
149
|
-
* result
|
|
150
|
-
* @param {{executionTimeoutMs: number, executionMaxBuffer: number}} bounds
|
|
151
|
-
* resolved interceptor bounds — the timeout in ms, the buffer in bytes.
|
|
94
|
+
* result
|
|
95
|
+
* @param {{executionTimeoutMs: number, executionMaxBuffer: number}} bounds
|
|
152
96
|
* @returns {{category: string, remediation: string, details: object,
|
|
153
97
|
* preview: string, exitCode: number}}
|
|
154
98
|
*/
|
|
@@ -244,14 +188,10 @@ function buildFrictionSignal({
|
|
|
244
188
|
ts: new Date().toISOString(),
|
|
245
189
|
epicId: epicId ?? null,
|
|
246
190
|
storyId: storyId ?? null,
|
|
247
|
-
//
|
|
248
|
-
// carry no Task id. The field is retained for schema compatibility
|
|
249
|
-
// and always null.
|
|
191
|
+
// No Task tier; kept for schema compatibility.
|
|
250
192
|
taskId: null,
|
|
251
193
|
category,
|
|
252
|
-
// `
|
|
253
|
-
// command-scan stays authoritative for `source`: a consumer command killed
|
|
254
|
-
// by its own host remains consumer-actionable (Story #4851).
|
|
194
|
+
// `classifySignalSource` scans `emitter.command` first to attribute source.
|
|
255
195
|
emitter: {
|
|
256
196
|
tool: 'diagnose-friction.js',
|
|
257
197
|
command: commandStr,
|
|
@@ -260,10 +200,6 @@ function buildFrictionSignal({
|
|
|
260
200
|
};
|
|
261
201
|
}
|
|
262
202
|
|
|
263
|
-
// ---------------------------------------------------------------------------
|
|
264
|
-
// Main Execution
|
|
265
|
-
// ---------------------------------------------------------------------------
|
|
266
|
-
|
|
267
203
|
export async function main(args = process.argv.slice(2)) {
|
|
268
204
|
const { storyId, epicId, cmdArgs } = parseArguments(args);
|
|
269
205
|
|
|
@@ -273,16 +209,9 @@ export async function main(args = process.argv.slice(2)) {
|
|
|
273
209
|
);
|
|
274
210
|
}
|
|
275
211
|
|
|
276
|
-
//
|
|
277
|
-
//
|
|
278
|
-
//
|
|
279
|
-
// interceptor's OWN invocation, not friction in the wrapped command. It must
|
|
280
|
-
// be reported as one and MUST NOT reach the ledger — otherwise the real
|
|
281
|
-
// friction is discarded and the roll-up eventually auto-files a framework-gap
|
|
282
|
-
// ticket about the framework's own instrumentation being misused. The
|
|
283
|
-
// discriminator is this argv shape, never the ENOENT result: a correctly
|
|
284
|
-
// split command whose binary is genuinely absent yields the identical
|
|
285
|
-
// `spawnSync` result and stays real friction.
|
|
212
|
+
// No shell, so one whitespace-bearing arg is a usage error that must not
|
|
213
|
+
// reach the ledger. Discriminate on argv shape, not ENOENT: a genuinely
|
|
214
|
+
// absent binary yields the same spawn result and is real friction.
|
|
286
215
|
if (cmdArgs.length === 1 && /\s/.test(cmdArgs[0])) {
|
|
287
216
|
throw new Error(
|
|
288
217
|
`Usage: --cmd takes the command as separate argv words, not one quoted string. Received a single quoted argument: "${cmdArgs[0]}". Drop the quotes so each word is its own argv entry — \`--cmd ${cmdArgs[0]}\`. No friction signal was recorded.`,
|
|
@@ -290,13 +219,9 @@ export async function main(args = process.argv.slice(2)) {
|
|
|
290
219
|
}
|
|
291
220
|
|
|
292
221
|
const config = resolveConfig();
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
//
|
|
296
|
-
// `MAX_BUFFER_BYTES` ceiling: it is a reported policy bound whose value the
|
|
297
|
-
// emitted friction row carries (`details.executionMaxBuffer`), not an
|
|
298
|
-
// overflow guard. Story #5009 moved its definition to the shared
|
|
299
|
-
// child-process surface so it is no longer a hand-copied literal here.
|
|
222
|
+
const { executionTimeoutMs } = getLimits();
|
|
223
|
+
// Deliberately below `MAX_BUFFER_BYTES`: a reported policy bound, not an
|
|
224
|
+
// overflow guard.
|
|
300
225
|
const executionMaxBuffer = INTERCEPTOR_MAX_BUFFER_BYTES;
|
|
301
226
|
|
|
302
227
|
const commandStr = cmdArgs.join(' ');
|
|
@@ -313,8 +238,6 @@ export async function main(args = process.argv.slice(2)) {
|
|
|
313
238
|
if (result.stderr) process.stderr.write(result.stderr);
|
|
314
239
|
|
|
315
240
|
if (result.status !== 0) {
|
|
316
|
-
// A `null` status means the child never exited normally; the cause lives in
|
|
317
|
-
// `result.signal`, not in the status.
|
|
318
241
|
const abnormal =
|
|
319
242
|
result.status === null
|
|
320
243
|
? describeAbnormalExit(result, {
|
|
@@ -322,9 +245,6 @@ export async function main(args = process.argv.slice(2)) {
|
|
|
322
245
|
executionMaxBuffer,
|
|
323
246
|
})
|
|
324
247
|
: null;
|
|
325
|
-
// With both streams empty an abnormal termination names its signal; the
|
|
326
|
-
// `Unknown exit code` fallback is therefore reachable only with a real
|
|
327
|
-
// numeric status, never as `Unknown exit code null`.
|
|
328
248
|
const noOutputFallback = abnormal
|
|
329
249
|
? abnormal.preview
|
|
330
250
|
: `Unknown exit code ${result.status}`;
|
|
@@ -340,9 +260,7 @@ export async function main(args = process.argv.slice(2)) {
|
|
|
340
260
|
'Command failed. Appending friction signal to NDJSON stream...',
|
|
341
261
|
);
|
|
342
262
|
|
|
343
|
-
//
|
|
344
|
-
// the kill may have truncated (or never produced), so it cannot name the
|
|
345
|
-
// signal.
|
|
263
|
+
// A killed command's output may be truncated, so it classifies itself.
|
|
346
264
|
const classified = classifyFrictionCategory(errorOutput);
|
|
347
265
|
const category = abnormal?.category ?? classified.category;
|
|
348
266
|
const remediation = abnormal?.remediation ?? classified.remediation;
|
|
@@ -359,11 +277,7 @@ export async function main(args = process.argv.slice(2)) {
|
|
|
359
277
|
terminationDetails: abnormal?.details ?? null,
|
|
360
278
|
});
|
|
361
279
|
|
|
362
|
-
//
|
|
363
|
-
// only the story is resolved, write to the standalone signals
|
|
364
|
-
// stream at `<tempRoot>/standalone/stories/story-<sid>/signals.ndjson`
|
|
365
|
-
// by passing `epicId: null` through to the writer. The only case
|
|
366
|
-
// we still skip is fully-no-context (story unresolved).
|
|
280
|
+
// A null epicId routes to the standalone Story stream.
|
|
367
281
|
if (resolvedStoryId != null) {
|
|
368
282
|
try {
|
|
369
283
|
const ok = await appendSignal({
|
|
@@ -394,18 +308,12 @@ export async function main(args = process.argv.slice(2)) {
|
|
|
394
308
|
Logger.error(remediation);
|
|
395
309
|
Logger.error('----------------------------------------\n');
|
|
396
310
|
|
|
397
|
-
// Never `process.exit(result.status)` on a null status — that exits 0 and
|
|
398
|
-
// reports success for a killed command.
|
|
399
311
|
process.exit(abnormal?.exitCode ?? result.status);
|
|
400
312
|
} else {
|
|
401
313
|
process.exit(0);
|
|
402
314
|
}
|
|
403
315
|
}
|
|
404
316
|
|
|
405
|
-
// ---------------------------------------------------------------------------
|
|
406
|
-
// Call main if run directly
|
|
407
|
-
// ---------------------------------------------------------------------------
|
|
408
|
-
|
|
409
317
|
import { runAsCli } from './lib/cli-utils.js';
|
|
410
318
|
|
|
411
319
|
runAsCli(import.meta.url, main, {
|
|
@@ -57,7 +57,7 @@ const escalateFrom = (value) => value !== false && value !== 'false';
|
|
|
57
57
|
* without a real worktree ledger or a real process kill.
|
|
58
58
|
*
|
|
59
59
|
* Every seam on the optional final `deps` parameter defaults to the real
|
|
60
|
-
* implementation (
|
|
60
|
+
* implementation (`docs/contributing/test-seams.md` rules 1-2, 4), so `main` and
|
|
61
61
|
* every production caller are unchanged.
|
|
62
62
|
*
|
|
63
63
|
* @param {string[]} [argv]
|
|
@@ -1,34 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* branch before opening the PR.
|
|
9
|
-
* If the same gate has already passed against the current `git rev-parse
|
|
10
|
-
* HEAD` (recorded earlier in the local hot path), this wrapper logs a skip
|
|
11
|
-
* and exits 0 instead of re-spawning the runner. On run, a successful
|
|
12
|
-
* gate is recorded so the next invocation can skip in turn.
|
|
13
|
-
*
|
|
14
|
-
* Usage:
|
|
15
|
-
* node .agents/scripts/evidence-gate.js \
|
|
16
|
-
* --standalone --scope-id <storyId> --gate <name> \
|
|
17
|
-
* [--worktree <path>] [--no-evidence] -- <cmd> [args...]
|
|
18
|
-
*
|
|
19
|
-
* Examples:
|
|
20
|
-
* node .agents/scripts/evidence-gate.js --standalone --scope-id 4250 --gate lint \
|
|
21
|
-
* --worktree .worktrees/story-4250 -- npm run lint
|
|
22
|
-
* node .agents/scripts/evidence-gate.js --standalone --scope-id 4250 --gate test \
|
|
23
|
-
* --worktree .worktrees/story-4250 -- npm test
|
|
24
|
-
*
|
|
25
|
-
* `--standalone` (Story #4250) is required: the evidence file is anchored on
|
|
26
|
-
* the Story id at
|
|
27
|
-
* `<tempRoot>/standalone/stories/story-<sid>/validation-evidence.json` — the
|
|
28
|
-
* same keyspace the standalone close consults, so the acceptance-self-eval
|
|
29
|
-
* critic's verify[] runs (lint / typecheck) are shared with the close.
|
|
30
|
-
* v2.0.0 removed the Epic tier along with the `--epic-id` Epic-keyed
|
|
31
|
-
* keyspace.
|
|
4
|
+
* Runs one gate, skipping it when evidence shows the same gate already
|
|
5
|
+
* passed for the current HEAD and tree, and recording a pass for the next
|
|
6
|
+
* caller. `--standalone` is required: it keys evidence by Story id, the same
|
|
7
|
+
* keyspace close consults, so worker-side verify[] runs credit the close.
|
|
32
8
|
*/
|
|
33
9
|
|
|
34
10
|
import { spawnSync } from 'node:child_process';
|
|
@@ -44,12 +20,6 @@ import {
|
|
|
44
20
|
treeFingerprint,
|
|
45
21
|
} from './lib/validation-evidence.js';
|
|
46
22
|
|
|
47
|
-
/**
|
|
48
|
-
* Split argv at the first `--` and return both halves. The wrapper consumes
|
|
49
|
-
* everything before `--`; the runner receives everything after.
|
|
50
|
-
*
|
|
51
|
-
* Exported for testing.
|
|
52
|
-
*/
|
|
53
23
|
export function splitOnDashDash(argv) {
|
|
54
24
|
const idx = argv.indexOf('--');
|
|
55
25
|
if (idx === -1) return { wrapperArgs: argv, runnerArgs: [] };
|
|
@@ -59,11 +29,6 @@ export function splitOnDashDash(argv) {
|
|
|
59
29
|
};
|
|
60
30
|
}
|
|
61
31
|
|
|
62
|
-
/**
|
|
63
|
-
* Parse the wrapper-side argv (before `--`).
|
|
64
|
-
*
|
|
65
|
-
* Exported for testing.
|
|
66
|
-
*/
|
|
67
32
|
export function parseWrapperArgs(argv) {
|
|
68
33
|
const { values } = parseArgs({
|
|
69
34
|
args: argv,
|
|
@@ -96,16 +61,9 @@ function resolveHeadShaDefault(cwd, gitSpawnFn) {
|
|
|
96
61
|
}
|
|
97
62
|
|
|
98
63
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* Both are read from the **spawn** cwd — the Story worktree when one is
|
|
104
|
-
* supplied — so the keys describe the tree the gate actually saw. The tree
|
|
105
|
-
* fingerprint is what keeps this gate credited across close's own base-sync
|
|
106
|
-
* fast-forward, which moves HEAD between the deposit and the gates that would
|
|
107
|
-
* spend it; see `validation-evidence.js#treeFingerprint`.
|
|
108
|
-
*
|
|
64
|
+
* Read from the spawn cwd so the keys describe the tree the gate saw. The
|
|
65
|
+
* tree fingerprint keeps credit across close's base-sync fast-forward, which
|
|
66
|
+
* moves HEAD between deposit and spend.
|
|
109
67
|
* @param {{ spawnCwd: string, gitSpawnFn: Function, useEvidence: boolean }} args
|
|
110
68
|
* @returns {{ headSha: string|null, inputFingerprint: string|null }}
|
|
111
69
|
*/
|
|
@@ -118,34 +76,21 @@ function resolveEvidenceKeys({ spawnCwd, gitSpawnFn, useEvidence }) {
|
|
|
118
76
|
}
|
|
119
77
|
|
|
120
78
|
/**
|
|
121
|
-
* Runner-shaped entry-point: takes the parsed wrapper args + runner args and
|
|
122
|
-
* executes the gate. Pure-ish (modulo IO) — all side-effects are routed via
|
|
123
|
-
* the injection hooks so tests can stub `gitSpawn`, `spawnSync`, and the
|
|
124
|
-
* evidence store without touching disk or spawning processes.
|
|
125
|
-
*
|
|
126
|
-
* Exported for tests + the CLI `main()`.
|
|
127
|
-
*
|
|
128
79
|
* @param {object} params
|
|
129
|
-
* @param {number} params.scopeId
|
|
130
|
-
* @param {boolean} [params.standalone]
|
|
131
|
-
*
|
|
132
|
-
* @param {
|
|
133
|
-
* @param {
|
|
134
|
-
* @param {string}
|
|
135
|
-
*
|
|
136
|
-
* @param {
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* @param {
|
|
140
|
-
* @param {
|
|
141
|
-
* @param {
|
|
142
|
-
* @
|
|
143
|
-
* @param {Function} [deps.shouldSkipFn] — Stub for `shouldSkip`.
|
|
144
|
-
* @param {Function} [deps.recordPassFn] — Stub for `recordPass`.
|
|
145
|
-
* @param {object} [deps.logger] — Logger-shaped object (info/error/warn/fatal).
|
|
146
|
-
* @returns {{ status: number, skipped: boolean }} Outcome summary. `status`
|
|
147
|
-
* is the runner's exit code (0 = pass), `skipped` is true when evidence
|
|
148
|
-
* short-circuited the runner.
|
|
80
|
+
* @param {number} params.scopeId
|
|
81
|
+
* @param {boolean} [params.standalone]
|
|
82
|
+
* @param {string} params.gate
|
|
83
|
+
* @param {boolean} params.useEvidence
|
|
84
|
+
* @param {string} params.cwd — evidence cwd (locates the temp tree)
|
|
85
|
+
* @param {string|null} [params.worktreePath] — spawn cwd and HEAD source
|
|
86
|
+
* @param {string[]} params.runnerArgs
|
|
87
|
+
* @param {object} [deps]
|
|
88
|
+
* @param {Function} [deps.gitSpawnFn]
|
|
89
|
+
* @param {Function} [deps.spawnFn]
|
|
90
|
+
* @param {Function} [deps.shouldSkipFn]
|
|
91
|
+
* @param {Function} [deps.recordPassFn]
|
|
92
|
+
* @param {object} [deps.logger]
|
|
93
|
+
* @returns {{ status: number, skipped: boolean }}
|
|
149
94
|
*/
|
|
150
95
|
export async function runEvidenceGate(params, deps = {}) {
|
|
151
96
|
const {
|
|
@@ -165,9 +110,6 @@ export async function runEvidenceGate(params, deps = {}) {
|
|
|
165
110
|
runnerArgs,
|
|
166
111
|
} = params ?? {};
|
|
167
112
|
|
|
168
|
-
// `--standalone` (Story #4250) routes the evidence file to the
|
|
169
|
-
// storyId-anchored keyspace so the acceptance-self-eval critic can record
|
|
170
|
-
// verify[] evidence into the same keyspace the standalone close consults.
|
|
171
113
|
if (
|
|
172
114
|
!scopeId ||
|
|
173
115
|
!standalone ||
|
|
@@ -180,14 +122,10 @@ export async function runEvidenceGate(params, deps = {}) {
|
|
|
180
122
|
);
|
|
181
123
|
return { status: 1, skipped: false };
|
|
182
124
|
}
|
|
183
|
-
// Evidence-store opts shared by shouldSkip + recordPass below.
|
|
184
125
|
const evidenceStoreOpts = { cwd, standalone };
|
|
185
126
|
|
|
186
|
-
//
|
|
187
|
-
//
|
|
188
|
-
// to the main checkout so the temp tree resolves under the main
|
|
189
|
-
// `.git/`. The HEAD-SHA used as the cache key is read from the spawn cwd
|
|
190
|
-
// (the worktree), so cache entries key against the Story branch's HEAD.
|
|
127
|
+
// The gate runs in the worktree; evidence stays anchored to the main
|
|
128
|
+
// checkout so the temp tree resolves under the main `.git/`.
|
|
191
129
|
const spawnCwd = worktreePath ?? cwd;
|
|
192
130
|
const [cmd, ...cmdArgs] = runnerArgs;
|
|
193
131
|
const configHash = hashCommandConfig({ cmd, args: cmdArgs, cwd: spawnCwd });
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
*
|
|
7
|
-
* and fixing it is not this delivery's job". The rule used to say "file a
|
|
8
|
-
* `meta::framework-gap` issue" and stop, leaving the agent to hand-run
|
|
9
|
-
* `gh issue create` wherever it was standing. This is the mechanism behind
|
|
10
|
-
* that sentence: evidence from the CI digest, ownership routing, fingerprint
|
|
11
|
-
* dedup, the `friction` comment, and the `agent::blocked` flip in one call.
|
|
12
|
-
*
|
|
13
|
-
* It files an **intake** issue, never a Story: `/mandrel-plan <id>` graduates
|
|
14
|
-
* it on the next planning pass. Delivery never blocks on planning — see
|
|
15
|
-
* `lib/orchestration/ci-gap-intake.js` for why that split is load-bearing.
|
|
3
|
+
* CI-remediation Option-2 filing: for a red check that is real but not this
|
|
4
|
+
* delivery's to fix, files (or updates, by fingerprint) an intake issue in
|
|
5
|
+
* the owning repo, comments `friction` on the Story, and optionally blocks it.
|
|
6
|
+
* It files intake, never a Story, so delivery never blocks on planning.
|
|
16
7
|
*/
|
|
17
8
|
|
|
18
9
|
import { parseArgs } from 'node:util';
|
|
@@ -35,7 +26,11 @@ import {
|
|
|
35
26
|
INTAKE_VERDICTS,
|
|
36
27
|
REFUSED_VERDICT,
|
|
37
28
|
} from './lib/orchestration/ci-gap-intake.js';
|
|
38
|
-
import {
|
|
29
|
+
import {
|
|
30
|
+
RERUN_ALLOWANCE_VERDICTS,
|
|
31
|
+
readCiDigest,
|
|
32
|
+
recordRerunAllowance,
|
|
33
|
+
} from './lib/orchestration/ci-rerun-guard.js';
|
|
39
34
|
import {
|
|
40
35
|
STATE_LABELS,
|
|
41
36
|
transitionTicketState,
|
|
@@ -55,7 +50,7 @@ const USAGE = {
|
|
|
55
50
|
],
|
|
56
51
|
[
|
|
57
52
|
'--verdict <verdict>',
|
|
58
|
-
`One of ${INTAKE_VERDICTS.join(' | ')}. "${REFUSED_VERDICT}" is refused: it routes to Option 1, fix at source.`,
|
|
53
|
+
`One of ${INTAKE_VERDICTS.join(' | ')}. "${REFUSED_VERDICT}" is refused: it routes to Option 1, fix at source. ${RERUN_ALLOWANCE_VERDICTS.join(' / ')} also record the one-rerun allowance on the CI digest.`,
|
|
59
54
|
],
|
|
60
55
|
[
|
|
61
56
|
'--owner <bucket>',
|
|
@@ -80,15 +75,9 @@ const USAGE = {
|
|
|
80
75
|
};
|
|
81
76
|
|
|
82
77
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* `gh` is the transport rather than the provider facade because a filing can
|
|
86
|
-
* target a repository other than the configured one, and `gh issue create
|
|
87
|
-
* --repo` is the surface that already does that (the graduators file
|
|
88
|
-
* cross-repo the same way).
|
|
89
|
-
*
|
|
78
|
+
* `gh` rather than the provider facade: a filing may target another repo.
|
|
90
79
|
* @param {object} opts
|
|
91
|
-
* @returns {object}
|
|
80
|
+
* @returns {object}
|
|
92
81
|
*/
|
|
93
82
|
function liveIntakePorts({ provider, searchRepo, cwd, logger }) {
|
|
94
83
|
const labelCache = new Map();
|
|
@@ -100,9 +89,7 @@ function liveIntakePorts({ provider, searchRepo, cwd, logger }) {
|
|
|
100
89
|
repo: searchRepo.repo,
|
|
101
90
|
}),
|
|
102
91
|
createIssue: async ({ owner, repo, title, body, labels }) => {
|
|
103
|
-
// `gh issue create
|
|
104
|
-
// routing label (meta::platform-gap, friction::unreproducible-tier)
|
|
105
|
-
// has to exist before the create — not after it errors.
|
|
92
|
+
// `gh issue create` fails outright on an absent label; ensure first.
|
|
106
93
|
const ensured = await ensureIssueLabels({
|
|
107
94
|
owner,
|
|
108
95
|
repo,
|
|
@@ -132,13 +119,15 @@ function liveIntakePorts({ provider, searchRepo, cwd, logger }) {
|
|
|
132
119
|
}
|
|
133
120
|
|
|
134
121
|
/**
|
|
135
|
-
* Render the `friction` comment the Story carries so the blocker is legible
|
|
136
|
-
* on the ticket itself, not only in the intake issue.
|
|
137
|
-
*
|
|
138
122
|
* @param {object} opts
|
|
139
123
|
* @returns {string}
|
|
140
124
|
*/
|
|
141
|
-
export function renderFrictionComment({
|
|
125
|
+
export function renderFrictionComment({
|
|
126
|
+
verdict,
|
|
127
|
+
result,
|
|
128
|
+
digest,
|
|
129
|
+
rerunAllowance = null,
|
|
130
|
+
}) {
|
|
142
131
|
const target = result.issue?.url ?? result.issue?.number ?? '(not filed)';
|
|
143
132
|
const lines = [
|
|
144
133
|
`### CI gap filed — verdict \`${verdict}\``,
|
|
@@ -158,23 +147,28 @@ export function renderFrictionComment({ verdict, result, digest }) {
|
|
|
158
147
|
`- **Routing:** deferred from \`${result.routing.deferredFrom}\` (${result.routing.deferralReason}) — filed locally instead.`,
|
|
159
148
|
);
|
|
160
149
|
}
|
|
161
|
-
lines.push(
|
|
162
|
-
'',
|
|
163
|
-
'This verdict does **not** license a re-run of the failed job. Graduate the',
|
|
164
|
-
'intake issue with `/mandrel-plan <issue number>` to turn it into a Story.',
|
|
165
|
-
);
|
|
150
|
+
lines.push('', renderRerunLine(rerunAllowance), GRADUATE_LINE);
|
|
166
151
|
return lines.join('\n');
|
|
167
152
|
}
|
|
168
153
|
|
|
154
|
+
const GRADUATE_LINE =
|
|
155
|
+
'Graduate the intake issue with `/mandrel-plan <issue number>` to turn it into a Story.';
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* @param {{ headSha: string } | null} rerunAllowance
|
|
159
|
+
* @returns {string}
|
|
160
|
+
*/
|
|
161
|
+
function renderRerunLine(rerunAllowance) {
|
|
162
|
+
return rerunAllowance
|
|
163
|
+
? 'This verdict is environmental and proven, so **one** rerun of the failed ' +
|
|
164
|
+
`job is now admitted on head \`${rerunAllowance.headSha}\` — and one only. ` +
|
|
165
|
+
'A second red after it is real and routes to Option 1.'
|
|
166
|
+
: 'This verdict does **not** license a re-run of the failed job.';
|
|
167
|
+
}
|
|
168
|
+
|
|
169
169
|
/**
|
|
170
|
-
* File the CI-gap intake issue for one Story, post the `friction` comment,
|
|
171
|
-
* and optionally flip the Story to `agent::blocked`.
|
|
172
|
-
*
|
|
173
|
-
* Every port is injectable so the unit tests exercise the whole command with
|
|
174
|
-
* no network and no live tracker.
|
|
175
|
-
*
|
|
176
170
|
* @param {object} opts
|
|
177
|
-
* @returns {Promise<object>}
|
|
171
|
+
* @returns {Promise<object>}
|
|
178
172
|
*/
|
|
179
173
|
export async function runFileCiGap({
|
|
180
174
|
storyId,
|
|
@@ -198,7 +192,10 @@ export async function runFileCiGap({
|
|
|
198
192
|
throw new Error('--story <id> is required (a positive issue number).');
|
|
199
193
|
}
|
|
200
194
|
const resolved = config ?? resolveConfig();
|
|
201
|
-
|
|
195
|
+
// Must resolve exactly as `pr-watch-with-update.js` does when writing it.
|
|
196
|
+
const digestRoot = tempRoot ?? resolved?.project?.paths?.tempRoot ?? 'temp';
|
|
197
|
+
const ciDigest =
|
|
198
|
+
digest ?? readCiDigest({ storyId: sid, tempRoot: digestRoot, cwd });
|
|
202
199
|
if (!ciDigest) {
|
|
203
200
|
throw new Error(
|
|
204
201
|
`no CI digest for Story #${sid}. The digest is written by \`pr-watch-with-update.js --story ${sid}\` on the first red; without it there is no run link or failure signature to file.`,
|
|
@@ -237,9 +234,24 @@ export async function runFileCiGap({
|
|
|
237
234
|
now,
|
|
238
235
|
});
|
|
239
236
|
|
|
237
|
+
// A proven-environmental verdict earns one same-SHA rerun; never on dry run.
|
|
238
|
+
const rerunAllowance = dryRun
|
|
239
|
+
? null
|
|
240
|
+
: recordRerunAllowance({
|
|
241
|
+
storyId: sid,
|
|
242
|
+
verdict,
|
|
243
|
+
tempRoot: digestRoot,
|
|
244
|
+
cwd,
|
|
245
|
+
});
|
|
246
|
+
|
|
240
247
|
const actions = { commented: false, blocked: false };
|
|
241
248
|
if (!dryRun && ticketing) {
|
|
242
|
-
const body = renderFrictionComment({
|
|
249
|
+
const body = renderFrictionComment({
|
|
250
|
+
verdict,
|
|
251
|
+
result,
|
|
252
|
+
digest: ciDigest,
|
|
253
|
+
rerunAllowance,
|
|
254
|
+
});
|
|
243
255
|
try {
|
|
244
256
|
await upsertStructuredComment(ticketing, sid, 'friction', body);
|
|
245
257
|
actions.commented = true;
|
|
@@ -258,12 +270,10 @@ export async function runFileCiGap({
|
|
|
258
270
|
}
|
|
259
271
|
}
|
|
260
272
|
|
|
261
|
-
return { storyId: sid, verdict, ...result, actions };
|
|
273
|
+
return { storyId: sid, verdict, ...result, actions, rerunAllowance };
|
|
262
274
|
}
|
|
263
275
|
|
|
264
276
|
/**
|
|
265
|
-
* CLI entrypoint.
|
|
266
|
-
*
|
|
267
277
|
* @returns {Promise<void>}
|
|
268
278
|
*/
|
|
269
279
|
async function main() {
|
|
@@ -290,8 +300,6 @@ async function main() {
|
|
|
290
300
|
block: values.block,
|
|
291
301
|
});
|
|
292
302
|
|
|
293
|
-
// Single-line JSON per the script-output contract — an orchestrator parses
|
|
294
|
-
// this, and a pretty dump is noise in a delivery transcript.
|
|
295
303
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
296
304
|
for (const err of result.errors) {
|
|
297
305
|
Logger.error(`[file-ci-gap] ${err}`);
|