mandrel 2.60.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,53 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* epic-rollup.js — derive a container Epic's board state from its children
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* {@link rollUpEpicForStory} is invoked from **every edge that changes a
|
|
14
|
-
* child's state**: the `agent::executing` flip in `single-story-init.js`, the
|
|
15
|
-
* post-land tail, and the supersede close in `plan-persist`. Holding at N=1
|
|
16
|
-
* was never the hard part — the gap was that a container only re-derived on
|
|
17
|
-
* the edges someone had remembered to wire, so a cohort superseded by a
|
|
18
|
-
* re-plan left its Epic open with no child that would ever move again.
|
|
19
|
-
* Because every trigger is a child state change, the fallback scan reads
|
|
20
|
-
* `state: 'all'`: "did this reopen work under a container I already closed?"
|
|
21
|
-
* is always a live question.
|
|
22
|
-
*
|
|
23
|
-
* Three invariants shape the writes:
|
|
24
|
-
*
|
|
25
|
-
* 1. **The Epic never gains an `agent::*` label.** That absence keeps the
|
|
26
|
-
* container out of the bare `/mandrel-deliver` ready list and outside
|
|
27
|
-
* `lint-issue-body.js`, so the derived column goes to the board
|
|
28
|
-
* directly via `ColumnSync.setColumn` rather than through a label.
|
|
29
|
-
* 2. **Status recomputes in both directions; closure is one-way.** A
|
|
30
|
-
* reopened child pulls a closed Epic's Status back to `In Progress`
|
|
31
|
-
* and MUST NOT reopen the issue — an operator who closed a container
|
|
32
|
-
* deliberately is not overruled by a reopened child.
|
|
33
|
-
* 3. **Never throws.** Every step degrades with a reason. A stale
|
|
34
|
-
* container costs tidiness; a delivery failed on a board mutation
|
|
2
|
+
* epic-rollup.js — derive a container Epic's board state from its children
|
|
3
|
+
* and write it. Invoked from every edge that changes a child's state (init,
|
|
4
|
+
* post-land, supersede close), since a never-delivered container has no
|
|
5
|
+
* other writer.
|
|
6
|
+
*
|
|
7
|
+
* Invariants:
|
|
8
|
+
* 1. The Epic never gains an `agent::*` label (keeps it off the ready list
|
|
9
|
+
* and out of body lint); the column goes straight to the board.
|
|
10
|
+
* 2. Status recomputes both ways; closure is one-way — a reopened child
|
|
11
|
+
* pulls Status back but never reopens the issue.
|
|
12
|
+
* 3. Never throws: a stale container costs tidiness, a failed delivery
|
|
35
13
|
* costs a landed Story its terminal envelope.
|
|
36
|
-
* 4.
|
|
37
|
-
*
|
|
38
|
-
* that recompute next tick and wrong for the one that does not. When
|
|
39
|
-
* the native sub-issue read fails, the body checklist still answers
|
|
40
|
-
* "who are the children" — but no longer "are these *all* of them",
|
|
41
|
-
* and closing on that difference shut an Epic over 23 open children
|
|
42
|
-
* (Story #5210). Degraded reads keep the Status and assignee writes
|
|
43
|
-
* and lose only the close.
|
|
14
|
+
* 4. Closure needs an authoritative child list. A degraded native read
|
|
15
|
+
* keeps the Status/assignee writes (they self-correct) but never closes.
|
|
44
16
|
*
|
|
45
17
|
* @module lib/orchestration/epic-rollup
|
|
46
|
-
* @see Story #5205
|
|
47
|
-
* @see Story #5210 — fail closed on a degraded child read.
|
|
48
|
-
* @see Story #5255 — a closed child contributes no `agent::*` state.
|
|
49
|
-
* @see Story #5280 — every child edge derives; the parent resolves in one
|
|
50
|
-
* call; the reads carry one declared shape.
|
|
51
18
|
*/
|
|
52
19
|
|
|
53
20
|
import { Logger } from '../Logger.js';
|
|
@@ -63,17 +30,8 @@ import { resolveOperatorFromCandidates } from './lease-guard-shared.js';
|
|
|
63
30
|
import { anyChildLanded, deriveParentState } from './ticketing/bulk.js';
|
|
64
31
|
|
|
65
32
|
/**
|
|
66
|
-
* Derived states
|
|
67
|
-
*
|
|
68
|
-
* this operator's problem, and dropping the assignee at the moment someone
|
|
69
|
-
* needs to be found would invert the signal.
|
|
70
|
-
*
|
|
71
|
-
* "Blocked" here means an **open** blocked child. `deriveParentState` stopped
|
|
72
|
-
* reading closed children's `agent::*` labels in Story #5255 — a superseded
|
|
73
|
-
* Story closed while still wearing `agent::blocked` is not someone's problem
|
|
74
|
-
* to pick up, and the stale label used to derive `agent::blocked` forever,
|
|
75
|
-
* which both held an owner on the container and pinned it open past the
|
|
76
|
-
* `derived !== DONE` bail below.
|
|
33
|
+
* Derived states in which the Epic carries an owner. An (open) blocked child
|
|
34
|
+
* counts: that is exactly when someone needs to be found.
|
|
77
35
|
*/
|
|
78
36
|
const IN_FLIGHT_STATES = new Set([
|
|
79
37
|
AGENT_LABELS.EXECUTING,
|
|
@@ -81,28 +39,15 @@ const IN_FLIGHT_STATES = new Set([
|
|
|
81
39
|
]);
|
|
82
40
|
|
|
83
41
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* fan-out of independent single-issue GETs against one repo — because the
|
|
88
|
-
* constraint being respected is GitHub's, not this module's: enough overlap to
|
|
89
|
-
* collapse a 58-child Epic from 58 sequential round-trips, well under the
|
|
90
|
-
* burst threshold that earns a secondary rate limit. The children of one Epic
|
|
91
|
-
* are order-independent, so the serial loop this replaces was paying
|
|
92
|
-
* `sum(round-trips)` for nothing.
|
|
93
|
-
*
|
|
94
|
-
* Deliberately not exported. Nothing outside this module reads the number, and
|
|
95
|
-
* an export only tests import fails the production dead-export gate.
|
|
42
|
+
* Child reads in flight; matches `resolve-stories.js`, under GitHub's
|
|
43
|
+
* secondary-rate-limit burst threshold. Not exported: a test-only export
|
|
44
|
+
* fails the production dead-export gate.
|
|
96
45
|
*/
|
|
97
46
|
const FETCH_CONCURRENCY = 5;
|
|
98
47
|
|
|
99
48
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* Deliberately the **non-throwing** resolution (`missingHandleBehavior:
|
|
103
|
-
* 'null'`), unlike the Story lease's: a container with no owner recorded is
|
|
104
|
-
* a cosmetic gap, and refusing the whole rollup over it would cost the
|
|
105
|
-
* Status write and the closure too.
|
|
49
|
+
* Non-throwing, unlike the Story lease: a missing owner is cosmetic and must
|
|
50
|
+
* not cost the Status write and closure.
|
|
106
51
|
*
|
|
107
52
|
* @param {object} config Resolved `.agentrc.json` config.
|
|
108
53
|
* @returns {string|null} Bare login, or null when none is configured.
|
|
@@ -115,8 +60,6 @@ function resolveEpicOwner(config) {
|
|
|
115
60
|
}
|
|
116
61
|
|
|
117
62
|
/**
|
|
118
|
-
* Normalize an issue's assignee list to bare logins.
|
|
119
|
-
*
|
|
120
63
|
* @param {unknown} raw
|
|
121
64
|
* @returns {string[]}
|
|
122
65
|
*/
|
|
@@ -128,8 +71,6 @@ function normalizeAssignees(raw) {
|
|
|
128
71
|
}
|
|
129
72
|
|
|
130
73
|
/**
|
|
131
|
-
* Is this issue already closed?
|
|
132
|
-
*
|
|
133
74
|
* @param {{ state?: string }} issue
|
|
134
75
|
* @returns {boolean}
|
|
135
76
|
*/
|
|
@@ -138,20 +79,10 @@ function isClosed(issue) {
|
|
|
138
79
|
}
|
|
139
80
|
|
|
140
81
|
/**
|
|
141
|
-
* Fetch one child
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
* reads "all children done" off the list it is handed, so a silently dropped
|
|
146
|
-
* child could close a container with work still open under it.
|
|
147
|
-
*
|
|
148
|
-
* The one id it declines to fail on is a **body-only** one that resolves to
|
|
149
|
-
* nothing. The checklist is hand-editable prose, so a row can cite an issue
|
|
150
|
-
* that was deleted, transferred or mistyped, and no re-run will ever make it
|
|
151
|
-
* resolve — treating that as a failed read pins the container `pending`
|
|
152
|
-
* forever over a typo. A *native* id that will not resolve keeps failing the
|
|
153
|
-
* batch: the backend vouched for that edge, so its absence is a real read
|
|
154
|
-
* problem and next tick may well answer.
|
|
82
|
+
* Fetch one child. Throws on a failed read, since a silently dropped child
|
|
83
|
+
* could let the container close over open work. Exception: an unresolvable
|
|
84
|
+
* body-only id (a checklist typo no re-run fixes) is dropped; an
|
|
85
|
+
* unresolvable native id still fails.
|
|
155
86
|
*
|
|
156
87
|
* @param {{ childId: number, droppable: boolean, provider: object }} opts
|
|
157
88
|
* @returns {Promise<{ childId: number, child: object|null }>}
|
|
@@ -164,15 +95,9 @@ async function readOneChild({ childId, droppable, provider }) {
|
|
|
164
95
|
}
|
|
165
96
|
|
|
166
97
|
/**
|
|
167
|
-
* Read every child
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
* otherwise the children that count plus the ones refused by name.
|
|
171
|
-
*
|
|
172
|
-
* Note the scope: this validates the **readability of the ids it was given**,
|
|
173
|
-
* never the **completeness of the id list**. Completeness is
|
|
174
|
-
* `nativeReadFailed`'s job in {@link rollUpOneEpic} — checking only this one
|
|
175
|
-
* is what let three readable ids stand in for 58 (Story #5210).
|
|
98
|
+
* Read every child; `null` when any claimed child is unreadable. Validates
|
|
99
|
+
* readability of the given ids, never completeness of the list — that is
|
|
100
|
+
* `nativeReadFailed`'s job.
|
|
176
101
|
*
|
|
177
102
|
* @param {{ epicId: number, childIds: number[], bodyOnlyIds?: number[], provider: object }} opts
|
|
178
103
|
* @returns {Promise<{ children: object[], refused: Array<{ childId: number, reason: string }> }|null>}
|
|
@@ -199,9 +124,7 @@ async function readChildren({ epicId, childIds, bodyOnlyIds = [], provider }) {
|
|
|
199
124
|
return null;
|
|
200
125
|
}
|
|
201
126
|
|
|
202
|
-
//
|
|
203
|
-
// reads and the `refused` list a caller reports do not depend on which
|
|
204
|
-
// round-trip happened to finish first.
|
|
127
|
+
// Classify in input order so output is independent of fetch timing.
|
|
205
128
|
const children = [];
|
|
206
129
|
const refused = [];
|
|
207
130
|
for (const { childId, child } of read) {
|
|
@@ -214,10 +137,7 @@ async function readChildren({ epicId, childIds, bodyOnlyIds = [], provider }) {
|
|
|
214
137
|
continue;
|
|
215
138
|
}
|
|
216
139
|
if (isEpicTicket(child)) {
|
|
217
|
-
// A
|
|
218
|
-
// construction, so `deriveParentState` would read it as neither done nor
|
|
219
|
-
// in flight and stall the parent on a child that is itself derived.
|
|
220
|
-
// Nesting containers is out of scope entirely; say so and move on.
|
|
140
|
+
// A nested container has no `agent::*` label and would stall the parent.
|
|
221
141
|
refused.push({ childId, reason: 'epic-typed-child' });
|
|
222
142
|
Logger.warn(
|
|
223
143
|
`[epic-rollup] Epic #${epicId}: child #${childId} is itself a container ` +
|
|
@@ -232,8 +152,6 @@ async function readChildren({ epicId, childIds, bodyOnlyIds = [], provider }) {
|
|
|
232
152
|
}
|
|
233
153
|
|
|
234
154
|
/**
|
|
235
|
-
* Push the derived column onto the Epic's board item.
|
|
236
|
-
*
|
|
237
155
|
* @param {{ epicId: number, column: string|null, columnSync: object }} opts
|
|
238
156
|
* @returns {Promise<{ column: string|null, detail: string|null }>}
|
|
239
157
|
*/
|
|
@@ -249,13 +167,8 @@ async function applyColumn({ epicId, column, columnSync }) {
|
|
|
249
167
|
}
|
|
250
168
|
|
|
251
169
|
/**
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
* The additive assignees mutation is the only one that cannot evict a login
|
|
255
|
-
* another run wrote between our read and our write, so it is the only one
|
|
256
|
-
* used here — and the reason the assignee is never removed when the Epic
|
|
257
|
-
* closes. A closed container naming who delivered it is useful; a removal
|
|
258
|
-
* would need the replacing endpoint and would race every concurrent run.
|
|
170
|
+
* Add the owner. Additive only: it cannot evict a concurrent run's login,
|
|
171
|
+
* which is also why the assignee is never removed on close.
|
|
259
172
|
*
|
|
260
173
|
* @param {{ epicId: number, epic: object, owner: string|null, provider: object }} opts
|
|
261
174
|
* @returns {Promise<{ assigned: boolean, detail: string|null }>}
|
|
@@ -274,13 +187,8 @@ async function applyOwner({ epicId, epic, owner, provider }) {
|
|
|
274
187
|
}
|
|
275
188
|
|
|
276
189
|
/**
|
|
277
|
-
* Close a container
|
|
278
|
-
*
|
|
279
|
-
* `landed` picks the reason and the sentence, and the two must agree. A cohort
|
|
280
|
-
* re-planned out of existence closes every child as superseded — finished, so
|
|
281
|
-
* the container is finished too, but nothing merged. Reporting that as
|
|
282
|
-
* `completed` over "every child Story landed" is a false claim in the one
|
|
283
|
-
* place an operator goes to find out what a run actually delivered.
|
|
190
|
+
* Close a finished container: `completed` only if a child landed, else
|
|
191
|
+
* `not_planned` (e.g. an all-superseded cohort).
|
|
284
192
|
*
|
|
285
193
|
* @param {{ epicId: number, landed: boolean, provider: object }} opts
|
|
286
194
|
* @returns {Promise<{ closed: boolean, detail: string|null }>}
|
|
@@ -304,14 +212,8 @@ async function applyClosure({ epicId, landed, provider }) {
|
|
|
304
212
|
}
|
|
305
213
|
|
|
306
214
|
/**
|
|
307
|
-
* Roll one Epic up
|
|
308
|
-
*
|
|
309
|
-
* `nativeReadFailed` splits the writes by reversibility. Column and assignee
|
|
310
|
-
* are recomputed from scratch on every later tick, so applying them to a
|
|
311
|
-
* possibly-truncated list costs at most a stale board cell that self-corrects.
|
|
312
|
-
* Closure does not: it is the one write no subsequent tick undoes (invariant 2
|
|
313
|
-
* — a reopened child pulls Status back but MUST NOT reopen the issue), so it
|
|
314
|
-
* requires a child list we know to be complete.
|
|
215
|
+
* Roll one Epic up. `nativeReadFailed` blocks only closure, the one write no
|
|
216
|
+
* later tick undoes (invariant 4).
|
|
315
217
|
*
|
|
316
218
|
* @param {{ epic: object, childIds: number[], bodyOnlyIds?: number[], nativeReadFailed?: boolean, provider: object, columnSync: object, owner: string|null }} opts
|
|
317
219
|
* @returns {Promise<object>} Per-Epic outcome record.
|
|
@@ -325,8 +227,6 @@ async function rollUpOneEpic({
|
|
|
325
227
|
columnSync,
|
|
326
228
|
owner,
|
|
327
229
|
}) {
|
|
328
|
-
// `epic.id` and nothing else: every read that reaches here now returns the
|
|
329
|
-
// declared ticket shape, in which `id` IS the issue number.
|
|
330
230
|
const epicId = Number(epic?.id);
|
|
331
231
|
const outcome = {
|
|
332
232
|
epicId,
|
|
@@ -368,10 +268,8 @@ async function rollUpOneEpic({
|
|
|
368
268
|
}
|
|
369
269
|
|
|
370
270
|
if (derived !== AGENT_LABELS.DONE) {
|
|
371
|
-
//
|
|
372
|
-
//
|
|
373
|
-
// reopened-child case, whose Status we just corrected and whose issue
|
|
374
|
-
// state is deliberately left alone.
|
|
271
|
+
// A closed Epic here is the reopened-child case: Status corrected, issue
|
|
272
|
+
// state left alone.
|
|
375
273
|
outcome.pending = !isClosed(epic);
|
|
376
274
|
return outcome;
|
|
377
275
|
}
|
|
@@ -379,13 +277,8 @@ async function rollUpOneEpic({
|
|
|
379
277
|
if (isClosed(epic)) return outcome;
|
|
380
278
|
|
|
381
279
|
if (nativeReadFailed) {
|
|
382
|
-
// Every child
|
|
383
|
-
//
|
|
384
|
-
// above validates that the ids we were handed are *readable*; nothing
|
|
385
|
-
// there validates that the list is *complete*, which is how an Epic with
|
|
386
|
-
// 23 open children closed off the three its body happened to spell in the
|
|
387
|
-
// bare `- [ ] #N` form (Story #5210). Overwrites any column/owner detail
|
|
388
|
-
// deliberately: this is the reason the Epic is still pending.
|
|
280
|
+
// Every visible child landed, but the list may be incomplete. This
|
|
281
|
+
// detail deliberately overwrites any column/owner detail.
|
|
389
282
|
outcome.pending = true;
|
|
390
283
|
outcome.detail = 'child-read-degraded';
|
|
391
284
|
Logger.warn(
|
|
@@ -408,18 +301,9 @@ async function rollUpOneEpic({
|
|
|
408
301
|
}
|
|
409
302
|
|
|
410
303
|
/**
|
|
411
|
-
* Resolve this Story's container in
|
|
412
|
-
*
|
|
413
|
-
*
|
|
414
|
-
* this module actually asks. The scan below is what it replaces: listing every
|
|
415
|
-
* candidate Epic and reading each one's children until one of them mentions
|
|
416
|
-
* the Story — O(containers) requests, all but one of them discarded.
|
|
417
|
-
*
|
|
418
|
-
* Returns `null` — never throws — when the provider has no such port, when the
|
|
419
|
-
* Story has no parent, or when the parent is not a container Epic. Each of
|
|
420
|
-
* those is "no answer *here*", and the caller's checklist scan is the other
|
|
421
|
-
* half: linkage can legitimately exist as a body row with no native edge
|
|
422
|
-
* behind it.
|
|
304
|
+
* Resolve this Story's container in one request via the native parent edge.
|
|
305
|
+
* `null` (never throws) means "no answer here" — linkage may still exist as
|
|
306
|
+
* a body checklist row, which the caller's scan covers.
|
|
423
307
|
*
|
|
424
308
|
* @param {{ storyId: number, provider: object }} opts
|
|
425
309
|
* @returns {Promise<object|null>} Mapped parent Epic, or null.
|
|
@@ -441,21 +325,8 @@ async function parentEpicFor({ storyId, provider }) {
|
|
|
441
325
|
}
|
|
442
326
|
|
|
443
327
|
/**
|
|
444
|
-
*
|
|
445
|
-
*
|
|
446
|
-
*
|
|
447
|
-
* **`state: 'all'`, deliberately.** The scan used to be `state: 'open'`, which
|
|
448
|
-
* made two of this module's documented behaviours unreachable: a closed
|
|
449
|
-
* container was never listed, so a *reopened* child could never pull its
|
|
450
|
-
* Status back to `In Progress`, and the `isClosed(epic)` branches downstream
|
|
451
|
-
* were dead code asserting a rule nothing could exercise. Every edge that
|
|
452
|
-
* invokes this rollup is a child's own state change — init, post-land, the
|
|
453
|
-
* supersede close, the epilogue — so "did this change reopen work under a
|
|
454
|
-
* container I already closed?" is always a live question, and an open-only
|
|
455
|
-
* listing answers it wrongly rather than partially.
|
|
456
|
-
*
|
|
457
|
-
* Closing stays one-way regardless: {@link rollUpOneEpic} corrects a closed
|
|
458
|
-
* Epic's Status and never writes its issue state.
|
|
328
|
+
* Fallback: every container Epic. `state: 'all'` so a reopened child can
|
|
329
|
+
* pull a closed container's Status back (closure itself stays one-way).
|
|
459
330
|
*
|
|
460
331
|
* @param {{ provider: object }} opts
|
|
461
332
|
* @returns {Promise<object[]>}
|
|
@@ -479,17 +350,9 @@ async function scanContainerEpics({ provider }) {
|
|
|
479
350
|
}
|
|
480
351
|
|
|
481
352
|
/**
|
|
482
|
-
* Find the container Epics
|
|
483
|
-
*
|
|
484
|
-
*
|
|
485
|
-
* body carries no pointer back, and adding one would reverse ADR
|
|
486
|
-
* `20260726-v2-story-collapse`. It resolves the native edge first and scans
|
|
487
|
-
* only when that answers nothing.
|
|
488
|
-
*
|
|
489
|
-
* The two paths differ in one thing: an Epic the *native* read named is this
|
|
490
|
-
* Story's parent by construction, so its child list is read to derive state,
|
|
491
|
-
* not to confirm the link. A *scanned* Epic still has to prove it lists the
|
|
492
|
-
* Story.
|
|
353
|
+
* Find the container Epics holding a Story (Story bodies carry no parent
|
|
354
|
+
* pointer). Native edge first, scan otherwise; a scanned Epic must prove it
|
|
355
|
+
* lists the Story, a native parent need not.
|
|
493
356
|
*
|
|
494
357
|
* @param {{ storyId: number, provider: object, skipEpicIds: Set<number> }} opts
|
|
495
358
|
* @returns {Promise<Array<{ epic: object, childIds: number[], nativeReadFailed: boolean, bodyOnlyIds: number[] }>>}
|
|
@@ -504,10 +367,8 @@ async function findEpicsForStory({ storyId, provider, skipEpicIds }) {
|
|
|
504
367
|
const epicId = Number(epic?.id);
|
|
505
368
|
if (!Number.isInteger(epicId)) continue;
|
|
506
369
|
if (skipEpicIds.has(epicId)) continue;
|
|
507
|
-
// Body checklist UNION native
|
|
508
|
-
//
|
|
509
|
-
// body alone here is what made an Epic whose children were linked in the
|
|
510
|
-
// GitHub UI expandable but permanently unclosable.
|
|
370
|
+
// Body checklist UNION native edges — the same reader delivery expansion
|
|
371
|
+
// uses; body alone misses children linked in the GitHub UI.
|
|
511
372
|
const {
|
|
512
373
|
ids: childIds,
|
|
513
374
|
nativeReadFailed,
|
|
@@ -518,10 +379,7 @@ async function findEpicsForStory({ storyId, provider, skipEpicIds }) {
|
|
|
518
379
|
onWarn: (message) => Logger.warn(message),
|
|
519
380
|
});
|
|
520
381
|
if (!authoritative && !childIds.includes(storyId)) {
|
|
521
|
-
// A degraded read
|
|
522
|
-
// child list, which drops the Epic from the run entirely rather than
|
|
523
|
-
// rolling it up wrongly. Non-destructive, but silent — say so, since it
|
|
524
|
-
// is the same root cause as the refusal in `rollUpOneEpic`.
|
|
382
|
+
// A degraded read may have truncated this Story out; skip, but say so.
|
|
525
383
|
if (nativeReadFailed) {
|
|
526
384
|
Logger.warn(
|
|
527
385
|
`[epic-rollup] Epic #${epicId}: skipped for Story #${storyId} on a ` +
|
|
@@ -536,13 +394,9 @@ async function findEpicsForStory({ storyId, provider, skipEpicIds }) {
|
|
|
536
394
|
}
|
|
537
395
|
|
|
538
396
|
/**
|
|
539
|
-
* Roll every container Epic listing this Story
|
|
540
|
-
*
|
|
541
|
-
*
|
|
542
|
-
* siblings share a container, so without it the second Story would re-derive
|
|
543
|
-
* — and re-close — an Epic the first already closed. Live listings filter to
|
|
544
|
-
* open Epics and would eventually hide it, but a caller must not have to rely
|
|
545
|
-
* on a remote read racing its own writes.
|
|
397
|
+
* Roll up every container Epic listing this Story. `skipEpicIds` lets a
|
|
398
|
+
* caller walking sibling Stories avoid re-closing a shared Epic without
|
|
399
|
+
* relying on a remote read racing its own writes.
|
|
546
400
|
*
|
|
547
401
|
* @param {{
|
|
548
402
|
* storyId: number,
|
|
@@ -567,10 +421,7 @@ export async function rollUpEpicForStory({
|
|
|
567
421
|
if (!Number.isInteger(id) || id <= 0) {
|
|
568
422
|
return { ...empty, reason: 'invalid-story-id' };
|
|
569
423
|
}
|
|
570
|
-
//
|
|
571
|
-
// and `listTicketsByLabel` answers by scanning, and `findEpicsForStory`
|
|
572
|
-
// degrades from either to the other. Both absent means no way to reach a
|
|
573
|
-
// container at all.
|
|
424
|
+
// Either lookup port suffices.
|
|
574
425
|
if (
|
|
575
426
|
typeof provider?.getTicket !== 'function' ||
|
|
576
427
|
typeof provider?.updateTicket !== 'function' ||
|
|
@@ -588,8 +439,7 @@ export async function rollUpEpicForStory({
|
|
|
588
439
|
});
|
|
589
440
|
if (matches.length === 0) return { ...empty, reason: 'no-container-epic' };
|
|
590
441
|
|
|
591
|
-
//
|
|
592
|
-
// metadata, so sharing it spends the resolve once instead of per Epic.
|
|
442
|
+
// Shared so board metadata resolves once.
|
|
593
443
|
const sync =
|
|
594
444
|
columnSync ??
|
|
595
445
|
(typeof provider.graphql === 'function'
|
|
@@ -619,8 +469,6 @@ export async function rollUpEpicForStory({
|
|
|
619
469
|
reason: null,
|
|
620
470
|
};
|
|
621
471
|
} catch (err) {
|
|
622
|
-
// The module-level never-throws contract. Both call sites are lifecycle
|
|
623
|
-
// edges of a Story that is otherwise fine; neither may fail on this.
|
|
624
472
|
const detail = String(err?.message ?? err);
|
|
625
473
|
Logger.warn(`[epic-rollup] Rollup for Story #${id} failed: ${detail}`);
|
|
626
474
|
return { ...empty, reason: detail };
|
|
@@ -1,26 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* file-assumption-enum.js —
|
|
3
|
-
* file-
|
|
4
|
-
*
|
|
5
|
-
* Story #3331 relocated `FILE_ASSUMPTION_VALUES` here so the canonical
|
|
6
|
-
* Story-body parser (`../story-body/story-body.js`) can reach the enum
|
|
7
|
-
* without importing the Task-named `task-body-validator.js`. The runtime
|
|
8
|
-
* file-assumption gate (`./file-assumptions.js`) imports `parseStoryBody`
|
|
9
|
-
* from `story-body.js`; routing the enum import through this leaf keeps
|
|
10
|
-
* the dependency graph acyclic.
|
|
11
|
-
*
|
|
12
|
-
* This module imports nothing. It is the single source of truth for the
|
|
13
|
-
* assumption vocabulary; `story-body.js`, `task-body-validator.js`, and
|
|
14
|
-
* `file-assumptions.js` all import the enum from here. `file-assumptions.js`
|
|
15
|
-
* additionally re-exports it so legacy callers (and
|
|
16
|
-
* `tests/file-assumptions.test.js`) keep resolving the symbol from the
|
|
17
|
-
* runtime gate.
|
|
18
|
-
*
|
|
19
|
-
* Canonical assumption values a path entry may declare:
|
|
20
|
-
* - `creates` — the path does not yet exist; the Story creates it.
|
|
21
|
-
* - `refactors-existing` — the path exists; the Story rewrites it in place.
|
|
22
|
-
* - `exists` — the path is read but not modified (e.g. a fixture).
|
|
23
|
-
* - `deletes` — the path exists; the Story removes it.
|
|
2
|
+
* file-assumption-enum.js — the file-assumption vocabulary, in an import-free
|
|
3
|
+
* leaf so `story-body.js` and `file-assumptions.js` stay acyclic.
|
|
24
4
|
*/
|
|
25
5
|
|
|
26
6
|
export const FILE_ASSUMPTION_VALUES = Object.freeze([
|