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,20 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* plan-context.js — single planner-context envelope
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* ONE JSON envelope, so the authoring middle reads a single file instead of
|
|
6
|
-
* shim-scripting library imports.
|
|
7
|
-
*
|
|
8
|
-
* Two operator modes (v2 Story-only):
|
|
9
|
-
* - `seed` / `seed-file` — freeform text (chat or on-disk). Carries
|
|
10
|
-
* `seed` plus `duplicates[]` (open-Story dup search).
|
|
11
|
-
* - `tickets` — one or more existing issue ids to analyze into proper
|
|
12
|
-
* Stories. Carries `sourceTickets[]` plus `duplicates[]` (excluding
|
|
13
|
-
* the source ids themselves).
|
|
14
|
-
*
|
|
15
|
-
* All fields are JSON-serialisable; the module performs no GitHub writes.
|
|
16
|
-
* The only I/O surfaces are the injected `provider` (reads) and the
|
|
17
|
-
* best-effort local scans the folded builders already perform.
|
|
2
|
+
* plan-context.js — builds the single JSON planner-context envelope for
|
|
3
|
+
* `/mandrel-plan` (modes: seed, seed-file, tickets, amends). No GitHub
|
|
4
|
+
* writes; I/O is the injected provider's reads plus best-effort local scans.
|
|
18
5
|
*/
|
|
19
6
|
|
|
20
7
|
import { readFile } from 'node:fs/promises';
|
|
@@ -39,43 +26,17 @@ import { findOpenEpicCandidates } from './epic-candidates.js';
|
|
|
39
26
|
import { buildAuthoringContext } from './planning/authoring-context.js';
|
|
40
27
|
|
|
41
28
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* envelope size: Story #4541 removed the `applyBudget` pass from
|
|
45
|
-
* `buildAuthoringContext`, because both builders below discard that budgeted
|
|
46
|
-
* body and ship the raw seed on `seed.content` instead — the budget bounded
|
|
47
|
-
* a field that never left the function.
|
|
48
|
-
*
|
|
49
|
-
* A measured seed-mode envelope on this repo (a thin `.feature` corpus) is
|
|
50
|
-
* ~120 KB, dominated by the digest-first `docsContext` (~63 KB inline
|
|
51
|
-
* digest) and the rendered `systemPrompts` (~54 KB); every other field is
|
|
52
|
-
* under 1 KB. Story #4811 retired the tier-capped codebase snapshot that
|
|
53
|
-
* used to sit alongside them (~35 KB skinny here). This measurement is
|
|
54
|
-
* **not** representative of every consumer, though: Story #4977 found
|
|
55
|
-
* `bddScenarios` at 118 KB on a consumer with a mature Gherkin corpus —
|
|
56
|
-
* larger than `docsContext` and `systemPrompts` combined, consuming nearly
|
|
57
|
-
* all of the ceiling's headroom on its own, because the scanner applied no
|
|
58
|
-
* cap. `bddScenarios` is now truncated to `BDD_SCENARIOS_BYTE_BUDGET`
|
|
59
|
-
* (`lib/bdd-scenario-budget.js`, ≤24 KB) before it reaches this envelope,
|
|
60
|
-
* so the seed remains the only field this ceiling leaves genuinely
|
|
61
|
-
* unbounded. 256 KB (~64K tokens at the ≈4-chars/token estimate) leaves
|
|
62
|
-
* roughly 2× headroom over the fixed-floor measurement above while staying
|
|
63
|
-
* well under the session budget. An envelope over it is truncated with a
|
|
64
|
-
* `truncated` note rather than refused (Story #5312) — raise the ceiling
|
|
65
|
-
* only with a measured justification.
|
|
29
|
+
* The only bound on envelope size: ~2× a measured ~120 KB seed-mode envelope.
|
|
30
|
+
* Raise only with a measured justification.
|
|
66
31
|
*/
|
|
67
32
|
export const PLAN_CONTEXT_ENVELOPE_BYTE_CEILING = 256_000;
|
|
68
33
|
|
|
69
|
-
/** Marker appended to a string field the cap had to cut. */
|
|
70
34
|
const TRUNCATION_MARKER =
|
|
71
35
|
'\n\n[… truncated by plan-context: PLAN_CONTEXT_ENVELOPE_BYTE_CEILING …]';
|
|
72
36
|
|
|
73
|
-
/** Bounded number of cap rounds — each round cuts the current largest field. */
|
|
74
37
|
const MAX_TRUNCATION_ROUNDS = 8;
|
|
75
38
|
|
|
76
39
|
/**
|
|
77
|
-
* Byte length of a JSON-serialised value.
|
|
78
|
-
*
|
|
79
40
|
* @param {unknown} value
|
|
80
41
|
* @returns {number}
|
|
81
42
|
*/
|
|
@@ -84,9 +45,6 @@ function jsonBytes(value) {
|
|
|
84
45
|
}
|
|
85
46
|
|
|
86
47
|
/**
|
|
87
|
-
* Cut a string to fit `excess` fewer bytes, keeping a leading prefix and
|
|
88
|
-
* appending the truncation marker.
|
|
89
|
-
*
|
|
90
48
|
* @param {string} text
|
|
91
49
|
* @param {number} excess
|
|
92
50
|
* @returns {string}
|
|
@@ -104,11 +62,8 @@ function truncateString(text, excess) {
|
|
|
104
62
|
}
|
|
105
63
|
|
|
106
64
|
/**
|
|
107
|
-
* Cut one
|
|
108
|
-
*
|
|
109
|
-
* fits), and an object whose largest string property is cut in place — which
|
|
110
|
-
* covers `seed.content`, `docsContext.digest` and every list field. Returns
|
|
111
|
-
* `null` for a shape nothing here can shrink.
|
|
65
|
+
* Cut one field by ~`excess` bytes: a string to a prefix, an array by tail
|
|
66
|
+
* entries, an object by its largest string property. `null` if uncuttable.
|
|
112
67
|
*
|
|
113
68
|
* @param {unknown} value
|
|
114
69
|
* @param {number} excess
|
|
@@ -149,28 +104,12 @@ function truncateField(value, excess) {
|
|
|
149
104
|
}
|
|
150
105
|
|
|
151
106
|
/**
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
* field so the planner can see what it did not get.
|
|
155
|
-
*
|
|
156
|
-
* Until Story #5312 this refused the envelope outright and exited non-zero
|
|
157
|
-
* naming what to trim. That was the wrong direction for a bound whose only
|
|
158
|
-
* job is to keep the planner's context readable: an oversize seed or
|
|
159
|
-
* `--tickets` body is an operator's real input, and refusing to plan from it
|
|
160
|
-
* cost a re-run for a ceiling the operator had no way to act on (the seed is
|
|
161
|
-
* carried verbatim by design). A truncated envelope with a note is a plan
|
|
162
|
-
* that runs on the part that fits and says so; a refusal is no plan at all.
|
|
163
|
-
* The bound itself stays a fixed framework constant — a cap the operator can
|
|
164
|
-
* raise past what the model can read fails silently again.
|
|
165
|
-
*
|
|
166
|
-
* Deliberately **not** exported: its only external caller would be a test, and
|
|
167
|
-
* a test-only export is a production-dead one. It is reachable end to end
|
|
168
|
-
* through {@link buildPlanContext}, which is where the behaviour matters.
|
|
107
|
+
* Truncate the largest fields to fit, rather than refuse: an oversize seed is
|
|
108
|
+
* the operator's real input, and a partial plan that says so beats none.
|
|
169
109
|
*
|
|
170
110
|
* @param {object} envelope
|
|
171
111
|
* @param {{ ceiling?: number }} [opts]
|
|
172
|
-
* @returns {object}
|
|
173
|
-
* copy carrying `truncated: Array<{ field, originalBytes, keptBytes, note }>`.
|
|
112
|
+
* @returns {object} unchanged when it fits, else a copy with `truncated[]`.
|
|
174
113
|
*/
|
|
175
114
|
function capPlanContextEnvelope(envelope, opts = {}) {
|
|
176
115
|
const ceiling = opts.ceiling ?? PLAN_CONTEXT_ENVELOPE_BYTE_CEILING;
|
|
@@ -181,13 +120,9 @@ function capPlanContextEnvelope(envelope, opts = {}) {
|
|
|
181
120
|
for (let round = 0; round < MAX_TRUNCATION_ROUNDS; round += 1) {
|
|
182
121
|
const total = jsonBytes({ ...next, truncated });
|
|
183
122
|
if (total <= ceiling) break;
|
|
184
|
-
// JSON escaping of
|
|
185
|
-
//
|
|
186
|
-
// absorbs the whole excess rather than a residual spilling onto the next
|
|
187
|
-
// largest one (which is the planner's own prompt).
|
|
123
|
+
// Over-cut slightly (JSON escaping of marker/note) so the dominant field
|
|
124
|
+
// absorbs the whole excess instead of spilling onto the system prompts.
|
|
188
125
|
const excess = total - ceiling + 128;
|
|
189
|
-
// The largest field that can be cut — re-cut on a later round rather than
|
|
190
|
-
// moving on to a smaller field it never had to touch.
|
|
191
126
|
const candidates = Object.entries(next)
|
|
192
127
|
.map(([field, value]) => [field, jsonBytes(value)])
|
|
193
128
|
.sort((a, b) => b[1] - a[1]);
|
|
@@ -222,13 +157,7 @@ function capPlanContextEnvelope(envelope, opts = {}) {
|
|
|
222
157
|
return { ...next, truncated };
|
|
223
158
|
}
|
|
224
159
|
|
|
225
|
-
/**
|
|
226
|
-
* Compact, machine-readable descriptor of the `tickets.json` array the
|
|
227
|
-
* authoring pass writes and `validateAndNormalizeTickets` gates at persist
|
|
228
|
-
* time. A descriptor, not a validator: the deterministic gate stays in the
|
|
229
|
-
* persist half (design § 1 step 3); this field exists so the authoring
|
|
230
|
-
* middle knows the shape without re-reading the decomposer prompt prose.
|
|
231
|
-
*/
|
|
160
|
+
/** Shape descriptor only; persist's validator is the gate. */
|
|
232
161
|
export const TICKET_SCHEMA_DESCRIPTOR = Object.freeze({
|
|
233
162
|
shape: 'array',
|
|
234
163
|
itemFields: Object.freeze({
|
|
@@ -248,26 +177,14 @@ export const TICKET_SCHEMA_DESCRIPTOR = Object.freeze({
|
|
|
248
177
|
'validateAndNormalizeTickets (lib/orchestration/ticket-validator.js) at persist time',
|
|
249
178
|
});
|
|
250
179
|
|
|
251
|
-
/**
|
|
252
|
-
* Filename of the ready-to-fill Story authoring template `plan-context.js`
|
|
253
|
-
* writes next to the captured envelope (Story #4707).
|
|
254
|
-
*/
|
|
255
180
|
export const STORIES_TEMPLATE_FILENAME = 'stories.template.json';
|
|
256
181
|
|
|
257
182
|
/**
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
* pre-resolved to its creates-vs-refactors assumption against the repo
|
|
261
|
-
* snapshot the signals already probed: a path present in the repo is a
|
|
262
|
-
* `refactors-existing`, a missing one is a `creates`. Order follows
|
|
263
|
-
* `predictedPaths` (first appearance in the seed). Falls back to the
|
|
264
|
-
* single instructive placeholder entry when the seed predicted no paths.
|
|
183
|
+
* Template `changes[]`: the seed-predicted paths as bare strings (persist
|
|
184
|
+
* derives each assumption against the base branch), or one placeholder.
|
|
265
185
|
*
|
|
266
|
-
* @param {{
|
|
267
|
-
*
|
|
268
|
-
* repoState?: { existingPaths?: string[], missingPaths?: string[] },
|
|
269
|
-
* }|null|undefined} complexitySignals
|
|
270
|
-
* @returns {Array<{ path: string, assumption: string }>}
|
|
186
|
+
* @param {{ predictedPaths?: string[] }|null|undefined} complexitySignals
|
|
187
|
+
* @returns {string[]}
|
|
271
188
|
*/
|
|
272
189
|
function buildTemplateChanges(complexitySignals) {
|
|
273
190
|
const predicted = Array.isArray(complexitySignals?.predictedPaths)
|
|
@@ -275,46 +192,14 @@ function buildTemplateChanges(complexitySignals) {
|
|
|
275
192
|
(p) => typeof p === 'string' && p.length > 0,
|
|
276
193
|
)
|
|
277
194
|
: [];
|
|
278
|
-
|
|
279
|
-
return [{ path: 'path/to/file.ext', assumption: 'refactors-existing' }];
|
|
280
|
-
}
|
|
281
|
-
const existing = new Set(
|
|
282
|
-
Array.isArray(complexitySignals?.repoState?.existingPaths)
|
|
283
|
-
? complexitySignals.repoState.existingPaths
|
|
284
|
-
: [],
|
|
285
|
-
);
|
|
286
|
-
return predicted.map((path) => ({
|
|
287
|
-
path,
|
|
288
|
-
assumption: existing.has(path) ? 'refactors-existing' : 'creates',
|
|
289
|
-
}));
|
|
195
|
+
return predicted.length === 0 ? ['path/to/file.ext'] : predicted;
|
|
290
196
|
}
|
|
291
197
|
|
|
292
198
|
/**
|
|
293
|
-
*
|
|
294
|
-
*
|
|
295
|
-
* One-shot authoring: the planner copies this file to `stories.json`, fills
|
|
296
|
-
* the placeholder values, and runs persist — no step requires reading
|
|
297
|
-
* `story-body.js` source or re-poking the envelope for format discovery
|
|
298
|
-
* (bench: ~7 of 17 plan turns were format discovery). The template uses the
|
|
299
|
-
* **structured-object body** shape, which persist parses and serializes to
|
|
300
|
-
* the canonical markdown itself (`parse` accepts an object;
|
|
301
|
-
* `assembleOnePlanStory` re-serializes canonically), so the serializer
|
|
302
|
-
* contract never has to be reverse-engineered by the author. `acceptance[]`
|
|
303
|
-
* / `verify[]` live at the ticket's top level — the machine contract persist
|
|
304
|
-
* syncs into the body.
|
|
305
|
-
*
|
|
306
|
-
* Correct-by-construction skeleton (Story #4723): when the envelope's
|
|
307
|
-
* `complexitySignals` predicted a footprint the `changes[]` entries arrive
|
|
308
|
-
* pre-resolved to creates-vs-refactors against the repo snapshot — a
|
|
309
|
-
* faithfully-filled skeleton passes the persist ticket validators without a
|
|
310
|
-
* mechanical round-trip. The persist gates stay
|
|
311
|
-
* authoritative (they probe the base branch ref, not the working tree).
|
|
199
|
+
* Ready-to-fill `stories.json` template. Uses the structured-object body
|
|
200
|
+
* persist serializes itself, so authors never reverse-engineer the markdown.
|
|
312
201
|
*
|
|
313
|
-
*
|
|
314
|
-
* instructive placeholder values rather than comments.
|
|
315
|
-
*
|
|
316
|
-
* @param {{ complexitySignals?: object|null }} [opts] Envelope signals to
|
|
317
|
-
* pre-resolve the skeleton against; omit for the bare placeholder shape.
|
|
202
|
+
* @param {{ complexitySignals?: object|null }} [opts]
|
|
318
203
|
* @returns {string} Pretty-printed JSON template content.
|
|
319
204
|
*/
|
|
320
205
|
export function renderStoriesTemplate({ complexitySignals = null } = {}) {
|
|
@@ -325,12 +210,8 @@ export function renderStoriesTemplate({ complexitySignals = null } = {}) {
|
|
|
325
210
|
title: 'Fill: short descriptive title',
|
|
326
211
|
body: {
|
|
327
212
|
goal: 'Fill: one sentence stating why this Story exists.',
|
|
328
|
-
// A filled
|
|
329
|
-
//
|
|
330
|
-
// Story, so the skeleton has to show an author what a checkpoint
|
|
331
|
-
// list looks like. Each line is a stage of the work — a commit
|
|
332
|
-
// boundary inside one session — never a restatement of an
|
|
333
|
-
// acceptance item, which states what is true once the Story lands.
|
|
213
|
+
// A filled example: each line is a commit-boundary stage of the
|
|
214
|
+
// work, never a restated acceptance item.
|
|
334
215
|
slicing:
|
|
335
216
|
'1. Re-anchor the shared constant and its consumers.\n' +
|
|
336
217
|
'2. Move the gate ahead of the first write and arm the refusal.\n' +
|
|
@@ -359,9 +240,7 @@ export function renderStoriesTemplate({ complexitySignals = null } = {}) {
|
|
|
359
240
|
}
|
|
360
241
|
|
|
361
242
|
/**
|
|
362
|
-
* Count
|
|
363
|
-
* free-form seed text. Unlike {@link countScopeItems} this does not require
|
|
364
|
-
* a scope-shaped heading — a raw `--seed` text rarely has one.
|
|
243
|
+
* Count enumerated lines (`- `, `* `, `1. `) anywhere — no heading required.
|
|
365
244
|
*
|
|
366
245
|
* @param {string} text
|
|
367
246
|
* @returns {number}
|
|
@@ -373,24 +252,13 @@ function countEnumeratedItems(text) {
|
|
|
373
252
|
.filter((line) => /^\s*(?:[-*]|\d+\.)\s+\S/.test(line)).length;
|
|
374
253
|
}
|
|
375
254
|
|
|
376
|
-
/**
|
|
377
|
-
* Delta-shaped change-request verbs — a change request naming one of these
|
|
378
|
-
* stays a Story by default when the footprint stays inside Story width.
|
|
379
|
-
*/
|
|
255
|
+
/** Change-request verbs: such a seed stays a Story within Story width. */
|
|
380
256
|
const DELTA_VERB_RE =
|
|
381
257
|
/\b(fix(?:es)?|tweak(?:s)?|extend(?:s)?|update(?:s)?|adjust(?:s)?|rename(?:s)?|correct(?:s)?|patch(?:es)?|bug|regression|flaky)\b/i;
|
|
382
258
|
|
|
383
259
|
/**
|
|
384
|
-
*
|
|
385
|
-
*
|
|
386
|
-
* path from needing a judgment pass of its own.
|
|
387
|
-
*
|
|
388
|
-
* The heuristics anchor to the granularity SSOT —
|
|
389
|
-
* `DELIVERABLE_GRANULARITY_GUIDANCE` in `ticket-validator-sizing.js` (one
|
|
390
|
-
* Story = one coherent capability slice; multiple independent capabilities =
|
|
391
|
-
* an Epic) — and to the change-request delta rubric above. The verdict is
|
|
392
|
-
* **advisory**: being wrong in the `epic` direction is cheap, and
|
|
393
|
-
* `borderline` is a first-class output, not a forced call.
|
|
260
|
+
* Advisory scope signal over raw seed text (one capability = one Story).
|
|
261
|
+
* Erring toward `epic` is cheap; `borderline` is a real verdict.
|
|
394
262
|
*
|
|
395
263
|
* @param {{ seedText?: string }} args
|
|
396
264
|
* @returns {{ verdict: 'epic'|'story'|'borderline', reasons: string[], advisory: true, appliedBy: 'cli' }}
|
|
@@ -452,27 +320,17 @@ export function buildScopeTriageSignal({ seedText = '' } = {}) {
|
|
|
452
320
|
};
|
|
453
321
|
}
|
|
454
322
|
|
|
455
|
-
/**
|
|
456
|
-
* The `audit-rules.json` lens `target` value marking a lens applicable only to
|
|
457
|
-
* a project with a rendered frontend.
|
|
458
|
-
*/
|
|
459
323
|
const WEB_LENS_TARGET = 'web';
|
|
460
324
|
|
|
461
325
|
/**
|
|
462
|
-
*
|
|
463
|
-
*
|
|
464
|
-
* `MAX_PREDICTED_PATHS` paths — enumerating all of them would let one UI-heavy
|
|
465
|
-
* seed blow that budget. The full count travels beside the sample as
|
|
466
|
-
* `matchedPathCount`, so nothing is silently lost.
|
|
326
|
+
* Sample size of matched UI paths: the signal rides the ~2KB `--out` stdout
|
|
327
|
+
* digest; `matchedPathCount` carries the full total.
|
|
467
328
|
*/
|
|
468
329
|
const UI_MATCHED_PATH_SAMPLE = 5;
|
|
469
330
|
|
|
470
331
|
/**
|
|
471
|
-
* Union of
|
|
472
|
-
*
|
|
473
|
-
* "this path is part of a rendered UI surface". Read from the manifest rather
|
|
474
|
-
* than re-listed here: a second copy of the glob set would be a second thing to
|
|
475
|
-
* keep in sync, and the manifest is already the place an operator extends it.
|
|
332
|
+
* Union of every `target: "web"` lens's `triggers.filePatterns` — read from
|
|
333
|
+
* the manifest, never re-listed, so there is one glob set to extend.
|
|
476
334
|
*
|
|
477
335
|
* @param {{ audits?: Record<string, object> }} rules
|
|
478
336
|
* @returns {string[]} Deduplicated globs, in manifest order.
|
|
@@ -489,12 +347,8 @@ function resolveWebFilePatterns(rules) {
|
|
|
489
347
|
}
|
|
490
348
|
|
|
491
349
|
/**
|
|
492
|
-
*
|
|
493
|
-
*
|
|
494
|
-
* An unreadable manifest is **indeterminate**, not "no match": the signal fails
|
|
495
|
-
* OPEN in the same direction {@link hasWebSurface} does, because a spurious
|
|
496
|
-
* mention of an operator-invoked command costs nothing while a missed one costs
|
|
497
|
-
* the whole point of the offer.
|
|
350
|
+
* Predicted paths on a UI surface. An unreadable manifest is indeterminate and
|
|
351
|
+
* fails OPEN: a spurious offer costs nothing, a missed one defeats it.
|
|
498
352
|
*
|
|
499
353
|
* @param {string[]} predictedPaths
|
|
500
354
|
* @returns {{ matchedPaths: string[], indeterminate: boolean }}
|
|
@@ -515,9 +369,6 @@ function resolveWebFootprintMatch(predictedPaths) {
|
|
|
515
369
|
}
|
|
516
370
|
|
|
517
371
|
/**
|
|
518
|
-
* The one sentence a `uiSurface` signal carries — why the offer fires, or why it
|
|
519
|
-
* does not. Kept in one place so the fired and unfired shapes stay one object.
|
|
520
|
-
*
|
|
521
372
|
* @param {{
|
|
522
373
|
* detected: boolean,
|
|
523
374
|
* webSurface: boolean,
|
|
@@ -549,22 +400,8 @@ function uiSurfaceReason({
|
|
|
549
400
|
}
|
|
550
401
|
|
|
551
402
|
/**
|
|
552
|
-
*
|
|
553
|
-
*
|
|
554
|
-
* Two observables, both already shipped, ANDed together:
|
|
555
|
-
*
|
|
556
|
-
* 1. the project is web-capable at all (`hasWebSurface` — the same
|
|
557
|
-
* applicability predicate the `target: "web"` audit lenses gate on), and
|
|
558
|
-
* 2. at least one predicted path matches a web lens `filePattern`.
|
|
559
|
-
*
|
|
560
|
-
* No new detection surface and no new `.agentrc.json` key: both halves are
|
|
561
|
-
* derived from the consumer's own checkout, so a frontend-less project — this
|
|
562
|
-
* repository included — resolves falsey and the offer never fires.
|
|
563
|
-
*
|
|
564
|
-
* The signal carries **no routing authority** (`automatic: false`): `/mandrel-plan`
|
|
565
|
-
* may say that a plan touches UI and that `/prototype` exists, and must never
|
|
566
|
-
* invoke it. Pure over its inputs and total — a malformed signal bag or an
|
|
567
|
-
* unreadable manifest degrades, never throws.
|
|
403
|
+
* Advisory: web-capable project AND a predicted path matches a web lens glob.
|
|
404
|
+
* The planner may mention `/prototype`, never invoke it. Never throws.
|
|
568
405
|
*
|
|
569
406
|
* @param {{
|
|
570
407
|
* complexitySignals?: object|null,
|
|
@@ -579,8 +416,7 @@ function uiSurfaceReason({
|
|
|
579
416
|
* matchedPaths: string[],
|
|
580
417
|
* matchedPathCount: number,
|
|
581
418
|
* reasons: string[],
|
|
582
|
-
* }}
|
|
583
|
-
* ({@link UI_MATCHED_PATH_SAMPLE}); `matchedPathCount` is the full total.
|
|
419
|
+
* }}
|
|
584
420
|
*/
|
|
585
421
|
function buildUiSurfaceSignal({ complexitySignals, config, cwd } = {}) {
|
|
586
422
|
const predictedPaths = Array.isArray(complexitySignals?.predictedPaths)
|
|
@@ -621,10 +457,8 @@ function buildUiSurfaceSignal({ complexitySignals, config, cwd } = {}) {
|
|
|
621
457
|
}
|
|
622
458
|
|
|
623
459
|
/**
|
|
624
|
-
*
|
|
625
|
-
*
|
|
626
|
-
* keys — keeps every existing per-mode envelope key set byte-stable: both are
|
|
627
|
-
* derived from the signals they ride on.
|
|
460
|
+
* Nest the advisory signals inside `complexitySignals` so the per-mode
|
|
461
|
+
* top-level envelope key sets stay stable.
|
|
628
462
|
*
|
|
629
463
|
* @param {object} complexitySignals
|
|
630
464
|
* @param {{ config?: object, cwd?: string }} [context]
|
|
@@ -638,21 +472,8 @@ function withAdvisorySignals(complexitySignals, { config, cwd } = {}) {
|
|
|
638
472
|
}
|
|
639
473
|
|
|
640
474
|
/**
|
|
641
|
-
*
|
|
642
|
-
*
|
|
643
|
-
* `lib/templates/decomposer-prompts.js`, with the schedule rules and the
|
|
644
|
-
* collision refusal a planner reads only when the default-single split policy
|
|
645
|
-
* clears carried separately as `storySplitRules` (Story #5312).
|
|
646
|
-
*
|
|
647
|
-
* Story #5332 deleted the `spec` / `acceptance` fields with the module that
|
|
648
|
-
* rendered them: nothing read either, and both contradicted the current
|
|
649
|
-
* contract — one asserting Spec budgets that no longer exist, the other
|
|
650
|
-
* demanding the verify tier suffixes tickets mode now strips.
|
|
651
|
-
*
|
|
652
|
-
* `storyTicketsRules` is the one mode-conditional field (Story #5323): it
|
|
653
|
-
* only means anything when the seed is an existing ticket, and an envelope
|
|
654
|
-
* that carries it in every mode teaches the author to look for a source
|
|
655
|
-
* ticket that a `--seed` run does not have.
|
|
475
|
+
* `storyTicketsRules` only in tickets mode: a `--seed` run has no source
|
|
476
|
+
* ticket to look for.
|
|
656
477
|
*
|
|
657
478
|
* @param {{ mode?: string }} [args]
|
|
658
479
|
* @returns {{ story: string, storySplitRules: string, storyTicketsRules?: string }}
|
|
@@ -666,8 +487,7 @@ export function buildSystemPrompts({ mode } = {}) {
|
|
|
666
487
|
}
|
|
667
488
|
|
|
668
489
|
/**
|
|
669
|
-
*
|
|
670
|
-
* signal, not a gate.
|
|
490
|
+
* Open-Story duplicate search; failures degrade to [] (triage, not a gate).
|
|
671
491
|
*
|
|
672
492
|
* @param {{
|
|
673
493
|
* seed: string,
|
|
@@ -700,20 +520,9 @@ async function searchStoryDuplicates({
|
|
|
700
520
|
}
|
|
701
521
|
|
|
702
522
|
/**
|
|
703
|
-
* Gather
|
|
704
|
-
*
|
|
705
|
-
*
|
|
706
|
-
* concurrency (Story #4952).
|
|
707
|
-
*
|
|
708
|
-
* None of them reads a value the others produce, so the result is a pure
|
|
709
|
-
* function of `seed` and the injected config: the assembled envelope is
|
|
710
|
-
* **byte-identical** to the serial build for the same inputs, whichever order
|
|
711
|
-
* the three happen to settle in. `concurrentMap` preserves input order, so the
|
|
712
|
-
* destructuring below is positional and stable.
|
|
713
|
-
*
|
|
714
|
-
* `docsContextFiles` is emptied for the `buildAuthoringContext` call: the
|
|
715
|
-
* per-plan digest-file path needs a plan id that does not exist yet — the
|
|
716
|
-
* inline digest gathered alongside it replaces that pointer.
|
|
523
|
+
* Gather independent envelope inputs concurrently; order-preserving, so the
|
|
524
|
+
* result matches a serial build. `docsContextFiles` is emptied because no
|
|
525
|
+
* plan id exists yet for a digest file — the inline digest replaces it.
|
|
717
526
|
*
|
|
718
527
|
* @param {{
|
|
719
528
|
* seed: string,
|
|
@@ -761,10 +570,6 @@ async function gatherEnvelopeInputs({
|
|
|
761
570
|
epic: { id: 0, title: epicTitle, body: seed },
|
|
762
571
|
github: config.github ?? null,
|
|
763
572
|
cwd,
|
|
764
|
-
// Story #5182 — the memory-hygiene advisory's two thresholds.
|
|
765
|
-
// They live on `planning`, not the `project` block `settings`
|
|
766
|
-
// carries, so they ride the opts bag rather than that legacy one.
|
|
767
|
-
memoryPool: config.planning?.memoryPool ?? null,
|
|
768
573
|
},
|
|
769
574
|
),
|
|
770
575
|
() =>
|
|
@@ -772,10 +577,6 @@ async function gatherEnvelopeInputs({
|
|
|
772
577
|
docsContextFiles: settings?.docsContextFiles,
|
|
773
578
|
docsRoot: paths.docsRoot,
|
|
774
579
|
}),
|
|
775
|
-
// Story #5155 — the two cross-plan lookups. Both are advisory triage
|
|
776
|
-
// lists offered at Gate #3, independent of every other gather and of
|
|
777
|
-
// each other, so they join the same bounded fan-out rather than adding
|
|
778
|
-
// two more serial round-trips to the operator's wait.
|
|
779
580
|
() =>
|
|
780
581
|
findOpenEpicCandidates({
|
|
781
582
|
seed,
|
|
@@ -793,10 +594,6 @@ async function gatherEnvelopeInputs({
|
|
|
793
594
|
}),
|
|
794
595
|
],
|
|
795
596
|
(gather) => gather(),
|
|
796
|
-
// The per-mode envelope gathers (Story #4952): the duplicate search, the
|
|
797
|
-
// authoring-context fold and the docs digest have no data dependency on
|
|
798
|
-
// one another, so their serialization was incidental and `/mandrel-plan` paid it
|
|
799
|
-
// with the operator waiting at Gate #1.
|
|
800
597
|
{ concurrency: FANOUT_CONCURRENCY },
|
|
801
598
|
);
|
|
802
599
|
|
|
@@ -812,12 +609,7 @@ async function gatherEnvelopeInputs({
|
|
|
812
609
|
};
|
|
813
610
|
}
|
|
814
611
|
|
|
815
|
-
/**
|
|
816
|
-
* Build the seed-file (ideation) envelope. No parent ticket
|
|
817
|
-
* exists yet — creation moves to the persist half — so the open-Story
|
|
818
|
-
* dup search is the mode's gating input. `docsContext` is inline-digest:
|
|
819
|
-
* there is no plan temp directory to anchor a digest file to yet.
|
|
820
|
-
*/
|
|
612
|
+
/** Seed-file envelope; also the base for seed mode. */
|
|
821
613
|
async function buildSeedFileModeEnvelope({
|
|
822
614
|
seedFilePath,
|
|
823
615
|
seedFileContent,
|
|
@@ -835,18 +627,12 @@ async function buildSeedFileModeEnvelope({
|
|
|
835
627
|
);
|
|
836
628
|
}
|
|
837
629
|
|
|
838
|
-
//
|
|
839
|
-
// intersects against `predictedPaths`, so the signals have to exist before
|
|
840
|
-
// the fan-out starts. `buildComplexitySignals` is synchronous and reads
|
|
841
|
-
// nothing the gather produces, so hoisting it changes cost, not output.
|
|
630
|
+
// Before the gather: dependency candidates intersect `predictedPaths`.
|
|
842
631
|
const complexitySignals = withAdvisorySignals(
|
|
843
632
|
buildComplexitySignals({ seedText: content, cwd }),
|
|
844
633
|
{ config, cwd },
|
|
845
634
|
);
|
|
846
635
|
|
|
847
|
-
// Dup search, the authoring-context fold grounded in the seed prose, the
|
|
848
|
-
// inline docs digest and the two cross-plan candidate lists are independent
|
|
849
|
-
// — gathered concurrently (Story #4952, Story #5155).
|
|
850
636
|
const {
|
|
851
637
|
duplicates,
|
|
852
638
|
authoring,
|
|
@@ -866,9 +652,7 @@ async function buildSeedFileModeEnvelope({
|
|
|
866
652
|
return {
|
|
867
653
|
mode: modeLabel,
|
|
868
654
|
seed: { path: seedFilePath ?? null, content },
|
|
869
|
-
// Advisory
|
|
870
|
-
// nested `uiSurface` is the advisory /prototype offer — never an
|
|
871
|
-
// automatic reroute.
|
|
655
|
+
// Advisory only — no routing authority.
|
|
872
656
|
complexitySignals,
|
|
873
657
|
duplicates,
|
|
874
658
|
epicCandidates,
|
|
@@ -881,16 +665,11 @@ async function buildSeedFileModeEnvelope({
|
|
|
881
665
|
ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
|
|
882
666
|
systemPrompts: buildSystemPrompts(),
|
|
883
667
|
planState: null,
|
|
884
|
-
// N=1 default: author one Story; skip Epic-scale decompose ceremony.
|
|
885
668
|
planProfile: 'story-default',
|
|
886
669
|
};
|
|
887
670
|
}
|
|
888
671
|
|
|
889
|
-
/**
|
|
890
|
-
* Build the seed-mode (chat text) envelope. The seed-file does not exist
|
|
891
|
-
* yet: the dup search and the authoring-context fold both run off the raw
|
|
892
|
-
* seed text (N=1 default — no Epic-scale decompose).
|
|
893
|
-
*/
|
|
672
|
+
/** Seed-mode (chat text) envelope. */
|
|
894
673
|
async function buildSeedModeEnvelope({
|
|
895
674
|
seedText,
|
|
896
675
|
provider,
|
|
@@ -921,9 +700,6 @@ async function buildSeedModeEnvelope({
|
|
|
921
700
|
}
|
|
922
701
|
|
|
923
702
|
/**
|
|
924
|
-
* Fetch source tickets for `--tickets` mode.
|
|
925
|
-
* Hydrates ids concurrently (bounded) while preserving input order.
|
|
926
|
-
*
|
|
927
703
|
* @param {number[]} ticketIds
|
|
928
704
|
* @param {object} provider
|
|
929
705
|
* @returns {Promise<Array<{ id:number, title:string, body:string, labels:string[], url?:string }>>}
|
|
@@ -954,16 +730,11 @@ async function fetchSourceTickets(ticketIds, provider) {
|
|
|
954
730
|
state: ticket.state ?? undefined,
|
|
955
731
|
};
|
|
956
732
|
},
|
|
957
|
-
// `--tickets` source-ticket hydration: one independent read per id.
|
|
958
733
|
{ concurrency: FANOUT_CONCURRENCY },
|
|
959
734
|
);
|
|
960
735
|
}
|
|
961
736
|
|
|
962
|
-
/**
|
|
963
|
-
* Build the tickets-mode envelope — analyze existing issue(s) into proper
|
|
964
|
-
* Stories. Dup search excludes the source ids so a ticket is not reported
|
|
965
|
-
* as a duplicate of itself.
|
|
966
|
-
*/
|
|
737
|
+
/** Dup search excludes the source ids: a ticket is not its own duplicate. */
|
|
967
738
|
async function buildTicketsModeEnvelope({
|
|
968
739
|
ticketIds,
|
|
969
740
|
provider,
|
|
@@ -981,15 +752,11 @@ async function buildTicketsModeEnvelope({
|
|
|
981
752
|
.map((t) => `# ${t.title}\n\n${t.body}`)
|
|
982
753
|
.join('\n\n---\n\n');
|
|
983
754
|
|
|
984
|
-
// Hoisted for the same reason as seed-file mode (Story #5155).
|
|
985
755
|
const complexitySignals = withAdvisorySignals(
|
|
986
756
|
buildComplexitySignals({ seedText: seed, cwd }),
|
|
987
757
|
{ config, cwd },
|
|
988
758
|
);
|
|
989
759
|
|
|
990
|
-
// Same independent gathers as seed-file mode, concurrent under the same
|
|
991
|
-
// bound (Story #4952); only the source-ticket hydration above is a genuine
|
|
992
|
-
// data dependency, because `seed` is derived from it.
|
|
993
760
|
const {
|
|
994
761
|
duplicates,
|
|
995
762
|
authoring,
|
|
@@ -1034,9 +801,8 @@ async function buildTicketsModeEnvelope({
|
|
|
1034
801
|
}
|
|
1035
802
|
|
|
1036
803
|
/**
|
|
1037
|
-
*
|
|
1038
|
-
*
|
|
1039
|
-
* grounded on whatever survived), never a throw.
|
|
804
|
+
* Prior Story's acceptance and delivered files; an unparseable body degrades
|
|
805
|
+
* to empty lists, never a throw.
|
|
1040
806
|
*
|
|
1041
807
|
* @param {string} priorBody
|
|
1042
808
|
* @returns {{ priorAcceptance: string[], deliveredFiles: string[] }}
|
|
@@ -1060,20 +826,8 @@ function extractPriorArtifacts(priorBody) {
|
|
|
1060
826
|
}
|
|
1061
827
|
|
|
1062
828
|
/**
|
|
1063
|
-
*
|
|
1064
|
-
*
|
|
1065
|
-
* light amendment through the light path: instead of re-interrogating the
|
|
1066
|
-
* repo from scratch (`buildAuthoringContext`'s codebase snapshot and the BDD /
|
|
1067
|
-
* memory / feedback probes), the envelope composes a DELTA from what already
|
|
1068
|
-
* exists — the prior Story's body, its acceptance criteria (the real
|
|
1069
|
-
* contract), and its delivered file map — so a follow-up change plans from the
|
|
1070
|
-
* shape already shipped.
|
|
1071
|
-
*
|
|
1072
|
-
* The semantic steps that reach the ticket are preserved: the open-Story
|
|
1073
|
-
* duplicate search (excluding the amended Story itself) and the authoring
|
|
1074
|
-
* system prompts still ride the envelope. What is
|
|
1075
|
-
* dropped is only the from-scratch repo interrogation the prior artifacts
|
|
1076
|
-
* already stand in for — that is the round-trip diet, not an amputation.
|
|
829
|
+
* `--amends` envelope: a delta grounded on the prior Story instead of a
|
|
830
|
+
* from-scratch repo interrogation.
|
|
1077
831
|
*
|
|
1078
832
|
* @param {{
|
|
1079
833
|
* amendsId: number,
|
|
@@ -1105,12 +859,7 @@ async function buildAmendmentModeEnvelope({
|
|
|
1105
859
|
const priorBody = typeof prior.body === 'string' ? prior.body : '';
|
|
1106
860
|
const { priorAcceptance, deliveredFiles } = extractPriorArtifacts(priorBody);
|
|
1107
861
|
|
|
1108
|
-
//
|
|
1109
|
-
// member. `provider.getTicket` above is a hard data dependency (the prior
|
|
1110
|
-
// body IS the seed), and the mode deliberately carries no authoring-context
|
|
1111
|
-
// fold and no docs digest — the prior artifacts are the grounding. It still
|
|
1112
|
-
// goes through the same bounded gather as the other two builders so one file
|
|
1113
|
-
// does not carry two ways of gathering independent envelope inputs.
|
|
862
|
+
// A one-member gather, kept on the same path as the other builders.
|
|
1114
863
|
const [duplicates] = await concurrentMap(
|
|
1115
864
|
[
|
|
1116
865
|
() =>
|
|
@@ -1122,7 +871,6 @@ async function buildAmendmentModeEnvelope({
|
|
|
1122
871
|
}),
|
|
1123
872
|
],
|
|
1124
873
|
(gather) => gather(),
|
|
1125
|
-
// Same independent-gather fan-out as the seed-mode envelope above.
|
|
1126
874
|
{ concurrency: FANOUT_CONCURRENCY },
|
|
1127
875
|
);
|
|
1128
876
|
|
|
@@ -1135,15 +883,12 @@ async function buildAmendmentModeEnvelope({
|
|
|
1135
883
|
priorAcceptance,
|
|
1136
884
|
deliveredFiles,
|
|
1137
885
|
},
|
|
1138
|
-
// The prior body is the seed the delta is authored against.
|
|
1139
886
|
seed: { text: priorBody, path: null },
|
|
1140
887
|
complexitySignals: withAdvisorySignals(
|
|
1141
888
|
buildComplexitySignals({ seedText: priorBody, cwd }),
|
|
1142
889
|
{ config, cwd },
|
|
1143
890
|
),
|
|
1144
891
|
duplicates,
|
|
1145
|
-
// No plan temp dir and no from-scratch repo interrogation — the prior
|
|
1146
|
-
// artifacts are the grounding, so there is no docs digest to anchor.
|
|
1147
892
|
docsContext: null,
|
|
1148
893
|
ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
|
|
1149
894
|
systemPrompts: buildSystemPrompts(),
|
|
@@ -1153,11 +898,7 @@ async function buildAmendmentModeEnvelope({
|
|
|
1153
898
|
}
|
|
1154
899
|
|
|
1155
900
|
/**
|
|
1156
|
-
* Build the
|
|
1157
|
-
*
|
|
1158
|
-
* Every mode returns through here, which makes this the one place the
|
|
1159
|
-
* envelope's total size is decided — and therefore the only honest place to
|
|
1160
|
-
* bound it (see {@link capPlanContextEnvelope}).
|
|
901
|
+
* Build the planner-context envelope — the one place every mode is capped.
|
|
1161
902
|
*
|
|
1162
903
|
* @param {{
|
|
1163
904
|
* mode: 'seed-file'|'seed'|'tickets'|'amends',
|
|
@@ -1201,10 +942,6 @@ export async function buildPlanContext({
|
|
|
1201
942
|
);
|
|
1202
943
|
}
|
|
1203
944
|
|
|
1204
|
-
/**
|
|
1205
|
-
* Mode dispatch for {@link buildPlanContext}. Split out so the ceiling cap
|
|
1206
|
-
* wraps every mode exactly once.
|
|
1207
|
-
*/
|
|
1208
945
|
async function buildPlanContextEnvelope({
|
|
1209
946
|
mode,
|
|
1210
947
|
seedFilePath,
|