mandrel 2.60.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 +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +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 +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
// .agents/scripts/lib/dynamic-workflow/audit-orchestrator.js
|
|
2
|
-
/**
|
|
3
|
-
* Reusable audit-lens orchestration engine (Epic #3597, Story #3609).
|
|
4
|
-
*
|
|
5
|
-
* Every audit lens that runs as a Claude Code **dynamic workflow**
|
|
6
|
-
* (https://code.claude.com/docs/en/workflows) shares the same three-phase
|
|
7
|
-
* fan-out:
|
|
8
|
-
*
|
|
9
|
-
* 1. **analyze** — one read-only sub-agent per analysis dimension, run in
|
|
10
|
-
* parallel, each producing raw findings for its dimension only.
|
|
11
|
-
* 2. **adversarial cross-check** — an independent read-only reviewer
|
|
12
|
-
* re-verifies each dimension's findings, dropping false positives.
|
|
13
|
-
* 3. **synthesize** — a single agent assembles the cross-checked findings
|
|
14
|
-
* into the lens's report contract and writes the artifact.
|
|
15
|
-
*
|
|
16
|
-
* Before this engine existed, each lens (starting with `audit-clean-code`)
|
|
17
|
-
* inlined a private copy of this loop. `runAuditOrchestration` extracts it
|
|
18
|
-
* once so a lens workflow only has to declare *what* is lens-specific —
|
|
19
|
-
* its dimension list, its prompt builders, its read-only tool allowlist, and
|
|
20
|
-
* its report-contract self-check — and delegate the fan-out plumbing here.
|
|
21
|
-
*
|
|
22
|
-
* ## Read-only guarantee
|
|
23
|
-
*
|
|
24
|
-
* Analysis and cross-check agents receive only the caller-supplied
|
|
25
|
-
* `readOnlyTools` allowlist (read/search tools — no write/edit/shell). The
|
|
26
|
-
* single write in the run is the report artifact, performed by the synthesis
|
|
27
|
-
* agent, which is granted the read-only allowlist plus `Write`.
|
|
28
|
-
*
|
|
29
|
-
* ## Partial-failure posture
|
|
30
|
-
*
|
|
31
|
-
* The per-dimension fan-out is settled, not all-or-nothing (Story #4783). One
|
|
32
|
-
* rejected dimension used to discard every sibling's completed work; the
|
|
33
|
-
* engine now partitions the settled results, flows the fulfilled dimensions on
|
|
34
|
-
* to the next phase, and records the rejected ones as an explicit
|
|
35
|
-
* degraded-coverage note in the report's Executive Summary. This mirrors the
|
|
36
|
-
* posture `close-validation/runner.js` already takes with per-gate errors:
|
|
37
|
-
* capture the failure into the result rather than rejecting the whole run.
|
|
38
|
-
* Only a *total* loss — every dimension rejected — throws, because there is
|
|
39
|
-
* then nothing to synthesise.
|
|
40
|
-
*
|
|
41
|
-
* ## Report-contract self-check
|
|
42
|
-
*
|
|
43
|
-
* After synthesis the engine calls the caller-supplied `assertReportContract`
|
|
44
|
-
* on the synthesis output and throws when the report is non-conformant, so a
|
|
45
|
-
* lens can never silently emit a malformed report. The thrown message is
|
|
46
|
-
* derived from the caller's `formatContractError` (when supplied) so each lens
|
|
47
|
-
* can phrase the failure in its own terms.
|
|
48
|
-
*
|
|
49
|
-
* This module is dependency-free and lens-agnostic: it imports nothing from
|
|
50
|
-
* any specific lens. It is exercised in isolation by
|
|
51
|
-
* `tests/dynamic-workflow-audit-orchestrator.test.js` with a stub `agent` /
|
|
52
|
-
* `phase` so the fan-out wiring is unit-testable without a live Claude Code
|
|
53
|
-
* runtime.
|
|
54
|
-
*
|
|
55
|
-
* @module dynamic-workflow/audit-orchestrator
|
|
56
|
-
*/
|
|
57
|
-
|
|
58
|
-
import { withDegradedCoverageNote } from './degraded-coverage.js';
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* A dimension that did not complete, as recorded by the settled fan-out.
|
|
62
|
-
*
|
|
63
|
-
* @typedef {import('./degraded-coverage.js').DimensionFailure} DimensionFailure
|
|
64
|
-
*/
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* The live dynamic-workflow runtime context the host passes to a saved
|
|
68
|
-
* `.claude/workflows/*.workflow.js` entry point. Re-exported as a typedef so
|
|
69
|
-
* every lens workflow references one canonical shape rather than re-declaring
|
|
70
|
-
* it (and drifting from) the runtime contract.
|
|
71
|
-
*
|
|
72
|
-
* `agent` spawns a sub-agent and resolves to its result envelope (the textual
|
|
73
|
-
* output is on `.output`). `phase` groups one or more agent calls under a
|
|
74
|
-
* named phase surfaced in the `/workflows` view; it resolves to **whatever its
|
|
75
|
-
* callback resolves to**, so it is generic over the callback's return type.
|
|
76
|
-
*
|
|
77
|
-
* @typedef {object} AgentResult
|
|
78
|
-
* @property {string} output - The sub-agent's textual output.
|
|
79
|
-
*
|
|
80
|
-
* @typedef {object} WorkflowContext
|
|
81
|
-
* @property {(opts: { prompt: string, allowedTools?: string[], model?: string }) => Promise<AgentResult>} agent
|
|
82
|
-
* Spawn a sub-agent with the given prompt and (optional) tool allowlist /
|
|
83
|
-
* model. Resolves to the agent's result envelope.
|
|
84
|
-
* @property {<T>(name: string, fn: () => Promise<T>) => Promise<T>} phase
|
|
85
|
-
* Group agent calls into a named phase (per-phase agent count, token total,
|
|
86
|
-
* and elapsed time surface in `/workflows`). Resolves to the callback's
|
|
87
|
-
* own resolved value.
|
|
88
|
-
* @property {object} inputs - Caller-supplied workflow inputs.
|
|
89
|
-
*/
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* @template TReport
|
|
93
|
-
* @typedef {object} AuditOrchestrationSpec
|
|
94
|
-
* @property {WorkflowContext} ctx
|
|
95
|
-
* The live dynamic-workflow runtime context (`agent` + `phase`).
|
|
96
|
-
* @property {readonly string[]} dimensions
|
|
97
|
-
* The independent analysis dimensions to fan out, one sub-agent each.
|
|
98
|
-
* @property {readonly string[]} readOnlyTools
|
|
99
|
-
* The read-only tool allowlist granted to analysis and cross-check agents.
|
|
100
|
-
* The synthesis agent additionally receives `Write`.
|
|
101
|
-
* @property {(dimension: string) => string} buildDimensionPrompt
|
|
102
|
-
* Compose the analysis prompt for one dimension (lens-specific).
|
|
103
|
-
* @property {(dimension: string, findings: string) => string} buildCrossCheckPrompt
|
|
104
|
-
* Compose the adversarial cross-check prompt for one dimension's findings.
|
|
105
|
-
* @property {(crossCheckedBlocks: string[], degraded: DimensionFailure[]) => string} buildSynthesisPrompt
|
|
106
|
-
* Compose the synthesis prompt that assembles the report and writes it. The
|
|
107
|
-
* second argument lists the dimensions that did not complete (empty on a
|
|
108
|
-
* full-coverage run); lenses may ignore it — the engine annotates the report
|
|
109
|
-
* with the degraded-coverage note either way.
|
|
110
|
-
* @property {(report: string) => { conformant: boolean, missingSections: string[], hasTitle: boolean }} assertReportContract
|
|
111
|
-
* Self-check the synthesised report against the lens's report contract.
|
|
112
|
-
* @property {(check: { conformant: boolean, missingSections: string[], hasTitle: boolean }) => string} [formatContractError]
|
|
113
|
-
* Optional: phrase the non-conformance error in the lens's own terms.
|
|
114
|
-
* Defaults to a generic message naming the missing title / sections.
|
|
115
|
-
* @property {(report: string) => TReport} [buildResult]
|
|
116
|
-
* Optional: derive the engine's return value from the synthesised report.
|
|
117
|
-
* Defaults to returning `{ report }`.
|
|
118
|
-
*/
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* The default phase names, exported so lenses and tests reference the exact
|
|
122
|
-
* strings rather than hard-coding them.
|
|
123
|
-
*/
|
|
124
|
-
export const ORCHESTRATION_PHASES = Object.freeze({
|
|
125
|
-
ANALYZE: 'analyze-dimensions',
|
|
126
|
-
CROSS_CHECK: 'adversarial-cross-check',
|
|
127
|
-
SYNTHESIZE: 'synthesize-report',
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
/** The single mutating tool the synthesis agent is granted. */
|
|
131
|
-
export const SYNTHESIS_WRITE_TOOL = 'Write';
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Default phrasing for a report-contract self-check failure. Lenses can
|
|
135
|
-
* override via `spec.formatContractError`.
|
|
136
|
-
*
|
|
137
|
-
* @param {{ conformant: boolean, missingSections: string[], hasTitle: boolean }} check
|
|
138
|
-
* @returns {string}
|
|
139
|
-
*/
|
|
140
|
-
export function defaultContractError(check) {
|
|
141
|
-
const titlePart = check.hasTitle ? '' : 'title; ';
|
|
142
|
-
const sections = Array.isArray(check.missingSections)
|
|
143
|
-
? check.missingSections.join(', ')
|
|
144
|
-
: '';
|
|
145
|
-
return `report failed contract check: missing ${titlePart}sections=[${sections}]`;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Reduce a rejection reason to a single-line message.
|
|
150
|
-
*
|
|
151
|
-
* @param {unknown} reason
|
|
152
|
-
* @returns {string}
|
|
153
|
-
*/
|
|
154
|
-
function describeRejection(reason) {
|
|
155
|
-
if (reason instanceof Error) return reason.message;
|
|
156
|
-
return String(reason ?? 'unknown error');
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Partition settled fan-out results into the values that completed and the
|
|
161
|
-
* dimensions that did not. `dimensions[i]` names the dimension behind
|
|
162
|
-
* `settled[i]`, so a rejection is always attributable.
|
|
163
|
-
*
|
|
164
|
-
* @template T
|
|
165
|
-
* @param {readonly string[]} dimensions
|
|
166
|
-
* @param {readonly PromiseSettledResult<T>[]} settled
|
|
167
|
-
* @param {string} phaseName Phase recorded on each failure.
|
|
168
|
-
* @returns {{ fulfilled: T[], failures: DimensionFailure[] }}
|
|
169
|
-
*/
|
|
170
|
-
function partitionSettled(dimensions, settled, phaseName) {
|
|
171
|
-
const fulfilled = [];
|
|
172
|
-
const failures = [];
|
|
173
|
-
settled.forEach((result, index) => {
|
|
174
|
-
if (result.status === 'fulfilled') {
|
|
175
|
-
fulfilled.push(result.value);
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
failures.push({
|
|
179
|
-
dimension: dimensions[index],
|
|
180
|
-
phase: phaseName,
|
|
181
|
-
reason: describeRejection(result.reason),
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
return { fulfilled, failures };
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Run the shared three-phase audit-lens orchestration: parallel per-dimension
|
|
189
|
-
* analysis → adversarial cross-check → synthesis + report-contract self-check.
|
|
190
|
-
*
|
|
191
|
-
* The caller supplies everything lens-specific (dimensions, prompt builders,
|
|
192
|
-
* tool allowlist, contract assertion); this engine owns the fan-out plumbing
|
|
193
|
-
* and the read-only / single-write tool discipline.
|
|
194
|
-
*
|
|
195
|
-
* @template TReport
|
|
196
|
-
* @param {AuditOrchestrationSpec<TReport>} spec
|
|
197
|
-
* @returns {Promise<TReport>}
|
|
198
|
-
*/
|
|
199
|
-
export async function runAuditOrchestration(spec) {
|
|
200
|
-
const {
|
|
201
|
-
ctx,
|
|
202
|
-
dimensions,
|
|
203
|
-
readOnlyTools,
|
|
204
|
-
buildDimensionPrompt,
|
|
205
|
-
buildCrossCheckPrompt,
|
|
206
|
-
buildSynthesisPrompt,
|
|
207
|
-
assertReportContract,
|
|
208
|
-
formatContractError = defaultContractError,
|
|
209
|
-
buildResult = (report) => /** @type {TReport} */ ({ report }),
|
|
210
|
-
} = spec;
|
|
211
|
-
|
|
212
|
-
const { agent, phase } = ctx;
|
|
213
|
-
|
|
214
|
-
// Phase 1 — parallel per-dimension analysis (read-only agents). Settled, not
|
|
215
|
-
// all-or-nothing: one dimension's rejection must not discard its siblings.
|
|
216
|
-
const analyzed = await phase(ORCHESTRATION_PHASES.ANALYZE, async () =>
|
|
217
|
-
Promise.allSettled(
|
|
218
|
-
dimensions.map(async (dimension) => {
|
|
219
|
-
const { output } = await agent({
|
|
220
|
-
prompt: buildDimensionPrompt(dimension),
|
|
221
|
-
allowedTools: [...readOnlyTools],
|
|
222
|
-
});
|
|
223
|
-
return { dimension, findings: output };
|
|
224
|
-
}),
|
|
225
|
-
),
|
|
226
|
-
);
|
|
227
|
-
const { fulfilled: rawFindings, failures: analyzeFailures } =
|
|
228
|
-
partitionSettled(dimensions, analyzed, 'analyze');
|
|
229
|
-
|
|
230
|
-
// Phase 2 — adversarial cross-check: an independent agent re-verifies each
|
|
231
|
-
// surviving dimension's findings and filters false positives before
|
|
232
|
-
// inclusion. Settled for the same reason as phase 1.
|
|
233
|
-
const checkedDimensions = rawFindings.map((entry) => entry.dimension);
|
|
234
|
-
const checked = await phase(ORCHESTRATION_PHASES.CROSS_CHECK, async () =>
|
|
235
|
-
Promise.allSettled(
|
|
236
|
-
rawFindings.map(async ({ dimension, findings }) => {
|
|
237
|
-
const { output } = await agent({
|
|
238
|
-
prompt: buildCrossCheckPrompt(dimension, findings),
|
|
239
|
-
allowedTools: [...readOnlyTools],
|
|
240
|
-
});
|
|
241
|
-
return output;
|
|
242
|
-
}),
|
|
243
|
-
),
|
|
244
|
-
);
|
|
245
|
-
const { fulfilled: crossChecked, failures: crossCheckFailures } =
|
|
246
|
-
partitionSettled(checkedDimensions, checked, 'cross-check');
|
|
247
|
-
|
|
248
|
-
const degraded = [...analyzeFailures, ...crossCheckFailures];
|
|
249
|
-
if (dimensions.length > 0 && crossChecked.length === 0) {
|
|
250
|
-
// Nothing survived — there is no partial report to salvage.
|
|
251
|
-
throw new Error(
|
|
252
|
-
`every audit dimension failed: ${degraded
|
|
253
|
-
.map((f) => `${f.dimension} (${f.phase}: ${f.reason})`)
|
|
254
|
-
.join('; ')}`,
|
|
255
|
-
);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// Phase 3 — synthesis: assemble the report contract and write the artifact.
|
|
259
|
-
const { output: synthesised } = await phase(
|
|
260
|
-
ORCHESTRATION_PHASES.SYNTHESIZE,
|
|
261
|
-
async () =>
|
|
262
|
-
agent({
|
|
263
|
-
prompt: buildSynthesisPrompt(crossChecked, degraded),
|
|
264
|
-
// Synthesis is the one stage permitted to write the report artifact.
|
|
265
|
-
allowedTools: [...readOnlyTools, SYNTHESIS_WRITE_TOOL],
|
|
266
|
-
}),
|
|
267
|
-
);
|
|
268
|
-
|
|
269
|
-
// The coverage gap is annotated by the engine, never left to the synthesis
|
|
270
|
-
// agent's discretion.
|
|
271
|
-
const report = withDegradedCoverageNote(
|
|
272
|
-
synthesised,
|
|
273
|
-
degraded,
|
|
274
|
-
dimensions.length,
|
|
275
|
-
);
|
|
276
|
-
|
|
277
|
-
// Self-verify report-contract conformance before returning.
|
|
278
|
-
const check = assertReportContract(report);
|
|
279
|
-
if (!check.conformant) {
|
|
280
|
-
throw new Error(formatContractError(check));
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
return buildResult(report);
|
|
284
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
// .agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js
|
|
2
|
-
import { assertSectionsContract } from './report-contract-core.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* The `audit-clean-code` report contract (Story #3278).
|
|
6
|
-
*
|
|
7
|
-
* This is the **single source of truth** for the report shape that BOTH the
|
|
8
|
-
* sequential lens (`.agents/workflows/audit-clean-code.md` Step 3) and the
|
|
9
|
-
* orchestrated dynamic-workflow path
|
|
10
|
-
* (`.claude/workflows/audit-clean-code.workflow.js`) MUST emit to
|
|
11
|
-
* `{{auditOutputDir}}/audit-clean-code-results.md`. Keeping it here lets the
|
|
12
|
-
* contract-tier test assert report conformance against one definition rather
|
|
13
|
-
* than re-deriving headings from prose in two places.
|
|
14
|
-
*
|
|
15
|
-
* This module documents the **existing** report shape; it does not introduce
|
|
16
|
-
* a new one. Changing the report contract is a separate, deliberate decision —
|
|
17
|
-
* not a side effect of the dual-path orchestration work.
|
|
18
|
-
*
|
|
19
|
-
* @module dynamic-workflow/clean-code-report-contract
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
/** The artifact filename the lens writes under `auditOutputDir`. */
|
|
23
|
-
export const REPORT_ARTIFACT_BASENAME = 'audit-clean-code-results.md';
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* The required top-level (`##`) section headings, in document order, that the
|
|
27
|
-
* lens markdown's Step 3 template defines. A conformant report MUST contain
|
|
28
|
-
* each of these headings; the orchestrated path assembles its sub-agent
|
|
29
|
-
* findings into exactly this skeleton.
|
|
30
|
-
*/
|
|
31
|
-
export const REQUIRED_SECTIONS = Object.freeze([
|
|
32
|
-
'Executive Summary',
|
|
33
|
-
'Detailed Findings',
|
|
34
|
-
'Dead Code Inventory',
|
|
35
|
-
'Technical Debt Backlog',
|
|
36
|
-
]);
|
|
37
|
-
|
|
38
|
-
/** The H1 title the report opens with. */
|
|
39
|
-
export const REPORT_TITLE = 'Clean Code Audit Report';
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* The required field labels inside each `### <finding>` block under
|
|
43
|
-
* `## Detailed Findings`. Mirrors the strict per-finding structure in the
|
|
44
|
-
* lens template.
|
|
45
|
-
*/
|
|
46
|
-
export const FINDING_FIELDS = Object.freeze([
|
|
47
|
-
'Dimension',
|
|
48
|
-
'Impact',
|
|
49
|
-
'Current State',
|
|
50
|
-
'Recommendation & Rationale',
|
|
51
|
-
'Agent Prompt',
|
|
52
|
-
]);
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* The Dead Code Inventory table column headers, in order.
|
|
56
|
-
*/
|
|
57
|
-
export const DEAD_CODE_COLUMNS = Object.freeze([
|
|
58
|
-
'File',
|
|
59
|
-
'Symbol / Block',
|
|
60
|
-
'Type',
|
|
61
|
-
'Estimated LOC',
|
|
62
|
-
]);
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Assert that a rendered markdown report conforms to the contract: it has the
|
|
66
|
-
* H1 title and every required `##` section heading. Returns a structured
|
|
67
|
-
* result rather than throwing, so callers (tests, the orchestrated path's
|
|
68
|
-
* self-check) can report precisely which sections are missing.
|
|
69
|
-
*
|
|
70
|
-
* Pure function — string analysis only.
|
|
71
|
-
*
|
|
72
|
-
* @param {string} markdown - The rendered report body.
|
|
73
|
-
* @returns {{ conformant: boolean, missingSections: string[], hasTitle: boolean }}
|
|
74
|
-
*/
|
|
75
|
-
export function assertReportContract(markdown) {
|
|
76
|
-
return assertSectionsContract(markdown, {
|
|
77
|
-
title: REPORT_TITLE,
|
|
78
|
-
requiredSections: REQUIRED_SECTIONS,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
// .agents/scripts/lib/dynamic-workflow/degraded-coverage.js
|
|
2
|
-
/**
|
|
3
|
-
* Degraded-coverage annotation for audit-lens reports (Story #4783).
|
|
4
|
-
*
|
|
5
|
-
* An audit lens fans out one sub-agent per analysis dimension. When one of
|
|
6
|
-
* those dimensions rejects — a sub-agent that ran out of context, a
|
|
7
|
-
* measurement command that failed, a transient runtime error — the run used to
|
|
8
|
-
* discard every sibling dimension's completed work along with it.
|
|
9
|
-
*
|
|
10
|
-
* The engine now partitions instead: the fulfilled dimensions flow on to
|
|
11
|
-
* synthesis, and the rejected ones are recorded here as an explicit note in
|
|
12
|
-
* the report's Executive Summary. A lens that covers four of five dimensions
|
|
13
|
-
* *and says which one is missing* is strictly more useful than one that yields
|
|
14
|
-
* nothing — but only if the gap is visible. An unannotated partial report is
|
|
15
|
-
* worse than no report, because it reads as complete coverage.
|
|
16
|
-
*
|
|
17
|
-
* The annotation is applied by the engine, not requested of the synthesis
|
|
18
|
-
* agent: a coverage disclaimer that depends on an LLM remembering to write it
|
|
19
|
-
* is not a disclaimer.
|
|
20
|
-
*
|
|
21
|
-
* @module dynamic-workflow/degraded-coverage
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* A dimension that did not complete.
|
|
26
|
-
*
|
|
27
|
-
* @typedef {object} DimensionFailure
|
|
28
|
-
* @property {string} dimension The analysis dimension that failed.
|
|
29
|
-
* @property {string} phase The phase it failed in (`analyze` / `cross-check`).
|
|
30
|
-
* @property {string} reason The rejection's message.
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
/** Matches the Executive Summary heading at any heading level. */
|
|
34
|
-
const EXECUTIVE_SUMMARY_HEADING = /^#{1,6}\s+Executive Summary\b/i;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Render the degraded-coverage note. Names every failed dimension, the phase
|
|
38
|
-
* it failed in, and the reason, so a reader can tell coverage loss apart from
|
|
39
|
-
* an absence of findings.
|
|
40
|
-
*
|
|
41
|
-
* @param {readonly DimensionFailure[]} failures
|
|
42
|
-
* @param {number} totalDimensions Dimensions the run set out to cover.
|
|
43
|
-
* @returns {string} A markdown blockquote.
|
|
44
|
-
*/
|
|
45
|
-
function formatDegradedCoverageNote(failures, totalDimensions) {
|
|
46
|
-
const detail = failures
|
|
47
|
-
.map((f) => `**${f.dimension}** (${f.phase}: ${f.reason})`)
|
|
48
|
-
.join('; ');
|
|
49
|
-
const noun = failures.length === 1 ? 'dimension' : 'dimensions';
|
|
50
|
-
return [
|
|
51
|
-
`> ⚠️ **Degraded coverage** — ${failures.length} of ${totalDimensions} analysis ${noun} did not complete`,
|
|
52
|
-
`> and ${failures.length === 1 ? 'is' : 'are'} unrepresented in this report: ${detail}.`,
|
|
53
|
-
'> Findings for the remaining dimensions are complete; the gap above is not evidence of their absence.',
|
|
54
|
-
].join('\n');
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Annotate a synthesised report with the degraded-coverage note, inserted
|
|
59
|
-
* directly beneath the `## Executive Summary` heading (every lens report
|
|
60
|
-
* contract requires that section). A report without the heading is prefixed
|
|
61
|
-
* instead, so the note can never be silently dropped.
|
|
62
|
-
*
|
|
63
|
-
* Returns the report unchanged when nothing failed — a full-coverage run must
|
|
64
|
-
* not carry a coverage caveat.
|
|
65
|
-
*
|
|
66
|
-
* @param {string} report
|
|
67
|
-
* @param {readonly DimensionFailure[]} failures
|
|
68
|
-
* @param {number} totalDimensions
|
|
69
|
-
* @returns {string}
|
|
70
|
-
*/
|
|
71
|
-
export function withDegradedCoverageNote(report, failures, totalDimensions) {
|
|
72
|
-
if (!Array.isArray(failures) || failures.length === 0) return report;
|
|
73
|
-
const note = formatDegradedCoverageNote(failures, totalDimensions);
|
|
74
|
-
const lines = String(report).split('\n');
|
|
75
|
-
const headingIndex = lines.findIndex((line) =>
|
|
76
|
-
EXECUTIVE_SUMMARY_HEADING.test(line.trim()),
|
|
77
|
-
);
|
|
78
|
-
if (headingIndex === -1) return `${note}\n\n${report}`;
|
|
79
|
-
lines.splice(headingIndex + 1, 0, '', note);
|
|
80
|
-
return lines.join('\n');
|
|
81
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
// .agents/scripts/lib/dynamic-workflow/documentation-report-contract.js
|
|
2
|
-
import { assertSectionsContract } from './report-contract-core.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* The `audit-documentation` report contract (Story #4024).
|
|
6
|
-
*
|
|
7
|
-
* This is the **single source of truth** for the report shape that BOTH the
|
|
8
|
-
* sequential lens (`.agents/workflows/audit-documentation.md` Step 3) and the
|
|
9
|
-
* orchestrated dynamic-workflow path
|
|
10
|
-
* (`.claude/workflows/audit-documentation.workflow.js`) MUST emit to
|
|
11
|
-
* `{{auditOutputDir}}/audit-documentation-results.md`. Keeping it here lets
|
|
12
|
-
* the contract-tier test assert report conformance against one definition
|
|
13
|
-
* rather than re-deriving headings from prose in two places.
|
|
14
|
-
*
|
|
15
|
-
* @module dynamic-workflow/documentation-report-contract
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
/** The artifact filename the lens writes under `auditOutputDir`. */
|
|
19
|
-
export const REPORT_ARTIFACT_BASENAME = 'audit-documentation-results.md';
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* The required top-level (`##`) section headings, in document order, that the
|
|
23
|
-
* lens markdown's Step 3 template defines. A conformant report MUST contain
|
|
24
|
-
* each of these headings; the orchestrated path assembles its verified
|
|
25
|
-
* findings into exactly this skeleton.
|
|
26
|
-
*/
|
|
27
|
-
export const REQUIRED_SECTIONS = Object.freeze([
|
|
28
|
-
'Executive Summary',
|
|
29
|
-
'Target Set Coverage',
|
|
30
|
-
'Detailed Findings',
|
|
31
|
-
]);
|
|
32
|
-
|
|
33
|
-
/** The H1 title the report opens with. */
|
|
34
|
-
export const REPORT_TITLE = 'Documentation Audit Report';
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* The required field labels inside each `### <finding>` block under
|
|
38
|
-
* `## Detailed Findings`. Mirrors the strict per-finding structure in the
|
|
39
|
-
* lens template.
|
|
40
|
-
*/
|
|
41
|
-
export const FINDING_FIELDS = Object.freeze([
|
|
42
|
-
'Category',
|
|
43
|
-
'Impact',
|
|
44
|
-
'Current State',
|
|
45
|
-
'Recommendation & Rationale',
|
|
46
|
-
'Agent Prompt',
|
|
47
|
-
]);
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* The finding categories the per-finding `Category` field draws from. These
|
|
51
|
-
* mirror the lens's Step 3 template enumeration: deterministic-gate findings
|
|
52
|
-
* (Generator Drift, Link Integrity) plus semantic-verification findings
|
|
53
|
-
* (Broken Instruction, Stale Description, Missing Coverage).
|
|
54
|
-
*/
|
|
55
|
-
export const FINDING_CATEGORIES = Object.freeze([
|
|
56
|
-
'Broken Instruction',
|
|
57
|
-
'Stale Description',
|
|
58
|
-
'Missing Coverage',
|
|
59
|
-
'Generator Drift',
|
|
60
|
-
'Link Integrity',
|
|
61
|
-
]);
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* The impact buckets the Executive Summary and per-finding `Impact` field draw
|
|
65
|
-
* from. The lens speaks in High/Medium/Low; this list is the canonical
|
|
66
|
-
* taxonomy the downstream `audit-to-stories` consumer maps onto Story
|
|
67
|
-
* priority.
|
|
68
|
-
*/
|
|
69
|
-
export const IMPACT_LEVELS = Object.freeze(['High', 'Medium', 'Low']);
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Assert that a rendered markdown report conforms to the contract: it has the
|
|
73
|
-
* H1 title and every required `##` section heading. Returns a structured
|
|
74
|
-
* result rather than throwing, so callers (tests, the orchestrated path's
|
|
75
|
-
* self-check) can report precisely which sections are missing.
|
|
76
|
-
*
|
|
77
|
-
* Pure function — string analysis only.
|
|
78
|
-
*
|
|
79
|
-
* @param {string} markdown - The rendered report body.
|
|
80
|
-
* @returns {{ conformant: boolean, missingSections: string[], hasTitle: boolean }}
|
|
81
|
-
*/
|
|
82
|
-
export function assertReportContract(markdown) {
|
|
83
|
-
return assertSectionsContract(markdown, {
|
|
84
|
-
title: REPORT_TITLE,
|
|
85
|
-
requiredSections: REQUIRED_SECTIONS,
|
|
86
|
-
});
|
|
87
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
// .agents/scripts/lib/dynamic-workflow/performance-report-contract.js
|
|
2
|
-
import { assertSectionsContract } from './report-contract-core.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* The `audit-performance` report contract (Epic #3597, Story #3611).
|
|
6
|
-
*
|
|
7
|
-
* This is the **single source of truth** for the report shape that BOTH the
|
|
8
|
-
* sequential lens (`.agents/workflows/audit-performance.md` Step 3) and the
|
|
9
|
-
* orchestrated dynamic-workflow path
|
|
10
|
-
* (`.claude/workflows/audit-performance.workflow.js`) MUST emit to
|
|
11
|
-
* `{{auditOutputDir}}/audit-performance-results.md`. Keeping it here lets the
|
|
12
|
-
* contract-tier test assert report conformance against one definition rather
|
|
13
|
-
* than re-deriving headings from prose in two places.
|
|
14
|
-
*
|
|
15
|
-
* The report shape is declared by the lens markdown's Step 4 template. Story
|
|
16
|
-
* #4631 added the mandatory per-finding **Evidence** field (a repro command
|
|
17
|
-
* plus a `measured`/`estimated` tag) so measurement-first evidence is part of
|
|
18
|
-
* the contract both paths must emit, not just prose in the lens.
|
|
19
|
-
*
|
|
20
|
-
* @module dynamic-workflow/performance-report-contract
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/** The artifact filename the lens writes under `auditOutputDir`. */
|
|
24
|
-
export const REPORT_ARTIFACT_BASENAME = 'audit-performance-results.md';
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* The required top-level (`##`) section headings, in document order, that the
|
|
28
|
-
* lens markdown's Step 3 template defines. A conformant report MUST contain
|
|
29
|
-
* each of these headings; the orchestrated path assembles its cross-checked
|
|
30
|
-
* sub-agent findings into exactly this skeleton.
|
|
31
|
-
*
|
|
32
|
-
* The `Low-Hanging Fruit` section is the performance lens's distinguishing
|
|
33
|
-
* section — the quick-win backlog the synthesis stage must always emit.
|
|
34
|
-
*/
|
|
35
|
-
export const REQUIRED_SECTIONS = Object.freeze([
|
|
36
|
-
'Executive Summary',
|
|
37
|
-
'Detailed Findings',
|
|
38
|
-
'Low-Hanging Fruit',
|
|
39
|
-
]);
|
|
40
|
-
|
|
41
|
-
/** The H1 title the report opens with. */
|
|
42
|
-
export const REPORT_TITLE = 'Performance Audit Report';
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* The required field labels inside each `### <finding>` block under
|
|
46
|
-
* `## Detailed Findings`. Mirrors the strict per-finding structure in the
|
|
47
|
-
* lens template.
|
|
48
|
-
*/
|
|
49
|
-
export const FINDING_FIELDS = Object.freeze([
|
|
50
|
-
'Dimension',
|
|
51
|
-
'Impact',
|
|
52
|
-
'Evidence',
|
|
53
|
-
'Current State',
|
|
54
|
-
'Recommendation & Rationale',
|
|
55
|
-
'Agent Prompt',
|
|
56
|
-
]);
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Assert that a rendered markdown report conforms to the contract: it has the
|
|
60
|
-
* H1 title and every required `##` section heading. Returns a structured
|
|
61
|
-
* result rather than throwing, so callers (tests, the orchestrated path's
|
|
62
|
-
* self-check) can report precisely which sections are missing.
|
|
63
|
-
*
|
|
64
|
-
* Pure function — string analysis only.
|
|
65
|
-
*
|
|
66
|
-
* @param {string} markdown - The rendered report body.
|
|
67
|
-
* @returns {{ conformant: boolean, missingSections: string[], hasTitle: boolean }}
|
|
68
|
-
*/
|
|
69
|
-
export function assertReportContract(markdown) {
|
|
70
|
-
return assertSectionsContract(markdown, {
|
|
71
|
-
title: REPORT_TITLE,
|
|
72
|
-
requiredSections: REQUIRED_SECTIONS,
|
|
73
|
-
});
|
|
74
|
-
}
|