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,47 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* close-gate transcript (~1.4MB each), its terse-result detail dumps, and its
|
|
6
|
-
* validation-evidence envelope behind forever, because no code path had ever
|
|
7
|
-
* removed them. This module is the single engine that reclaims them.
|
|
8
|
-
*
|
|
9
|
-
* ## Allowlist, never a blocklist
|
|
10
|
-
*
|
|
11
|
-
* The safety property that matters is not "delete the right things" but
|
|
12
|
-
* "never delete the wrong thing". So classification is positive: an artifact
|
|
13
|
-
* is a purge candidate only when a declared class claims it. Everything else —
|
|
14
|
-
* an operator's scratch directory, a hand-parked file, a family a future
|
|
15
|
-
* Story adds without teaching this module about it — is **unrecognized**, is
|
|
16
|
-
* never touched, and is reported with its byte size so a human decides. A
|
|
17
|
-
* blocklist would have the opposite failure mode: anything the framework
|
|
18
|
-
* forgot to exclude gets deleted.
|
|
19
|
-
*
|
|
20
|
-
* ## Two eligibility signals, deliberately different in strength
|
|
21
|
-
*
|
|
22
|
-
* - **Story-keyed.** An artifact whose name carries a Story id is purged when
|
|
23
|
-
* that Story's merge has been *confirmed* by the caller — the post-land tail
|
|
24
|
-
* or a boot sweep that read live state. This is the primary path and the one
|
|
25
|
-
* the operator asked for: spent the moment the work lands.
|
|
26
|
-
* - **Age-floored.** Artifacts no Story id can be recovered from (audit
|
|
27
|
-
* reports, abandoned `plan-<slug>/` dirs) fall back to a `staleDays` floor.
|
|
28
|
-
* Only the sweep opts into this; the per-Story purge never does, so a
|
|
29
|
-
* post-land tail can never reap a sibling's in-flight artifact.
|
|
30
|
-
*
|
|
31
|
-
* ## Keep-class
|
|
32
|
-
*
|
|
33
|
-
* `signals.ndjson` is the artifact whose value *starts* when the run ends —
|
|
34
|
-
* `acceptance-eval` and the loop-health check both read it
|
|
35
|
-
* long after the Story merged. It is excluded twice over: it is not in the
|
|
36
|
-
* evidence basename allowlist, and {@link KEEP_BASENAMES} is re-checked at
|
|
37
|
-
* the deletion site. Defence in depth is warranted for the one file whose
|
|
38
|
-
* loss is silent and unrecoverable.
|
|
39
|
-
*
|
|
40
|
-
* ## Best-effort, never load-bearing
|
|
41
|
-
*
|
|
42
|
-
* Every entry point resolves rather than throws. This is hygiene: a purge
|
|
43
|
-
* that fails must never fail a land, a boot, or a persist that already did
|
|
44
|
-
* its real work. Failures are collected into `errors[]` and reported.
|
|
2
|
+
* Allowlisted auto-purge of spent temp artifacts: only a declared class's
|
|
3
|
+
* entries are candidates; the rest are reported, never touched. Never throws
|
|
4
|
+
* — a failed purge must not fail a land, boot, or persist.
|
|
45
5
|
*/
|
|
46
6
|
|
|
47
7
|
import fsPromises from 'node:fs/promises';
|
|
@@ -55,9 +15,8 @@ import {
|
|
|
55
15
|
import { Logger } from './Logger.js';
|
|
56
16
|
|
|
57
17
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* to turn it off rather than to turn it on.
|
|
18
|
+
* Defaults for `delivery.tempRetention`; purge is on unless turned off.
|
|
19
|
+
* `staleDays` is not configurable — only switches that turn a deletion off are.
|
|
61
20
|
*/
|
|
62
21
|
export const TEMP_RETENTION_DEFAULTS = Object.freeze({
|
|
63
22
|
enabled: true,
|
|
@@ -70,50 +29,36 @@ export const TEMP_RETENTION_DEFAULTS = Object.freeze({
|
|
|
70
29
|
}),
|
|
71
30
|
});
|
|
72
31
|
|
|
73
|
-
/** Every declared purge class, in classification order. */
|
|
74
32
|
export const PURGE_CLASS_NAMES = Object.freeze(
|
|
75
33
|
Object.keys(TEMP_RETENTION_DEFAULTS.classes),
|
|
76
34
|
);
|
|
77
35
|
|
|
78
36
|
/**
|
|
79
|
-
*
|
|
80
|
-
*
|
|
37
|
+
* Never deleted, re-checked at the deletion site: `signals.ndjson` is read
|
|
38
|
+
* long after merge and its loss is silent and unrecoverable.
|
|
81
39
|
*/
|
|
82
40
|
export const KEEP_BASENAMES = Object.freeze(['signals.ndjson']);
|
|
83
41
|
|
|
84
|
-
/**
|
|
85
|
-
* The per-Story artifact basenames `validationEvidence` claims. An explicit
|
|
86
|
-
* allowlist rather than a "delete everything but signals" rule: a file this
|
|
87
|
-
* module has not been taught about is kept, not guessed at.
|
|
88
|
-
*/
|
|
42
|
+
/** Explicit allowlist: an untaught file in a Story dir is kept. */
|
|
89
43
|
const STORY_EVIDENCE_BASENAMES = Object.freeze([
|
|
90
44
|
'validation-evidence.json',
|
|
91
45
|
'lifecycle.ndjson',
|
|
92
46
|
'manifest.md',
|
|
93
47
|
]);
|
|
94
48
|
|
|
95
|
-
/**
|
|
96
|
-
* Top-level temp entries that belong to the framework but are never purge
|
|
97
|
-
* candidates: `qa/` holds resumable operator-owned session ledgers, `cache/`
|
|
98
|
-
* has its own invalidation, and `*.lock` files are live coordination state.
|
|
99
|
-
*/
|
|
49
|
+
/** Framework-owned, never purged (`*.lock` files are also skipped). */
|
|
100
50
|
const RESERVED_TOP_LEVEL = Object.freeze(['qa', 'cache']);
|
|
101
51
|
|
|
102
52
|
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
103
53
|
|
|
104
|
-
/** `story-4794` → `4794`. */
|
|
105
54
|
const STORY_DIR_PATTERN = /^story-(\d+)$/;
|
|
106
|
-
/** `close-gates-4794`, `sync-result-story-4794` → `4794`. */
|
|
107
55
|
const TRAILING_ID_PATTERN = /-(\d+)$/;
|
|
108
|
-
/** `audit-story-4794-audit-clean-code.md` → `4794`. */
|
|
109
56
|
const AUDIT_STORY_PATTERN = /^audit-story-(\d+)-/;
|
|
110
|
-
/**
|
|
57
|
+
/** Per-run temp tree holding `stories/story-<id>/` children. */
|
|
111
58
|
const RUN_DIR_PATTERN = /^run-\d+$/;
|
|
112
59
|
|
|
113
60
|
/**
|
|
114
|
-
*
|
|
115
|
-
* {@link TEMP_RETENTION_DEFAULTS}. An unset block yields the defaults, so a
|
|
116
|
-
* consumer that never heard of this feature gets the purge.
|
|
61
|
+
* Effective retention policy, defaults filled in.
|
|
117
62
|
*
|
|
118
63
|
* @param {object} [config] Resolved config bag.
|
|
119
64
|
* @returns {{ enabled: boolean, staleDays: number, classes: Record<string, boolean> }}
|
|
@@ -127,15 +72,13 @@ export function resolveTempRetention(config) {
|
|
|
127
72
|
}
|
|
128
73
|
return {
|
|
129
74
|
enabled: raw.enabled ?? TEMP_RETENTION_DEFAULTS.enabled,
|
|
130
|
-
staleDays:
|
|
75
|
+
staleDays: TEMP_RETENTION_DEFAULTS.staleDays,
|
|
131
76
|
classes,
|
|
132
77
|
};
|
|
133
78
|
}
|
|
134
79
|
|
|
135
80
|
/**
|
|
136
|
-
* `readdir`
|
|
137
|
-
* read. Every scan below walks optional trees, so an absent one is the normal
|
|
138
|
-
* case, not an error.
|
|
81
|
+
* `readdir` yielding `[]` for an absent or unreadable directory.
|
|
139
82
|
*
|
|
140
83
|
* @param {typeof fsPromises} fsp
|
|
141
84
|
* @param {string} dir
|
|
@@ -150,8 +93,7 @@ async function safeReaddir(fsp, dir) {
|
|
|
150
93
|
}
|
|
151
94
|
|
|
152
95
|
/**
|
|
153
|
-
*
|
|
154
|
-
* directory. Reporting-only: a vanished child is skipped rather than fatal.
|
|
96
|
+
* Recursive byte total; a vanished child is skipped.
|
|
155
97
|
*
|
|
156
98
|
* @param {typeof fsPromises} fsp
|
|
157
99
|
* @param {string} target
|
|
@@ -180,10 +122,8 @@ async function sizeOf(fsp, target) {
|
|
|
180
122
|
}
|
|
181
123
|
|
|
182
124
|
/**
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
* reap has always used, and widening it here would silently change when an
|
|
186
|
-
* abandoned directory becomes eligible.
|
|
125
|
+
* One classified entry. `mtimeMs` is the entry's own mtime, not the newest
|
|
126
|
+
* beneath it; widening it would change when an abandoned dir becomes eligible.
|
|
187
127
|
*
|
|
188
128
|
* @param {typeof fsPromises} fsp
|
|
189
129
|
* @param {string} target
|
|
@@ -209,19 +149,12 @@ async function makeEntry(fsp, target, className, storyId, keep = false) {
|
|
|
209
149
|
};
|
|
210
150
|
}
|
|
211
151
|
|
|
212
|
-
/**
|
|
213
|
-
* Extensions this class owns inside `orchestration/`. Story #4816 added
|
|
214
|
-
* `.json`: the persisted terminal envelope lands beside the gate log, and a
|
|
215
|
-
* `.log`-only scan would have left one immortal file per delivered Story in a
|
|
216
|
-
* directory the purge otherwise keeps clean.
|
|
217
|
-
*/
|
|
152
|
+
/** `.json` covers the persisted terminal envelope beside each gate log. */
|
|
218
153
|
const ORCHESTRATION_EXTENSIONS = Object.freeze(['.log', '.json']);
|
|
219
154
|
|
|
220
155
|
/**
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
* from the gate sink, `sync-result-story-4794.log` from the terse-result dump,
|
|
224
|
-
* `story-deliver-terminal-4794.json` from the terminal-envelope persist.
|
|
156
|
+
* Story id from an `orchestration/` basename; every writer there ends the
|
|
157
|
+
* name with `-<id>`.
|
|
225
158
|
*
|
|
226
159
|
* @param {string} name
|
|
227
160
|
* @returns {number|null}
|
|
@@ -231,12 +164,7 @@ function storyIdFromLogName(name) {
|
|
|
231
164
|
return match ? Number(match[1]) : null;
|
|
232
165
|
}
|
|
233
166
|
|
|
234
|
-
/**
|
|
235
|
-
* `<tempRoot>/orchestration/*.{log,json}` — close gate transcripts,
|
|
236
|
-
* terse-result detail dumps, and persisted terminal envelopes. An artifact
|
|
237
|
-
* whose name carries no id (there are none today, but the class owns the
|
|
238
|
-
* directory) is age-floored rather than dropped from the class.
|
|
239
|
-
*/
|
|
167
|
+
/** `<tempRoot>/orchestration/*.{log,json}`; an id-less name is age-floored. */
|
|
240
168
|
async function scanOrchestrationLogs(tempRoot, fsp) {
|
|
241
169
|
const dir = path.join(tempRoot, ORCHESTRATION_DIRNAME);
|
|
242
170
|
const entries = [];
|
|
@@ -258,10 +186,7 @@ async function scanOrchestrationLogs(tempRoot, fsp) {
|
|
|
258
186
|
return entries;
|
|
259
187
|
}
|
|
260
188
|
|
|
261
|
-
/**
|
|
262
|
-
* Every directory that holds `story-<id>/` children: the standalone tree and
|
|
263
|
-
* each per-run tree.
|
|
264
|
-
*/
|
|
189
|
+
/** Directories holding `story-<id>/` children: standalone and per-run. */
|
|
265
190
|
async function storyParentDirs(tempRoot, fsp) {
|
|
266
191
|
const parents = [path.join(tempRoot, 'standalone', 'stories')];
|
|
267
192
|
for (const dirent of await safeReaddir(fsp, tempRoot)) {
|
|
@@ -273,11 +198,8 @@ async function storyParentDirs(tempRoot, fsp) {
|
|
|
273
198
|
}
|
|
274
199
|
|
|
275
200
|
/**
|
|
276
|
-
* `<…>/stories/story-<id
|
|
277
|
-
*
|
|
278
|
-
* Every file in the directory is emitted, but only the declared evidence
|
|
279
|
-
* basenames are purge candidates; `signals.ndjson` and anything unrecognized
|
|
280
|
-
* are emitted with `keep: true` so the envelope can show what survived.
|
|
201
|
+
* `<…>/stories/story-<id>/*`; non-allowlisted files are emitted `keep: true`
|
|
202
|
+
* so the envelope shows what survived.
|
|
281
203
|
*/
|
|
282
204
|
async function scanValidationEvidence(tempRoot, fsp) {
|
|
283
205
|
const entries = [];
|
|
@@ -302,10 +224,7 @@ async function scanValidationEvidence(tempRoot, fsp) {
|
|
|
302
224
|
return entries;
|
|
303
225
|
}
|
|
304
226
|
|
|
305
|
-
/**
|
|
306
|
-
* `<tempRoot>/audits/*` — audit reports. `audit-story-<id>-<lens>.md` is
|
|
307
|
-
* Story-keyed; the roster-level reports and profiling output are age-floored.
|
|
308
|
-
*/
|
|
227
|
+
/** `<tempRoot>/audits/*`; `audit-story-<id>-*` is Story-keyed, rest age-floored. */
|
|
309
228
|
async function scanAuditResults(tempRoot, fsp) {
|
|
310
229
|
const dir = path.join(tempRoot, 'audits');
|
|
311
230
|
const entries = [];
|
|
@@ -322,10 +241,7 @@ async function scanAuditResults(tempRoot, fsp) {
|
|
|
322
241
|
return entries;
|
|
323
242
|
}
|
|
324
243
|
|
|
325
|
-
/**
|
|
326
|
-
* `<tempRoot>/plan-<slug>/` — plan authoring dirs. Never Story-keyed: the
|
|
327
|
-
* directory predates the Stories it creates, so age is the only safe signal.
|
|
328
|
-
*/
|
|
244
|
+
/** `<tempRoot>/plan-<slug>/`: predates its Stories, so age is the only signal. */
|
|
329
245
|
async function scanPlanDirs(tempRoot, fsp) {
|
|
330
246
|
const entries = [];
|
|
331
247
|
for (const dirent of await safeReaddir(fsp, tempRoot)) {
|
|
@@ -341,7 +257,6 @@ async function scanPlanDirs(tempRoot, fsp) {
|
|
|
341
257
|
return entries;
|
|
342
258
|
}
|
|
343
259
|
|
|
344
|
-
/** Class name → scanner. Iteration order matches {@link PURGE_CLASS_NAMES}. */
|
|
345
260
|
const SCANNERS = Object.freeze({
|
|
346
261
|
orchestrationLogs: scanOrchestrationLogs,
|
|
347
262
|
validationEvidence: scanValidationEvidence,
|
|
@@ -350,9 +265,8 @@ const SCANNERS = Object.freeze({
|
|
|
350
265
|
});
|
|
351
266
|
|
|
352
267
|
/**
|
|
353
|
-
*
|
|
354
|
-
*
|
|
355
|
-
* unrecognized, never be silently ignored.
|
|
268
|
+
* Keep in lockstep with the scanners: an entry no class walks must surface
|
|
269
|
+
* as unrecognized.
|
|
356
270
|
*
|
|
357
271
|
* @param {string} name
|
|
358
272
|
* @returns {boolean}
|
|
@@ -368,9 +282,7 @@ function isClassOwnedTopLevel(name) {
|
|
|
368
282
|
}
|
|
369
283
|
|
|
370
284
|
/**
|
|
371
|
-
*
|
|
372
|
-
* Reported with byte sizes, never deleted — this is what makes a 49MB scratch
|
|
373
|
-
* directory visible to the operator instead of invisible to the tooling.
|
|
285
|
+
* Unclaimed, non-reserved top-level entries: reported with sizes, never deleted.
|
|
374
286
|
*
|
|
375
287
|
* @param {string} tempRoot
|
|
376
288
|
* @param {typeof fsPromises} fsp
|
|
@@ -389,8 +301,7 @@ async function collectUnrecognized(tempRoot, fsp) {
|
|
|
389
301
|
}
|
|
390
302
|
|
|
391
303
|
/**
|
|
392
|
-
* Classify a
|
|
393
|
-
* (or a test) can see exactly what the purge would consider.
|
|
304
|
+
* Classify a temp tree without deleting anything.
|
|
394
305
|
*
|
|
395
306
|
* @param {{ config?: object, tempRoot?: string, fsp?: typeof fsPromises }} [args]
|
|
396
307
|
* @returns {Promise<{ tempRoot: string, entries: object[], unrecognized: Array<{ path: string, bytes: number }> }>}
|
|
@@ -413,8 +324,6 @@ export async function collectTempEntries({
|
|
|
413
324
|
}
|
|
414
325
|
|
|
415
326
|
/**
|
|
416
|
-
* Is this entry eligible for deletion under the current policy and signals?
|
|
417
|
-
*
|
|
418
327
|
* @param {object} entry
|
|
419
328
|
* @param {object} ctx
|
|
420
329
|
* @returns {boolean}
|
|
@@ -430,23 +339,20 @@ function isPurgeable(entry, ctx) {
|
|
|
430
339
|
}
|
|
431
340
|
|
|
432
341
|
/**
|
|
433
|
-
*
|
|
434
|
-
*
|
|
435
|
-
* decision (Story-keyed vs. age-floored) that a caller reaching this directly
|
|
436
|
-
* could get wrong. Exporting it would also be a dead export — nothing outside
|
|
437
|
-
* this file has a reason to call it.
|
|
342
|
+
* Purge core; module-private because each exported entry point encodes the
|
|
343
|
+
* Story-keyed vs. age-floored policy a direct caller could get wrong.
|
|
438
344
|
*
|
|
439
345
|
* @param {object} [args]
|
|
440
|
-
* @param {object} [args.config]
|
|
346
|
+
* @param {object} [args.config]
|
|
441
347
|
* @param {number[]} [args.storyIds] Stories whose merge the caller CONFIRMED.
|
|
442
348
|
* @param {boolean} [args.sweepStale] Opt into the age floor for un-keyed entries.
|
|
443
|
-
* @param {string[]|null} [args.only]
|
|
444
|
-
* @param {string[]} [args.excludePaths]
|
|
445
|
-
* @param {number} [args.now]
|
|
446
|
-
* @param {string} [args.tempRoot]
|
|
447
|
-
* @param {typeof fsPromises} [args.fsp]
|
|
448
|
-
* @param {{ info: Function }} [args.logger]
|
|
449
|
-
* @param {string} [args.label]
|
|
349
|
+
* @param {string[]|null} [args.only]
|
|
350
|
+
* @param {string[]} [args.excludePaths]
|
|
351
|
+
* @param {number} [args.now]
|
|
352
|
+
* @param {string} [args.tempRoot]
|
|
353
|
+
* @param {typeof fsPromises} [args.fsp]
|
|
354
|
+
* @param {{ info: Function }} [args.logger]
|
|
355
|
+
* @param {string} [args.label]
|
|
450
356
|
* @returns {Promise<object>} Result envelope; never throws.
|
|
451
357
|
*/
|
|
452
358
|
async function purgeTempArtifacts({
|
|
@@ -501,7 +407,6 @@ async function purgeTempArtifacts({
|
|
|
501
407
|
result.purged.push({ path: entry.path, bytes: entry.bytes });
|
|
502
408
|
result.bytesReclaimed += entry.bytes;
|
|
503
409
|
} catch (err) {
|
|
504
|
-
// A racing writer or a permission error: leave it for the next run.
|
|
505
410
|
result.errors.push(`${entry.path}: ${String(err?.message ?? err)}`);
|
|
506
411
|
}
|
|
507
412
|
}
|
|
@@ -516,8 +421,6 @@ async function purgeTempArtifacts({
|
|
|
516
421
|
}
|
|
517
422
|
|
|
518
423
|
/**
|
|
519
|
-
* Human-readable byte count for the one summary line.
|
|
520
|
-
*
|
|
521
424
|
* @param {number} bytes
|
|
522
425
|
* @returns {string}
|
|
523
426
|
*/
|
|
@@ -534,9 +437,7 @@ export function formatBytes(bytes) {
|
|
|
534
437
|
}
|
|
535
438
|
|
|
536
439
|
/**
|
|
537
|
-
* Purge one merged Story's
|
|
538
|
-
* where "merged" is already confirmed — so this never applies the age floor
|
|
539
|
-
* and can never touch a sibling Story's in-flight artifacts.
|
|
440
|
+
* Purge one confirmed-merged Story's artifacts; never applies the age floor.
|
|
540
441
|
*
|
|
541
442
|
* @param {{ storyId: number, config?: object, now?: number, tempRoot?: string,
|
|
542
443
|
* fsp?: typeof fsPromises, logger?: object }} args
|
|
@@ -552,10 +453,8 @@ export async function purgeStoryTempArtifacts({ storyId, config, ...rest }) {
|
|
|
552
453
|
}
|
|
553
454
|
|
|
554
455
|
/**
|
|
555
|
-
* Catch-up sweep:
|
|
556
|
-
*
|
|
557
|
-
* that reclaims a backlog — Stories merged in an earlier run, merged through
|
|
558
|
-
* the GitHub UI, or delivered before this feature existed.
|
|
456
|
+
* Catch-up sweep: confirmed-merged Stories plus age-floored entries past
|
|
457
|
+
* `staleDays`.
|
|
559
458
|
*
|
|
560
459
|
* @param {{ config?: object, mergedStoryIds?: number[], now?: number,
|
|
561
460
|
* tempRoot?: string, fsp?: typeof fsPromises, logger?: object,
|
|
@@ -5,43 +5,13 @@ import {
|
|
|
5
5
|
import { BODY_FORMAT_LINTS } from '../story-body/body-format-lints.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* The story-author system prompt
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* carrier of the story-author system prompt, delivered to the host LLM in the
|
|
13
|
-
* `systemPrompts.story` field of the `/mandrel-plan` context envelope (via
|
|
14
|
-
* `lib/orchestration/plan-context.js#buildSystemPrompts`), so no second
|
|
15
|
-
* verbatim copy can drift.
|
|
16
|
-
*
|
|
17
|
-
* Two layers, composed by {@link renderStoryAuthorPrompt}:
|
|
18
|
-
*
|
|
19
|
-
* - **The N=1 core** ({@link renderStoryAuthorCore}) — what every draft
|
|
20
|
-
* needs: the body schema, the contract-level Spec rule, the deterministic
|
|
21
|
-
* body-format lints, and acceptance defined as outcomes a PR reviewer can
|
|
22
|
-
* confirm from the diff and the verify output. It carries no delivery
|
|
23
|
-
* schedule, no per-file behavior paragraphs, no reviewability budget and
|
|
24
|
-
* no verify-tier suffix — every one of those either scored a shape the
|
|
25
|
-
* authoring model already judges or prescribed a proxy that became the
|
|
26
|
-
* goal.
|
|
27
|
-
* - **The N>1 rules** ({@link renderStorySplitRules}) — the schedule rules
|
|
28
|
-
* that only mean anything once a draft has siblings: every Story must
|
|
29
|
-
* earn its slot in the wave schedule, and no same-wave pair may collide
|
|
30
|
-
* on a declared path (Story #5332 replaced the acceptance partition with
|
|
31
|
-
* the dispatcher's own collision predicate, armed as a refusal).
|
|
32
|
-
* - **The tickets-mode rules** ({@link ticketsModePromptField}, Story
|
|
33
|
-
* #5323) — what to re-derive rather than carry when the seed is an
|
|
34
|
-
* existing ticket whose body is already in Story shape.
|
|
35
|
-
*
|
|
36
|
-
* The envelope carries the core as `systemPrompts.story`, the split rules as
|
|
37
|
-
* `systemPrompts.storySplitRules` and the tickets rules as
|
|
38
|
-
* `systemPrompts.storyTicketsRules`; a planner reads the second only when the
|
|
39
|
-
* default-single split policy clears, and the third only in tickets mode.
|
|
8
|
+
* The sole source of the story-author system prompt, shipped in the
|
|
9
|
+
* `/mandrel-plan` envelope as `systemPrompts.story` (the N=1 core),
|
|
10
|
+
* `storySplitRules` (read only at N>1) and `storyTicketsRules` (tickets mode
|
|
11
|
+
* only).
|
|
40
12
|
*/
|
|
41
13
|
|
|
42
14
|
/**
|
|
43
|
-
* The N=1 core of the story-author prompt.
|
|
44
|
-
*
|
|
45
15
|
* @returns {string}
|
|
46
16
|
*/
|
|
47
17
|
export function renderStoryAuthorCore() {
|
|
@@ -55,11 +25,8 @@ export function renderStoryAuthorCore() {
|
|
|
55
25
|
advisoryCaveat,
|
|
56
26
|
newFileContract,
|
|
57
27
|
} = AUTHORING_ALTITUDE_GUIDANCE;
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
// (`lib/story-body/body-format-lints.js`) so an authored draft is lint-clean
|
|
61
|
-
// by construction rather than discovered as a persist dry-run failure and
|
|
62
|
-
// re-authored at resident-context prices (Story #4684).
|
|
28
|
+
// Rendered example-first so a draft is lint-clean by construction rather
|
|
29
|
+
// than re-authored after a persist dry-run failure.
|
|
63
30
|
const bodyFormatLintChecklist = BODY_FORMAT_LINTS.map(
|
|
64
31
|
(lint) =>
|
|
65
32
|
`- **${lint.id}** — ${lint.summary} Example: \`${lint.goodExample}\``,
|
|
@@ -117,7 +84,8 @@ The **persisted** \`body\` renders these markdown sections (in order) — you au
|
|
|
117
84
|
<optional technical approach at contract level — do NOT restate Goal / Acceptance / Verify>
|
|
118
85
|
|
|
119
86
|
## Changes
|
|
120
|
-
-
|
|
87
|
+
- <file path>
|
|
88
|
+
- {"path": "<file path>", "assumption": "deletes"}
|
|
121
89
|
- ...
|
|
122
90
|
|
|
123
91
|
## Acceptance <-- synthesized by persist from acceptance[]; do not author
|
|
@@ -137,9 +105,9 @@ The **persisted** \`body\` renders these markdown sections (in order) — you au
|
|
|
137
105
|
- **goal** (in body string): One sentence stating WHY this Story exists.
|
|
138
106
|
- **spec** (optional, in body string as \`## Spec\`): The technical approach at the altitude the SPEC PROSE CONTRACT below fixes — contract and invariants, never implementation narration. Write as much as the work needs and no more; persist keeps Specs inline at any length and never writes them under \`docs/\`.
|
|
139
107
|
- **slicing** (optional): Ordered intra-session checkpoints for one Story, one line each. A checkpoint is a **stage of the work** — a commit boundary the deliverer passes through inside one session, stated as the step it performs. An acceptance item is a **state of the codebase** a PR reviewer confirms once the Story has landed. The same Story therefore carries both: the checkpoints say in what order it is built, \`acceptance[]\` says what must then be true. Never a fan-out table, never a second acceptance list, and never sibling tickets — a broad sweep with many stages is still one Story, sliced here.
|
|
140
|
-
- **changes** (in body string): Each entry is
|
|
108
|
+
- **changes** (in body string): Each entry is a **bare path string** — the default form; persist derives its assumption by probing the base branch and reports the derivation. Use the object form \`{ path, assumption }\` (\`assumption\` one of \`creates | refactors-existing | deletes\`) only to pin one yourself, and always for a \`deletes\`, which a bare path can never express. **Name the files the deliverer authors, and omit generated artifacts** — quality baselines, generated test indexes, migration journals, lockfiles and the like are regenerated by the work itself, the refresh is a close-gate concern, and declaring one needlessly reserves a footprint that serializes sibling Stories at dispatch. Acceptable path shapes include explicit files (\`src/components/Foo.tsx\`), glob patterns (\`tests/e2e/*.spec.ts\`, \`**/*.astro\`), and module identifiers that resolve to files. Pin \`refactors-existing\` for an in-place edit, \`creates\` for a net-new file, \`deletes\` for a removal, whenever the probe would get it wrong. Persist probes every path against the base branch and derives the assumption for you, so a \`creates\` on an existing path or a \`refactors-existing\` on an absent one is a dry-run warning; only a \`deletes\` naming an absent path is refused.
|
|
141
109
|
- **acceptance** (top-level array on the ticket object): Each item is an **outcome a PR reviewer can confirm from the diff and the verify output** — what is true of the codebase once the Story lands, stated at the altitude of the capability (a command that now exits 0 against a named input, a behavior a named test now asserts, a config that now fails validation on a retired key, a document that now records a decision). State as many outcomes as the capability has and no more — the list has no target, floor or ceiling, and a long one is never a reason to split the Story. Push grep-shaped probes, file-exists checks and exit-code tests down into \`verify[]\`; never pin an internal helper name or a private file path into an acceptance item the advisory \`changes[]\` is free to reshape. UNACCEPTABLE: "verify by reading the diff", "looks good", "matches the spec".
|
|
142
|
-
- **verify** (top-level array on the ticket object): The **mechanical checks** — exact commands or test paths the deliverer runs and the acceptance critic consumes as evidence: \`node --test tests/x.test.js\`, \`npm run lint\`, \`npm run validate\`, a scoped grep. Every acceptance item should be confirmable from at least one verify entry's output plus the diff.
|
|
110
|
+
- **verify** (top-level array on the ticket object): The **mechanical checks** — exact commands or test paths the deliverer runs and the acceptance critic consumes as evidence: \`node --test tests/x.test.js\`, \`npm run lint\`, \`npm run validate\`, a scoped grep. Every acceptance item should be confirmable from at least one verify entry's output plus the diff. A Story with no verify entry is warned about, not rejected — but the critic then has nothing to read as evidence, so author the commands.
|
|
143
111
|
- **Bodies record decisions, never questions to the operator.** Never persist an open question ("Flag if…", "TBD", "confirm with the operator") into a Story body — the executing sub-agent is non-interactive and cannot answer it, and the dry-run warns on every one it finds. Triage each unknown by who can resolve it: an AFK-shaped unknown (a fact in docs, a third-party API surface, observable repo behavior) MUST be resolved by your own research before authoring — never restated as an assumption; only a HITL-shaped unknown (a genuine product or architecture call the operator owns) may be restated as a declarative Key Assumption the agent can act on, stating the default chosen (a decision-made-by-default).
|
|
144
112
|
- **non_goals** (OPTIONAL, in body string as the \`## Non-Goals\` section): A short list of capabilities or changes this Story explicitly does NOT deliver — an advisory negative-scope bound that fences the executing agent away from adjacent work. It is **advisory and NON-GATING**: the validator does not require, count, or reject on it, and an absent or empty section renders nothing. Use the EXACT single-word hyphenated heading spelling \`## Non-Goals\` (a space-separated heading like \`## Out of Scope\` is NOT recognized by the parser and will be dropped). Reach for it when a Story's negative boundary is non-obvious from its \`acceptance[]\` alone; omit it otherwise.
|
|
145
113
|
|
|
@@ -180,19 +148,10 @@ ${envelopeFloor}
|
|
|
180
148
|
- **A remediation sweep over one subsystem is one Story.** A batch of findings in the same subsystem shares one reason to exist — the subsystem is wrong — so it arrives as one Story whose \`## Slicing\` checkpoints carry the stages, not as one Story per finding.
|
|
181
149
|
- ${singleConsumerRule}
|
|
182
150
|
|
|
183
|
-
#### UI
|
|
184
|
-
|
|
185
|
-
Every \`changes[]\` entry is a \`{ path, assumption }\` object — a prose bullet there is rejected by the parser, so the testid contract is carried where prose belongs:
|
|
151
|
+
#### UI AND COPY WORK — where the contract is written down:
|
|
186
152
|
|
|
187
|
-
-
|
|
188
|
-
|
|
189
|
-
- \`"data-testid changes: <old> -> <new>, with the matching tests/e2e/*.spec.ts selector updated"\` — paired with that \`tests/e2e/*.spec.ts\` file in \`changes[]\`, in the same Story or a depends_on Story.
|
|
190
|
-
- State the preserved-testid set in \`## Non-Goals\` prose as well when the Story deliberately renames nothing.
|
|
191
|
-
- Renaming a testid without the matching e2e edit is FORBIDDEN.
|
|
192
|
-
|
|
193
|
-
#### BRAND / COPY / STYLE WORK:
|
|
194
|
-
|
|
195
|
-
- Stories that touch user-visible copy, brand assets, or visual style MUST cite the relevant section of \`docs/style-guide.md\` in \`acceptance\` (e.g. \`"acceptance": ["Hero copy matches docs/style-guide.md §3 (voice & tone)"]\`). If \`docs/style-guide.md\` does not exist or has no relevant section, state that explicitly: \`"acceptance": ["docs/style-guide.md absent — copy reviewed against the inline brand brief in the plan seed"]\`. Silence on style sourcing is a smell.
|
|
153
|
+
- A Story touching UI (\`*.tsx\`, \`*.astro\`, \`*.svelte\`, \`*.vue\`, a components folder) states the \`data-testid\` contract in \`acceptance[]\` per the testid contract in \`.agents/skills/stack/qa/playwright/SKILL.md\`.
|
|
154
|
+
- A Story touching user-visible copy, brand assets or visual style cites the relevant section of \`docs/style-guide.md\` in \`acceptance[]\` when that file exists.
|
|
196
155
|
|
|
197
156
|
CRITICAL: Dependencies should follow execution blockers. There is no parent ticket — never emit a 'parent_slug' field.
|
|
198
157
|
IMPORTANT DEPENDENCY RULE: Story-to-Story dependencies are expressed via \`depends_on\` (one Story depends_on another Story's slug). Use this to express execution ordering across the plan.
|
|
@@ -200,10 +159,6 @@ IMPORTANT DEPENDENCY RULE: Story-to-Story dependencies are expressed via \`depen
|
|
|
200
159
|
}
|
|
201
160
|
|
|
202
161
|
/**
|
|
203
|
-
* The rules that only apply once a draft has more than one Story: the
|
|
204
|
-
* delivery-schedule simulation that makes each Story earn its slot, and the
|
|
205
|
-
* same-wave collision refusal persist enforces at N>1.
|
|
206
|
-
*
|
|
207
162
|
* @returns {string}
|
|
208
163
|
*/
|
|
209
164
|
export function renderStorySplitRules() {
|
|
@@ -229,16 +184,9 @@ Each Story carries its **own** \`## Spec\`; a shared \`techspec.md\` cannot be f
|
|
|
229
184
|
}
|
|
230
185
|
|
|
231
186
|
/**
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
* A `--tickets` seed arrives already in Story shape — rendered `AC-<n>:`
|
|
236
|
-
* checkboxes, a `## Verify` list, a `## Changes` footprint — and an author
|
|
237
|
-
* reading it as a template carries that shape forward instead of re-deriving
|
|
238
|
-
* it. The observed failure (swarm-os #2707 / #2708, planned from #2542 under
|
|
239
|
-
* mandrel 2.57.0) was a Story whose acceptance list was the source's, handles
|
|
240
|
-
* and all, and whose verify entries carried a tier suffix retired two
|
|
241
|
-
* releases earlier. The source ticket is **evidence**, not a draft.
|
|
187
|
+
* A `--tickets` seed already arrives in Story shape, and an author reading it
|
|
188
|
+
* as a template carries stale handles and retired suffixes forward; the
|
|
189
|
+
* source is evidence, not a draft.
|
|
242
190
|
*
|
|
243
191
|
* @returns {string}
|
|
244
192
|
*/
|
|
@@ -255,10 +203,6 @@ You are planning from one or more existing tickets. Read them for **what the wor
|
|
|
255
203
|
}
|
|
256
204
|
|
|
257
205
|
/**
|
|
258
|
-
* Render the story-author prompt for a draft of `storyCount` Stories: the
|
|
259
|
-
* N=1 core, plus the schedule and partition rules when the draft has
|
|
260
|
-
* siblings.
|
|
261
|
-
*
|
|
262
206
|
* @param {{ storyCount?: number }} [args]
|
|
263
207
|
* @returns {string}
|
|
264
208
|
*/
|
|
@@ -268,14 +212,8 @@ export function renderStoryAuthorPrompt({ storyCount = 1 } = {}) {
|
|
|
268
212
|
}
|
|
269
213
|
|
|
270
214
|
/**
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
* `storyTicketsRules` only means anything when the seed is an existing
|
|
274
|
-
* ticket, and an envelope carrying it in every mode teaches the author to
|
|
275
|
-
* look for a source ticket a `--seed` run does not have. Returning a
|
|
276
|
-
* spreadable object rather than a nullable string keeps the decision here,
|
|
277
|
-
* beside the prompt it selects, instead of as a branch in the envelope
|
|
278
|
-
* builder.
|
|
215
|
+
* Spreadable into `systemPrompts`: present only in tickets mode, since
|
|
216
|
+
* elsewhere it would send the author looking for a source ticket.
|
|
279
217
|
*
|
|
280
218
|
* @param {string|undefined} mode The plan-context mode.
|
|
281
219
|
* @returns {{ storyTicketsRules?: string }}
|
|
@@ -5,49 +5,20 @@ import path from 'node:path';
|
|
|
5
5
|
import { TEST_TEMP_ROOT_ENV } from './config/temp-paths.js';
|
|
6
6
|
import { reapOnExit } from './test-temp.js';
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* Per-process memo for the created scratch dir, so repeated calls in one
|
|
10
|
-
* runner process (e.g. building env bags for several chunks) share a single
|
|
11
|
-
* scratch tree instead of minting one dir per call.
|
|
12
|
-
*/
|
|
8
|
+
/** Per-process memo: one scratch tree per runner process. */
|
|
13
9
|
let _createdScratchDir = null;
|
|
14
10
|
|
|
15
|
-
/**
|
|
16
|
-
* Test-only: clear the per-process scratch memo so a suite can exercise the
|
|
17
|
-
* creation branch repeatedly in one process.
|
|
18
|
-
*/
|
|
11
|
+
/** Test-only: clear the scratch memo. */
|
|
19
12
|
export function _clearTestScratchTempRootCache() {
|
|
20
13
|
_createdScratchDir = null;
|
|
21
14
|
}
|
|
22
15
|
|
|
23
16
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* If `baseEnv` already carries an absolute `MANDREL_TEST_TEMP_ROOT` (the
|
|
28
|
-
* common case for a child process that inherits the parent runner's env),
|
|
29
|
-
* that value is reused verbatim so every chunk / worker of a single suite
|
|
30
|
-
* run shares one scratch dir. Otherwise a fresh `os.tmpdir()` directory is
|
|
31
|
-
* created once per process (memoized). Every stream writer that resolves a
|
|
32
|
-
* relative tempRoot then lands under this dir instead of the repo's real
|
|
33
|
-
* `temp/` telemetry tree — the regression that let 99% of friction records
|
|
34
|
-
* be test-fixture pollution.
|
|
35
|
-
*
|
|
36
|
-
* Reaping (Story #4808): the minting process registers removal of the
|
|
37
|
-
* scratch dir at exit. This branch is creator-only by construction — a
|
|
38
|
-
* process that inherited an absolute root returns above without ever
|
|
39
|
-
* touching the memo, so a child can never delete its parent's scratch
|
|
40
|
-
* while the parent is still writing to it. Left unreaped, this seam was
|
|
41
|
-
* the single largest contributor to the OS-temp-root leak (870 surviving
|
|
42
|
-
* `mandrel-test-temp-` roots on one host), because it mints one per
|
|
43
|
-
* `run-tests.js` invocation.
|
|
44
|
-
*
|
|
45
|
-
* Directly unit-tested via the injectable `mkdtemp` seam in
|
|
46
|
-
* `tests/lib/test-env.test.js` (Story #4711).
|
|
17
|
+
* Per-process scratch tempRoot keeping tests out of real `temp/` telemetry.
|
|
18
|
+
* An inherited absolute root is reused; only the minting process reaps it.
|
|
47
19
|
*
|
|
48
20
|
* @param {NodeJS.ProcessEnv} [baseEnv=process.env]
|
|
49
21
|
* @param {{ mkdtemp?: typeof mkdtempSync, onExit?: (fn: () => void) => void }} [deps]
|
|
50
|
-
* Injectable for tests.
|
|
51
22
|
* @returns {string} absolute scratch tempRoot
|
|
52
23
|
*/
|
|
53
24
|
export function ensureTestScratchTempRoot(
|
|
@@ -70,39 +41,15 @@ export function ensureTestScratchTempRoot(
|
|
|
70
41
|
}
|
|
71
42
|
|
|
72
43
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* Operators keep a real `NOTIFICATION_WEBHOOK_URL` in `.env` for development
|
|
76
|
-
* (the production `notify()` path reads it via `process.env` after
|
|
77
|
-
* `resolveConfig()` calls `loadEnv()`). Without scrubbing, any test that
|
|
78
|
-
* transitively reaches `notify()` POSTs to the live endpoint.
|
|
79
|
-
*
|
|
80
|
-
* This helper produces the env bag that test child processes inherit:
|
|
44
|
+
* Env bag for test child processes:
|
|
81
45
|
*
|
|
82
|
-
* - `NOTIFICATION_WEBHOOK_URL` is deleted unless
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* exercise the webhook POST inject `opts.fetchImpl` instead, so the
|
|
90
|
-
* request never reaches the real network even if a URL resolves.)
|
|
91
|
-
* - Every `GIT_*` variable is dropped. When the suite runs inside a git
|
|
92
|
-
* hook (husky pre-push via the coverage-capture path), the parent git
|
|
93
|
-
* invocation exports `GIT_DIR` — from a linked worktree, the absolute
|
|
94
|
-
* `<main>/.git/worktrees/<name>` path. A test fixture's `git init`
|
|
95
|
-
* under that env re-initializes the shared gitdir and writes
|
|
96
|
-
* `core.bare=true` into the MAIN checkout's `.git/config`, breaking
|
|
97
|
-
* every worktree at once (#4580). Production git call sites are
|
|
98
|
-
* covered by `cleanGitEnv` in `git-utils.js`; this is the same scrub
|
|
99
|
-
* for test child processes, which may spawn git directly. Tests that
|
|
100
|
-
* need a `GIT_*` variable set it explicitly on their own spawn.
|
|
101
|
-
* - `MANDREL_TEST_TEMP_ROOT` is set to an absolute per-process scratch
|
|
102
|
-
* dir (Story #4696). Any test that reaches a stream writer without
|
|
103
|
-
* injecting its own absolute tempRoot lands under scratch instead of
|
|
104
|
-
* the repo's real `temp/` telemetry tree, so the suite can no longer
|
|
105
|
-
* append fixture records to friction / lifecycle / trace streams.
|
|
46
|
+
* - `NOTIFICATION_WEBHOOK_URL` is deleted (unless
|
|
47
|
+
* `MANDREL_ALLOW_TEST_WEBHOOKS=1`) so no test POSTs to a live endpoint;
|
|
48
|
+
* - `NODE_ENV` defaults to `test`;
|
|
49
|
+
* - every `GIT_*` is dropped: inside a git hook `GIT_DIR` points at the
|
|
50
|
+
* shared gitdir, and a fixture's `git init` there writes `core.bare=true`
|
|
51
|
+
* into the main checkout, breaking every worktree;
|
|
52
|
+
* - `MANDREL_TEST_TEMP_ROOT` points at the per-process scratch root.
|
|
106
53
|
*
|
|
107
54
|
* @param {NodeJS.ProcessEnv} baseEnv
|
|
108
55
|
* @returns {NodeJS.ProcessEnv}
|