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,56 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/diff-magnitude.js —
|
|
3
|
-
* split into implementation and mandated-companion
|
|
2
|
+
* lib/orchestration/diff-magnitude.js — changed-line magnitude of a diff,
|
|
3
|
+
* split into implementation and mandated-companion (tests, docs, baselines,
|
|
4
|
+
* lockfiles) halves, so obeying test-first and doc rules never inflates the
|
|
5
|
+
* size that bounds the light path.
|
|
4
6
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* - **Too tight.** Of 33 real-work squash merges on `main` (excluding
|
|
12
|
-
* release-please and `chore(baselines)` automation) only 7 — 21% — touch
|
|
13
|
-
* four files or fewer; the median is 8. The framework's *own* narrow-diff
|
|
14
|
-
* scale, `DEFAULT_DIFF_WIDTH.softFiles` in `review-depth.js`, is 15.
|
|
15
|
-
* - **Blind.** A three-file, 323-line rewrite passed while a 190-file change
|
|
16
|
-
* was rejected 47× over — even though 186 of those files were tests and its
|
|
17
|
-
* implementation was 7 files.
|
|
18
|
-
*
|
|
19
|
-
* So the axis is **changed lines over implementation files**, and the companion
|
|
20
|
-
* classes the framework itself mandates are exempt from the count: obeying
|
|
21
|
-
* `rules/testing-standards.md` (test-first), the documentation a change of
|
|
22
|
-
* consequence is expected to touch, and the baseline ratchets must not inflate
|
|
23
|
-
* the number that then rejects the change. Re-counting those same 33 merges on implementation files alone moves
|
|
24
|
-
* the four-file pass rate from 21% to 58%.
|
|
25
|
-
*
|
|
26
|
-
* ## Three contracts worth not rediscovering
|
|
27
|
-
*
|
|
28
|
-
* 1. **Additions plus deletions, never net.** A modified line counts twice
|
|
29
|
-
* (one `+`, one `-`), which is the intended weighting. Net is actively
|
|
30
|
-
* broken as a size signal: the merge retiring the planner snapshot is
|
|
31
|
-
* 1119 add+del but **−803** net, so a large deletion would measure as
|
|
32
|
-
* trivial.
|
|
33
|
-
* 2. **A pure rename is free.** `git diff --numstat` reports `0\t0` for one,
|
|
34
|
-
* and its path arrives in `old => new` form — normalized here to the
|
|
35
|
-
* destination so the file still counts toward the implementation tally.
|
|
36
|
-
* 3. **Exemption is from *counting*, never from *risk*.** Nothing here
|
|
37
|
-
* touches sensitive-path derivation, which every caller runs over the
|
|
38
|
-
* full changed set including companions.
|
|
39
|
-
*
|
|
40
|
-
* Companion matching runs through the audit suite's picomatch seam as a
|
|
41
|
-
* **positive** glob list negated by the caller. A `!`-prefixed picomatch
|
|
42
|
-
* pattern widens a match rather than narrowing it, so expressing the
|
|
43
|
-
* behavior-bearing exceptions as negations would silently exempt more than
|
|
44
|
-
* intended.
|
|
45
|
-
*
|
|
46
|
-
* Every export is total: no throws. {@link readNumstatRows} owns the one git
|
|
47
|
-
* read; everything else is pure.
|
|
48
|
-
*
|
|
49
|
-
* The public surface is deliberately just those two functions. The numstat
|
|
50
|
-
* parse, the rename normalization, and the companion classifier are internal:
|
|
51
|
-
* each is fully observable through them (a stubbed `gitSpawnFn` drives the
|
|
52
|
-
* parse, an `isCompanionFn` seam drives the classification), so exporting them
|
|
53
|
-
* would widen the module's contract for no caller.
|
|
7
|
+
* Contracts: lines are additions + deletions, never net (a big deletion is
|
|
8
|
+
* not trivial); a pure rename is free but its file still counts; exemption
|
|
9
|
+
* is from counting, never from sensitive-path risk. Companion globs are a
|
|
10
|
+
* positive list — a `!` picomatch pattern widens rather than narrows. Every
|
|
11
|
+
* export is total.
|
|
54
12
|
*
|
|
55
13
|
* @module lib/orchestration/diff-magnitude
|
|
56
14
|
*/
|
|
@@ -59,27 +17,13 @@ import { matchesAnyFilePattern } from '../audit-suite/selector.js';
|
|
|
59
17
|
import { gitSpawn } from '../git-utils.js';
|
|
60
18
|
|
|
61
19
|
/**
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* "config" by file type but behavior by effect, and `.agents/schemas/audit-rules.json`
|
|
68
|
-
* is the sensitive-path SSOT — exempting it would let a change widen the very
|
|
69
|
-
* allowlist that decides whether it is risky.
|
|
70
|
-
*
|
|
71
|
-
* Note the anchoring: `baselines/**` is the generated baseline **data** at the
|
|
72
|
-
* repository root. The baseline *schemas* under `.agents/schemas/baselines/`
|
|
73
|
-
* are unanchored by this pattern and therefore still count as implementation.
|
|
74
|
-
*
|
|
75
|
-
* Markdown is exempt wholesale, which includes `.agents/workflows/**` and
|
|
76
|
-
* `.agents/rules/**`. That is intended: rewriting a workflow contract is not
|
|
77
|
-
* *effort* the way a module rewrite is, and its real guards are the close-time
|
|
78
|
-
* context-budget, doc-link, and docs-reference-sync gates — none of which this
|
|
79
|
-
* ceiling replaces.
|
|
20
|
+
* Mandated-companion paths, exempt from implementation counts. Deliberately
|
|
21
|
+
* absent: `.agentrc.json`, `.agents/schemas/**` (incl. the sensitive-path
|
|
22
|
+
* SSOT), `.github/workflows/**`, `package.json` — behavior by effect.
|
|
23
|
+
* `baselines/**` is root-anchored, so baseline schemas still count. Markdown
|
|
24
|
+
* (incl. workflows/rules) is exempt; its guards are the close-time doc gates.
|
|
80
25
|
*/
|
|
81
26
|
const COMPANION_PATH_GLOBS = Object.freeze([
|
|
82
|
-
// Tests — mandated by rules/testing-standards.md's test-first discipline.
|
|
83
27
|
'**/__tests__/**',
|
|
84
28
|
'**/*.test.js',
|
|
85
29
|
'**/*.test.mjs',
|
|
@@ -88,24 +32,17 @@ const COMPANION_PATH_GLOBS = Object.freeze([
|
|
|
88
32
|
'**/*.test.tsx',
|
|
89
33
|
'tests/**',
|
|
90
34
|
'features/**',
|
|
91
|
-
// Documentation — the prose a change of consequence is expected to refresh.
|
|
92
35
|
'docs/**',
|
|
93
36
|
'**/*.md',
|
|
94
|
-
// Generated baseline data — written by the ratchets, not hand-authored.
|
|
95
37
|
'baselines/**',
|
|
96
|
-
// Lockfiles — regenerated wholesale; their line count means nothing.
|
|
97
38
|
'package-lock.json',
|
|
98
39
|
'pnpm-lock.yaml',
|
|
99
40
|
'yarn.lock',
|
|
100
41
|
]);
|
|
101
42
|
|
|
102
43
|
/**
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
* (`dir/{old => new}/file.js`); both resolve to the destination, so a renamed
|
|
106
|
-
* implementation file still counts as one implementation file.
|
|
107
|
-
*
|
|
108
|
-
* Pure and total.
|
|
44
|
+
* Resolve a numstat rename (`old => new` or `dir/{old => new}/f.js`) to its
|
|
45
|
+
* destination.
|
|
109
46
|
*
|
|
110
47
|
* @param {string} raw
|
|
111
48
|
* @returns {string}
|
|
@@ -123,14 +60,8 @@ function normalizeNumstatPath(raw) {
|
|
|
123
60
|
}
|
|
124
61
|
|
|
125
62
|
/**
|
|
126
|
-
* Parse
|
|
127
|
-
*
|
|
128
|
-
* Binary rows (`-\t-\tpath`) contribute zero text lines without poisoning the
|
|
129
|
-
* parse. Any line that does not match the numstat shape makes the whole result
|
|
130
|
-
* untrustworthy, so the function returns `null` — the "magnitude unknown"
|
|
131
|
-
* signal every caller fails closed (or fails open) on deliberately.
|
|
132
|
-
*
|
|
133
|
-
* Pure and total.
|
|
63
|
+
* Parse numstat rows. Binary rows count zero lines; any malformed line
|
|
64
|
+
* returns `null` ("magnitude unknown").
|
|
134
65
|
*
|
|
135
66
|
* @param {unknown} stdout
|
|
136
67
|
* @returns {Array<{ additions: number, deletions: number, path: string }>|null}
|
|
@@ -153,11 +84,8 @@ function parseNumstatRows(stdout) {
|
|
|
153
84
|
}
|
|
154
85
|
|
|
155
86
|
/**
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
* Pure and total — a throwing matcher resolves to `false`, which counts the
|
|
159
|
-
* file as implementation. That is the conservative direction: a
|
|
160
|
-
* classification failure must never shrink the measured magnitude.
|
|
87
|
+
* A throwing matcher yields `false` (implementation): a classification
|
|
88
|
+
* failure must never shrink the magnitude.
|
|
161
89
|
*
|
|
162
90
|
* @param {unknown} file
|
|
163
91
|
* @param {{ matchFn?: typeof matchesAnyFilePattern }} [deps]
|
|
@@ -173,11 +101,7 @@ function isCompanionPath(file, { matchFn = matchesAnyFilePattern } = {}) {
|
|
|
173
101
|
}
|
|
174
102
|
|
|
175
103
|
/**
|
|
176
|
-
*
|
|
177
|
-
* side-effecting function in this module.
|
|
178
|
-
*
|
|
179
|
-
* Total — never throws; returns `null` on any git failure or unparseable
|
|
180
|
-
* output.
|
|
104
|
+
* Numstat rows for `baseRef...headRef`; `null` on any failure.
|
|
181
105
|
*
|
|
182
106
|
* @param {{
|
|
183
107
|
* baseRef?: string,
|
|
@@ -210,20 +134,9 @@ export function readNumstatRows({
|
|
|
210
134
|
}
|
|
211
135
|
|
|
212
136
|
/**
|
|
213
|
-
* Summarize
|
|
214
|
-
*
|
|
215
|
-
*
|
|
216
|
-
* `implFiles` is counted from `changedFiles` — the canonical
|
|
217
|
-
* `git diff --name-only` enumeration produced by `change-set.js` — rather than
|
|
218
|
-
* from the numstat rows, so file counting uses clean paths from the one
|
|
219
|
-
* enumerator every other consumer reads. `implLines` comes from the numstat
|
|
220
|
-
* rows, which is the only surface carrying line counts.
|
|
221
|
-
*
|
|
222
|
-
* Returns `null` when either input is unusable: the magnitude is then *unknown*,
|
|
223
|
-
* which is deliberately distinct from *zero* so a caller can fail closed on the
|
|
224
|
-
* absence of evidence.
|
|
225
|
-
*
|
|
226
|
-
* Pure and total.
|
|
137
|
+
* Summarize magnitude. Files come from `change-set.js`'s canonical
|
|
138
|
+
* enumeration, lines from numstat. `null` (unknown, distinct from zero)
|
|
139
|
+
* when either input is unusable.
|
|
227
140
|
*
|
|
228
141
|
* @param {{
|
|
229
142
|
* changedFiles?: unknown,
|
|
@@ -248,10 +161,7 @@ export function summarizeDiffMagnitude({
|
|
|
248
161
|
(f) => typeof f === 'string' && f.trim() !== '',
|
|
249
162
|
);
|
|
250
163
|
|
|
251
|
-
//
|
|
252
|
-
// direction, since counting a companion as implementation can only ever make
|
|
253
|
-
// the measured magnitude larger. Guarded here as well as inside the default
|
|
254
|
-
// classifier so an injected one cannot break this function's totality.
|
|
164
|
+
// Guarded again so an injected classifier cannot break totality.
|
|
255
165
|
const isCompanion = (file) => {
|
|
256
166
|
try {
|
|
257
167
|
return isCompanionFn(file) === true;
|
|
@@ -2,12 +2,8 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Read
|
|
6
|
-
*
|
|
7
|
-
* Missing or unreadable files are skipped silently. Order is preserved from
|
|
8
|
-
* the input list. This is the shared read/normalize seam the per-Epic docs
|
|
9
|
-
* digest builds on (Story #4338) so there is a single home for the fs read
|
|
10
|
-
* path.
|
|
5
|
+
* Read doc files relative to `docsRoot`, in input order; missing or
|
|
6
|
+
* unreadable files are skipped.
|
|
11
7
|
*
|
|
12
8
|
* @param {{ files: string[], docsRoot?: string }} args
|
|
13
9
|
* @returns {Promise<Array<{ name: string, path: string, content: string }>>}
|
|
@@ -1,34 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* docs-digest.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `project.docsContextFiles` on every Story, re-paying the full docs payload
|
|
6
|
-
* per child. This module produces a single **digest** — one compact markdown
|
|
7
|
-
* outline per configured doc — that the parent threads into every child prompt
|
|
8
|
-
* once. The digest gives each child enough shape (path, size, heading outline
|
|
9
|
-
* with line numbers, and the first paragraph under each `##` section) to decide
|
|
10
|
-
* which full files to pull on demand, instead of ingesting the whole set up
|
|
11
|
-
* front.
|
|
12
|
-
*
|
|
13
|
-
* The heavy lifting of reading + normalizing doc bodies is delegated to
|
|
14
|
-
* `doc-reader.js` (`readDocFiles`), keeping a single home for the fs read path.
|
|
15
|
-
*
|
|
16
|
-
* Story #4433 extends this module with {@link ensureDocsDigest}, a shared
|
|
17
|
-
* generate-and-write export so the planner-context surface
|
|
18
|
-
* (`plan-context.js` / `authoring-context.js`) can produce a session docs
|
|
19
|
-
* digest without duplicating the mkdir+writeFile plumbing shared by
|
|
20
|
-
* `plan-context.js` / `authoring-context.js` and the `/mandrel-deliver` workflow.
|
|
2
|
+
* docs-digest.js — a compact outline of `project.docsContextFiles` (path,
|
|
3
|
+
* size, headings with line numbers, first `##` paragraph) so agents pull
|
|
4
|
+
* full docs on demand instead of ingesting the whole set per Story.
|
|
21
5
|
*/
|
|
22
6
|
|
|
23
7
|
import fs from 'node:fs';
|
|
24
8
|
import path from 'node:path';
|
|
25
9
|
import { readDocFiles } from './doc-reader.js';
|
|
26
10
|
|
|
27
|
-
/**
|
|
28
|
-
* Level-2 / level-3 markdown heading matcher. Mirrors the outline granularity
|
|
29
|
-
* the planning-context budget already uses so the two surfaces agree on what a
|
|
30
|
-
* "section" is.
|
|
31
|
-
*/
|
|
11
|
+
/** `##`/`###` headings — the planning-context budget's section granularity. */
|
|
32
12
|
const HEADING_RE = /^(#{2,3})\s+(.+?)\s*$/;
|
|
33
13
|
|
|
34
14
|
function byteLen(s) {
|
|
@@ -37,10 +17,6 @@ function byteLen(s) {
|
|
|
37
17
|
}
|
|
38
18
|
|
|
39
19
|
/**
|
|
40
|
-
* Extract the heading outline (level + text + 1-based line number) from a
|
|
41
|
-
* markdown body. Line numbers let a child jump straight to the section it
|
|
42
|
-
* needs when it pulls the full file.
|
|
43
|
-
*
|
|
44
20
|
* @param {string} content
|
|
45
21
|
* @returns {Array<{ level: number, text: string, line: number }>}
|
|
46
22
|
*/
|
|
@@ -56,12 +32,10 @@ function extractOutline(content) {
|
|
|
56
32
|
}
|
|
57
33
|
|
|
58
34
|
/**
|
|
59
|
-
*
|
|
60
|
-
* next heading or a blank-line paragraph break. Returns '' when the section
|
|
61
|
-
* has no prose (e.g. a heading immediately followed by a sub-heading).
|
|
35
|
+
* First paragraph under a heading; '' when the section has no prose.
|
|
62
36
|
*
|
|
63
|
-
* @param {string[]} lines
|
|
64
|
-
* @param {number} headingLine 1-based
|
|
37
|
+
* @param {string[]} lines
|
|
38
|
+
* @param {number} headingLine 1-based
|
|
65
39
|
* @returns {string}
|
|
66
40
|
*/
|
|
67
41
|
function firstParagraphAfter(lines, headingLine) {
|
|
@@ -79,9 +53,6 @@ function firstParagraphAfter(lines, headingLine) {
|
|
|
79
53
|
}
|
|
80
54
|
|
|
81
55
|
/**
|
|
82
|
-
* Render one doc's digest section: path + byte size, then a bulleted heading
|
|
83
|
-
* outline where each `##` bullet carries the first paragraph beneath it.
|
|
84
|
-
*
|
|
85
56
|
* @param {{ path: string, content: string }} doc
|
|
86
57
|
* @returns {string} markdown block
|
|
87
58
|
*/
|
|
@@ -110,15 +81,12 @@ function renderDocSection(doc) {
|
|
|
110
81
|
}
|
|
111
82
|
|
|
112
83
|
/**
|
|
113
|
-
* Build the
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* — i.e. `docsContextFiles` is empty/unset — so callers surface a null
|
|
117
|
-
* `docsDigestPath` rather than writing an empty file.
|
|
84
|
+
* Build the digest; missing files are skipped. `null` when nothing is
|
|
85
|
+
* readable, so callers report a null `docsDigestPath` instead of an empty
|
|
86
|
+
* file.
|
|
118
87
|
*
|
|
119
88
|
* @param {{ docsContextFiles?: string[], docsRoot?: string }} args
|
|
120
|
-
* @returns {Promise<string|null>}
|
|
121
|
-
* no files to digest.
|
|
89
|
+
* @returns {Promise<string|null>}
|
|
122
90
|
*/
|
|
123
91
|
export async function buildDocsDigest({ docsContextFiles, docsRoot } = {}) {
|
|
124
92
|
const files = Array.isArray(docsContextFiles) ? docsContextFiles : [];
|
|
@@ -142,14 +110,8 @@ export async function buildDocsDigest({ docsContextFiles, docsRoot } = {}) {
|
|
|
142
110
|
}
|
|
143
111
|
|
|
144
112
|
/**
|
|
145
|
-
* Build the
|
|
146
|
-
*
|
|
147
|
-
* generate-and-persist export both digest producers call: the per-run
|
|
148
|
-
* `/mandrel-deliver` docs digest (`helpers/deliver-story.md`) and the planner-
|
|
149
|
-
* context digest (`plan-context.js` → `authoring-context.js`, Story
|
|
150
|
-
* #4433). Callers own path construction (temp-root layout, run id, etc.)
|
|
151
|
-
* so both surfaces can keep — or deliberately share — their own convention;
|
|
152
|
-
* this function only owns "build digest, ensure parent dir, write file".
|
|
113
|
+
* Build and write the digest (`null`, no write, when empty). Shared by the
|
|
114
|
+
* deliver and planner surfaces; callers own path construction.
|
|
153
115
|
*
|
|
154
116
|
* @param {{ docsContextFiles?: string[], docsRoot?: string, outputPath: string }} args
|
|
155
117
|
* @returns {Promise<{ digest: string, outputPath: string } | null>}
|
|
@@ -1,25 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* epic-candidates.js — rank the open container Epics a new plan could join
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* fingerprint is keyed on the child set, so a different cohort never matches
|
|
9
|
-
* it — by design, since adopting the wrong container silently mis-files a run.
|
|
10
|
-
*
|
|
11
|
-
* So the join has to be a **decision**, not a hash collision: this module
|
|
12
|
-
* surfaces every open Epic with an overlap score, and the operator picks at
|
|
13
|
-
* Gate #3. The list is deliberately **complete rather than thresholded** — a
|
|
14
|
-
* low score is evidence for the operator to weigh, and hiding a candidate is
|
|
15
|
-
* how a plan silently opens its second container for one body of work.
|
|
16
|
-
*
|
|
17
|
-
* Scoring reuses `duplicate-search.js`'s tokenizer and Jaccard overlap rather
|
|
18
|
-
* than growing a second similarity notion in the codebase; like that module's,
|
|
19
|
-
* it is a triage signal and not a semantic search.
|
|
2
|
+
* epic-candidates.js — rank the open container Epics a new plan could join,
|
|
3
|
+
* for the operator to pick at Gate #3 (joining a different cohort is a
|
|
4
|
+
* decision, not a fingerprint match). The list is complete, never
|
|
5
|
+
* thresholded: hiding a low scorer is how one body of work gets two
|
|
6
|
+
* containers. Scoring reuses `duplicate-search.js`'s tokenizer and overlap —
|
|
7
|
+
* a triage signal, not semantic search.
|
|
20
8
|
*
|
|
21
9
|
* @module lib/orchestration/epic-candidates
|
|
22
|
-
* @see Story #5155
|
|
23
10
|
*/
|
|
24
11
|
|
|
25
12
|
import { overlapScore, tokenize } from '../duplicate-search.js';
|
|
@@ -29,8 +16,6 @@ import { concurrentMap, FANOUT_CONCURRENCY } from '../util/concurrent-map.js';
|
|
|
29
16
|
import { isEpicTicket, readEpicChildIds } from './epic-container.js';
|
|
30
17
|
|
|
31
18
|
/**
|
|
32
|
-
* Build an issue URL for an Epic the provider returned without one.
|
|
33
|
-
*
|
|
34
19
|
* @param {number} id
|
|
35
20
|
* @param {{ owner?: string, repo?: string }} [opts]
|
|
36
21
|
* @returns {string}
|
|
@@ -41,16 +26,8 @@ function buildEpicUrl(id, { owner, repo } = {}) {
|
|
|
41
26
|
}
|
|
42
27
|
|
|
43
28
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* Child titles matter because a container's own title and goal are short and
|
|
47
|
-
* abstract ("Auth hardening", one paragraph), while the seed that should match
|
|
48
|
-
* it is concrete. The children are where the shared vocabulary actually lives.
|
|
49
|
-
*
|
|
50
|
-
* Entirely best-effort: no `getTicket`, an unreadable child, or a throw all
|
|
51
|
-
* degrade to fewer title tokens, never to a failed envelope. A candidate that
|
|
52
|
-
* scores low because its children could not be read is still *listed* — the
|
|
53
|
-
* operator sees every open Epic regardless.
|
|
29
|
+
* Child titles carry the concrete vocabulary an abstract Epic title lacks.
|
|
30
|
+
* Best-effort: failures only reduce tokens.
|
|
54
31
|
*
|
|
55
32
|
* @param {{ childIds: number[], provider: object }} opts
|
|
56
33
|
* @returns {Promise<string>} Space-joined child titles ('' when none resolved).
|
|
@@ -75,17 +52,11 @@ async function readChildTitles({ childIds, provider }) {
|
|
|
75
52
|
}
|
|
76
53
|
|
|
77
54
|
/**
|
|
78
|
-
* Score one open Epic against the seed.
|
|
79
|
-
*
|
|
80
55
|
* @param {{ epic: object, seedTokens: Set<string>, provider: object, owner?: string, repo?: string }} opts
|
|
81
56
|
* @returns {Promise<{ id: number, title: string, url: string, score: number, childIds: number[] }|null>}
|
|
82
57
|
*/
|
|
83
58
|
async function scoreEpic({ epic, seedTokens, provider, owner, repo }) {
|
|
84
|
-
//
|
|
85
|
-
// is the issue number. The `number`-then-`id` fallback this replaced read as
|
|
86
|
-
// defensive and was not: on that shape it never fired, and on a raw REST
|
|
87
|
-
// payload it was the only thing standing between this and scoring an Epic
|
|
88
|
-
// under its database id.
|
|
59
|
+
// Declared ticket shape: `id` is the issue number.
|
|
89
60
|
const id = Number(epic?.id);
|
|
90
61
|
if (!Number.isInteger(id) || id <= 0) return null;
|
|
91
62
|
|
|
@@ -94,9 +65,7 @@ async function scoreEpic({ epic, seedTokens, provider, owner, repo }) {
|
|
|
94
65
|
const childIds = readEpicChildIds(body);
|
|
95
66
|
const childTitles = await readChildTitles({ childIds, provider });
|
|
96
67
|
|
|
97
|
-
// The
|
|
98
|
-
// drops short and non-alphabetic tokens, so the corpus is effectively the
|
|
99
|
-
// title, the `## Goal` prose and the child titles.
|
|
68
|
+
// The tokenizer drops marker/id noise.
|
|
100
69
|
const corpus = `${title}\n${body}\n${childTitles}`;
|
|
101
70
|
const score = overlapScore(seedTokens, tokenize(corpus));
|
|
102
71
|
|
|
@@ -110,16 +79,8 @@ async function scoreEpic({ epic, seedTokens, provider, owner, repo }) {
|
|
|
110
79
|
}
|
|
111
80
|
|
|
112
81
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* **Only open Epics are candidates.** A closed Epic is a completed body of
|
|
116
|
-
* work; joining one would reopen a container the epilogue deliberately closed,
|
|
117
|
-
* and silently re-scope a finished plan. The operator files a new Epic or
|
|
118
|
-
* reopens the old one by hand.
|
|
119
|
-
*
|
|
120
|
-
* Failures degrade to `[]` — like the duplicate search, this is a triage
|
|
121
|
-
* signal offered at a gate, and no plan should fail to be authored because
|
|
122
|
-
* the Epic listing was unavailable.
|
|
82
|
+
* Every open container Epic ranked by seed overlap. Closed Epics are
|
|
83
|
+
* finished work and never candidates. Failures degrade to `[]`.
|
|
123
84
|
*
|
|
124
85
|
* @param {{
|
|
125
86
|
* seed: string,
|
|
@@ -156,8 +117,7 @@ export async function findOpenEpicCandidates({ seed, provider, owner, repo }) {
|
|
|
156
117
|
{ concurrency: FANOUT_CONCURRENCY },
|
|
157
118
|
);
|
|
158
119
|
|
|
159
|
-
//
|
|
160
|
-
// tie, so the same backlog always renders the same list.
|
|
120
|
+
// Ties break on id.
|
|
161
121
|
return scored
|
|
162
122
|
.filter((c) => c !== null)
|
|
163
123
|
.sort((a, b) => b.score - a.score || a.id - b.id);
|
|
@@ -1,22 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* epic-checklist.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* renders one from scratch; this module is the other operation adoption needs
|
|
6
|
-
* — amending a body that already exists, written by someone else, possibly
|
|
7
|
-
* hand-edited since.
|
|
8
|
-
*
|
|
9
|
-
* The two are deliberately separate. Composing may assume everything about the
|
|
10
|
-
* text because it produced all of it; amending may assume almost nothing and
|
|
11
|
-
* must treat every line it did not come to change as untouchable: the `## Goal`
|
|
12
|
-
* prose, the fingerprint marker, the item order, and above all the **checked
|
|
13
|
-
* state** of existing rows. An operator who ticked `- [x] #41` is recording
|
|
14
|
-
* that the Story landed, and a re-render would silently discard it.
|
|
15
|
-
*
|
|
16
|
-
* So the edit is a surgical line insertion rather than a re-render.
|
|
2
|
+
* epic-checklist.js — amend a live, possibly hand-edited Epic body's child
|
|
3
|
+
* checklist by surgical line insertion, never a re-render: goal prose,
|
|
4
|
+
* markers, order and existing checked state are untouchable.
|
|
17
5
|
*
|
|
18
6
|
* @module lib/orchestration/epic-checklist
|
|
19
|
-
* @see Story #5155
|
|
20
7
|
*/
|
|
21
8
|
|
|
22
9
|
import {
|
|
@@ -41,13 +28,8 @@ function findLastChecklistIndex(lines) {
|
|
|
41
28
|
}
|
|
42
29
|
|
|
43
30
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* Three placements, in priority order, each preserving a different thing:
|
|
47
|
-
* replacing the empty-container placeholder (which would otherwise stand above
|
|
48
|
-
* rows that contradict it), appending after the last existing row (which keeps
|
|
49
|
-
* original-then-appended order on read-back), or opening the section for a body
|
|
50
|
-
* that never had one.
|
|
31
|
+
* Splice target: replace the empty placeholder, else append after the last
|
|
32
|
+
* row, else open under the heading.
|
|
51
33
|
*
|
|
52
34
|
* @param {string[]} lines
|
|
53
35
|
* @returns {[number, number]|null} `null` when there is no section to extend.
|
|
@@ -69,14 +51,10 @@ function locateInsertion(lines) {
|
|
|
69
51
|
}
|
|
70
52
|
|
|
71
53
|
/**
|
|
72
|
-
* Append child ids
|
|
73
|
-
*
|
|
74
|
-
* Idempotence is the load-bearing property: a resumed or re-run persist calls
|
|
75
|
-
* this again with the same cohort, and a second copy of every row would make
|
|
76
|
-
* the container claim children it does not have.
|
|
54
|
+
* Append child ids idempotently — a re-run persist passes the same cohort.
|
|
77
55
|
*
|
|
78
|
-
* @param {string} body
|
|
79
|
-
* @param {number[]} childIds
|
|
56
|
+
* @param {string} body
|
|
57
|
+
* @param {number[]} childIds
|
|
80
58
|
* @returns {string} The updated body (byte-identical when nothing was added).
|
|
81
59
|
*/
|
|
82
60
|
export function appendEpicChildIds(body, childIds) {
|
|
@@ -92,9 +70,7 @@ export function appendEpicChildIds(body, childIds) {
|
|
|
92
70
|
const target = locateInsertion(lines);
|
|
93
71
|
|
|
94
72
|
if (target === null) {
|
|
95
|
-
//
|
|
96
|
-
// than refusing: `isEpicTicket` already treats such a ticket as a real
|
|
97
|
-
// Epic, so the adoption must not be the one place that disagrees.
|
|
73
|
+
// No section: add one, since `isEpicTicket` counts this as an Epic.
|
|
98
74
|
return `${text.replace(/\n+$/, '')}\n\n${CHILDREN_HEADING}\n\n${rows.join('\n')}\n`;
|
|
99
75
|
}
|
|
100
76
|
|