mandrel 2.60.0 → 2.62.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/merge-queue.js +158 -0
- 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 +190 -280
- 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 +183 -485
- 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 +32 -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,10 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Replaces the unwired Epic retro as the default closeout for v2: after a
|
|
5
|
-
* Story merges, read its standalone `signals.ndjson` friction stream, compose
|
|
6
|
-
* routed proposals, auto-file follow-up issues (when enabled), and upsert a
|
|
7
|
-
* structured `follow-ups` comment on the Story.
|
|
2
|
+
* Capture follow-ups from a landed Story's friction stream: compose routed
|
|
3
|
+
* proposals, auto-file them, and publish the roll-up.
|
|
8
4
|
*
|
|
9
5
|
* @module lib/orchestration/story-follow-ups
|
|
10
6
|
*/
|
|
@@ -34,21 +30,14 @@ import { upsertStructuredComment } from './ticketing.js';
|
|
|
34
30
|
const FOLLOW_UPS_COMMENT_TYPE = 'follow-ups';
|
|
35
31
|
|
|
36
32
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* Story #5341 made the filing the condition. The comment had been
|
|
41
|
-
* unconditional, and the corpus it rendered is dominated by noise: #5324's
|
|
42
|
-
* roll-up carried 116 signals and filed nothing, and #4653 / #4833 / #4834 /
|
|
43
|
-
* #4836 record filings that were false or leaked from fixtures. A comment that
|
|
44
|
-
* says "nothing to do" on every Story trains its readers to skip the one that
|
|
45
|
-
* does not — while the roll-up itself is still written, so nothing is lost,
|
|
46
|
-
* only moved off the ticket.
|
|
33
|
+
* Comment on the ticket only when something was filed; otherwise park the
|
|
34
|
+
* roll-up as a temp artifact — a "nothing to do" comment on every Story trains
|
|
35
|
+
* readers to skip the one that matters.
|
|
47
36
|
*
|
|
48
37
|
* @param {object} args
|
|
49
|
-
* @param {number} args.anchorId
|
|
50
|
-
* @param {string} args.body
|
|
51
|
-
* @param {number} args.filedCount
|
|
38
|
+
* @param {number} args.anchorId
|
|
39
|
+
* @param {string} args.body
|
|
40
|
+
* @param {number} args.filedCount
|
|
52
41
|
* @param {object} args.provider
|
|
53
42
|
* @param {object} [args.config]
|
|
54
43
|
* @returns {Promise<{ posted: boolean, artifactPath: string|null, summary: string }>}
|
|
@@ -66,8 +55,6 @@ export async function publishFollowUpsRollup({
|
|
|
66
55
|
}
|
|
67
56
|
|
|
68
57
|
/**
|
|
69
|
-
* Post the roll-up as the `follow-ups` structured comment.
|
|
70
|
-
*
|
|
71
58
|
* @param {object} args
|
|
72
59
|
* @returns {Promise<{ posted: true, artifactPath: null, summary: string }>}
|
|
73
60
|
*/
|
|
@@ -86,8 +73,6 @@ async function postFollowUpsComment({ anchorId, body, filedCount, provider }) {
|
|
|
86
73
|
}
|
|
87
74
|
|
|
88
75
|
/**
|
|
89
|
-
* Write the roll-up to the run artifacts under the temp root.
|
|
90
|
-
*
|
|
91
76
|
* @param {object} args
|
|
92
77
|
* @returns {Promise<{ posted: false, artifactPath: string, summary: string }>}
|
|
93
78
|
*/
|
|
@@ -103,42 +88,17 @@ async function parkFollowUpsRollup({ anchorId, body, config }) {
|
|
|
103
88
|
};
|
|
104
89
|
}
|
|
105
90
|
|
|
106
|
-
/** Milliseconds in one day — the unit `frictionWindowDays` is expressed in. */
|
|
107
91
|
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
108
92
|
|
|
109
|
-
/** Window bound applied when `frictionWindowDays` is unset. */
|
|
110
|
-
const DEFAULT_FRICTION_WINDOW_DAYS = 30;
|
|
111
|
-
|
|
112
93
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* Defaults to 30 rather than to "unbounded": the widened cross-run window
|
|
116
|
-
* exists to let a once-per-Story defect reach the ≥ 2 threshold, and 30 days is
|
|
117
|
-
* long enough for that while short enough that a defect fixed last month stops
|
|
118
|
-
* re-routing. An absent, non-integer, or sub-1 value takes the default — the
|
|
119
|
-
* runtime AJV in `config-settings-schema-delivery.js` rejects those at load, so
|
|
120
|
-
* reaching this fallback means the config never went through the validator.
|
|
121
|
-
*
|
|
122
|
-
* @param {object} [config]
|
|
123
|
-
* @returns {number}
|
|
94
|
+
* Long enough for a once-per-Story defect to recur, short enough that a
|
|
95
|
+
* defect fixed last month stops re-routing.
|
|
124
96
|
*/
|
|
125
|
-
|
|
126
|
-
const raw = config?.delivery?.feedbackLoop?.frictionWindowDays;
|
|
127
|
-
const days = Number(raw);
|
|
128
|
-
return Number.isInteger(days) && days >= 1
|
|
129
|
-
? days
|
|
130
|
-
: DEFAULT_FRICTION_WINDOW_DAYS;
|
|
131
|
-
}
|
|
97
|
+
const FRICTION_WINDOW_DAYS = 30;
|
|
132
98
|
|
|
133
99
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* Routing itself lives in `github/framework-repo.js` — this is the slug-shaped
|
|
138
|
-
* adapter the composer wants (`composeRoutedProposals` renders slugs in prose)
|
|
139
|
-
* plus the `{owner, repo}` map `graduate()` routes on. The `platform` bucket
|
|
140
|
-
* has **no default**: an unconfigured shared-infra repo stays `null` so a
|
|
141
|
-
* caller reports it rather than filing platform-owned work somewhere plausible.
|
|
100
|
+
* Slug-shaped adapter over `resolveOwnershipRepos`. `platform` has no default:
|
|
101
|
+
* unconfigured stays `null` so platform work is never filed somewhere plausible.
|
|
142
102
|
*
|
|
143
103
|
* @param {object} [config]
|
|
144
104
|
* @returns {{ frameworkRepo: string, consumerRepo: string, platform: (string|null), currentRepo: { owner: string, repo: string }, repos: { consumer: object|null, framework: object|null, platform: object|null } }}
|
|
@@ -146,9 +106,7 @@ function resolveFrictionWindowDays(config) {
|
|
|
146
106
|
export function resolveFollowUpRepos(config) {
|
|
147
107
|
const repos = resolveOwnershipRepos(config);
|
|
148
108
|
const consumerRepo = formatRepoSlug(repos.consumer) ?? DEFAULT_FRAMEWORK_REPO;
|
|
149
|
-
//
|
|
150
|
-
// to the mirror constant), and both slugs above are well-formed by
|
|
151
|
-
// construction — so neither the render nor the split can yield a blank half.
|
|
109
|
+
// The framework bucket always resolves, so neither slug can be blank.
|
|
152
110
|
const frameworkRepo = formatRepoSlug(repos.framework);
|
|
153
111
|
const [cOwner, cRepo] = consumerRepo.split('/');
|
|
154
112
|
const currentRepo = { owner: cOwner, repo: cRepo };
|
|
@@ -166,19 +124,8 @@ export function resolveFollowUpRepos(config) {
|
|
|
166
124
|
}
|
|
167
125
|
|
|
168
126
|
/**
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
* **`storyId` and `details` are load-bearing (Story #4649).** This function
|
|
172
|
-
* used to flatten every record to `{ category, source }`, which silently
|
|
173
|
-
* dropped exactly the two fields `netOutRecoveredIncidents` keys on — so the
|
|
174
|
-
* Story #4622 recovery-netting could never fire on real data, and every
|
|
175
|
-
* transient friction event survived to be auto-filed. The composer's unit
|
|
176
|
-
* tests passed throughout, because they fed it synthetic signals carrying
|
|
177
|
-
* both fields that no production path ever produced. Preserve them.
|
|
178
|
-
*
|
|
179
|
-
* The record's own `storyId` is preferred over the argument so a stream that
|
|
180
|
-
* carries foreign rows attributes each one correctly; the argument is the
|
|
181
|
-
* fallback for records written before the field existed.
|
|
127
|
+
* Signals keep `storyId` and `details` — recovery netting keys on both. The
|
|
128
|
+
* record's own `storyId` wins; the argument is the fallback.
|
|
182
129
|
*
|
|
183
130
|
* @param {number} storyId
|
|
184
131
|
* @param {object} [config]
|
|
@@ -199,13 +146,7 @@ export async function gatherStoryFrictionSignals(storyId, config) {
|
|
|
199
146
|
}
|
|
200
147
|
|
|
201
148
|
/**
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
* `eventId` is minted by every producer (`diagnose-friction.js` and
|
|
205
|
-
* `runtime-friction.js` both `crypto.randomUUID()` it), so it is the primary
|
|
206
|
-
* key. A row predating the field falls back to its physical `file:line`,
|
|
207
|
-
* which is equally stable — the same row read through two passes over the
|
|
208
|
-
* same tree yields the same coordinates.
|
|
149
|
+
* De-dup key: the producer-minted `eventId`, else the stable `file:line`.
|
|
209
150
|
*
|
|
210
151
|
* @param {unknown} parsed
|
|
211
152
|
* @param {string} file
|
|
@@ -226,55 +167,19 @@ function signalIdentity(parsed, file, lineNumber) {
|
|
|
226
167
|
}
|
|
227
168
|
|
|
228
169
|
/**
|
|
229
|
-
* Gather
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
*
|
|
239
|
-
* So the gather reduces over every `signals.ndjson` still present under the
|
|
240
|
-
* configured temp root: `<tempRoot>/standalone/stories/story-<sid>/` and
|
|
241
|
-
* `<tempRoot>/run-<eid>/stories/story-<sid>/`. Temp-tree auto-purge
|
|
242
|
-
* shortening that window is acceptable — a short window under-counts, and
|
|
243
|
-
* therefore fails toward *not* filing, which is the safe direction.
|
|
244
|
-
*
|
|
245
|
-
* The run's own Stories are still gathered explicitly first. The discovery
|
|
246
|
-
* walk resolves through the identical path helpers, so it is provably a
|
|
247
|
-
* superset; the explicit pass makes "never fewer signals than before" a
|
|
248
|
-
* property of the code rather than of an argument about path resolution.
|
|
249
|
-
* {@link signalIdentity} de-duplicates the overlap, so one event can never be
|
|
250
|
-
* counted twice and inflate a singleton into a fabricated recurrence.
|
|
251
|
-
*
|
|
252
|
-
* Homed beside {@link gatherStoryFrictionSignals} on purpose: the two used to
|
|
253
|
-
* be independent copies of the same loop in two modules, and they drifted in
|
|
254
|
-
* exactly the way that made the recovery-netting unreachable (Story #4649).
|
|
255
|
-
* One reader, one normalizer, no second place to forget a field.
|
|
256
|
-
*
|
|
257
|
-
* Unusable ids are skipped rather than throwing — a roll-up must not fail the
|
|
258
|
-
* epilogue over one malformed entry.
|
|
259
|
-
*
|
|
260
|
-
* **Bounded by age, not by run (Story #4850).** Widening the window to the
|
|
261
|
-
* whole surviving temp tree also made it unbounded in *time*: a defect fixed
|
|
262
|
-
* weeks ago kept its occurrences on disk and kept re-routing forever, burying
|
|
263
|
-
* a genuine new regression underneath a historical ledger. Rows older than
|
|
264
|
-
* `delivery.feedbackLoop.frictionWindowDays` (default 30) are excluded, as are
|
|
265
|
-
* rows carrying no `ts` a `Date` can read — excluding an undateable row is the
|
|
266
|
-
* direction that fails toward under-counting, and under-counting fails toward
|
|
267
|
-
* not filing. Both exclusions are **counted and reported**, so a caller can
|
|
268
|
-
* tell a bounded window from an unbounded one without reading prose.
|
|
269
|
-
*
|
|
270
|
-
* A recovery marker is written after the incident it cancels, so a marker can
|
|
271
|
-
* never fall outside a window its incident is inside — the netting cannot be
|
|
272
|
-
* broken by the age floor.
|
|
170
|
+
* Gather over every surviving `signals.ndjson` under the temp root, not just
|
|
171
|
+
* the run's Stories — a systemic defect fires once per Story, so a per-run
|
|
172
|
+
* window never reaches the ≥ 2 threshold. The run's own Stories are read
|
|
173
|
+
* first (guaranteeing a superset) and {@link signalIdentity} de-dups the
|
|
174
|
+
* overlap so no event counts twice. Rows older than
|
|
175
|
+
* {@link FRICTION_WINDOW_DAYS} or with an unreadable `ts` are excluded and
|
|
176
|
+
* counted; every shrinkage fails toward not filing. A recovery marker always
|
|
177
|
+
* postdates its incident, so the age floor cannot break netting. Bad ids are
|
|
178
|
+
* skipped, never thrown.
|
|
273
179
|
*
|
|
274
180
|
* @param {Array<number|string>} storyIds The run's own Stories.
|
|
275
181
|
* @param {object} [config]
|
|
276
|
-
* @param {{ now?: number }} [clock]
|
|
277
|
-
* the window without touching the system clock.
|
|
182
|
+
* @param {{ now?: number }} [clock]
|
|
278
183
|
* @returns {Promise<{
|
|
279
184
|
* signals: Array<{ category: string, source: 'framework'|'consumer', storyId: number, ts: string|null, details: object }>,
|
|
280
185
|
* window: { days: number, cutoff: string, excludedStale: number, excludedUnparseable: number },
|
|
@@ -285,7 +190,7 @@ export async function gatherRunFrictionSignals(
|
|
|
285
190
|
config,
|
|
286
191
|
{ now = Date.now() } = {},
|
|
287
192
|
) {
|
|
288
|
-
const days =
|
|
193
|
+
const days = FRICTION_WINDOW_DAYS;
|
|
289
194
|
const cutoffMs = now - days * MS_PER_DAY;
|
|
290
195
|
const signals = [];
|
|
291
196
|
const seen = new Set();
|
|
@@ -339,28 +244,8 @@ export async function gatherRunFrictionSignals(
|
|
|
339
244
|
}
|
|
340
245
|
|
|
341
246
|
/**
|
|
342
|
-
*
|
|
343
|
-
*
|
|
344
|
-
* Story #4578 — an empty roll-up over a multi-Story run must NOT read as
|
|
345
|
-
* success. The pre-#4578 text ("No friction signals — nothing to follow up")
|
|
346
|
-
* was *truthful* about the stream and *false* about the run: a 7-Story
|
|
347
|
-
* delivery containing a mid-run git outage, a parked worker, and a
|
|
348
|
-
* four-round acceptance critic rendered byte-identically to a genuinely
|
|
349
|
-
* clean run. An operator cannot tell "nothing went wrong" from "the
|
|
350
|
-
* telemetry never fired", and the second is likeliest exactly when the run
|
|
351
|
-
* went worst.
|
|
352
|
-
*
|
|
353
|
-
* So the line is a function of `storyCount`:
|
|
354
|
-
* - `storyCount <= 1` → the honest, quiet reading is retained. A single
|
|
355
|
-
* Story that emitted nothing plausibly *was* clean, and crying wolf on
|
|
356
|
-
* every clean Story is how a warning channel gets tuned out.
|
|
357
|
-
* - `storyCount > 1` → zero signals across N Stories is a **claim**, and
|
|
358
|
-
* the surrounding text says so and names the two readings, rather than
|
|
359
|
-
* asserting the flattering one.
|
|
360
|
-
*
|
|
361
|
-
* This mirrors the sibling precedent in `run-epilogue.js`'s
|
|
362
|
-
* `renderDiffLines`, which refuses to let an unresolvable base diff render
|
|
363
|
-
* as "0 changed files".
|
|
247
|
+
* Zero signals over one Story reads as quiet; over N > 1 it is flagged as a
|
|
248
|
+
* claim, since "telemetry never fired" looks identical to a clean run.
|
|
364
249
|
*
|
|
365
250
|
* @param {number} storyCount
|
|
366
251
|
* @returns {string[]}
|
|
@@ -381,11 +266,7 @@ function renderEmptyRollupLines(storyCount) {
|
|
|
381
266
|
];
|
|
382
267
|
}
|
|
383
268
|
|
|
384
|
-
/**
|
|
385
|
-
* Skip reasons that are a deliberate outcome rather than a broken loop. A
|
|
386
|
-
* roll-up whose every proposal was skipped for one of these filed nothing
|
|
387
|
-
* *on purpose*; anything else is the loop failing quietly.
|
|
388
|
-
*/
|
|
269
|
+
/** Deliberate skips; any other skip reason is the loop failing quietly. */
|
|
389
270
|
const BENIGN_SKIP_REASONS = new Set([
|
|
390
271
|
'already-filed',
|
|
391
272
|
'toggle-disabled',
|
|
@@ -395,8 +276,6 @@ const BENIGN_SKIP_REASONS = new Set([
|
|
|
395
276
|
]);
|
|
396
277
|
|
|
397
278
|
/**
|
|
398
|
-
* Summarize a category corpus for the "name what you saw" lines. Pure.
|
|
399
|
-
*
|
|
400
279
|
* @param {Array<{ category?: string }>} signals
|
|
401
280
|
* @returns {Array<{ category: string, occurrences: number }>}
|
|
402
281
|
*/
|
|
@@ -415,26 +294,14 @@ export function summarizeSignalCategories(signals) {
|
|
|
415
294
|
}
|
|
416
295
|
|
|
417
296
|
/**
|
|
418
|
-
*
|
|
419
|
-
*
|
|
420
|
-
*
|
|
421
|
-
*
|
|
422
|
-
* Two suspect shapes, both of which previously rendered as success:
|
|
423
|
-
*
|
|
424
|
-
* - `zeroProposals` — signals were gathered and **nothing** came out, not
|
|
425
|
-
* even a below-threshold row. That is the third instance of the failure
|
|
426
|
-
* mode Story #4578 fixed for the zero-signal case and Story #4824 for the
|
|
427
|
-
* all-discarded case: an all-empty routed result is silence, and a routing
|
|
428
|
-
* regression is exactly what it looks like.
|
|
429
|
-
* - `unfiledProposals` — proposals cleared the threshold and none were
|
|
430
|
-
* filed for a reason that is not a deliberate one. This is what actually
|
|
431
|
-
* happened in Story #4828: `gh issue create` rejected every call over an
|
|
432
|
-
* absent label, the error landed in a bucket nobody rendered, and the
|
|
433
|
-
* roll-up reported `filed: 0`.
|
|
297
|
+
* Pure, so the epilogue's step result and the comment agree. Suspect shapes:
|
|
298
|
+
* `zeroProposals` (signals in, not even a discarded row out — looks exactly
|
|
299
|
+
* like a routing regression) and `unfiledProposals` (actionable proposals,
|
|
300
|
+
* none filed, for a non-benign reason).
|
|
434
301
|
*
|
|
435
302
|
* @param {object} args
|
|
436
303
|
* @param {number} args.signalCount
|
|
437
|
-
* @param {number} args.proposalCount
|
|
304
|
+
* @param {number} args.proposalCount
|
|
438
305
|
* @param {number} args.discardedCount
|
|
439
306
|
* @param {number} args.filedCount
|
|
440
307
|
* @param {string[]} [args.filingErrors]
|
|
@@ -469,8 +336,6 @@ export function assessRollupOutcome({
|
|
|
469
336
|
}
|
|
470
337
|
|
|
471
338
|
/**
|
|
472
|
-
* Render the "N signals in, zero proposals out" warning (Story #4828).
|
|
473
|
-
*
|
|
474
339
|
* @param {number} signalCount
|
|
475
340
|
* @param {Array<{ category: string, occurrences: number }>} categories
|
|
476
341
|
* @returns {string[]}
|
|
@@ -491,9 +356,6 @@ function renderZeroProposalLines(signalCount, categories) {
|
|
|
491
356
|
}
|
|
492
357
|
|
|
493
358
|
/**
|
|
494
|
-
* Render the "proposals cleared the threshold but none were filed" warning
|
|
495
|
-
* (Story #4828).
|
|
496
|
-
*
|
|
497
359
|
* @param {number} proposalCount
|
|
498
360
|
* @param {string[]} filingErrors
|
|
499
361
|
* @param {string[]} blockingSkipReasons
|
|
@@ -518,18 +380,7 @@ function renderUnfiledProposalLines(
|
|
|
518
380
|
}
|
|
519
381
|
|
|
520
382
|
/**
|
|
521
|
-
*
|
|
522
|
-
*
|
|
523
|
-
* The pre-#4824 row was `` `category` ×N `` and nothing else. That is exactly
|
|
524
|
-
* how a defect firing once per Story stayed invisible for eighteen
|
|
525
|
-
* consecutive Stories: an operator reading "×1" cannot tell a one-off from a
|
|
526
|
-
* systemic defect whose window was too narrow to see it recur. The row now
|
|
527
|
-
* names the emitting tools, the bucket fingerprint, and the number of
|
|
528
|
-
* distinct Stories it spans — the cross-run count the widened recurrence
|
|
529
|
-
* window produces.
|
|
530
|
-
*
|
|
531
|
-
* Every added field is optional so a caller passing a hand-built proposals
|
|
532
|
-
* object (or an older persisted one) still renders.
|
|
383
|
+
* Descriptive fields are optional so hand-built or older proposals render.
|
|
533
384
|
*
|
|
534
385
|
* @param {{ category: string, occurrences: number, tools?: string[], fingerprint?: string, storyCount?: number }} item
|
|
535
386
|
* @returns {string}
|
|
@@ -550,10 +401,6 @@ function renderDiscardedItem(item) {
|
|
|
550
401
|
}
|
|
551
402
|
|
|
552
403
|
/**
|
|
553
|
-
* Normalize the two loosely-typed inputs into the four buckets every section
|
|
554
|
-
* renderer reads. Absorbs the optional-chain / nullish-coalesce cluster that
|
|
555
|
-
* otherwise all lands on `buildFollowUpsCommentBody` (Story #4926).
|
|
556
|
-
*
|
|
557
404
|
* @param {object|null|undefined} proposals
|
|
558
405
|
* @param {object|null|undefined} graduated
|
|
559
406
|
* @returns {{ filed: object[], framework: object[], consumer: object[],
|
|
@@ -571,8 +418,6 @@ function normalizeRollupBuckets(proposals, graduated) {
|
|
|
571
418
|
}
|
|
572
419
|
|
|
573
420
|
/**
|
|
574
|
-
* Render the "**Filed**" section, or nothing when no proposal was filed.
|
|
575
|
-
*
|
|
576
421
|
* @param {object[]} filed
|
|
577
422
|
* @returns {string[]}
|
|
578
423
|
*/
|
|
@@ -589,8 +434,7 @@ function renderFiledSection(filed) {
|
|
|
589
434
|
}
|
|
590
435
|
|
|
591
436
|
/**
|
|
592
|
-
*
|
|
593
|
-
* an operator runs by hand when auto-filing produced nothing.
|
|
437
|
+
* Hand-run command stanzas, shown only when auto-filing produced nothing.
|
|
594
438
|
*
|
|
595
439
|
* @param {object[]} actionable framework + consumer, in that order
|
|
596
440
|
* @param {object[]} filed
|
|
@@ -608,8 +452,6 @@ function renderActionableSection(actionable, filed) {
|
|
|
608
452
|
}
|
|
609
453
|
|
|
610
454
|
/**
|
|
611
|
-
* Render the "**Below threshold (not filed)**" section.
|
|
612
|
-
*
|
|
613
455
|
* @param {object[]} discarded
|
|
614
456
|
* @returns {string[]}
|
|
615
457
|
*/
|
|
@@ -625,10 +467,6 @@ function renderDiscardedSection(discarded) {
|
|
|
625
467
|
}
|
|
626
468
|
|
|
627
469
|
/**
|
|
628
|
-
* Render the all-empty branch. Story #4828 — "no proposals" has two readings,
|
|
629
|
-
* and only one of them is a quiet run. Signals gathered but nothing routed is
|
|
630
|
-
* the third instance of the silence Stories #4578 and #4824 each fixed once.
|
|
631
|
-
*
|
|
632
470
|
* @param {{ empty: boolean, outcome: {zeroProposals: boolean},
|
|
633
471
|
* signalCount: number, categories: object[], storyCount: number }} args
|
|
634
472
|
* @returns {string[]}
|
|
@@ -650,8 +488,7 @@ function renderEmptySection({
|
|
|
650
488
|
}
|
|
651
489
|
|
|
652
490
|
/**
|
|
653
|
-
*
|
|
654
|
-
* above has a field here so a caller never has to regex the body.
|
|
491
|
+
* Machine-readable twin of the prose, so callers never regex the body.
|
|
655
492
|
*
|
|
656
493
|
* @param {object} args
|
|
657
494
|
* @returns {object}
|
|
@@ -669,17 +506,10 @@ function buildRollupPayload({
|
|
|
669
506
|
return {
|
|
670
507
|
storyId,
|
|
671
508
|
storyCount,
|
|
672
|
-
// Story #4828 — the corpus the roll-up actually read. Without it a
|
|
673
|
-
// reader cannot tell "0 proposals because nothing recurred" from
|
|
674
|
-
// "0 proposals because routing broke".
|
|
675
509
|
signalCount,
|
|
676
510
|
categories,
|
|
677
511
|
framework: framework.map((i) => i.category),
|
|
678
512
|
consumer: consumer.map((i) => i.category),
|
|
679
|
-
// Story #4824 — the machine-readable twin of the row above. A bare
|
|
680
|
-
// category list could not distinguish a genuine one-off from a
|
|
681
|
-
// recurrence the window was too narrow to see, so the count, the
|
|
682
|
-
// cross-Story span, and the shape fingerprint ride along.
|
|
683
513
|
discarded: discarded.map((i) => ({
|
|
684
514
|
category: i.category,
|
|
685
515
|
occurrences: i.occurrences,
|
|
@@ -687,12 +517,7 @@ function buildRollupPayload({
|
|
|
687
517
|
fingerprint: i.fingerprint ?? null,
|
|
688
518
|
})),
|
|
689
519
|
filed: filed.map((i) => ({ category: i.category, url: i.url ?? null })),
|
|
690
|
-
// Story #4578 — an empty roll-up over N>1 Stories is a claim worth
|
|
691
|
-
// flagging, not a success. Machine-readable twin of the warning
|
|
692
|
-
// prose so a caller need not regex the body.
|
|
693
520
|
emptyRollupSuspect: storyCount > 1 && empty && signalCount === 0,
|
|
694
|
-
// Story #4828 — the two remaining shapes that used to render as
|
|
695
|
-
// success. Machine-readable twins of the warning prose above.
|
|
696
521
|
zeroProposalSuspect: outcome.zeroProposals,
|
|
697
522
|
unfiledProposalSuspect: outcome.unfiledProposals,
|
|
698
523
|
filingErrors,
|
|
@@ -707,11 +532,8 @@ function buildRollupPayload({
|
|
|
707
532
|
* storyCount?: number,
|
|
708
533
|
* signalCount?: number,
|
|
709
534
|
* categories?: Array<{ category: string, occurrences: number }>,
|
|
710
|
-
* }} args - `storyCount` (default 1)
|
|
711
|
-
*
|
|
712
|
-
* `signalCount` / `categories` (Story #4828) are what the roll-up actually
|
|
713
|
-
* gathered, so a zero-proposal or zero-filed outcome can name its own
|
|
714
|
-
* corpus instead of rendering as a clean run.
|
|
535
|
+
* }} args - `storyCount` (default 1) decides whether an empty result reads
|
|
536
|
+
* as quiet or as a flagged claim.
|
|
715
537
|
* @returns {string}
|
|
716
538
|
*/
|
|
717
539
|
export function buildFollowUpsCommentBody({
|
|
@@ -782,8 +604,6 @@ export function buildFollowUpsCommentBody({
|
|
|
782
604
|
}
|
|
783
605
|
|
|
784
606
|
/**
|
|
785
|
-
* Compose the routed proposals for one Story's friction corpus.
|
|
786
|
-
*
|
|
787
607
|
* @param {number} sid
|
|
788
608
|
* @param {Array<object>} signals
|
|
789
609
|
* @param {object} [config]
|
|
@@ -797,17 +617,11 @@ function composeStoryProposals(sid, signals, config) {
|
|
|
797
617
|
frameworkRepo: repos.frameworkRepo,
|
|
798
618
|
consumerRepo: repos.consumerRepo,
|
|
799
619
|
signals,
|
|
800
|
-
// Derived, not hardcoded `[]` (Story #4649). This is the escape hatch
|
|
801
|
-
// the retired story-scope threshold carve-out was standing in for: a
|
|
802
|
-
// Story still parked at `agent::blocked` files at a single occurrence,
|
|
803
|
-
// while one that blocked and self-resolved nets out entirely.
|
|
804
620
|
unresolvedBlockedEvents: deriveUnresolvedBlockedEvents(signals),
|
|
805
621
|
});
|
|
806
622
|
}
|
|
807
623
|
|
|
808
624
|
/**
|
|
809
|
-
* Hand one Story's routed proposals to the graduator.
|
|
810
|
-
*
|
|
811
625
|
* @param {object} args
|
|
812
626
|
* @returns {Promise<object>}
|
|
813
627
|
*/
|
|
@@ -818,8 +632,6 @@ function fileStoryProposals({ sid, proposals, provider, config, cwd }) {
|
|
|
818
632
|
provider,
|
|
819
633
|
config,
|
|
820
634
|
currentRepo: repos.currentRepo,
|
|
821
|
-
// The resolved bucket object, not a re-split of the slug: routing is
|
|
822
|
-
// decided once in `github/framework-repo.js`.
|
|
823
635
|
frameworkRepo: repos.repos.framework,
|
|
824
636
|
platformRepo: repos.repos.platform,
|
|
825
637
|
routedProposals: proposals,
|
|
@@ -828,18 +640,8 @@ function fileStoryProposals({ sid, proposals, provider, config, cwd }) {
|
|
|
828
640
|
}
|
|
829
641
|
|
|
830
642
|
/**
|
|
831
|
-
*
|
|
832
|
-
* fail because follow-up filing flaked.
|
|
833
|
-
*
|
|
834
|
-
* Story #4543 retired the `captureFollowUpsAfterConfirm` action-gate wrapper
|
|
835
|
-
* (and its `withConfirmFollowUps` sibling) that used to front this function.
|
|
836
|
-
* Re-deriving "did the merge land?" from a confirmation envelope's `action`
|
|
837
|
-
* field was the coupling that made close-and-land — the DEFAULT path — skip
|
|
838
|
-
* capture entirely: the gate only opened on the standalone CLI's `done`, and
|
|
839
|
-
* a belated manual confirm could not backfill because the Story was already
|
|
840
|
-
* `agent::done` (confirm returns `noop`, the gate never opens). The shared
|
|
841
|
-
* land tail (`single-story-close/phases/post-land.js`) now calls this
|
|
842
|
-
* directly, after the merge is already confirmed.
|
|
643
|
+
* Called by the land tail after the merge is confirmed. Never throws — the
|
|
644
|
+
* land must not fail because follow-up filing flaked.
|
|
843
645
|
*
|
|
844
646
|
* @param {object} args
|
|
845
647
|
* @param {number} args.storyId
|
|
@@ -901,10 +703,6 @@ export async function captureStoryFollowUps({
|
|
|
901
703
|
}
|
|
902
704
|
|
|
903
705
|
/**
|
|
904
|
-
* Report a failed capture without failing the close around it — follow-up
|
|
905
|
-
* capture is a reporting step, so a provider or filesystem fault degrades the
|
|
906
|
-
* report and never the land.
|
|
907
|
-
*
|
|
908
706
|
* @param {number} sid
|
|
909
707
|
* @param {unknown} err
|
|
910
708
|
* @param {((tag: string, msg: string) => void)} [progress]
|
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Init routes its full result object to
|
|
6
|
-
* `<tempRoot>/orchestration/story-init-result-<id>.log` through
|
|
7
|
-
* `emitTerseResult`, wrapped in the same `--- STORY INIT RESULT ---` markers
|
|
8
|
-
* the legacy inline dump used. Story #5343 retired the `story-init` ticket
|
|
9
|
-
* comment that duplicated it, which makes this file the durable record of
|
|
10
|
-
* what a run was seeded with — most load-bearingly the `runScopedConfig` pin
|
|
11
|
-
* `run-scoped-config.js` compares against at close.
|
|
12
|
-
*
|
|
13
|
-
* Total and non-throwing: a missing, unreadable or unparseable envelope
|
|
14
|
-
* resolves to `null`, and the caller reports the degrade. Reading it is
|
|
15
|
-
* always best-effort — the temp tree is reapable by design.
|
|
2
|
+
* Read back the init envelope `single-story-init.js` writes — the record of
|
|
3
|
+
* what a run was seeded with, including the `runScopedConfig` pin. Never
|
|
4
|
+
* throws: anything unreadable is `null` (the temp tree is reapable).
|
|
16
5
|
*
|
|
17
6
|
* @module lib/orchestration/story-init-envelope
|
|
18
7
|
*/
|
|
@@ -23,8 +12,6 @@ import path from 'node:path';
|
|
|
23
12
|
import { orchestrationLogDir } from '../config/temp-paths.js';
|
|
24
13
|
|
|
25
14
|
/**
|
|
26
|
-
* Read one Story's init envelope, or `null` when there is none to read.
|
|
27
|
-
*
|
|
28
15
|
* @param {{
|
|
29
16
|
* storyId: number|string,
|
|
30
17
|
* config?: object,
|
|
@@ -38,8 +25,7 @@ function readStoryInitEnvelope({ storyId, config, readFileFn = readFileSync }) {
|
|
|
38
25
|
`story-init-result-${storyId}.log`,
|
|
39
26
|
);
|
|
40
27
|
try {
|
|
41
|
-
//
|
|
42
|
-
// outermost brace span rather than parsing the whole file.
|
|
28
|
+
// Markers bracket the JSON: take the outermost brace span.
|
|
43
29
|
const fence = /\{[\s\S]*\}/.exec(readFileFn(file, 'utf8'));
|
|
44
30
|
const payload = fence ? JSON.parse(fence[0]) : null;
|
|
45
31
|
return payload && typeof payload === 'object' ? payload : null;
|
|
@@ -49,11 +35,6 @@ function readStoryInitEnvelope({ storyId, config, readFileFn = readFileSync }) {
|
|
|
49
35
|
}
|
|
50
36
|
|
|
51
37
|
/**
|
|
52
|
-
* The `runScopedConfig` pin off one Story's init envelope, or `null` when the
|
|
53
|
-
* envelope is absent or carries none. The write half is
|
|
54
|
-
* `run-scoped-config.js#pinRunScopedConfig`, which `single-story-init.js`
|
|
55
|
-
* records on the envelope this reads back.
|
|
56
|
-
*
|
|
57
38
|
* @param {{
|
|
58
39
|
* storyId: number|string,
|
|
59
40
|
* config?: object,
|
|
@@ -33,12 +33,8 @@ export async function handleRemoteVerificationFailure({
|
|
|
33
33
|
`[single-story-init] failed to post remote-verification friction: ${err?.message ?? err}`,
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
// Story is still agent::ready (To Do) when the remote probe fails, so
|
|
39
|
-
// a direct label write leaves the board reading To Do for a blocked
|
|
40
|
-
// Story. single-story-init.js's own comment explains exactly why this
|
|
41
|
-
// must not bypass the mutator.
|
|
36
|
+
// Use the canonical mutator: a direct label write skips the Projects v2
|
|
37
|
+
// column sync and leaves the board reading To Do for a blocked Story.
|
|
42
38
|
try {
|
|
43
39
|
await transitionTicketState(provider, storyId, STATE_LABELS.BLOCKED, {});
|
|
44
40
|
} catch (err) {
|
|
@@ -1,30 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Houses the transitive-predecessor closure over the story-level
|
|
5
|
-
* `depends_on` graph. Extracted from `./ticket-validator-conflicts.js`
|
|
6
|
-
* under Story #3995 to break the `file-assumptions.js ↔
|
|
7
|
-
* ticket-validator-conflicts.js` import cycle: both the conflict gate and
|
|
8
|
-
* the wave-aware file-assumption gate need this graph traversal, so
|
|
9
|
-
* pulling it down into a dependency-free leaf lets both import it from
|
|
10
|
-
* below rather than from each other.
|
|
11
|
-
*
|
|
12
|
-
* This is a pure graph utility — no I/O, no policy. Its behaviour is
|
|
13
|
-
* unchanged from the original `computeStoryReachability`.
|
|
2
|
+
* Dependency-free leaf (breaks a conflicts ↔ file-assumptions import cycle).
|
|
14
3
|
*/
|
|
15
4
|
|
|
16
5
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* set contains every story reachable by following `depends_on` edges from
|
|
20
|
-
* the key (i.e. every story the key transitively depends on).
|
|
21
|
-
*
|
|
22
|
-
* BFS, no cycles assumed — callers must run `assertAcyclic` first.
|
|
23
|
-
*
|
|
24
|
-
* Exported so both the conflict gate (`ticket-validator-conflicts.js`)
|
|
25
|
-
* and the wave-aware file-assumption gate (`file-assumptions.js`) can
|
|
26
|
-
* reuse the same transitive-predecessor walk rather than re-deriving the
|
|
27
|
-
* `depends_on` closure.
|
|
6
|
+
* `Map<storySlug, Set<storySlug>>` of every Story each key transitively
|
|
7
|
+
* depends on. Assumes an acyclic graph — run `assertAcyclic` first.
|
|
28
8
|
*/
|
|
29
9
|
export function computeStoryReachability(stories) {
|
|
30
10
|
const reach = new Map();
|