mandrel 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,47 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* beats, paste a `node --input-type=module -e` block to build each worker's
|
|
10
|
-
* checklist, and remember to add `--merge-watch-mode async` to every close
|
|
11
|
-
* because close cannot see run topology. Four pieces of bookkeeping, all of
|
|
12
|
-
* them carried in the session's head, each of them silently wrong when
|
|
13
|
-
* forgotten — a dropped `--dispatched` id joins a second worker to a live
|
|
14
|
-
* branch, and a forgotten async flag serializes the run's merge waits.
|
|
15
|
-
*
|
|
16
|
-
* This CLI is that bookkeeping, scripted. One beat per invocation:
|
|
17
|
-
*
|
|
18
|
-
* 1. Tick with `--probe-live`, seeding `dispatched` from the **run ledger**
|
|
19
|
-
* rather than from the caller (`<tempRoot>/run-<id>/ledger.json`).
|
|
20
|
-
* 2. Write one dispatch prompt per ready Story — id, `workCwd` conventions,
|
|
21
|
-
* docs digest path, checklist path, change-set discipline — so the
|
|
22
|
-
* session's spawn is "use this file as the prompt" and nothing else.
|
|
23
|
-
* 3. Print the exact `single-story-close.js` command for every hand-off,
|
|
24
|
-
* with `--merge-watch-mode async` decided from run topology here, where
|
|
25
|
-
* the topology is known.
|
|
26
|
-
*
|
|
27
|
-
* Stdout is one compact JSON envelope (`kind: "deliver-run-beat"`). The
|
|
28
|
-
* tick's exit-code contract is preserved byte for byte — 0 ok · 1 input
|
|
29
|
-
* error · 2 cycle · 3 wedged · 4 blocked — because the loop's stopping rules
|
|
30
|
-
* are the tick's and this script must not invent a second dialect of them.
|
|
31
|
-
*
|
|
32
|
-
* The ledger is append-only on purpose, which is also its one sharp edge: an
|
|
33
|
-
* id whose spawn never reached `single-story-init.js` stays in it, is withheld
|
|
34
|
-
* as in flight on every later beat, and the run reads as "waiting" forever.
|
|
35
|
-
* The beat therefore reports every ledgered id live state still calls
|
|
36
|
-
* `agent::ready` in `stalledDispatch[]` with the recovery in
|
|
37
|
-
* `stalledDispatchReason`. It never auto-releases one: a slow init and a dead
|
|
38
|
-
* spawn are indistinguishable at this altitude, and releasing the first joins
|
|
39
|
-
* a second worker to a live branch (Story #5363).
|
|
40
|
-
*
|
|
41
|
-
* Scheduling itself is untouched: the ready set, the concurrency cap, the
|
|
42
|
-
* footprint guard and the foreign-lease withholding all come from
|
|
43
|
-
* `stories-wave-tick.js#runProbedStoriesWaveTick`. This is a ledger, a
|
|
44
|
-
* prompt writer and a command renderer around that one beat.
|
|
4
|
+
* One beat of a multi-Story `/mandrel-deliver` run: tick from live state with
|
|
5
|
+
* the run ledger as the dispatched list, write a dispatch prompt per ready
|
|
6
|
+
* Story, and render each hand-off's close command. Scheduling is entirely the
|
|
7
|
+
* tick's, and so is the exit-code contract — the loop's stopping rules must
|
|
8
|
+
* not get a second dialect.
|
|
45
9
|
*/
|
|
46
10
|
|
|
47
11
|
import { createHash } from 'node:crypto';
|
|
@@ -92,15 +56,10 @@ const USAGE = {
|
|
|
92
56
|
};
|
|
93
57
|
|
|
94
58
|
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
* The identity must be the same on every beat of one run (so the ledger is
|
|
98
|
-
* found again) and different across runs (so two concurrent deliveries do not
|
|
99
|
-
* share a dispatched list). The sorted id set is the only thing that satisfies
|
|
100
|
-
* both — a timestamp fails the first, and a single id fails the second.
|
|
101
|
-
*
|
|
59
|
+
* Stable across beats of one run, distinct across concurrent runs — only the
|
|
60
|
+
* sorted id set satisfies both.
|
|
102
61
|
* @param {number[]} ids
|
|
103
|
-
* @returns {string}
|
|
62
|
+
* @returns {string}
|
|
104
63
|
*/
|
|
105
64
|
export function deriveRunId(ids) {
|
|
106
65
|
const key = [...new Set(ids)].sort((a, b) => a - b).join(',');
|
|
@@ -108,13 +67,8 @@ export function deriveRunId(ids) {
|
|
|
108
67
|
}
|
|
109
68
|
|
|
110
69
|
/**
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
* A ledger that cannot be read is treated as empty rather than fatal: the
|
|
114
|
-
* consequence is one extra beat of the init window (which `--dispatched`
|
|
115
|
-
* existed to close), whereas refusing the beat would strand a live run on a
|
|
116
|
-
* bookkeeping artifact.
|
|
117
|
-
*
|
|
70
|
+
* An unreadable ledger is empty, not fatal: refusing the beat would strand a
|
|
71
|
+
* live run on a bookkeeping artifact.
|
|
118
72
|
* @param {string} ledgerPath
|
|
119
73
|
* @param {{ readFileFn?: (p: string, enc: string) => string }} [deps]
|
|
120
74
|
* @returns {number[]}
|
|
@@ -139,18 +93,15 @@ export function readLedgerDispatched(
|
|
|
139
93
|
}
|
|
140
94
|
|
|
141
95
|
/**
|
|
142
|
-
*
|
|
143
|
-
* this beat. Append-only by construction: nothing here removes an id, so the
|
|
144
|
-
* caller cannot get the "forgot to re-list one" failure `--dispatched` had.
|
|
145
|
-
*
|
|
96
|
+
* Append-only: nothing removes an id, so none can be forgotten.
|
|
146
97
|
* @param {object} args
|
|
147
98
|
* @param {string} args.ledgerPath
|
|
148
99
|
* @param {string} args.runId
|
|
149
100
|
* @param {number[]} args.stories
|
|
150
|
-
* @param {number[]} args.dispatched
|
|
151
|
-
* @param {number[]} args.ready
|
|
101
|
+
* @param {number[]} args.dispatched
|
|
102
|
+
* @param {number[]} args.ready
|
|
152
103
|
* @param {{ writeFileFn?: (p: string, c: string, enc: string) => void }} [deps]
|
|
153
|
-
* @returns {number[]}
|
|
104
|
+
* @returns {number[]}
|
|
154
105
|
*/
|
|
155
106
|
function writeLedger(
|
|
156
107
|
{ ledgerPath, runId, stories, dispatched, ready },
|
|
@@ -169,16 +120,8 @@ function writeLedger(
|
|
|
169
120
|
}
|
|
170
121
|
|
|
171
122
|
/**
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
* `--merge-watch-mode async` is a **run-topology** decision, which is why it
|
|
175
|
-
* is made here: the close process sees one Story and cannot tell whether a
|
|
176
|
-
* sibling is queued behind its merge wait. On a multi-Story run the serialized
|
|
177
|
-
* close tail is the dominant cost, and each synchronous close holds the
|
|
178
|
-
* foreground for its full merge wait before the next may start; on a run of
|
|
179
|
-
* one there is no sibling to unblock and the sync default reaches `landed`
|
|
180
|
-
* fastest.
|
|
181
|
-
*
|
|
123
|
+
* `--merge-watch-mode async` is a run-topology call close cannot make: with
|
|
124
|
+
* siblings, sync closes serialize every merge wait; alone, sync lands fastest.
|
|
182
125
|
* @param {{ storyId: number, mainRepo: string, storyCount: number }} args
|
|
183
126
|
* @returns {string}
|
|
184
127
|
*/
|
|
@@ -194,15 +137,13 @@ export function renderCloseCommand({ storyId, mainRepo, storyCount }) {
|
|
|
194
137
|
}
|
|
195
138
|
|
|
196
139
|
/**
|
|
197
|
-
*
|
|
198
|
-
* session's `Agent` call is this file and nothing else.
|
|
199
|
-
*
|
|
140
|
+
* The whole spawn payload for one ready Story.
|
|
200
141
|
* @param {object} args
|
|
201
142
|
* @param {number} args.storyId
|
|
202
143
|
* @param {string} args.mainRepo
|
|
203
144
|
* @param {string|null} args.docsDigestPath
|
|
204
145
|
* @param {string|null} args.checklistPath
|
|
205
|
-
* @returns {string}
|
|
146
|
+
* @returns {string}
|
|
206
147
|
*/
|
|
207
148
|
export function renderDispatchPrompt({
|
|
208
149
|
storyId,
|
|
@@ -266,11 +207,9 @@ export function renderDispatchPrompt({
|
|
|
266
207
|
}
|
|
267
208
|
|
|
268
209
|
/**
|
|
269
|
-
* Build one ready Story's dispatch prompt file and return its entry.
|
|
270
|
-
*
|
|
271
210
|
* @param {object} args
|
|
272
211
|
* @param {number} args.storyId
|
|
273
|
-
* @param {string} args.body
|
|
212
|
+
* @param {string} args.body
|
|
274
213
|
* @param {string} args.runTempDir
|
|
275
214
|
* @param {string} args.mainRepo
|
|
276
215
|
* @param {string|null} args.docsDigestPath
|
|
@@ -287,17 +226,12 @@ function buildDispatchEntry(
|
|
|
287
226
|
let changes = [];
|
|
288
227
|
let references = [];
|
|
289
228
|
try {
|
|
290
|
-
//
|
|
291
|
-
// `.body`, not at the top level. The retired `node -e` snippet in
|
|
292
|
-
// `helpers/deliver-reference.md` destructured the top level and so built
|
|
293
|
-
// every checklist from an empty footprint.
|
|
229
|
+
// Path entries live on `.body`, not at the top level of the parse result.
|
|
294
230
|
const { body: parsed } = parseStoryBody(body ?? '');
|
|
295
231
|
changes = parsed?.changes ?? [];
|
|
296
232
|
references = parsed?.references ?? [];
|
|
297
233
|
} catch {
|
|
298
|
-
//
|
|
299
|
-
// dispatch: the worker reads the real Story body itself, and close-scope
|
|
300
|
-
// lens coverage runs maker-blind regardless.
|
|
234
|
+
// Costs the checklist, never the dispatch: the worker reads the body itself.
|
|
301
235
|
changes = [];
|
|
302
236
|
references = [];
|
|
303
237
|
}
|
|
@@ -322,10 +256,7 @@ function buildDispatchEntry(
|
|
|
322
256
|
}
|
|
323
257
|
|
|
324
258
|
/**
|
|
325
|
-
*
|
|
326
|
-
* unfilled dispatch slot is explained in a single place.
|
|
327
|
-
*
|
|
328
|
-
* @param {object} envelope the tick envelope
|
|
259
|
+
* @param {object} envelope
|
|
329
260
|
* @returns {Array<{id: number, blockedBy: number, reason: string, paths: string[]}>}
|
|
330
261
|
*/
|
|
331
262
|
function collectWithheld(envelope) {
|
|
@@ -348,21 +279,11 @@ function collectWithheld(envelope) {
|
|
|
348
279
|
}
|
|
349
280
|
|
|
350
281
|
/**
|
|
351
|
-
*
|
|
352
|
-
*
|
|
353
|
-
*
|
|
354
|
-
* **Report, do not release.** A slow `single-story-init.js` and a spawn that
|
|
355
|
-
* died before reaching one look identical from here, and releasing the first
|
|
356
|
-
* re-dispatches a live Story onto its own branch — the exact failure the
|
|
357
|
-
* ledger exists to prevent. So the beat names the id and hands the operator
|
|
358
|
-
* the two things the call needs: where the ledger lives, and the flag that
|
|
359
|
-
* pins the run directory once they have edited it. Neither is derivable from
|
|
360
|
-
* the envelope's other fields, which is why both are spelled out here rather
|
|
361
|
-
* than left to a reader of the source.
|
|
362
|
-
*
|
|
282
|
+
* Report, never release: a slow init and a dead spawn look identical here,
|
|
283
|
+
* and releasing the first re-dispatches a live Story onto its own branch.
|
|
363
284
|
* @param {number[]} ids
|
|
364
285
|
* @param {{ ledgerPath: string, runId: string }} run
|
|
365
|
-
* @returns {string|null}
|
|
286
|
+
* @returns {string|null}
|
|
366
287
|
*/
|
|
367
288
|
export function renderStalledDispatchReason(ids, { ledgerPath, runId }) {
|
|
368
289
|
if (!Array.isArray(ids) || ids.length === 0) return null;
|
|
@@ -381,9 +302,7 @@ export function renderStalledDispatchReason(ids, { ledgerPath, runId }) {
|
|
|
381
302
|
}
|
|
382
303
|
|
|
383
304
|
/**
|
|
384
|
-
*
|
|
385
|
-
* `kind` never has to special-case the failure.
|
|
386
|
-
*
|
|
305
|
+
* Shaped like a beat envelope so callers branching on `kind` need no special case.
|
|
387
306
|
* @param {string} message
|
|
388
307
|
* @returns {{ envelope: object, exitCode: 1 }}
|
|
389
308
|
*/
|
|
@@ -395,8 +314,6 @@ function inputError(message) {
|
|
|
395
314
|
}
|
|
396
315
|
|
|
397
316
|
/**
|
|
398
|
-
* Resolve the ids for `--stories` and `--handoff`, or the error to report.
|
|
399
|
-
*
|
|
400
317
|
* @param {{ stories?: string, handoff?: string[] }} args
|
|
401
318
|
* @returns {{ ids: number[]|null, handoffIds: number[], error: string|null }}
|
|
402
319
|
*/
|
|
@@ -431,21 +348,15 @@ export function resolveRunIds({ stories, handoff }) {
|
|
|
431
348
|
}
|
|
432
349
|
|
|
433
350
|
/**
|
|
434
|
-
* Run one beat: tick, write the dispatch prompts, persist the ledger, render
|
|
435
|
-
* the close commands, and shape the envelope.
|
|
436
|
-
*
|
|
437
|
-
* Every collaborator is injectable so the beat is testable without a provider,
|
|
438
|
-
* a network call or the repository's own temp root.
|
|
439
|
-
*
|
|
440
351
|
* @param {object} args
|
|
441
|
-
* @param {string} args.stories
|
|
442
|
-
* @param {string[]} [args.handoff]
|
|
443
|
-
* @param {string} [args.concurrency]
|
|
444
|
-
* @param {string} [args.runId]
|
|
445
|
-
* @param {string} [args.cwd]
|
|
446
|
-
* @param {object} [args.config]
|
|
447
|
-
* @param {Function} [args.probe]
|
|
448
|
-
* @param {Function} [args.context]
|
|
352
|
+
* @param {string} args.stories
|
|
353
|
+
* @param {string[]} [args.handoff]
|
|
354
|
+
* @param {string} [args.concurrency]
|
|
355
|
+
* @param {string} [args.runId]
|
|
356
|
+
* @param {string} [args.cwd]
|
|
357
|
+
* @param {object} [args.config]
|
|
358
|
+
* @param {Function} [args.probe]
|
|
359
|
+
* @param {Function} [args.context]
|
|
449
360
|
* @param {object} [deps]
|
|
450
361
|
* @returns {Promise<{ envelope: object, exitCode: number }>}
|
|
451
362
|
*/
|
|
@@ -492,10 +403,7 @@ export async function runDeliverRunBeat(
|
|
|
492
403
|
} = await tickFn({
|
|
493
404
|
stories,
|
|
494
405
|
concurrency,
|
|
495
|
-
//
|
|
496
|
-
// the probe unions it into the label-derived in-flight set and then
|
|
497
|
-
// filters it against live state, so an id that has since gone done is
|
|
498
|
-
// dropped rather than pinned in flight forever.
|
|
406
|
+
// Additive, never authoritative: the probe filters it against live state.
|
|
499
407
|
dispatched: ledgered.join(','),
|
|
500
408
|
cwd: mainRepo,
|
|
501
409
|
...(config ? { config } : {}),
|
|
@@ -563,10 +471,7 @@ export async function runDeliverRunBeat(
|
|
|
563
471
|
blocked: tick.blocked ?? [],
|
|
564
472
|
blockedReason: tick.blockedReason ?? null,
|
|
565
473
|
foreignHeld: tick.foreignHeld ?? [],
|
|
566
|
-
//
|
|
567
|
-
// it: a footprint withhold names a blocking peer Story and its colliding
|
|
568
|
-
// paths, and a stalled dispatch has neither — it names a recovery the
|
|
569
|
-
// operator owns.
|
|
474
|
+
// Not in `withheld[]`: it has no blocking peer, only an operator recovery.
|
|
570
475
|
stalledDispatch,
|
|
571
476
|
stalledDispatchReason: renderStalledDispatchReason(stalledDispatch, {
|
|
572
477
|
ledgerPath,
|
|
@@ -579,8 +484,6 @@ export async function runDeliverRunBeat(
|
|
|
579
484
|
}
|
|
580
485
|
|
|
581
486
|
/**
|
|
582
|
-
* Parse argv into the beat's inputs.
|
|
583
|
-
*
|
|
584
487
|
* @param {string[]} argv
|
|
585
488
|
* @returns {{ stories?: string, handoff: string[], concurrency?: string, runId?: string, cwd?: string }}
|
|
586
489
|
*/
|
|
@@ -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]
|