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,22 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/ticketing/bulk.js — Cascade + batch ticketing surface
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* sequencing lock, the transient-error classifier and retry budget, and
|
|
7
|
-
* the partial-failure log helper. Pulled out of `../ticketing.js` under
|
|
8
|
-
* Story #1848 so the verb-family split (`reads` / `state` / `bulk`) is
|
|
9
|
-
* complete and the parent collapses to a pure re-export facade.
|
|
10
|
-
*
|
|
11
|
-
* Story #3995 — the single-ticket mutators (`transitionTicketState`,
|
|
12
|
-
* `toggleTasklistCheckbox`, `postStructuredComment`) moved to the leaf
|
|
13
|
-
* `./transition.js`, so this module now depends **downward** on
|
|
14
|
-
* `transition.js` and the former `state.js ↔ bulk.js` import cycle is
|
|
15
|
-
* gone. `cascadeCompletion` still recursively transitions parents via
|
|
16
|
-
* the imported `transitionTicketState`; the reverse call
|
|
17
|
-
* (`transitionTicketState → cascadeParentState`) is injected into
|
|
18
|
-
* `transition.js` by `state.js` via `registerCascadeRunner` rather than
|
|
19
|
-
* imported, which is what keeps the graph acyclic.
|
|
2
|
+
* lib/orchestration/ticketing/bulk.js — Cascade + batch ticketing surface:
|
|
3
|
+
* the upward cascade walk, the per-parent lock, and transient-error retry.
|
|
4
|
+
* Depends downward on `./transition.js`; the reverse edge is injected via
|
|
5
|
+
* `registerCascadeRunner`, keeping the import graph acyclic.
|
|
20
6
|
*/
|
|
21
7
|
|
|
22
8
|
import { Logger } from '../../Logger.js';
|
|
@@ -27,14 +13,7 @@ import {
|
|
|
27
13
|
transitionTicketState,
|
|
28
14
|
} from './transition.js';
|
|
29
15
|
|
|
30
|
-
/**
|
|
31
|
-
* Retry budget for transient `gh` failures (rate limit, secondary rate limit,
|
|
32
|
-
* 5xx, transport timeouts) inside the cascade transition. Three attempts with
|
|
33
|
-
* exponential backoff (250ms / 500ms / 1000ms) mirrors the budget used by
|
|
34
|
-
* `gitFetchWithRetry` (see `lib/git-utils.js`) and the HTTP-client retry path
|
|
35
|
-
* referenced by the plan persist surface. Backoff is overridable via
|
|
36
|
-
* {@link __setCascadeRetryDelays} so tests don't pay real wall-clock time.
|
|
37
|
-
*/
|
|
16
|
+
/** Backoff for transient `gh` failures inside the cascade transition. */
|
|
38
17
|
const CASCADE_RETRY_BACKOFF_MS = [250, 500, 1000];
|
|
39
18
|
const defaultCascadeSleep = (ms) =>
|
|
40
19
|
new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -42,8 +21,7 @@ let _cascadeRetryDelays = CASCADE_RETRY_BACKOFF_MS;
|
|
|
42
21
|
let _cascadeSleep = defaultCascadeSleep;
|
|
43
22
|
|
|
44
23
|
/**
|
|
45
|
-
* Test seam
|
|
46
|
-
* used by the cascade retry loop. Restore by calling with no arguments.
|
|
24
|
+
* Test seam; call with no arguments to restore defaults.
|
|
47
25
|
*
|
|
48
26
|
* @param {{ delays?: number[], sleep?: (ms: number) => Promise<void> }} [opts]
|
|
49
27
|
*/
|
|
@@ -56,21 +34,17 @@ export function __setCascadeRetryDelays(opts = {}) {
|
|
|
56
34
|
}
|
|
57
35
|
|
|
58
36
|
/**
|
|
59
|
-
* Per-parent serial lock
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* once the last awaiter finishes. The lock is scoped to a single Node
|
|
63
|
-
* process — cross-process races (multiple worktrees closing in parallel)
|
|
64
|
-
* still rely on the retry/idempotency path.
|
|
37
|
+
* Per-parent serial lock so concurrent cascades cannot race the parent's
|
|
38
|
+
* "all children done?" check. In-process only; cross-process races rely on
|
|
39
|
+
* the retry/idempotency path.
|
|
65
40
|
*
|
|
66
41
|
* @type {Map<number, Promise<unknown>>}
|
|
67
42
|
*/
|
|
68
43
|
const parentCascadeLocks = new Map();
|
|
69
44
|
|
|
70
45
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* propagate — each acquirer sees a clean entry into `fn`.
|
|
46
|
+
* Awaiters queue in invocation order; a prior holder's failure does not
|
|
47
|
+
* propagate to the next.
|
|
74
48
|
*
|
|
75
49
|
* @template R
|
|
76
50
|
* @param {number} parentId
|
|
@@ -93,20 +67,12 @@ async function withParentCascadeLock(parentId, fn) {
|
|
|
93
67
|
}
|
|
94
68
|
}
|
|
95
69
|
|
|
96
|
-
/**
|
|
97
|
-
* Test seam — clear the per-parent cascade lock map between tests so a
|
|
98
|
-
* pending entry from one scenario does not leak into the next.
|
|
99
|
-
*/
|
|
100
70
|
export function __resetParentCascadeLocks() {
|
|
101
71
|
parentCascadeLocks.clear();
|
|
102
72
|
}
|
|
103
73
|
|
|
104
74
|
/**
|
|
105
|
-
*
|
|
106
|
-
* rate limit, 5xx, transport timeout / reset) so the retry loop can back
|
|
107
|
-
* off instead of surfacing the failure to the operator. Provider-agnostic:
|
|
108
|
-
* matches on typed error names (`GhRateLimitError`), HTTP status, and
|
|
109
|
-
* conservative regex over stderr + message.
|
|
75
|
+
* Rate limit, 5xx, or transport failure — worth a backoff retry.
|
|
110
76
|
*
|
|
111
77
|
* @param {unknown} err
|
|
112
78
|
* @returns {boolean}
|
|
@@ -133,10 +99,8 @@ function isTransientCascadeError(err) {
|
|
|
133
99
|
}
|
|
134
100
|
|
|
135
101
|
/**
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
* `gh-exec`-thrown errors to a bare "exit 1" message, which made the
|
|
139
|
-
* failure mode unclassifiable post-hoc (see Story #1817).
|
|
102
|
+
* One-line rendering that keeps stderr and exit code, so a failure stays
|
|
103
|
+
* classifiable after the fact.
|
|
140
104
|
*
|
|
141
105
|
* @param {unknown} err
|
|
142
106
|
* @returns {string}
|
|
@@ -158,10 +122,7 @@ function formatCascadeError(err) {
|
|
|
158
122
|
}
|
|
159
123
|
|
|
160
124
|
/**
|
|
161
|
-
*
|
|
162
|
-
* errors propagate immediately on the first attempt. The total attempt
|
|
163
|
-
* count is `delays.length + 1` (one initial attempt plus one retry per
|
|
164
|
-
* delay).
|
|
125
|
+
* Retry `fn` on transient errors only; attempts = `delays.length + 1`.
|
|
165
126
|
*
|
|
166
127
|
* @template R
|
|
167
128
|
* @param {() => Promise<R>} fn
|
|
@@ -192,16 +153,7 @@ async function retryTransient(fn, opts = {}) {
|
|
|
192
153
|
}
|
|
193
154
|
|
|
194
155
|
/**
|
|
195
|
-
*
|
|
196
|
-
* {@link cascadeCompletion}. Each `error` string is pre-formatted with
|
|
197
|
-
* stderr + exit-code by `formatCascadeError`, so callers can pass the
|
|
198
|
-
* raw envelope through without further wrapping. Called from
|
|
199
|
-
* `state.js`'s `transitionTicketState` to keep its cyclomatic
|
|
200
|
-
* complexity inside the project's per-method CRAP ceiling (Story #1817,
|
|
201
|
-
* Story #1848).
|
|
202
|
-
*
|
|
203
|
-
* @param {number} ticketId The ticket whose `agent::done` transition
|
|
204
|
-
* triggered the cascade.
|
|
156
|
+
* @param {number} ticketId The ticket whose transition triggered the cascade.
|
|
205
157
|
* @param {{ failed?: Array<{ parentId: number, error: string }> } | null} cascade
|
|
206
158
|
*/
|
|
207
159
|
export function logCascadePartialFailures(ticketId, cascade) {
|
|
@@ -214,10 +166,6 @@ export function logCascadePartialFailures(ticketId, cascade) {
|
|
|
214
166
|
}
|
|
215
167
|
|
|
216
168
|
/**
|
|
217
|
-
* Per-parent body of {@link cascadeCompletion}. Pulled out so the outer
|
|
218
|
-
* walk stays a thin sequential loop while the per-parent work runs under
|
|
219
|
-
* the per-parent cascade lock.
|
|
220
|
-
*
|
|
221
169
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
222
170
|
* @param {number} ticketId - The ticket whose `agent::done` transition
|
|
223
171
|
* triggered the cascade.
|
|
@@ -233,11 +181,6 @@ async function processCascadeParent(provider, ticketId, parentId, opts) {
|
|
|
233
181
|
}
|
|
234
182
|
|
|
235
183
|
/**
|
|
236
|
-
* Body of {@link processCascadeParent} that runs under the per-parent lock.
|
|
237
|
-
* Split out so the lock-acquire scaffolding stays a one-liner and the
|
|
238
|
-
* cyclomatic complexity of the per-parent worker doesn't drift over the
|
|
239
|
-
* project's CRAP ceiling once the retry / idempotency branches are added.
|
|
240
|
-
*
|
|
241
184
|
* @returns {Promise<{ cascadedTo: number[], failed: Array<{ parentId: number, error: string }> }>}
|
|
242
185
|
*/
|
|
243
186
|
async function processCascadeParentLocked(
|
|
@@ -254,11 +197,8 @@ async function processCascadeParentLocked(
|
|
|
254
197
|
checked: true,
|
|
255
198
|
});
|
|
256
199
|
|
|
257
|
-
// Idempotency
|
|
258
|
-
// so a concurrent
|
|
259
|
-
// `agent::done` short-circuits us without re-running the transition.
|
|
260
|
-
// The provider cache may still hold a stale row from before the
|
|
261
|
-
// winner's PATCH — invalidate first when supported.
|
|
200
|
+
// Idempotency: re-read the parent under the lock (cache invalidated
|
|
201
|
+
// first) so a concurrent winner that already flipped it short-circuits us.
|
|
262
202
|
if (typeof provider.invalidateTicket === 'function') {
|
|
263
203
|
try {
|
|
264
204
|
provider.invalidateTicket(parentId);
|
|
@@ -274,13 +214,7 @@ async function processCascadeParentLocked(
|
|
|
274
214
|
return { cascadedTo, failed };
|
|
275
215
|
}
|
|
276
216
|
|
|
277
|
-
//
|
|
278
|
-
// `{ fresh: true }` threads into the per-child `getTicket` inside
|
|
279
|
-
// `getSubTickets`, bypassing the cache in one pass rather than two.
|
|
280
|
-
// The per-child try/catch fallback-to-null is preserved by `getSubTickets`
|
|
281
|
-
// itself, so a transient read failure cannot silently flip the all-done
|
|
282
|
-
// check. The concurrency cap (SUBTICKET_HYDRATION_CONCURRENCY = 8) is
|
|
283
|
-
// applied inside `getSubTickets`.
|
|
217
|
+
// Fresh sibling reads defend against stale-CLOSED cache entries.
|
|
284
218
|
const freshSubTickets = await provider.getSubTickets(parentId, {
|
|
285
219
|
fresh: true,
|
|
286
220
|
});
|
|
@@ -289,10 +223,6 @@ async function processCascadeParentLocked(
|
|
|
289
223
|
);
|
|
290
224
|
if (!allDone) return { cascadedTo, failed };
|
|
291
225
|
|
|
292
|
-
// Retry the parent transition on transient `gh` failures (rate limit,
|
|
293
|
-
// 5xx, transport timeouts). Permanent failures fall through to the
|
|
294
|
-
// outer catch on the first attempt so the operator sees the real
|
|
295
|
-
// error rather than three retries' worth of noise.
|
|
296
226
|
await retryTransient(
|
|
297
227
|
() =>
|
|
298
228
|
transitionTicketState(provider, parentId, STATE_LABELS.DONE, {
|
|
@@ -330,47 +260,25 @@ async function processCascadeParentLocked(
|
|
|
330
260
|
}
|
|
331
261
|
|
|
332
262
|
/**
|
|
333
|
-
*
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
*
|
|
338
|
-
* Parents run strictly sequentially in input order (Story #4017 —
|
|
339
|
-
* fan-out is <= 1 under the 2-tier hierarchy, so the former
|
|
340
|
-
* shared-ancestor grouping / parallel dispatch was deleted); concurrent
|
|
341
|
-
* transitions against a shared ancestor would race the "all children
|
|
342
|
-
* done?" check. Within each parent, sibling reads fan out via
|
|
343
|
-
* `getSubTickets(parentId, { fresh: true })` with the concurrency cap
|
|
344
|
-
* (8) applied inside `getSubTickets`.
|
|
345
|
-
*
|
|
346
|
-
* Per-parent errors are isolated: a failure updating one parent (network,
|
|
347
|
-
* permission, stale ticket) never discards progress on sibling parents.
|
|
348
|
-
* Failures are collected and returned so callers can log them with full
|
|
349
|
-
* ticket context instead of seeing a single rejection.
|
|
263
|
+
* When a ticket is `agent::done`, tick its checkbox in each parent and, if
|
|
264
|
+
* all the parent's children are done, transition the parent and recurse.
|
|
265
|
+
* Parents run sequentially (a shared ancestor would race the all-done
|
|
266
|
+
* check); per-parent failures are collected, never discarding sibling work.
|
|
350
267
|
*
|
|
351
268
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
352
269
|
* @param {number} ticketId
|
|
353
|
-
* @param {{ notify?: Function, _logger?: object }} [opts] - `
|
|
354
|
-
*
|
|
355
|
-
* tickets. `_logger` is an internal hook used by nested cascade calls
|
|
356
|
-
* to keep buffered output coherent — external callers should leave it
|
|
357
|
-
* unset so the module-level {@link Logger} is used.
|
|
270
|
+
* @param {{ notify?: Function, _logger?: object }} [opts] - `_logger` is for
|
|
271
|
+
* nested calls only.
|
|
358
272
|
* @returns {Promise<{ cascadedTo: number[], failed: Array<{ parentId: number, error: string }> }>}
|
|
359
273
|
*/
|
|
360
274
|
async function cascadeCompletion(provider, ticketId, opts = {}) {
|
|
361
275
|
const ticket = await provider.getTicket(ticketId);
|
|
362
276
|
|
|
363
|
-
// Determine if this ticket is agent::done
|
|
364
277
|
if (!ticket.labels.includes(STATE_LABELS.DONE)) {
|
|
365
278
|
return { cascadedTo: [], failed: [] };
|
|
366
279
|
}
|
|
367
280
|
|
|
368
|
-
//
|
|
369
|
-
// the native sub-issue link were both written by `createTicket`, the
|
|
370
|
-
// Epic-hierarchy write surface deleted in the same Story; with no writer,
|
|
371
|
-
// the body regex could only ever miss and the native lookup could only
|
|
372
|
-
// ever spend an API call to learn the same. The operator-settable `blocks`
|
|
373
|
-
// annotation is the one parent edge that can still exist.
|
|
281
|
+
// The operator-settable `blocks` annotation is the only parent edge.
|
|
374
282
|
const { blocks: parentIds } = await provider.getTicketDependencies(ticketId);
|
|
375
283
|
const parsedParents = Array.isArray(parentIds) ? parentIds : [];
|
|
376
284
|
|
|
@@ -378,12 +286,6 @@ async function cascadeCompletion(provider, ticketId, opts = {}) {
|
|
|
378
286
|
return { cascadedTo: [], failed: [] };
|
|
379
287
|
}
|
|
380
288
|
|
|
381
|
-
// Story #4017 — under the 2-tier hierarchy a ticket has at most one
|
|
382
|
-
// parent, so the shared-ancestor grouping / parallel-group dispatch
|
|
383
|
-
// machinery was deleted. Parents (fan-out <= 1
|
|
384
|
-
// in practice; the loop stays general for the body-reference fallback)
|
|
385
|
-
// run strictly sequentially, which trivially preserves the
|
|
386
|
-
// shared-ancestor safety invariant the grouping used to enforce.
|
|
387
289
|
const cascadedTo = [];
|
|
388
290
|
const failed = [];
|
|
389
291
|
for (const parentId of parsedParents) {
|
|
@@ -398,49 +300,12 @@ async function cascadeCompletion(provider, ticketId, opts = {}) {
|
|
|
398
300
|
}
|
|
399
301
|
|
|
400
302
|
/**
|
|
401
|
-
*
|
|
402
|
-
*
|
|
403
|
-
* Rules (Story #2676):
|
|
404
|
-
* - Any **open** child carrying `agent::blocked` → parent should be
|
|
405
|
-
* `agent::blocked`.
|
|
406
|
-
* - Otherwise, every child is `agent::done` (or closed) → parent should be
|
|
407
|
-
* `agent::done`.
|
|
408
|
-
* - Otherwise, any **open** child carrying `agent::executing` or
|
|
409
|
-
* `agent::closing` → parent should be `agent::executing`.
|
|
410
|
-
* - Otherwise (e.g. all children still `agent::ready`) → return `null` to
|
|
411
|
-
* signal "leave the parent unchanged". A parent already partway through
|
|
412
|
-
* the lifecycle MUST NOT be downgraded just because one child reverted.
|
|
413
|
-
*
|
|
414
|
-
* **A closed child contributes no `agent::*` state** (Story #5255). Its label
|
|
415
|
-
* records the state it was in when it stopped, not outstanding work, and
|
|
416
|
-
* nothing clears it on the way out: a Story re-planned out of `agent::blocked`
|
|
417
|
-
* is closed as superseded still wearing that label, and the blocked rule then
|
|
418
|
-
* pinned its container Epic open forever — `epic-rollup.js` bails before its
|
|
419
|
-
* close path on any derived state other than `agent::done`, so the Epic
|
|
420
|
-
* reported `pending` every run with every child long since closed. Filtering
|
|
421
|
-
* here rather than at that one call site is what also covers a child closed by
|
|
422
|
-
* hand with a stale state label attached. The all-done branch already counted
|
|
423
|
-
* `state === 'closed'` as done, so a closed child keeps exactly that meaning
|
|
424
|
-
* and loses only its vote on the other two.
|
|
425
|
-
*
|
|
426
|
-
* The function is pure and exported so the rule can be exercised in
|
|
427
|
-
* isolation by unit tests without dragging the cascade I/O surface in.
|
|
428
|
-
*
|
|
429
|
-
* @param {Array<{ labels?: string[], state?: string }>} siblings
|
|
430
|
-
* @returns {string|null} A `STATE_LABELS.*` value, or `null` for no-op.
|
|
431
|
-
*/
|
|
432
|
-
/**
|
|
433
|
-
* The labels that still describe **live** work on this child.
|
|
434
|
-
*
|
|
435
|
-
* Empty for a closed child: its `agent::*` label records the state it stopped
|
|
436
|
-
* in, not outstanding work, and the two live-state rules in
|
|
437
|
-
* {@link deriveParentState} must not read it. The all-done rule reads the
|
|
438
|
-
* child's labels directly, so a closed child keeps counting as done.
|
|
303
|
+
* Labels describing live work on a child — empty for a closed child, whose
|
|
304
|
+
* stale `agent::*` label records where it stopped, not outstanding work.
|
|
439
305
|
*
|
|
440
|
-
* Module-level rather than
|
|
441
|
-
*
|
|
442
|
-
*
|
|
443
|
-
* arrow and reports the shift as drift on code that did not change.
|
|
306
|
+
* Module-level rather than a local arrow: the CRAP baseline keys anonymous
|
|
307
|
+
* functions positionally, so adding one inside `deriveParentState` would
|
|
308
|
+
* renumber later arrows and fake drift.
|
|
444
309
|
*
|
|
445
310
|
* @param {{ labels?: string[], state?: string }} sibling
|
|
446
311
|
* @returns {string[]}
|
|
@@ -450,6 +315,16 @@ function liveChildLabels(sibling) {
|
|
|
450
315
|
return Array.isArray(sibling?.labels) ? sibling.labels : [];
|
|
451
316
|
}
|
|
452
317
|
|
|
318
|
+
/**
|
|
319
|
+
* Derive a parent's `agent::*` state from its children: any open blocked →
|
|
320
|
+
* blocked; else all done-or-closed → done; else any open executing/closing →
|
|
321
|
+
* executing; else `null` (never downgrade a parent). Closed children vote
|
|
322
|
+
* only as done — a stale `agent::blocked` on a superseded child must not
|
|
323
|
+
* pin its Epic open.
|
|
324
|
+
*
|
|
325
|
+
* @param {Array<{ labels?: string[], state?: string }>} siblings
|
|
326
|
+
* @returns {string|null} A `STATE_LABELS.*` value, or `null` for no-op.
|
|
327
|
+
*/
|
|
453
328
|
export function deriveParentState(siblings) {
|
|
454
329
|
if (!Array.isArray(siblings) || siblings.length === 0) return null;
|
|
455
330
|
const labelsOf = (s) => (Array.isArray(s?.labels) ? s.labels : []);
|
|
@@ -470,22 +345,9 @@ export function deriveParentState(siblings) {
|
|
|
470
345
|
}
|
|
471
346
|
|
|
472
347
|
/**
|
|
473
|
-
*
|
|
474
|
-
*
|
|
475
|
-
*
|
|
476
|
-
* child is done *or closed*, and it is right to: a closed child is finished
|
|
477
|
-
* work as far as the parent's lifecycle goes. But "finished" and "landed" are
|
|
478
|
-
* different claims, and the close path spends the difference. A cohort
|
|
479
|
-
* re-planned out of existence closes every child as superseded, carrying no
|
|
480
|
-
* `agent::done` and having merged nothing — and the container above it then
|
|
481
|
-
* closed as `completed`, over a log line claiming every child Story landed.
|
|
482
|
-
* Both the state reason and the sentence were false.
|
|
483
|
-
*
|
|
484
|
-
* So the two questions are asked separately: `deriveParentState` decides
|
|
485
|
-
* *whether* the parent is finished, this decides *how* it finished. A single
|
|
486
|
-
* landed child is enough — a container that delivered some of its work and
|
|
487
|
-
* superseded the rest completed, partially, and `not_planned` is reserved for
|
|
488
|
-
* the case where nothing was delivered at all.
|
|
348
|
+
* "Finished" is not "landed": a cohort closed wholly as superseded derives
|
|
349
|
+
* `done` but delivered nothing. One landed child means the container
|
|
350
|
+
* completed; none means `not_planned`.
|
|
489
351
|
*
|
|
490
352
|
* @param {Array<{ labels?: string[] }>} children
|
|
491
353
|
* @returns {boolean} True when at least one child carries `agent::done`.
|
|
@@ -500,26 +362,9 @@ export function anyChildLanded(children) {
|
|
|
500
362
|
}
|
|
501
363
|
|
|
502
364
|
/**
|
|
503
|
-
*
|
|
504
|
-
*
|
|
505
|
-
*
|
|
506
|
-
* walks the parent chain and updates each parent's state to the value
|
|
507
|
-
* derived by {@link deriveParentState} — so that moving a Task to
|
|
508
|
-
* `agent::executing` propagates "in progress" up to the Story and the
|
|
509
|
-
* Epic on the Project board, and moving a Task to `agent::blocked`
|
|
510
|
-
* surfaces the HITL signal at every ancestor.
|
|
511
|
-
*
|
|
512
|
-
* For `agent::done` transitions, propagation is delegated to the
|
|
513
|
-
* existing {@link cascadeCompletion} so the long-standing semantics
|
|
514
|
-
* (tasklist checkbox toggling, the "All child tickets completed via
|
|
515
|
-
* recursive cascade" progress comment, Epic exclusion) are preserved
|
|
516
|
-
* verbatim.
|
|
517
|
-
*
|
|
518
|
-
* Resilience matches {@link cascadeCompletion}: parents run
|
|
519
|
-
* sequentially; the per-parent lock from {@link withParentCascadeLock}
|
|
520
|
-
* prevents races on shared ancestors; and per-parent errors are
|
|
521
|
-
* isolated so a sibling parent's failure does not discard work on the
|
|
522
|
-
* others.
|
|
365
|
+
* Propagate any `agent::*` transition up the parent chain using
|
|
366
|
+
* {@link deriveParentState}; `done` delegates to {@link cascadeCompletion}.
|
|
367
|
+
* Same sequential, locked, failure-isolated walk.
|
|
523
368
|
*
|
|
524
369
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
525
370
|
* @param {number} ticketId
|
|
@@ -527,14 +372,7 @@ export function anyChildLanded(children) {
|
|
|
527
372
|
* @returns {Promise<{ cascadedTo: number[], failed: Array<{ parentId: number, error: string }> }>}
|
|
528
373
|
*/
|
|
529
374
|
export async function cascadeParentState(provider, ticketId, opts = {}) {
|
|
530
|
-
//
|
|
531
|
-
// `getTicketDependencies` (to walk the `blocks:` parent edge) and
|
|
532
|
-
// `getSubTickets` (to inspect the parent's children). Test fakes
|
|
533
|
-
// that stub only the single-ticket surface (e.g. the column-sync
|
|
534
|
-
// sibling tests) MUST still be able to drive `transitionTicketState`
|
|
535
|
-
// without the cascade blowing up. Silently no-op when the surface
|
|
536
|
-
// is missing — propagation is best-effort, matching the contract
|
|
537
|
-
// already documented for the column-sync mirror.
|
|
375
|
+
// Best-effort: providers lacking the dependency/sub-ticket surface no-op.
|
|
538
376
|
if (
|
|
539
377
|
typeof provider?.getTicketDependencies !== 'function' ||
|
|
540
378
|
typeof provider?.getSubTickets !== 'function'
|
|
@@ -546,9 +384,6 @@ export async function cascadeParentState(provider, ticketId, opts = {}) {
|
|
|
546
384
|
const childState = labels.find((l) => ALL_STATES.includes(l));
|
|
547
385
|
if (!childState) return { cascadedTo: [], failed: [] };
|
|
548
386
|
|
|
549
|
-
// DONE-cascade keeps the existing path: tasklist checkbox toggle,
|
|
550
|
-
// progress comment, Epic-close exclusion, and the legacy log shape are
|
|
551
|
-
// all encoded in `cascadeCompletion` and externally observed by tests.
|
|
552
387
|
if (childState === STATE_LABELS.DONE) {
|
|
553
388
|
return cascadeCompletion(provider, ticketId, opts);
|
|
554
389
|
}
|
|
@@ -556,8 +391,6 @@ export async function cascadeParentState(provider, ticketId, opts = {}) {
|
|
|
556
391
|
const parsedParents = await resolveParentIds(provider, ticket, ticketId);
|
|
557
392
|
if (parsedParents.length === 0) return { cascadedTo: [], failed: [] };
|
|
558
393
|
|
|
559
|
-
// Story #4017 — sequential per-parent walk (fan-out <= 1 under the
|
|
560
|
-
// 2-tier hierarchy); see cascadeCompletion for the rationale.
|
|
561
394
|
const cascadedTo = [];
|
|
562
395
|
const failed = [];
|
|
563
396
|
for (const parentId of parsedParents) {
|
|
@@ -572,10 +405,6 @@ export async function cascadeParentState(provider, ticketId, opts = {}) {
|
|
|
572
405
|
}
|
|
573
406
|
|
|
574
407
|
/**
|
|
575
|
-
* Resolve the parent issue ids for a ticket from its `blocks:` dependency
|
|
576
|
-
* annotations. Mirrors the resolution path used by {@link cascadeCompletion}
|
|
577
|
-
* — see there for why the `parent: #NNN` body fallback is gone (Story #4545).
|
|
578
|
-
*
|
|
579
408
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
580
409
|
* @param {object} _ticket
|
|
581
410
|
* @param {number} ticketId
|
|
@@ -587,10 +416,6 @@ async function resolveParentIds(provider, _ticket, ticketId) {
|
|
|
587
416
|
}
|
|
588
417
|
|
|
589
418
|
/**
|
|
590
|
-
* Per-parent worker for {@link cascadeParentState}. Acquires the shared
|
|
591
|
-
* per-parent cascade lock so concurrent transitions on sibling children
|
|
592
|
-
* cannot race on the parent's derived-state check.
|
|
593
|
-
*
|
|
594
419
|
* @returns {Promise<{ cascadedTo: number[], failed: Array<{ parentId: number, error: string }> }>}
|
|
595
420
|
*/
|
|
596
421
|
async function processStateCascadeParent(provider, parentId, opts) {
|
|
@@ -600,11 +425,6 @@ async function processStateCascadeParent(provider, parentId, opts) {
|
|
|
600
425
|
);
|
|
601
426
|
}
|
|
602
427
|
|
|
603
|
-
/**
|
|
604
|
-
* Body of {@link processStateCascadeParent} under the per-parent lock.
|
|
605
|
-
* Computes the derived state from a fresh sibling read, applies the
|
|
606
|
-
* idempotency guard, and recurses upward.
|
|
607
|
-
*/
|
|
608
428
|
async function processStateCascadeParentLocked(
|
|
609
429
|
provider,
|
|
610
430
|
parentId,
|
|
@@ -621,21 +441,13 @@ async function processStateCascadeParentLocked(
|
|
|
621
441
|
// best-effort cache invalidation
|
|
622
442
|
}
|
|
623
443
|
}
|
|
624
|
-
// Fetch siblings fresh in one pass — `{ fresh: true }` threads into the
|
|
625
|
-
// per-child `getTicket` inside `getSubTickets`, replacing the previous
|
|
626
|
-
// two-step pattern of `getSubTickets` + a second `concurrentMap` fan-out
|
|
627
|
-
// with `invalidateTicket` + `getTicket(id, { fresh:true })`.
|
|
628
444
|
const freshSubs = await provider.getSubTickets(parentId, { fresh: true });
|
|
629
445
|
|
|
630
446
|
const derived = deriveParentState(freshSubs);
|
|
631
447
|
if (derived === null) return { cascadedTo, failed };
|
|
632
448
|
|
|
633
|
-
//
|
|
634
|
-
//
|
|
635
|
-
// comment, and the recursive walk that already pin its
|
|
636
|
-
// behaviour via the existing test surface. The closing child's
|
|
637
|
-
// id is taken from `freshSubs` — any DONE child suffices because
|
|
638
|
-
// cascadeCompletion only uses the child to look up its parents.
|
|
449
|
+
// All-done defers to the DONE cascade; any done child suffices since it
|
|
450
|
+
// is only used to look up the parents.
|
|
639
451
|
if (derived === STATE_LABELS.DONE) {
|
|
640
452
|
const doneChild = freshSubs.find(
|
|
641
453
|
(s) => Array.isArray(s?.labels) && s.labels.includes(STATE_LABELS.DONE),
|
|
@@ -654,9 +466,6 @@ async function processStateCascadeParentLocked(
|
|
|
654
466
|
const parentLabels = Array.isArray(parent?.labels) ? parent.labels : [];
|
|
655
467
|
const currentState = parentLabels.find((l) => ALL_STATES.includes(l));
|
|
656
468
|
if (currentState === derived) {
|
|
657
|
-
// Idempotency guard — Project board is already in the derived
|
|
658
|
-
// column. Skip the transition entirely so we do not burn a
|
|
659
|
-
// GraphQL write for a no-op.
|
|
660
469
|
return { cascadedTo, failed };
|
|
661
470
|
}
|
|
662
471
|
|
|
@@ -664,9 +473,7 @@ async function processStateCascadeParentLocked(
|
|
|
664
473
|
() =>
|
|
665
474
|
transitionTicketState(provider, parentId, derived, {
|
|
666
475
|
notify: opts.notify,
|
|
667
|
-
// Recursion is
|
|
668
|
-
// prevents state.js from firing its own cascadeParentState on the
|
|
669
|
-
// parent and double-walking the tree.
|
|
476
|
+
// Recursion is explicit below; avoid double-walking the tree.
|
|
670
477
|
cascade: false,
|
|
671
478
|
}),
|
|
672
479
|
{
|