mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,43 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* runtime-friction.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Friction telemetry was **opt-in**: a `friction` record existed only when
|
|
8
|
-
* an agent volunteered a `diagnose-friction.js --story <id> --cmd <...>`
|
|
9
|
-
* call. `plan-run-epilogue.js`'s `follow-up-rollup` then read an empty
|
|
10
|
-
* `signals.ndjson` and truthfully reported "No friction signals — nothing
|
|
11
|
-
* to follow up". A 7-Story run containing a mid-run git outage, a parked
|
|
12
|
-
* worker needing an operator resume, and a four-round acceptance critic
|
|
13
|
-
* produced a **zero-signal retro** — because the stream is least likely to
|
|
14
|
-
* fill exactly when a run is going badly and the agent is busy.
|
|
15
|
-
*
|
|
16
|
-
* This module closes that gap from the other side: the runtime emits
|
|
17
|
-
* friction from what it *already knows*, at the point it already knows it.
|
|
18
|
-
* No agent cooperation required.
|
|
19
|
-
*
|
|
20
|
-
* ## Not a second channel
|
|
21
|
-
*
|
|
22
|
-
* These records go through the **existing** `appendSignal` path, carry the
|
|
23
|
-
* **existing** `kind: 'friction'` shape, and land in the **same**
|
|
24
|
-
* `signals.ndjson` stream `diagnose-friction.js` writes and the roll-up
|
|
25
|
-
* reads. The only thing that is new is *who* decides to write.
|
|
26
|
-
*
|
|
27
|
-
* Deliberately distinct from {@link ../gates/friction.js}'s
|
|
28
|
-
* `emitFrictionSignal`, which early-returns unless **both** `storyId` and
|
|
29
|
-
* `epicId` are truthy. Every v2 Story is standalone (`epicId: null` — see
|
|
30
|
-
* `temp-paths.storyTempDir`'s standalone branch), and the roll-up reads the
|
|
31
|
-
* standalone stream via `forEachLine(null, sid, ...)`. Routing runtime
|
|
32
|
-
* friction through the gate helper would drop **every** record on the floor,
|
|
33
|
-
* silently, which is the bug this Story exists to fix.
|
|
34
|
-
*
|
|
35
|
-
* ## Robustness contract
|
|
36
|
-
*
|
|
37
|
-
* Observability MUST NOT halt the runner (`signals-writer.js`; the
|
|
38
|
-
* `docs/patterns.md` friction pattern). Every export here is best-effort:
|
|
39
|
-
* it swallows its own failures after a `Logger.warn` and resolves `false`.
|
|
40
|
-
* A missing signal is strictly preferable to a broken close.
|
|
2
|
+
* runtime-friction.js — emit friction signals from what the runtime already
|
|
3
|
+
* knows. Not via `gates/friction.js`, which drops records without an
|
|
4
|
+
* `epicId` (every v2 Story has none). Best-effort: failures log and resolve
|
|
5
|
+
* `false`.
|
|
41
6
|
*
|
|
42
7
|
* @module lib/observability/runtime-friction
|
|
43
8
|
*/
|
|
@@ -48,75 +13,24 @@ import { Logger } from '../Logger.js';
|
|
|
48
13
|
import { appendSignal, forEachLine } from './signals-writer.js';
|
|
49
14
|
|
|
50
15
|
/**
|
|
51
|
-
* The
|
|
52
|
-
*
|
|
53
|
-
* Values are plain strings by design: `signal-event.schema.json` types
|
|
54
|
-
* `category` as a free-form `{ type: 'string', minLength: 1 }`, so no schema
|
|
55
|
-
* change is required to add one. They are frozen here so the emitters and
|
|
56
|
-
* their tests name the same literal instead of spreading it.
|
|
57
|
-
*
|
|
58
|
-
* Category choice is load-bearing for the retro: `retro-proposals.js`
|
|
59
|
-
* aggregates **by exact category string**, so these are deliberately coarse
|
|
60
|
-
* — one bucket per failure mode — rather than per-incident. Two Stories that
|
|
61
|
-
* hit the same wall in one run aggregate to `occurrences: 2` and route as a
|
|
62
|
-
* real proposal instead of being discarded as two unrelated singletons.
|
|
16
|
+
* The retro aggregates by exact category string, so each is one coarse
|
|
17
|
+
* bucket per failure mode.
|
|
63
18
|
*/
|
|
64
19
|
export const RUNTIME_FRICTION_CATEGORIES = Object.freeze({
|
|
65
|
-
/** A Story was parked at `agent::blocked` — the HITL pause (§ 1.J). */
|
|
66
20
|
STORY_BLOCKED: 'story-blocked',
|
|
67
|
-
/** A close run ended on a `failed` terminal (non-zero exit). */
|
|
68
21
|
CLOSE_FAILED: 'close-failed',
|
|
69
|
-
/** A bounded merge wait expired with the PR still in flight. */
|
|
70
22
|
MERGE_WAIT_EXHAUSTED: 'merge-wait-exhausted',
|
|
71
|
-
/**
|
|
72
|
-
* A review/lens tool failed to *execute* (binary missing, unparseable
|
|
73
|
-
* output, materialization crash) — an operational degradation, not a code
|
|
74
|
-
* finding. Story #4699 routes these here so findings severity tiers
|
|
75
|
-
* reflect code findings only.
|
|
76
|
-
*/
|
|
23
|
+
/** A tool failed to execute — kept out of code-finding severity tiers. */
|
|
77
24
|
TOOL_DEGRADED: 'tool-degraded',
|
|
78
|
-
/**
|
|
79
|
-
* The light delivery path refused a scope — a suitability-gate escalation
|
|
80
|
-
* or a blocked diff backstop. Story #4856 added it because neither rejection
|
|
81
|
-
* emitted anything, so an over-tight ceiling could only reach the framework
|
|
82
|
-
* as anecdote; the roll-up aggregating these by category is what makes the
|
|
83
|
-
* ceilings recalibratable from recorded evidence.
|
|
84
|
-
*/
|
|
85
25
|
LIGHT_SCOPE_REJECTED: 'light-scope-rejected',
|
|
86
|
-
/**
|
|
87
|
-
* An operator overrode a Story-scope code-review critical blocker with
|
|
88
|
-
* `--override-review-block <reason>`. Deliberately its own
|
|
89
|
-
* bucket: this is the one signal that says a gate's verdict was rejected by
|
|
90
|
-
* a human who then shipped anyway, so a rising `occurrences` count is direct
|
|
91
|
-
* evidence the gate is miscalibrated rather than the code being bad. It is
|
|
92
|
-
* *not* `TOOL_DEGRADED` — the tool ran fine and produced a verdict; what
|
|
93
|
-
* failed was the verdict's usefulness.
|
|
94
|
-
*/
|
|
26
|
+
/** A human shipped over a review blocker; a rising count means miscalibration. */
|
|
95
27
|
REVIEW_BLOCK_OVERRIDDEN: 'review-block-overridden',
|
|
96
28
|
});
|
|
97
29
|
|
|
98
30
|
/**
|
|
99
|
-
* The
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* the retro composer aggregates, de-duplicates and labels on the category
|
|
103
|
-
* string ALONE — so an empty-diff refusal and a `public-api` sensitive-path
|
|
104
|
-
* refusal landed in one bucket and filed one "recurred 2 times across 2
|
|
105
|
-
* Stories" follow-up whose two occurrences had nothing in common but the
|
|
106
|
-
* category (issue #5237; consumer Beestera/swarm-os#2408). The roll-up's shape
|
|
107
|
-
* fingerprint could not separate them either: it hashes detail KEYS, and every
|
|
108
|
-
* refusal carries an identical key set.
|
|
109
|
-
*
|
|
110
|
-
* Encoding the refusal class in the category is what splits them, and it
|
|
111
|
-
* splits them in every consumer at once — bucket aggregation, the graduator's
|
|
112
|
-
* idempotency marker and the `friction::<category>` label all read this one
|
|
113
|
-
* string. N refusals of the SAME class still coalesce, which is the recurrence
|
|
114
|
-
* evidence the light ceilings are recalibrated from. New categories need no
|
|
115
|
-
* seeding: the graduator mints missing `friction::*` labels before filing.
|
|
116
|
-
*
|
|
117
|
-
* A class-less refusal keeps the bare category unchanged — that is the
|
|
118
|
-
* suitability gate, which refuses a prompt before any diff exists and so has
|
|
119
|
-
* no diff-derived class to carry.
|
|
31
|
+
* The refusal class rides in the category because aggregation, graduator
|
|
32
|
+
* idempotency and the `friction::*` label all key on it; a class-less
|
|
33
|
+
* refusal keeps the bare category.
|
|
120
34
|
*
|
|
121
35
|
* @param {string|null} [refusalClass] A
|
|
122
36
|
* {@link module:lib/orchestration/light-suitability.LIGHT_REFUSAL_CLASSES}
|
|
@@ -150,19 +64,15 @@ function positiveIntOrNull(value) {
|
|
|
150
64
|
}
|
|
151
65
|
|
|
152
66
|
/**
|
|
153
|
-
* Append one
|
|
154
|
-
* stream. Best-effort: never throws, never rejects.
|
|
155
|
-
*
|
|
156
|
-
* `epicId` defaults to `null` (the standalone-Story stream) because that is
|
|
157
|
-
* where v2 Stories live and where the roll-up reads.
|
|
67
|
+
* Append one `friction` record. Never throws.
|
|
158
68
|
*
|
|
159
69
|
* @param {object} args
|
|
160
70
|
* @param {number} args.storyId
|
|
161
71
|
* @param {number|null} [args.epicId]
|
|
162
|
-
* @param {string} args.category
|
|
163
|
-
* @param {string} args.tool
|
|
164
|
-
* @param {object} [args.details]
|
|
165
|
-
* @param {object} [args.config]
|
|
72
|
+
* @param {string} args.category
|
|
73
|
+
* @param {string} args.tool
|
|
74
|
+
* @param {object} [args.details]
|
|
75
|
+
* @param {object} [args.config]
|
|
166
76
|
* @returns {Promise<boolean>} true when a record was appended.
|
|
167
77
|
*/
|
|
168
78
|
export async function emitRuntimeFriction({
|
|
@@ -175,8 +85,6 @@ export async function emitRuntimeFriction({
|
|
|
175
85
|
} = {}) {
|
|
176
86
|
const sid = positiveIntOrNull(storyId);
|
|
177
87
|
if (sid === null) {
|
|
178
|
-
// No Story context → no stream to write to. Not an error: some close
|
|
179
|
-
// paths (a usage error before the id is parsed) genuinely have none.
|
|
180
88
|
return false;
|
|
181
89
|
}
|
|
182
90
|
if (typeof category !== 'string' || category.trim() === '') {
|
|
@@ -190,8 +98,6 @@ export async function emitRuntimeFriction({
|
|
|
190
98
|
ts: new Date().toISOString(),
|
|
191
99
|
epicId: positiveIntOrNull(epicId),
|
|
192
100
|
storyId: sid,
|
|
193
|
-
// 2-tier hierarchy (Epic #3163): no Task tier. Retained for schema
|
|
194
|
-
// compatibility and always null — mirrors diagnose-friction.js.
|
|
195
101
|
taskId: null,
|
|
196
102
|
category: category.trim(),
|
|
197
103
|
emitter: { tool: tool || 'runtime-friction' },
|
|
@@ -206,9 +112,6 @@ export async function emitRuntimeFriction({
|
|
|
206
112
|
config,
|
|
207
113
|
});
|
|
208
114
|
} catch (err) {
|
|
209
|
-
// `appendSignal` already swallows its own I/O failures; this catch is
|
|
210
|
-
// defense in depth so a surprise (a poisoned config, a throwing
|
|
211
|
-
// validator) still cannot take down the path being observed.
|
|
212
115
|
Logger.warn(
|
|
213
116
|
`[runtime-friction] append failed for Story #${sid} (${category}): ${
|
|
214
117
|
err instanceof Error ? err.message : String(err)
|
|
@@ -219,25 +122,13 @@ export async function emitRuntimeFriction({
|
|
|
219
122
|
}
|
|
220
123
|
|
|
221
124
|
/**
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
* A transient block that self-resolves — lease contention or a stale label
|
|
226
|
-
* read under concurrent shared-checkout pressure (swarm-os friction #581) —
|
|
227
|
-
* still fired a `story-blocked` record at the block flip, which the retro
|
|
228
|
-
* composer counts toward the `story-blocked` recurrence total exactly like a
|
|
229
|
-
* terminal block. This emits a companion `story-blocked` record carrying the
|
|
230
|
-
* `details.recovered: true` discriminator, so the composer can net the whole
|
|
231
|
-
* incident out (see `retro-proposals.js`). The category is deliberately kept
|
|
232
|
-
* as `story-blocked` rather than a new bucket: a distinct category would
|
|
233
|
-
* itself aggregate into a routable proposal, re-introducing the noise.
|
|
234
|
-
*
|
|
235
|
-
* Best-effort; never throws.
|
|
125
|
+
* A `recovered: true` `story-blocked` record on leaving `agent::blocked`, so
|
|
126
|
+
* the retro nets the block out (same category, or it would aggregate itself).
|
|
236
127
|
*
|
|
237
128
|
* @param {object} args
|
|
238
129
|
* @param {number} args.storyId
|
|
239
|
-
* @param {string} [args.fromState]
|
|
240
|
-
* @param {string} [args.toState]
|
|
130
|
+
* @param {string} [args.fromState]
|
|
131
|
+
* @param {string} [args.toState]
|
|
241
132
|
* @param {object} [args.config]
|
|
242
133
|
* @returns {Promise<boolean>} true when a record was appended.
|
|
243
134
|
*/
|
|
@@ -261,56 +152,16 @@ export async function emitBlockRecoveredFriction({
|
|
|
261
152
|
}
|
|
262
153
|
|
|
263
154
|
/**
|
|
264
|
-
*
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
* An incident that fires once — a transient block, a CI/lease/GitHub fault at
|
|
270
|
-
* close, a merge wait that outran one window — but is provably resolved by the
|
|
271
|
-
* time the Story lands still left an un-netted record on the stream, which the
|
|
272
|
-
* composer counts exactly like an incident that never recovered. This appends
|
|
273
|
-
* the companion record carrying the `recovered: true` discriminator in the
|
|
274
|
-
* **same** `category` (a distinct bucket would itself aggregate into a routable
|
|
275
|
-
* proposal, re-introducing the noise), so `netOutRecoveredIncidents` /
|
|
276
|
-
* `deriveUnresolvedBlockedEvents` in `retro-proposals.js` can cancel the whole
|
|
277
|
-
* `(category, storyId)` incident out.
|
|
278
|
-
*
|
|
279
|
-
* **Why this is not emitted from `frictionForTerminal`.** A `landed` terminal
|
|
280
|
-
* envelope is emitted at the very END of close — *after* the post-land tail
|
|
281
|
-
* has already gathered the signal stream and filed its follow-ups. A marker
|
|
282
|
-
* written there would arrive too late to net anything out of the run that
|
|
283
|
-
* produced it. So the emit hangs off `runPostLandTail`, which is the single
|
|
284
|
-
* shared land point (reached from both the in-close land and the standalone
|
|
285
|
-
* `single-story-confirm-merge.js` resume) and runs BEFORE follow-up capture.
|
|
286
|
-
* The tail runs *because* the PR merged, so every incident on the stream is
|
|
287
|
-
* provably resolved at that point.
|
|
288
|
-
*
|
|
289
|
-
* **Conditional on an actual incident.** The marker is appended only when the
|
|
290
|
-
* Story's stream already carries an un-recovered record in `category`. Emitting
|
|
291
|
-
* unconditionally on every land would write a category-mislabelled row for
|
|
292
|
-
* Stories that never had the incident — and, because the netting is per
|
|
293
|
-
* `(category, storyId)` over the cumulative stream, that spurious marker would
|
|
294
|
-
* suppress the Story's whole bucket for `category`, making it un-routable at
|
|
295
|
-
* story scope for a Story that never hit the incident at all.
|
|
296
|
-
*
|
|
297
|
-
* What this guard does NOT do is bound the netting once a *legitimate* marker
|
|
298
|
-
* exists. The netting inherits the Story #4622 coarsening — per
|
|
299
|
-
* `(category, storyId)` across the whole stream, not 1:1 pairing — so a
|
|
300
|
-
* later, genuinely un-landed record in `category` for a Story that already
|
|
301
|
-
* recovered once is still netted away, and does not even reach `discarded`.
|
|
302
|
-
* Reaching that needs a re-close after a land (a confirm-merge resume, or a
|
|
303
|
-
* close after a revert). Deliberate, inherited, and called out here rather
|
|
304
|
-
* than papered over: an aggregate is a routing heuristic, not an incident
|
|
305
|
-
* ledger.
|
|
306
|
-
*
|
|
307
|
-
* Best-effort; never throws. A read failure yields no marker (the incident
|
|
308
|
-
* stays counted) rather than a speculative write.
|
|
155
|
+
* On land, emit a `recovered: true` marker in `category` so the retro nets
|
|
156
|
+
* the `(category, storyId)` incident out. Hung off `runPostLandTail` because
|
|
157
|
+
* the `landed` envelope arrives after follow-ups are already filed. Only
|
|
158
|
+
* emitted over an existing un-recovered record — otherwise it would suppress
|
|
159
|
+
* a bucket the Story never hit. A read failure emits nothing.
|
|
309
160
|
*
|
|
310
161
|
* @param {object} args
|
|
311
162
|
* @param {number} args.storyId
|
|
312
|
-
* @param {string} args.category
|
|
313
|
-
* @param {string} [args.tool]
|
|
163
|
+
* @param {string} args.category
|
|
164
|
+
* @param {string} [args.tool]
|
|
314
165
|
* @param {object} [args.config]
|
|
315
166
|
* @returns {Promise<boolean>} true when a record was appended.
|
|
316
167
|
*/
|
|
@@ -352,7 +203,6 @@ export async function emitRecoveredFrictionMarker({
|
|
|
352
203
|
);
|
|
353
204
|
return false;
|
|
354
205
|
}
|
|
355
|
-
// Nothing to cancel, or already cancelled — a second marker would be noise.
|
|
356
206
|
if (!incident || recovered) return false;
|
|
357
207
|
|
|
358
208
|
return emitRuntimeFriction({
|
|
@@ -365,12 +215,6 @@ export async function emitRecoveredFrictionMarker({
|
|
|
365
215
|
}
|
|
366
216
|
|
|
367
217
|
/**
|
|
368
|
-
* Emit the recovery counterpart of a `close-failed` record when a Story's
|
|
369
|
-
* close ultimately lands (Story #4649). Thin wrapper over
|
|
370
|
-
* {@link emitRecoveredFrictionMarker} bound to the `close-failed` category —
|
|
371
|
-
* retained as its own export so the post-land seam that injects it stays
|
|
372
|
-
* stable.
|
|
373
|
-
*
|
|
374
218
|
* @param {object} args
|
|
375
219
|
* @param {number} args.storyId
|
|
376
220
|
* @param {object} [args.config]
|
|
@@ -385,39 +229,12 @@ export async function emitCloseRecoveredFriction({ storyId, config } = {}) {
|
|
|
385
229
|
}
|
|
386
230
|
|
|
387
231
|
/**
|
|
388
|
-
*
|
|
389
|
-
*
|
|
390
|
-
*
|
|
391
|
-
* Single-homed because BOTH production gathers need it identically —
|
|
392
|
-
* `gatherStoryFrictionSignals` (story scope) and `executeFollowUpRollup`
|
|
393
|
-
* (run scope) — and the bug this exists to prevent is precisely the two of
|
|
394
|
-
* them drifting: they each independently flattened rows to
|
|
395
|
-
* `{ category, source }`, dropping the `storyId` / `details` the composer's
|
|
396
|
-
* recovery-netting keys on, which left that netting unreachable on real data
|
|
397
|
-
* while its unit tests stayed green (Story #4649).
|
|
398
|
-
*
|
|
399
|
-
* The row's own `storyId` wins over `fallbackStoryId` so a stream carrying
|
|
400
|
-
* foreign rows attributes each one correctly; the fallback covers records
|
|
401
|
-
* written before the field existed.
|
|
232
|
+
* One raw row → the retro composer's shape (`null` without a category).
|
|
233
|
+
* Shared by both gathers so they cannot drift; dropping `storyId`/`details`
|
|
234
|
+
* silently breaks recovery netting. `tool` is descriptive, never a routing key.
|
|
402
235
|
*
|
|
403
|
-
*
|
|
404
|
-
*
|
|
405
|
-
* de-duplicates a filed issue — but a roll-up that discards a candidate has
|
|
406
|
-
* to be able to *name* it, and a bare category cannot distinguish a
|
|
407
|
-
* `tool-degraded` from the scoped-lint runner from one out of lens
|
|
408
|
-
* materialization. It is descriptive, never a routing key.
|
|
409
|
-
*
|
|
410
|
-
* `ts` joined the shape in Story #4850, and it joined it **here** rather than
|
|
411
|
-
* in a second read beside the run-scope gather. The composer had no notion of
|
|
412
|
-
* *when* its corpus happened, so it borrowed the triggering run as the window
|
|
413
|
-
* and titled every proposal with a claim the evidence block below it already
|
|
414
|
-
* contradicted. Carrying the timestamp through the one shared normalizer is
|
|
415
|
-
* what lets the recurrence window be both bounded and describable; re-reading
|
|
416
|
-
* it beside one of the two gathers is precisely the drift that made the
|
|
417
|
-
* recovery-netting unreachable in Story #4649.
|
|
418
|
-
*
|
|
419
|
-
* @param {unknown} parsed One parsed NDJSON row.
|
|
420
|
-
* @param {number} fallbackStoryId Stream owner, used when the row has none.
|
|
236
|
+
* @param {unknown} parsed
|
|
237
|
+
* @param {number} fallbackStoryId Used when the row has no `storyId`.
|
|
421
238
|
* @returns {{ category: string, source: 'framework'|'consumer', storyId: number, tool: string, ts: string|null, details: object }|null}
|
|
422
239
|
*/
|
|
423
240
|
export function normalizeGatheredSignal(parsed, fallbackStoryId) {
|
|
@@ -444,13 +261,8 @@ export function normalizeGatheredSignal(parsed, fallbackStoryId) {
|
|
|
444
261
|
}
|
|
445
262
|
|
|
446
263
|
/**
|
|
447
|
-
*
|
|
448
|
-
*
|
|
449
|
-
* `signal-event.schema.json` requires `ts`, and both producers stamp
|
|
450
|
-
* `new Date().toISOString()` — but the gathers read whatever survives on disk,
|
|
451
|
-
* including rows a truncated write left half-formed. Resolving to `null`
|
|
452
|
-
* rather than guessing a time is what lets the recurrence window exclude an
|
|
453
|
-
* undateable row explicitly instead of aging it in as "recent".
|
|
264
|
+
* `null` for an unreadable `ts`, so the row is excluded from the recurrence
|
|
265
|
+
* window rather than aged in as recent.
|
|
454
266
|
*
|
|
455
267
|
* @param {unknown} value
|
|
456
268
|
* @returns {string|null}
|
|
@@ -462,16 +274,8 @@ function parsableTimestamp(value) {
|
|
|
462
274
|
}
|
|
463
275
|
|
|
464
276
|
/**
|
|
465
|
-
*
|
|
466
|
-
*
|
|
467
|
-
* from one place.
|
|
468
|
-
*
|
|
469
|
-
* **Category-agnostic by design (Story #4649).** The predicate used to hard-
|
|
470
|
-
* code `story-blocked`, which meant every new category needing recovery
|
|
471
|
-
* semantics had to re-implement the netting. A record is a recovery marker
|
|
472
|
-
* when it carries a usable `category` and `details.recovered === true`; the
|
|
473
|
-
* composer nets per `(category, storyId)`, so a marker can only ever cancel
|
|
474
|
-
* records in its OWN bucket.
|
|
277
|
+
* Category-agnostic recovery-marker test; a marker only cancels its own
|
|
278
|
+
* `(category, storyId)` bucket.
|
|
475
279
|
*
|
|
476
280
|
* @param {object} signal
|
|
477
281
|
* @returns {boolean}
|
|
@@ -489,41 +293,11 @@ export function isRecoveredSignal(signal) {
|
|
|
489
293
|
}
|
|
490
294
|
|
|
491
295
|
/**
|
|
492
|
-
*
|
|
493
|
-
*
|
|
494
|
-
*
|
|
495
|
-
*
|
|
496
|
-
*
|
|
497
|
-
* place, so one incident never double-counts into `occurrences: 2` and
|
|
498
|
-
* fabricates a filed proposal out of a single event:
|
|
499
|
-
*
|
|
500
|
-
* - `blocked` → **null here.** Every blocked terminal flips the Story to
|
|
501
|
-
* `agent::blocked` (`confirm-merge.js`, both the `merge.unlanded` and
|
|
502
|
-
* `merge.flip-failed` paths), and that transition is instrumented at the
|
|
503
|
-
* canonical mutator (`ticketing/transition.js`). Emitting here as well
|
|
504
|
-
* would count the same block twice.
|
|
505
|
-
* - `landed` → null. Nothing happened worth a retro.
|
|
506
|
-
* - `failed` → friction. A close that ended non-zero.
|
|
507
|
-
* - `pending` → friction **only when the cumulative wait budget is provably
|
|
508
|
-
* exhausted** (`waitBudget.cumulativeSeconds >= waitBudget.maxBudgetSeconds`).
|
|
509
|
-
* A `pending` return is reached at the per-invocation `maxWaitSeconds`
|
|
510
|
-
* bound (`phases/confirm-merge.js`); genuine cumulative exhaustion returns
|
|
511
|
-
* earlier as a **blocked** terminal via `blockOnUnlanded` (Story #4654).
|
|
512
|
-
* So a routine long-CI window rollover under budget is NOT exhaustion and
|
|
513
|
-
* emits nothing — its category name would otherwise assert an exhaustion
|
|
514
|
-
* that did not occur. Only the residual case the merge-wait guard cannot
|
|
515
|
-
* suppress — a merge that genuinely spends its whole budget and lands on a
|
|
516
|
-
* later resume — reaches here. A missing or non-numeric `cumulativeSeconds`
|
|
517
|
-
* / `maxBudgetSeconds` means exhaustion cannot be proven → emit nothing. A
|
|
518
|
-
* `pending` with **no** `waitBudget` is the `--no-wait-merge` /
|
|
519
|
-
* operator-merge path, where the human deliberately owns the land and
|
|
520
|
-
* nothing is broken — flagging it would train operators to ignore the
|
|
521
|
-
* channel.
|
|
522
|
-
*
|
|
523
|
-
* Deliberately **not exported**: it is this module's internal policy, and
|
|
524
|
-
* `emitTerminalFriction` is the contract callers (and tests) exercise. An
|
|
525
|
-
* export solely for testability would be production-dead code — the
|
|
526
|
-
* `--production` dead-exports ratchet exists to catch exactly that.
|
|
296
|
+
* The friction a terminal envelope implies; each incident is emitted from one
|
|
297
|
+
* place only. `blocked` → null (the transition mutator emits it); `failed` →
|
|
298
|
+
* `close-failed`; `pending` → `merge-wait-exhausted` only when the cumulative
|
|
299
|
+
* budget is provably spent — a routine window rollover or an operator-merge
|
|
300
|
+
* `pending` (no `waitBudget`) emits nothing.
|
|
527
301
|
*
|
|
528
302
|
* @param {object} envelope A `story-deliver-terminal` envelope.
|
|
529
303
|
* @returns {{ category: string, details: object }|null}
|
|
@@ -543,12 +317,6 @@ function frictionForTerminal(envelope) {
|
|
|
543
317
|
}
|
|
544
318
|
|
|
545
319
|
if (status === 'pending' && waitBudget) {
|
|
546
|
-
// Only a PROVEN cumulative-budget exhaustion is friction. The `pending`
|
|
547
|
-
// return is reached at the per-invocation `maxWaitSeconds` bound, not at
|
|
548
|
-
// the cumulative `maxBudgetSeconds` (that returns a blocked terminal
|
|
549
|
-
// earlier), so a routine window rollover carries `cumulativeSeconds`
|
|
550
|
-
// still under budget — emit nothing. A missing/non-numeric field means
|
|
551
|
-
// exhaustion cannot be proven, which is likewise not a record.
|
|
552
320
|
const cumulativeSeconds = Number(waitBudget.cumulativeSeconds);
|
|
553
321
|
const maxBudgetSeconds = Number(waitBudget.maxBudgetSeconds);
|
|
554
322
|
if (
|
|
@@ -575,22 +343,12 @@ function frictionForTerminal(envelope) {
|
|
|
575
343
|
}
|
|
576
344
|
|
|
577
345
|
/**
|
|
578
|
-
*
|
|
579
|
-
*
|
|
580
|
-
*
|
|
581
|
-
* `tool` is the CALLER's name, threaded in rather than assumed: TWO CLIs emit
|
|
582
|
-
* terminal envelopes — `single-story-close.js` (plus its runner) and
|
|
583
|
-
* `single-story-confirm-merge.js` — and `retro-proposals.js` reads
|
|
584
|
-
* `emitter.tool` (via {@link normalizeGatheredSignal}) to name the surface a
|
|
585
|
-
* candidate came from, so hard-coding the close name here attributed every
|
|
586
|
-
* confirm-merge record to a CLI that never ran and misdirected the follow-up.
|
|
587
|
-
* Both callers already declare their name once via `runAsCli({ source })`;
|
|
588
|
-
* pass that same string. The default keeps the close paths — the original
|
|
589
|
-
* callers, which pass none — emitting exactly what they always did.
|
|
346
|
+
* `tool` must be the calling CLI's name: two CLIs emit terminal envelopes and
|
|
347
|
+
* the retro attributes by `emitter.tool`.
|
|
590
348
|
*
|
|
591
349
|
* @param {object} args
|
|
592
350
|
* @param {object} args.envelope
|
|
593
|
-
* @param {string} [args.tool]
|
|
351
|
+
* @param {string} [args.tool]
|
|
594
352
|
* @param {object} [args.config]
|
|
595
353
|
* @returns {Promise<boolean>} true when a record was appended.
|
|
596
354
|
*/
|
|
@@ -1,27 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* signal-validator.js — write-time validation of
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* The signals writer calls {@link validateSignal} before appending a
|
|
7
|
-
* record so a schema-invalid line is dropped with a `Logger.warn` naming
|
|
8
|
-
* the violating field rather than polluting the stream (and defeating the
|
|
9
|
-
* downstream consumers that assume the canonical shape). Validation is
|
|
10
|
-
* best-effort: the writer contract (Tech Spec #1032) is preserved —
|
|
11
|
-
* observability MUST NOT throw into the runner, so every helper here
|
|
12
|
-
* swallows its own faults and degrades to "treat as valid" only when the
|
|
13
|
-
* validator itself cannot be constructed.
|
|
14
|
-
*
|
|
15
|
-
* The AJV instance compiles the on-disk schema **once** at module load so
|
|
16
|
-
* the writer and the contract test validate against the exact same
|
|
17
|
-
* document (no hand-rolled drift). `strict: false` matches the repo's
|
|
18
|
-
* other draft-07 validators (see `tests/schemas/signal-schemas.test.js`).
|
|
19
|
-
*
|
|
20
|
-
* Story #5003 deleted the persisted per-Epic reject tally
|
|
21
|
-
* (`temp/run-<eid>/signal-rejects.json`) and its `readSignalRejectCount`
|
|
22
|
-
* reader: the tally was keyed on a positive `epicId`, and v2 Stories are
|
|
23
|
-
* standalone, so nothing ever wrote a row and nothing could ever read one.
|
|
24
|
-
* Write-time validation itself is untouched.
|
|
2
|
+
* signal-validator.js — write-time validation of signal records against the
|
|
3
|
+
* on-disk `signal-event.schema.json`, compiled once so the writer and the
|
|
4
|
+
* contract test validate against the same document. Never throws.
|
|
25
5
|
*/
|
|
26
6
|
|
|
27
7
|
import { readFileSync } from 'node:fs';
|
|
@@ -44,10 +24,8 @@ const SCHEMA_PATH = path.resolve(
|
|
|
44
24
|
);
|
|
45
25
|
|
|
46
26
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* valid (fail-open) so a packaging error never silently drops all
|
|
50
|
-
* signals.
|
|
27
|
+
* `null` when the schema cannot be compiled: validation then fails open so a
|
|
28
|
+
* packaging error never drops every signal.
|
|
51
29
|
*
|
|
52
30
|
* @returns {import('ajv').ValidateFunction | null}
|
|
53
31
|
*/
|
|
@@ -70,10 +48,6 @@ function buildValidator() {
|
|
|
70
48
|
const _validate = buildValidator();
|
|
71
49
|
|
|
72
50
|
/**
|
|
73
|
-
* Derive a human-readable "violating field" label from the first AJV
|
|
74
|
-
* error. Prefers the missing property name (required errors) or the
|
|
75
|
-
* instance path, falling back to the raw message.
|
|
76
|
-
*
|
|
77
51
|
* @param {import('ajv').ErrorObject[] | null | undefined} errors
|
|
78
52
|
* @returns {string}
|
|
79
53
|
*/
|
|
@@ -96,12 +70,6 @@ function violatingFieldOf(errors) {
|
|
|
96
70
|
}
|
|
97
71
|
|
|
98
72
|
/**
|
|
99
|
-
* Validate a signal record against the canonical schema.
|
|
100
|
-
*
|
|
101
|
-
* Fail-open: when the validator could not be compiled the record is
|
|
102
|
-
* reported valid (the writer keeps working). A non-object record is
|
|
103
|
-
* reported invalid without invoking AJV.
|
|
104
|
-
*
|
|
105
73
|
* @param {unknown} record
|
|
106
74
|
* @returns {{ valid: boolean, violatingField: string|null, message: string|null }}
|
|
107
75
|
*/
|