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,35 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Append-only
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `temp/run-<id>/stories/story-<sid>/signals.ndjson`. Every live emitter
|
|
6
|
-
* funnels through this writer so the on-disk shape stays under one schema
|
|
7
|
-
* and one set of robustness guarantees. The sibling `traces.ndjson` stream
|
|
8
|
-
* and its `appendTrace` entry point went in Story #5003 with the tool-trace
|
|
9
|
-
* hook that was its only producer.
|
|
10
|
-
*
|
|
11
|
-
* Robustness contract (Tech Spec #1032 §observability):
|
|
12
|
-
* - **Best-effort.** Every entry point swallows fs / JSON failures
|
|
13
|
-
* after logging via `Logger.warn`. Observability MUST NOT take down
|
|
14
|
-
* the runner — a failed write is a missing signal, not a halted
|
|
15
|
-
* wave.
|
|
16
|
-
* - **No buffering.** Each `appendSignal` opens the target file, writes
|
|
17
|
-
* one newline-terminated JSON line, and closes.
|
|
18
|
-
* The Tech Spec explicitly forbids in-process buffering: emitters
|
|
19
|
-
* fire from inside per-Story sub-agents that may exit abruptly, and
|
|
20
|
-
* a buffered tail would silently disappear on `process.exit`.
|
|
21
|
-
* - **Lazy directory creation.** The first write to a fresh Story
|
|
22
|
-
* creates `temp/run-<id>/stories/story-<sid>/` via `fs.mkdir(..., { recursive: true })`.
|
|
23
|
-
* `epicId` / `storyId` are required positive integers — the
|
|
24
|
-
* `temp-paths.js` helpers assert this before we touch the disk.
|
|
25
|
-
*
|
|
26
|
-
* Reader contract:
|
|
27
|
-
* - `forEachLine(epicId, storyId, cb)` streams `signals.ndjson` line
|
|
28
|
-
* by line, parses each line as JSON, and invokes `cb(parsed, lineNumber)`.
|
|
29
|
-
* Malformed lines are skipped with a `Logger.warn`; a missing file
|
|
30
|
-
* returns `{ linesRead: 0, linesParsed: 0, missing: true }` rather
|
|
31
|
-
* than throwing. This matches how the analyzer wants to consume
|
|
32
|
-
* partial streams from in-flight Stories.
|
|
2
|
+
* Append-only writer and readers for per-Story `signals.ndjson`. Best-effort:
|
|
3
|
+
* failures are logged, never thrown. No buffering — emitters run in
|
|
4
|
+
* sub-agents that may exit abruptly.
|
|
33
5
|
*/
|
|
34
6
|
|
|
35
7
|
import { createReadStream } from 'node:fs';
|
|
@@ -49,30 +21,8 @@ import { validateSignal } from './signal-validator.js';
|
|
|
49
21
|
import { classifySignalSource } from './source-classifier.js';
|
|
50
22
|
|
|
51
23
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* Post the Epic #4406 cutover `source` is reserved **exclusively** for
|
|
56
|
-
* this framework/consumer classification — a record's originating tool
|
|
57
|
-
* lives in `emitter`, never `source`. That freed the classifier to run
|
|
58
|
-
* for every friction record (pre-cutover a provenance object under the
|
|
59
|
-
* `source` key blocked it via `Object.hasOwn`).
|
|
60
|
-
*
|
|
61
|
-
* Rules:
|
|
62
|
-
* - If the record is not a plain object (string, number, null,
|
|
63
|
-
* undefined), return it unchanged.
|
|
64
|
-
* - If the caller pre-set `source` to exactly `"framework"` or
|
|
65
|
-
* `"consumer"`, preserve it verbatim — some detectors classify
|
|
66
|
-
* upstream and we MUST NOT overwrite their intentional tag.
|
|
67
|
-
* - Otherwise (absent, or any other value — defense in depth against a
|
|
68
|
-
* stray non-canonical `source`), invoke `classifySignalSource` against
|
|
69
|
-
* the whole record and inject/overwrite `source` with the result.
|
|
70
|
-
*
|
|
71
|
-
* Story #4824 moved the field extraction into the classifier. The writer
|
|
72
|
-
* used to hand it only `failingPath` / `command`, which meant every
|
|
73
|
-
* runtime-emitted record — which populates neither — took the `consumer`
|
|
74
|
-
* default and the framework limb of the feedback loop was unreachable. The
|
|
75
|
-
* classifier now sees the `category` and `details` it needs to resolve those.
|
|
24
|
+
* `source` means only framework/consumer (the tool lives in `emitter`); a
|
|
25
|
+
* caller-set canonical value is kept, anything else overwritten.
|
|
76
26
|
*
|
|
77
27
|
* @param {unknown} signal
|
|
78
28
|
* @returns {unknown}
|
|
@@ -98,15 +48,6 @@ function tagSignalSource(signal) {
|
|
|
98
48
|
}
|
|
99
49
|
|
|
100
50
|
/**
|
|
101
|
-
* Validate a record against the canonical `signal-event.schema.json`
|
|
102
|
-
* before it is appended. On failure the record is **dropped** (never
|
|
103
|
-
* appended) and a `Logger.warn` names the violating field. Never throws —
|
|
104
|
-
* the writer's best-effort contract is preserved.
|
|
105
|
-
*
|
|
106
|
-
* Story #5003 removed the persisted per-Epic reject tally this used to
|
|
107
|
-
* increment: v2 Stories are standalone (`epicId` is always null), so the
|
|
108
|
-
* tally was never written and its only reader could never see one.
|
|
109
|
-
*
|
|
110
51
|
* @param {unknown} record
|
|
111
52
|
* @param {string} label
|
|
112
53
|
* @returns {boolean} true when the record is valid (safe to append).
|
|
@@ -121,10 +62,6 @@ function validateOrDrop(record, label) {
|
|
|
121
62
|
}
|
|
122
63
|
|
|
123
64
|
/**
|
|
124
|
-
* Best-effort append of a single record as one newline-terminated JSON
|
|
125
|
-
* line. Caller-supplied record must be JSON-serialisable; circular refs
|
|
126
|
-
* or BigInt fields are reported via `Logger.warn` and dropped.
|
|
127
|
-
*
|
|
128
65
|
* @param {string} targetPath
|
|
129
66
|
* @param {unknown} record
|
|
130
67
|
* @returns {Promise<boolean>} true on success, false on any swallowed failure.
|
|
@@ -157,12 +94,6 @@ async function appendOne(targetPath, record) {
|
|
|
157
94
|
}
|
|
158
95
|
|
|
159
96
|
/**
|
|
160
|
-
* Append one signal record to `temp/run-<id>/stories/story-<sid>/signals.ndjson`.
|
|
161
|
-
*
|
|
162
|
-
* The `signal` is written verbatim — callers (detectors) own its shape
|
|
163
|
-
* (kind, severity, message, etc.). The writer adds nothing. Errors are
|
|
164
|
-
* logged via `Logger.warn` and never thrown.
|
|
165
|
-
*
|
|
166
97
|
* @param {{ epicId: number, storyId: number, signal: unknown, config?: object }} args
|
|
167
98
|
* @returns {Promise<boolean>}
|
|
168
99
|
*/
|
|
@@ -185,19 +116,11 @@ export async function appendSignal(args) {
|
|
|
185
116
|
}
|
|
186
117
|
|
|
187
118
|
/**
|
|
188
|
-
*
|
|
189
|
-
* `cb(parsed, lineNumber)` for each successfully parsed JSON line.
|
|
190
|
-
* `lineNumber` is 1-based to match operator log expectations. Malformed
|
|
191
|
-
* lines are skipped with a `Logger.warn`. A missing file resolves with
|
|
192
|
-
* `missing: true` rather than throwing.
|
|
193
|
-
*
|
|
194
|
-
* Shared spine for `forEachLine`
|
|
195
|
-
* (per-Epic stream) so the two readers cannot drift in their
|
|
196
|
-
* malformed-line / missing-file / cb-throw handling.
|
|
119
|
+
* Shared reader spine; malformed lines and callback throws are skipped.
|
|
197
120
|
*
|
|
198
121
|
* @param {string} target
|
|
199
122
|
* @param {(parsed: unknown, lineNumber: number) => unknown | Promise<unknown>} cb
|
|
200
|
-
* @param {string} label
|
|
123
|
+
* @param {string} label
|
|
201
124
|
* @returns {Promise<{ linesRead: number, linesParsed: number, missing: boolean }>}
|
|
202
125
|
*/
|
|
203
126
|
async function forEachLineIn(target, cb, label) {
|
|
@@ -215,7 +138,6 @@ async function forEachLineIn(target, cb, label) {
|
|
|
215
138
|
try {
|
|
216
139
|
for await (const rawLine of rl) {
|
|
217
140
|
linesRead += 1;
|
|
218
|
-
// Skip empty lines (trailing newline at EOF, accidental blanks).
|
|
219
141
|
if (rawLine.length === 0) continue;
|
|
220
142
|
let parsed;
|
|
221
143
|
try {
|
|
@@ -251,11 +173,6 @@ async function forEachLineIn(target, cb, label) {
|
|
|
251
173
|
}
|
|
252
174
|
|
|
253
175
|
/**
|
|
254
|
-
* Stream a per-Story `signals.ndjson` line by line, invoking
|
|
255
|
-
* `cb(parsed, lineNumber)` for each successfully parsed JSON line. A
|
|
256
|
-
* missing file resolves with `missing: true` rather than throwing — the
|
|
257
|
-
* analyzer treats absence as "no signals yet" and keeps walking.
|
|
258
|
-
*
|
|
259
176
|
* @param {number} epicId
|
|
260
177
|
* @param {number} storyId
|
|
261
178
|
* @param {(parsed: unknown, lineNumber: number) => unknown | Promise<unknown>} cb
|
|
@@ -283,18 +200,11 @@ export async function forEachLine(epicId, storyId, cb, config) {
|
|
|
283
200
|
return forEachLineIn(target, cb, 'forEachLine');
|
|
284
201
|
}
|
|
285
202
|
|
|
286
|
-
/** Matches an Epic run directory (`run-<eid>`) directly under `tempRoot`. */
|
|
287
203
|
const RUN_DIR_RE = /^run-\d+$/;
|
|
288
204
|
|
|
289
|
-
/** Matches a per-Story directory (`story-<sid>`) under a `stories/` parent. */
|
|
290
205
|
const STORY_DIR_RE = /^story-(\d+)$/;
|
|
291
206
|
|
|
292
207
|
/**
|
|
293
|
-
* List directory entries, or `[]` when the directory is absent/unreadable.
|
|
294
|
-
* Absence is the common case (a fresh checkout has no temp tree at all) and
|
|
295
|
-
* must not throw — the discovery walk feeds a roll-up that may not fail the
|
|
296
|
-
* land.
|
|
297
|
-
*
|
|
298
208
|
* @param {string} dir
|
|
299
209
|
* @returns {Promise<import('node:fs').Dirent[]>}
|
|
300
210
|
*/
|
|
@@ -307,18 +217,8 @@ async function readDirEntries(dir) {
|
|
|
307
217
|
}
|
|
308
218
|
|
|
309
219
|
/**
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
313
|
-
* Both canonical layouts are walked — `<tempRoot>/standalone/stories/story-<sid>/`
|
|
314
|
-
* (v2 standalone Stories, where every close writes) and
|
|
315
|
-
* `<tempRoot>/run-<eid>/stories/story-<sid>/` (Epic-attached streams). The
|
|
316
|
-
* walk is the **recurrence window** the follow-up composer reduces over: a
|
|
317
|
-
* defect that fires exactly once per Story is invisible inside a single
|
|
318
|
-
* Story's stream and only becomes a recurrence across the surviving ones.
|
|
319
|
-
*
|
|
320
|
-
* Sorted by absolute path so a given tree always yields the same order and
|
|
321
|
-
* the composed proposals stay byte-identical.
|
|
220
|
+
* Every surviving stream (both layouts) — the recurrence window. Sorted so
|
|
221
|
+
* composed proposals are deterministic.
|
|
322
222
|
*
|
|
323
223
|
* @param {object} [config]
|
|
324
224
|
* @returns {Promise<Array<{ storyId: number, file: string }>>}
|
|
@@ -361,18 +261,8 @@ async function listStorySignalStreams(config) {
|
|
|
361
261
|
}
|
|
362
262
|
|
|
363
263
|
/**
|
|
364
|
-
*
|
|
365
|
-
*
|
|
366
|
-
*
|
|
367
|
-
* `context` carries `{ storyId, file, lineNumber }` — `storyId` is the
|
|
368
|
-
* **stream owner** (from the directory name), used only as the fallback when
|
|
369
|
-
* a row carries no `storyId` of its own; `file` + `lineNumber` identify the
|
|
370
|
-
* physical row, which is what lets a caller de-duplicate a legacy row that
|
|
371
|
-
* predates `eventId`.
|
|
372
|
-
*
|
|
373
|
-
* Same robustness contract as `forEachLine`: a missing tree, an unreadable
|
|
374
|
-
* directory, a malformed line, or a throwing callback each degrade to a
|
|
375
|
-
* warning rather than a rejection.
|
|
264
|
+
* `context.storyId` is the stream owner (a fallback only); `file` +
|
|
265
|
+
* `lineNumber` de-duplicate legacy rows without `eventId`.
|
|
376
266
|
*
|
|
377
267
|
* @param {(parsed: unknown, context: { storyId: number, file: string, lineNumber: number }) => unknown | Promise<unknown>} cb
|
|
378
268
|
* @param {object} [config]
|
|
@@ -1,48 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* source-classifier.js —
|
|
3
|
-
*
|
|
4
|
-
* `"consumer"` (the host project that consumes the framework via the
|
|
5
|
-
* materialized `.agents/` directory).
|
|
6
|
-
*
|
|
7
|
-
* Used by `signals-writer.js#appendSignal` so every
|
|
8
|
-
* record in `temp/run-<id>/stories/story-<sid>/signals.ndjson` carries an
|
|
9
|
-
* authoritative `source` field, allowing downstream retro consumers to
|
|
10
|
-
* route framework signals back to mandrel and keep consumer signals in
|
|
11
|
-
* the host project (Epic #2547 / Story #2553).
|
|
12
|
-
*
|
|
13
|
-
* Heuristic (Tech Spec #2550):
|
|
14
|
-
* - A signal is `"framework"` when its `failingPath` or `command`
|
|
15
|
-
* mentions any path under the framework's own surface area:
|
|
16
|
-
* - `.agents/`
|
|
17
|
-
* - `.agentrc.json`
|
|
18
|
-
* - `.claude/`
|
|
19
|
-
* - `node .agents/scripts/`
|
|
20
|
-
* …or (Story #4916) names one of the CLI entry points shipped at the
|
|
21
|
-
* top level of `.agents/scripts/` by **bare basename**, so recognition
|
|
22
|
-
* does not depend on how the caller spelled the reference.
|
|
23
|
-
* - Anything else (or empty input) defaults to `"consumer"`. The default
|
|
24
|
-
* is intentional — most friction comes from consumer code touching
|
|
25
|
-
* framework tooling, and we'd rather under-tag than mis-route a
|
|
26
|
-
* consumer signal into the framework retro stream.
|
|
27
|
-
*
|
|
28
|
-
* Story #4824 adds {@link classifySignalSource} alongside it — the
|
|
29
|
-
* record-level entry point the writer now calls, which resolves a
|
|
30
|
-
* runtime-emitted record (no `failingPath`, no `command`) instead of letting
|
|
31
|
-
* the `consumer` default win unconditionally. `classifyPathSource` keeps its
|
|
32
|
-
* two-argument signature and behaviour verbatim.
|
|
33
|
-
*
|
|
34
|
-
* The classifier is pure: no I/O, no logging, no throws on weird input.
|
|
35
|
-
* Callers (the writer) are responsible for swallowing classifier-level
|
|
36
|
-
* faults — but the only way this function can throw is via a programmer
|
|
37
|
-
* error in this file, which would surface during unit testing.
|
|
2
|
+
* source-classifier.js — tag a friction signal `"framework"` or `"consumer"`.
|
|
3
|
+
* Defaults to consumer: under-tagging beats mis-routing. Pure.
|
|
38
4
|
*/
|
|
39
5
|
|
|
40
|
-
/**
|
|
41
|
-
* Framework prefixes, in declaration order. Order is significant only
|
|
42
|
-
* for documentation purposes — any one match returns `"framework"`.
|
|
43
|
-
*
|
|
44
|
-
* @type {readonly string[]}
|
|
45
|
-
*/
|
|
6
|
+
/** @type {readonly string[]} */
|
|
46
7
|
const FRAMEWORK_PREFIXES = Object.freeze([
|
|
47
8
|
'.agents/',
|
|
48
9
|
'.agentrc.json',
|
|
@@ -51,28 +12,9 @@ const FRAMEWORK_PREFIXES = Object.freeze([
|
|
|
51
12
|
]);
|
|
52
13
|
|
|
53
14
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* The prefix scan above recognises a framework script only when the caller
|
|
58
|
-
* spelled a path — `node .agents/scripts/acceptance-eval.js` classifies
|
|
59
|
-
* `framework`, while the same script named bare (`acceptance-eval.js --story
|
|
60
|
-
* 4901`) matched no prefix and fell through to `consumer`, so a real framework
|
|
61
|
-
* defect was routed as consumer-actionable and discarded. Recognition must not
|
|
62
|
-
* depend on how the caller spelled the reference.
|
|
63
|
-
*
|
|
64
|
-
* Kept as **static data**, not a directory read: `classifySignalSource` is
|
|
65
|
-
* called once per signal and MUST stay pure — no filesystem I/O at classify
|
|
66
|
-
* time. The sync test in
|
|
67
|
-
* `tests/lib/observability/source-classifier.test.js` reads the real directory
|
|
68
|
-
* and fails when a script is added, renamed, or removed without this list
|
|
69
|
-
* being updated, so the set cannot go stale and silently restore the blind
|
|
70
|
-
* spot.
|
|
71
|
-
*
|
|
72
|
-
* Scoped to the top level deliberately: those are the entry points a command
|
|
73
|
-
* line names. Library modules under `.agents/scripts/lib/` carry generic
|
|
74
|
-
* basenames (`index.js`, `config.js`) that a consumer command could plausibly
|
|
75
|
-
* name, and widening to them would trade one mis-route for another.
|
|
15
|
+
* Top-level `.agents/scripts/` CLIs, so a bare basename classifies like its
|
|
16
|
+
* path. Static (classification is I/O-free); a sync test pins it to the
|
|
17
|
+
* directory. `lib/` basenames are too generic to include.
|
|
76
18
|
*
|
|
77
19
|
* @type {readonly string[]}
|
|
78
20
|
*/
|
|
@@ -85,33 +27,21 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
|
|
|
85
27
|
'audit-to-stories.js',
|
|
86
28
|
'boot-sweep.js',
|
|
87
29
|
'bootstrap.js',
|
|
88
|
-
'check-action-pinning.js',
|
|
89
30
|
'check-arch-cycles.js',
|
|
90
|
-
'check-audit-attribution.js',
|
|
91
|
-
'check-baseline-drift.js',
|
|
92
|
-
'check-baseline-scope.js',
|
|
93
31
|
'check-baselines.js',
|
|
94
32
|
'check-context-budget.js',
|
|
95
33
|
'check-cyclomatic.js',
|
|
96
34
|
'check-dead-exports.js',
|
|
97
35
|
'check-doc-links.js',
|
|
98
|
-
'check-generated-validator.js',
|
|
99
36
|
'check-gherkin-corpus.js',
|
|
100
|
-
'check-knip-entries.js',
|
|
101
|
-
'check-lifecycle-lint.js',
|
|
102
|
-
'check-pinned-override-notes.js',
|
|
103
|
-
'check-schema-references.js',
|
|
104
|
-
'check-test-portability.js',
|
|
105
37
|
'check-test-temp-hygiene.js',
|
|
106
38
|
'check-windows-git-perf.js',
|
|
107
|
-
'check-workflow-citations.js',
|
|
108
|
-
'check-workflow-cli-lint.js',
|
|
109
|
-
'check-workflow-timeouts.js',
|
|
110
39
|
'ceremony-derive.js',
|
|
111
40
|
'cleanup-repo-test-temp.js',
|
|
112
41
|
'coverage-capture.js',
|
|
113
42
|
'deliver-light.js',
|
|
114
43
|
'deliver-recover.js',
|
|
44
|
+
'deliver-run.js',
|
|
115
45
|
'diagnose-friction.js',
|
|
116
46
|
'diagnose.js',
|
|
117
47
|
'drain-pending-cleanup.js',
|
|
@@ -122,9 +52,7 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
|
|
|
122
52
|
'generate-skills-index.js',
|
|
123
53
|
'generate-workflows-doc.js',
|
|
124
54
|
'git-cleanup.js',
|
|
125
|
-
'install-matrix-assert.js',
|
|
126
55
|
'lint-issue-body.js',
|
|
127
|
-
'lint-label-vocabulary.js',
|
|
128
56
|
'mandrel-update-preflight.js',
|
|
129
57
|
'merge-baseline.js',
|
|
130
58
|
'nav-registry-diff.js',
|
|
@@ -133,21 +61,14 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
|
|
|
133
61
|
'plan-critics.js',
|
|
134
62
|
'plan-persist.js',
|
|
135
63
|
'plan-run-epilogue.js',
|
|
136
|
-
'post-structured-comment.js',
|
|
137
64
|
'pr-watch-with-update.js',
|
|
138
|
-
'provision-git-hooks.js',
|
|
139
|
-
'prune-baseline-orphans.js',
|
|
140
65
|
'prune-plan-run-labels.js',
|
|
141
66
|
'quality-preview.js',
|
|
142
67
|
'quality-watch.js',
|
|
143
68
|
'resolve-doc-tiers.js',
|
|
144
69
|
'resolve-stories.js',
|
|
145
70
|
'resync-status-column.js',
|
|
146
|
-
'run-coverage.js',
|
|
147
|
-
'run-lint.js',
|
|
148
|
-
'run-test-profile.js',
|
|
149
71
|
'run-tests.js',
|
|
150
|
-
'run-verify.js',
|
|
151
72
|
'single-story-close.js',
|
|
152
73
|
'single-story-confirm-merge.js',
|
|
153
74
|
'single-story-init.js',
|
|
@@ -155,38 +76,22 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
|
|
|
155
76
|
'sync-agentrc.js',
|
|
156
77
|
'sync-claude-agents.js',
|
|
157
78
|
'sync-claude-commands.js',
|
|
158
|
-
'test-isolate.js',
|
|
159
79
|
'test-wrapper.js',
|
|
160
80
|
'update-coverage-baseline.js',
|
|
161
81
|
'update-crap-baseline.js',
|
|
162
|
-
'update-dead-exports-baseline.js',
|
|
163
82
|
'update-duplication-baseline.js',
|
|
164
83
|
'update-maintainability-baseline.js',
|
|
165
84
|
'update-ticket-state.js',
|
|
166
85
|
'validate-skills.js',
|
|
167
86
|
]);
|
|
168
87
|
|
|
169
|
-
/**
|
|
170
|
-
* Membership index over {@link FRAMEWORK_SCRIPT_BASENAMES}, built once at
|
|
171
|
-
* module load so the per-signal scan is a hash lookup.
|
|
172
|
-
*
|
|
173
|
-
* @type {ReadonlySet<string>}
|
|
174
|
-
*/
|
|
88
|
+
/** @type {ReadonlySet<string>} */
|
|
175
89
|
const FRAMEWORK_SCRIPT_BASENAME_SET = new Set(FRAMEWORK_SCRIPT_BASENAMES);
|
|
176
90
|
|
|
177
|
-
/**
|
|
178
|
-
* Characters a shell-ish command line can wrap a token in. Stripped from both
|
|
179
|
-
* ends before the membership test so `"acceptance-eval.js",` still resolves.
|
|
180
|
-
*
|
|
181
|
-
* @type {RegExp}
|
|
182
|
-
*/
|
|
91
|
+
/** @type {RegExp} */
|
|
183
92
|
const TOKEN_TRIM = /^[\s'"`(,;:]+|[\s'"`),;:]+$/g;
|
|
184
93
|
|
|
185
94
|
/**
|
|
186
|
-
* Normalise a value to a string for prefix scanning. Anything that is not
|
|
187
|
-
* a string (undefined, null, numbers, objects) becomes the empty string,
|
|
188
|
-
* which scans clean against every framework prefix.
|
|
189
|
-
*
|
|
190
95
|
* @param {unknown} value
|
|
191
96
|
* @returns {string}
|
|
192
97
|
*/
|
|
@@ -196,11 +101,7 @@ function toScanString(value) {
|
|
|
196
101
|
}
|
|
197
102
|
|
|
198
103
|
/**
|
|
199
|
-
*
|
|
200
|
-
* substring. We use `includes` (not `startsWith`) because a command line
|
|
201
|
-
* like `node .agents/scripts/single-story-init.js` carries the prefix in the
|
|
202
|
-
* middle, and a failing-path like `repo/.agents/foo.js` may carry an
|
|
203
|
-
* absolute prefix.
|
|
104
|
+
* Substring match: prefixes appear mid-command and under absolute paths.
|
|
204
105
|
*
|
|
205
106
|
* @param {string} haystack
|
|
206
107
|
* @returns {boolean}
|
|
@@ -214,14 +115,7 @@ function containsFrameworkPrefix(haystack) {
|
|
|
214
115
|
}
|
|
215
116
|
|
|
216
117
|
/**
|
|
217
|
-
*
|
|
218
|
-
* basename** — no path segment at all (Story #4916).
|
|
219
|
-
*
|
|
220
|
-
* Whitespace-tokenised and matched whole: only a token that *equals* a known
|
|
221
|
-
* basename counts. A token carrying any path segment is deliberately left to
|
|
222
|
-
* {@link containsFrameworkPrefix} — `./tools/notify.js` is the consumer's own
|
|
223
|
-
* script and must stay `consumer`, while `.agents/scripts/notify.js` already
|
|
224
|
-
* matches a prefix. Likewise `my-notify.js` is not `notify.js`.
|
|
118
|
+
* Exact token match only: `./tools/notify.js` is the consumer's own script.
|
|
225
119
|
*
|
|
226
120
|
* @param {string} haystack
|
|
227
121
|
* @returns {boolean}
|
|
@@ -236,13 +130,6 @@ function containsFrameworkScriptBasename(haystack) {
|
|
|
236
130
|
}
|
|
237
131
|
|
|
238
132
|
/**
|
|
239
|
-
* True when `haystack` names the framework's own surface, by either
|
|
240
|
-
* recognition route: a path prefix, or a bare framework-script basename.
|
|
241
|
-
*
|
|
242
|
-
* Purely additive over {@link containsFrameworkPrefix} — every string that
|
|
243
|
-
* matched a prefix still matches here, so widening can only ever move a
|
|
244
|
-
* classification from `consumer` to `framework`, never the reverse.
|
|
245
|
-
*
|
|
246
133
|
* @param {string} haystack
|
|
247
134
|
* @returns {boolean}
|
|
248
135
|
*/
|
|
@@ -252,27 +139,10 @@ function namesFrameworkSurface(haystack) {
|
|
|
252
139
|
}
|
|
253
140
|
|
|
254
141
|
/**
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
* Both arguments are best-effort: pass whatever the detector already has
|
|
258
|
-
* (the failing file path, the failing command line, or both). When both
|
|
259
|
-
* are empty / non-string, returns `"consumer"` — the safe default for
|
|
260
|
-
* routing.
|
|
261
|
-
*
|
|
262
|
-
* Framework-wins: if either input matches a framework prefix, the result
|
|
263
|
-
* is `"framework"` even when the other input looks consumer-shaped. This
|
|
264
|
-
* matters for mixed cases like a consumer test invoking
|
|
265
|
-
* `node .agents/scripts/single-story-init.js` — that's framework friction even
|
|
266
|
-
* though the failing test path lives under the consumer.
|
|
267
|
-
*
|
|
268
|
-
* Either input matches on a framework path prefix **or** on a bare framework
|
|
269
|
-
* script basename (Story #4916), so `single-story-close.js --story 4906` is
|
|
270
|
-
* recognised exactly like its fully-pathed spelling.
|
|
142
|
+
* Framework wins if either input names it.
|
|
271
143
|
*
|
|
272
|
-
* @param {unknown} failingPath
|
|
273
|
-
*
|
|
274
|
-
* @param {unknown} command The command line the signal blames
|
|
275
|
-
* (e.g. `"node .agents/scripts/single-story-init.js"`).
|
|
144
|
+
* @param {unknown} failingPath
|
|
145
|
+
* @param {unknown} command
|
|
276
146
|
* @returns {"framework"|"consumer"}
|
|
277
147
|
*/
|
|
278
148
|
export function classifyPathSource(failingPath, command) {
|
|
@@ -284,33 +154,17 @@ export function classifyPathSource(failingPath, command) {
|
|
|
284
154
|
}
|
|
285
155
|
|
|
286
156
|
/**
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
* Kept as a local literal rather than imported from
|
|
291
|
-
* `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` because `runtime-friction.js`
|
|
292
|
-
* imports `signals-writer.js`, which imports this module — the import would
|
|
293
|
-
* close a cycle for a single string. The unit test asserts the two spellings
|
|
294
|
-
* agree, so the duplication cannot drift silently.
|
|
157
|
+
* Literal copy of `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` (importing it
|
|
158
|
+
* would close a cycle); a test pins them together.
|
|
295
159
|
*
|
|
296
160
|
* @type {string}
|
|
297
161
|
*/
|
|
298
162
|
const TOOL_DEGRADED_CATEGORY = 'tool-degraded';
|
|
299
163
|
|
|
300
|
-
/**
|
|
301
|
-
* Detail keys whose free text names the surface a runtime record blames.
|
|
302
|
-
* Scanned (step 2 below) because a runtime emitter puts the framework path
|
|
303
|
-
* it was executing here, not in `failingPath` / `command`.
|
|
304
|
-
*
|
|
305
|
-
* @type {readonly string[]}
|
|
306
|
-
*/
|
|
164
|
+
/** @type {readonly string[]} */
|
|
307
165
|
const DETAIL_SCAN_KEYS = Object.freeze(['reason', 'surface', 'phase']);
|
|
308
166
|
|
|
309
167
|
/**
|
|
310
|
-
* True when `value` is a non-empty string — the test for "the operator (or a
|
|
311
|
-
* detector) actually supplied this field", as opposed to a runtime emitter
|
|
312
|
-
* that leaves it absent.
|
|
313
|
-
*
|
|
314
168
|
* @param {unknown} value
|
|
315
169
|
* @returns {boolean}
|
|
316
170
|
*/
|
|
@@ -319,8 +173,6 @@ function isSupplied(value) {
|
|
|
319
173
|
}
|
|
320
174
|
|
|
321
175
|
/**
|
|
322
|
-
* Concatenate the scannable free text out of a record's `details` payload.
|
|
323
|
-
*
|
|
324
176
|
* @param {unknown} details
|
|
325
177
|
* @returns {string}
|
|
326
178
|
*/
|
|
@@ -336,45 +188,12 @@ function detailsScanText(details) {
|
|
|
336
188
|
}
|
|
337
189
|
|
|
338
190
|
/**
|
|
339
|
-
*
|
|
340
|
-
*
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
* prefix in an operator-supplied `failingPath` / `command`. Every
|
|
344
|
-
* runtime-emitted friction record (`runtime-friction.js`) populates neither
|
|
345
|
-
* field, so the `consumer` default always won and the framework limb of the
|
|
346
|
-
* feedback loop was unreachable — 78% of real records mis-tagged.
|
|
347
|
-
*
|
|
348
|
-
* The naive repair — "runtime-emitted means framework" — is measurably
|
|
349
|
-
* **wrong**. `close-failed` records from `single-story-close` carry
|
|
350
|
-
* consumer-owned failures (a base-sync conflict in the consumer's own source
|
|
351
|
-
* tree, a consumer `npm run test:coverage` exiting non-zero); tagging those
|
|
352
|
-
* `framework` would flood the framework repo with consumer test failures,
|
|
353
|
-
* which is worse than the current silence.
|
|
354
|
-
*
|
|
355
|
-
* So the discriminator is resolved in four steps, first match wins:
|
|
356
|
-
*
|
|
357
|
-
* 1. An operator-supplied `failingPath` / `path` / `command` /
|
|
358
|
-
* `emitter.command` → the existing {@link classifyPathSource} prefix scan,
|
|
359
|
-
* **unchanged**. A consumer command invoked through `diagnose-friction.js`
|
|
360
|
-
* stays `consumer`.
|
|
361
|
-
* 2. Else the `details` payload's free text (`reason`, `surface`, `phase`)
|
|
362
|
-
* naming a framework prefix → `framework`. A runtime emitter blames its
|
|
363
|
-
* surface here, not in a `command` field.
|
|
364
|
-
* 3. Else `category === "tool-degraded"` → `framework`.
|
|
365
|
-
* `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` is defined as a tool that
|
|
366
|
-
* failed to *execute* — an operational degradation, not a code finding.
|
|
367
|
-
* The framework's own tooling could not run, which says nothing about
|
|
368
|
-
* consumer code.
|
|
369
|
-
* 4. Else `consumer` — the existing safe default, unchanged.
|
|
370
|
-
*
|
|
371
|
-
* Steps 1, 2 and 4 leave every currently-exercised input byte-identical;
|
|
372
|
-
* step 3 is the limb that was unreachable. There is deliberately no emitter
|
|
373
|
-
* allowlist: nothing to maintain, nothing to rot.
|
|
374
|
-
*
|
|
375
|
-
* Pure, and never throws — the writer's `tagSignalSource` still guards it.
|
|
191
|
+
* First match wins: a supplied path/command → {@link classifyPathSource};
|
|
192
|
+
* `details` text naming a framework prefix; `tool-degraded`; else consumer.
|
|
193
|
+
* "Runtime-emitted means framework" is wrong — `close-failed` often blames
|
|
194
|
+
* consumer code.
|
|
376
195
|
*
|
|
377
|
-
* @param {unknown} record
|
|
196
|
+
* @param {unknown} record
|
|
378
197
|
* @returns {"framework"|"consumer"}
|
|
379
198
|
*/
|
|
380
199
|
export function classifySignalSource(record) {
|
|
@@ -5,34 +5,14 @@ import { orchestrationLogDir } from '../config/temp-paths.js';
|
|
|
5
5
|
import { Logger } from '../Logger.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* (`single-story-init`, `single-story-close`, `single-story-confirm-merge`)
|
|
12
|
-
* historically dumped their whole result object to stdout as pretty-printed
|
|
13
|
-
* JSON:
|
|
14
|
-
*
|
|
15
|
-
* --- STORY CLOSE RESULT ---
|
|
16
|
-
* { ... every field, 2-space indented ... }
|
|
17
|
-
* --- END RESULT ---
|
|
18
|
-
*
|
|
19
|
-
* That blob stays resident for the rest of the session and is re-read as
|
|
20
|
-
* cache every subsequent turn, yet the agent acts on only a handful of its
|
|
21
|
-
* fields (the machine contract is the separate terminal envelope). This helper
|
|
22
|
-
* routes the full detail to a temp log the agent can read on demand and emits
|
|
23
|
-
* a single structured summary line in its place.
|
|
24
|
-
*
|
|
25
|
-
* The escape hatch `MANDREL_RESULT_DETAIL=inline` restores the old inline
|
|
26
|
-
* pretty dump for interactive debugging.
|
|
8
|
+
* Hot-path CLIs log their full result and print one summary line, keeping a
|
|
9
|
+
* pretty JSON blob out of the agent's resident context.
|
|
10
|
+
* `MANDREL_RESULT_DETAIL=inline` restores the inline dump.
|
|
27
11
|
*/
|
|
28
12
|
|
|
29
|
-
/** Env var that restores the legacy inline pretty dump when set to `inline`. */
|
|
30
13
|
const RESULT_DETAIL_ENV = 'MANDREL_RESULT_DETAIL';
|
|
31
14
|
|
|
32
15
|
/**
|
|
33
|
-
* Turn a human label (`STORY CLOSE RESULT`) into a filesystem-safe log
|
|
34
|
-
* basename fragment (`story-close-result`).
|
|
35
|
-
*
|
|
36
16
|
* @param {string} label
|
|
37
17
|
* @returns {string}
|
|
38
18
|
*/
|
|
@@ -46,10 +26,6 @@ function slugify(label) {
|
|
|
46
26
|
}
|
|
47
27
|
|
|
48
28
|
/**
|
|
49
|
-
* The full detail block, byte-compatible with the legacy dump the hot-path
|
|
50
|
-
* scripts used to write to stdout — same markers, same pretty JSON — so a log
|
|
51
|
-
* a human opens reads exactly as the old inline dump did.
|
|
52
|
-
*
|
|
53
29
|
* @param {string} label
|
|
54
30
|
* @param {unknown} result
|
|
55
31
|
* @returns {string}
|
|
@@ -59,24 +35,17 @@ function detailBlock(label, result) {
|
|
|
59
35
|
}
|
|
60
36
|
|
|
61
37
|
/**
|
|
62
|
-
* Route a verbose result object off the agent's turn-resident stdout: write the
|
|
63
|
-
* full pretty detail to a temp log and emit a single-line structured summary in
|
|
64
|
-
* its place.
|
|
65
|
-
*
|
|
66
38
|
* @param {object} args
|
|
67
|
-
* @param {string} args.label
|
|
68
|
-
* @param {unknown} args.result
|
|
69
|
-
* @param {Record<string, unknown>} [args.summary]
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* @param {
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* @param {
|
|
77
|
-
* @param {typeof nodeFs} [args.fs] Filesystem seam (tests).
|
|
78
|
-
* @param {{ info: (m: string) => void }} [args.log] Logger seam (tests).
|
|
79
|
-
* @param {NodeJS.ProcessEnv} [args.env] Environment seam (tests).
|
|
39
|
+
* @param {string} args.label
|
|
40
|
+
* @param {unknown} args.result
|
|
41
|
+
* @param {Record<string, unknown>} [args.summary]
|
|
42
|
+
* @param {string|number} [args.scope] Log-name suffix so concurrent
|
|
43
|
+
* deliveries don't clobber one file.
|
|
44
|
+
* @param {string} [args.logDir]
|
|
45
|
+
* @param {object} [args.config]
|
|
46
|
+
* @param {typeof nodeFs} [args.fs]
|
|
47
|
+
* @param {{ info: (m: string) => void }} [args.log]
|
|
48
|
+
* @param {NodeJS.ProcessEnv} [args.env]
|
|
80
49
|
* @returns {{ logPath: string|null, inline: boolean, error?: string }}
|
|
81
50
|
*/
|
|
82
51
|
export function emitTerseResult({
|
|
@@ -92,7 +61,6 @@ export function emitTerseResult({
|
|
|
92
61
|
} = {}) {
|
|
93
62
|
const body = detailBlock(label, result);
|
|
94
63
|
|
|
95
|
-
// Escape hatch: restore the full inline pretty dump for interactive debugging.
|
|
96
64
|
if (String(env[RESULT_DETAIL_ENV] ?? '').toLowerCase() === 'inline') {
|
|
97
65
|
log.info?.(`\n${body}\n`);
|
|
98
66
|
return { logPath: null, inline: true };
|
|
@@ -110,8 +78,7 @@ export function emitTerseResult({
|
|
|
110
78
|
);
|
|
111
79
|
return { logPath, inline: false };
|
|
112
80
|
} catch (err) {
|
|
113
|
-
// Never lose detail:
|
|
114
|
-
// so the result is still recoverable from the transcript.
|
|
81
|
+
// Never lose detail: fall back to the inline dump.
|
|
115
82
|
log.info?.(`\n${body}\n`);
|
|
116
83
|
return { logPath: null, inline: true, error: err?.message ?? String(err) };
|
|
117
84
|
}
|