mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,15 +1,14 @@
|
|
|
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
|
*/
|
|
11
7
|
|
|
12
|
-
import {
|
|
8
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
|
|
11
|
+
import { orchestrationLogDir, signalsFile } from '../config/temp-paths.js';
|
|
13
12
|
import { graduateRetroProposals } from '../feedback-loop/retro-proposals-graduator.js';
|
|
14
13
|
import {
|
|
15
14
|
DEFAULT_FRAMEWORK_REPO,
|
|
@@ -30,42 +29,76 @@ import { upsertStructuredComment } from './ticketing.js';
|
|
|
30
29
|
|
|
31
30
|
const FOLLOW_UPS_COMMENT_TYPE = 'follow-ups';
|
|
32
31
|
|
|
33
|
-
/**
|
|
34
|
-
|
|
32
|
+
/**
|
|
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.
|
|
36
|
+
*
|
|
37
|
+
* @param {object} args
|
|
38
|
+
* @param {number} args.anchorId
|
|
39
|
+
* @param {string} args.body
|
|
40
|
+
* @param {number} args.filedCount
|
|
41
|
+
* @param {object} args.provider
|
|
42
|
+
* @param {object} [args.config]
|
|
43
|
+
* @returns {Promise<{ posted: boolean, artifactPath: string|null, summary: string }>}
|
|
44
|
+
*/
|
|
45
|
+
export async function publishFollowUpsRollup({
|
|
46
|
+
anchorId,
|
|
47
|
+
body,
|
|
48
|
+
filedCount,
|
|
49
|
+
provider,
|
|
50
|
+
config,
|
|
51
|
+
}) {
|
|
52
|
+
return filedCount > 0
|
|
53
|
+
? postFollowUpsComment({ anchorId, body, filedCount, provider })
|
|
54
|
+
: parkFollowUpsRollup({ anchorId, body, config });
|
|
55
|
+
}
|
|
35
56
|
|
|
36
|
-
/**
|
|
37
|
-
|
|
57
|
+
/**
|
|
58
|
+
* @param {object} args
|
|
59
|
+
* @returns {Promise<{ posted: true, artifactPath: null, summary: string }>}
|
|
60
|
+
*/
|
|
61
|
+
async function postFollowUpsComment({ anchorId, body, filedCount, provider }) {
|
|
62
|
+
await upsertStructuredComment(
|
|
63
|
+
provider,
|
|
64
|
+
anchorId,
|
|
65
|
+
FOLLOW_UPS_COMMENT_TYPE,
|
|
66
|
+
body,
|
|
67
|
+
);
|
|
68
|
+
return {
|
|
69
|
+
posted: true,
|
|
70
|
+
artifactPath: null,
|
|
71
|
+
summary: `Captured follow-ups for #${anchorId} (filed=${filedCount}).`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
38
74
|
|
|
39
75
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* Defaults to 30 rather than to "unbounded": the widened cross-run window
|
|
43
|
-
* exists to let a once-per-Story defect reach the ≥ 2 threshold, and 30 days is
|
|
44
|
-
* long enough for that while short enough that a defect fixed last month stops
|
|
45
|
-
* re-routing. An absent, non-integer, or sub-1 value takes the default — the
|
|
46
|
-
* runtime AJV in `config-settings-schema-delivery.js` rejects those at load, so
|
|
47
|
-
* reaching this fallback means the config never went through the validator.
|
|
48
|
-
*
|
|
49
|
-
* @param {object} [config]
|
|
50
|
-
* @returns {number}
|
|
76
|
+
* @param {object} args
|
|
77
|
+
* @returns {Promise<{ posted: false, artifactPath: string, summary: string }>}
|
|
51
78
|
*/
|
|
52
|
-
function
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
79
|
+
async function parkFollowUpsRollup({ anchorId, body, config }) {
|
|
80
|
+
const dir = orchestrationLogDir(config);
|
|
81
|
+
const artifactPath = path.join(dir, `follow-ups-rollup-${anchorId}.md`);
|
|
82
|
+
await mkdir(dir, { recursive: true });
|
|
83
|
+
await writeFile(artifactPath, `${body}\n`, 'utf8');
|
|
84
|
+
return {
|
|
85
|
+
posted: false,
|
|
86
|
+
artifactPath,
|
|
87
|
+
summary: `No follow-ups filed for #${anchorId} — roll-up kept at ${artifactPath}.`,
|
|
88
|
+
};
|
|
58
89
|
}
|
|
59
90
|
|
|
91
|
+
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
92
|
+
|
|
60
93
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
*
|
|
68
|
-
*
|
|
94
|
+
* Long enough for a once-per-Story defect to recur, short enough that a
|
|
95
|
+
* defect fixed last month stops re-routing.
|
|
96
|
+
*/
|
|
97
|
+
const FRICTION_WINDOW_DAYS = 30;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Slug-shaped adapter over `resolveOwnershipRepos`. `platform` has no default:
|
|
101
|
+
* unconfigured stays `null` so platform work is never filed somewhere plausible.
|
|
69
102
|
*
|
|
70
103
|
* @param {object} [config]
|
|
71
104
|
* @returns {{ frameworkRepo: string, consumerRepo: string, platform: (string|null), currentRepo: { owner: string, repo: string }, repos: { consumer: object|null, framework: object|null, platform: object|null } }}
|
|
@@ -73,9 +106,7 @@ function resolveFrictionWindowDays(config) {
|
|
|
73
106
|
export function resolveFollowUpRepos(config) {
|
|
74
107
|
const repos = resolveOwnershipRepos(config);
|
|
75
108
|
const consumerRepo = formatRepoSlug(repos.consumer) ?? DEFAULT_FRAMEWORK_REPO;
|
|
76
|
-
//
|
|
77
|
-
// to the mirror constant), and both slugs above are well-formed by
|
|
78
|
-
// 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.
|
|
79
110
|
const frameworkRepo = formatRepoSlug(repos.framework);
|
|
80
111
|
const [cOwner, cRepo] = consumerRepo.split('/');
|
|
81
112
|
const currentRepo = { owner: cOwner, repo: cRepo };
|
|
@@ -93,19 +124,8 @@ export function resolveFollowUpRepos(config) {
|
|
|
93
124
|
}
|
|
94
125
|
|
|
95
126
|
/**
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
* **`storyId` and `details` are load-bearing (Story #4649).** This function
|
|
99
|
-
* used to flatten every record to `{ category, source }`, which silently
|
|
100
|
-
* dropped exactly the two fields `netOutRecoveredIncidents` keys on — so the
|
|
101
|
-
* Story #4622 recovery-netting could never fire on real data, and every
|
|
102
|
-
* transient friction event survived to be auto-filed. The composer's unit
|
|
103
|
-
* tests passed throughout, because they fed it synthetic signals carrying
|
|
104
|
-
* both fields that no production path ever produced. Preserve them.
|
|
105
|
-
*
|
|
106
|
-
* The record's own `storyId` is preferred over the argument so a stream that
|
|
107
|
-
* carries foreign rows attributes each one correctly; the argument is the
|
|
108
|
-
* 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.
|
|
109
129
|
*
|
|
110
130
|
* @param {number} storyId
|
|
111
131
|
* @param {object} [config]
|
|
@@ -126,13 +146,7 @@ export async function gatherStoryFrictionSignals(storyId, config) {
|
|
|
126
146
|
}
|
|
127
147
|
|
|
128
148
|
/**
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
* `eventId` is minted by every producer (`diagnose-friction.js` and
|
|
132
|
-
* `runtime-friction.js` both `crypto.randomUUID()` it), so it is the primary
|
|
133
|
-
* key. A row predating the field falls back to its physical `file:line`,
|
|
134
|
-
* which is equally stable — the same row read through two passes over the
|
|
135
|
-
* same tree yields the same coordinates.
|
|
149
|
+
* De-dup key: the producer-minted `eventId`, else the stable `file:line`.
|
|
136
150
|
*
|
|
137
151
|
* @param {unknown} parsed
|
|
138
152
|
* @param {string} file
|
|
@@ -153,55 +167,19 @@ function signalIdentity(parsed, file, lineNumber) {
|
|
|
153
167
|
}
|
|
154
168
|
|
|
155
169
|
/**
|
|
156
|
-
* Gather
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
* So the gather reduces over every `signals.ndjson` still present under the
|
|
167
|
-
* configured temp root: `<tempRoot>/standalone/stories/story-<sid>/` and
|
|
168
|
-
* `<tempRoot>/run-<eid>/stories/story-<sid>/`. Temp-tree auto-purge
|
|
169
|
-
* shortening that window is acceptable — a short window under-counts, and
|
|
170
|
-
* therefore fails toward *not* filing, which is the safe direction.
|
|
171
|
-
*
|
|
172
|
-
* The run's own Stories are still gathered explicitly first. The discovery
|
|
173
|
-
* walk resolves through the identical path helpers, so it is provably a
|
|
174
|
-
* superset; the explicit pass makes "never fewer signals than before" a
|
|
175
|
-
* property of the code rather than of an argument about path resolution.
|
|
176
|
-
* {@link signalIdentity} de-duplicates the overlap, so one event can never be
|
|
177
|
-
* counted twice and inflate a singleton into a fabricated recurrence.
|
|
178
|
-
*
|
|
179
|
-
* Homed beside {@link gatherStoryFrictionSignals} on purpose: the two used to
|
|
180
|
-
* be independent copies of the same loop in two modules, and they drifted in
|
|
181
|
-
* exactly the way that made the recovery-netting unreachable (Story #4649).
|
|
182
|
-
* One reader, one normalizer, no second place to forget a field.
|
|
183
|
-
*
|
|
184
|
-
* Unusable ids are skipped rather than throwing — a roll-up must not fail the
|
|
185
|
-
* epilogue over one malformed entry.
|
|
186
|
-
*
|
|
187
|
-
* **Bounded by age, not by run (Story #4850).** Widening the window to the
|
|
188
|
-
* whole surviving temp tree also made it unbounded in *time*: a defect fixed
|
|
189
|
-
* weeks ago kept its occurrences on disk and kept re-routing forever, burying
|
|
190
|
-
* a genuine new regression underneath a historical ledger. Rows older than
|
|
191
|
-
* `delivery.feedbackLoop.frictionWindowDays` (default 30) are excluded, as are
|
|
192
|
-
* rows carrying no `ts` a `Date` can read — excluding an undateable row is the
|
|
193
|
-
* direction that fails toward under-counting, and under-counting fails toward
|
|
194
|
-
* not filing. Both exclusions are **counted and reported**, so a caller can
|
|
195
|
-
* tell a bounded window from an unbounded one without reading prose.
|
|
196
|
-
*
|
|
197
|
-
* A recovery marker is written after the incident it cancels, so a marker can
|
|
198
|
-
* never fall outside a window its incident is inside — the netting cannot be
|
|
199
|
-
* 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.
|
|
200
179
|
*
|
|
201
180
|
* @param {Array<number|string>} storyIds The run's own Stories.
|
|
202
181
|
* @param {object} [config]
|
|
203
|
-
* @param {{ now?: number }} [clock]
|
|
204
|
-
* the window without touching the system clock.
|
|
182
|
+
* @param {{ now?: number }} [clock]
|
|
205
183
|
* @returns {Promise<{
|
|
206
184
|
* signals: Array<{ category: string, source: 'framework'|'consumer', storyId: number, ts: string|null, details: object }>,
|
|
207
185
|
* window: { days: number, cutoff: string, excludedStale: number, excludedUnparseable: number },
|
|
@@ -212,7 +190,7 @@ export async function gatherRunFrictionSignals(
|
|
|
212
190
|
config,
|
|
213
191
|
{ now = Date.now() } = {},
|
|
214
192
|
) {
|
|
215
|
-
const days =
|
|
193
|
+
const days = FRICTION_WINDOW_DAYS;
|
|
216
194
|
const cutoffMs = now - days * MS_PER_DAY;
|
|
217
195
|
const signals = [];
|
|
218
196
|
const seen = new Set();
|
|
@@ -266,28 +244,8 @@ export async function gatherRunFrictionSignals(
|
|
|
266
244
|
}
|
|
267
245
|
|
|
268
246
|
/**
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
* Story #4578 — an empty roll-up over a multi-Story run must NOT read as
|
|
272
|
-
* success. The pre-#4578 text ("No friction signals — nothing to follow up")
|
|
273
|
-
* was *truthful* about the stream and *false* about the run: a 7-Story
|
|
274
|
-
* delivery containing a mid-run git outage, a parked worker, and a
|
|
275
|
-
* four-round acceptance critic rendered byte-identically to a genuinely
|
|
276
|
-
* clean run. An operator cannot tell "nothing went wrong" from "the
|
|
277
|
-
* telemetry never fired", and the second is likeliest exactly when the run
|
|
278
|
-
* went worst.
|
|
279
|
-
*
|
|
280
|
-
* So the line is a function of `storyCount`:
|
|
281
|
-
* - `storyCount <= 1` → the honest, quiet reading is retained. A single
|
|
282
|
-
* Story that emitted nothing plausibly *was* clean, and crying wolf on
|
|
283
|
-
* every clean Story is how a warning channel gets tuned out.
|
|
284
|
-
* - `storyCount > 1` → zero signals across N Stories is a **claim**, and
|
|
285
|
-
* the surrounding text says so and names the two readings, rather than
|
|
286
|
-
* asserting the flattering one.
|
|
287
|
-
*
|
|
288
|
-
* This mirrors the sibling precedent in `run-epilogue.js`'s
|
|
289
|
-
* `renderDiffLines`, which refuses to let an unresolvable base diff render
|
|
290
|
-
* 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.
|
|
291
249
|
*
|
|
292
250
|
* @param {number} storyCount
|
|
293
251
|
* @returns {string[]}
|
|
@@ -308,11 +266,7 @@ function renderEmptyRollupLines(storyCount) {
|
|
|
308
266
|
];
|
|
309
267
|
}
|
|
310
268
|
|
|
311
|
-
/**
|
|
312
|
-
* Skip reasons that are a deliberate outcome rather than a broken loop. A
|
|
313
|
-
* roll-up whose every proposal was skipped for one of these filed nothing
|
|
314
|
-
* *on purpose*; anything else is the loop failing quietly.
|
|
315
|
-
*/
|
|
269
|
+
/** Deliberate skips; any other skip reason is the loop failing quietly. */
|
|
316
270
|
const BENIGN_SKIP_REASONS = new Set([
|
|
317
271
|
'already-filed',
|
|
318
272
|
'toggle-disabled',
|
|
@@ -322,8 +276,6 @@ const BENIGN_SKIP_REASONS = new Set([
|
|
|
322
276
|
]);
|
|
323
277
|
|
|
324
278
|
/**
|
|
325
|
-
* Summarize a category corpus for the "name what you saw" lines. Pure.
|
|
326
|
-
*
|
|
327
279
|
* @param {Array<{ category?: string }>} signals
|
|
328
280
|
* @returns {Array<{ category: string, occurrences: number }>}
|
|
329
281
|
*/
|
|
@@ -342,26 +294,14 @@ export function summarizeSignalCategories(signals) {
|
|
|
342
294
|
}
|
|
343
295
|
|
|
344
296
|
/**
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
* Two suspect shapes, both of which previously rendered as success:
|
|
350
|
-
*
|
|
351
|
-
* - `zeroProposals` — signals were gathered and **nothing** came out, not
|
|
352
|
-
* even a below-threshold row. That is the third instance of the failure
|
|
353
|
-
* mode Story #4578 fixed for the zero-signal case and Story #4824 for the
|
|
354
|
-
* all-discarded case: an all-empty routed result is silence, and a routing
|
|
355
|
-
* regression is exactly what it looks like.
|
|
356
|
-
* - `unfiledProposals` — proposals cleared the threshold and none were
|
|
357
|
-
* filed for a reason that is not a deliberate one. This is what actually
|
|
358
|
-
* happened in Story #4828: `gh issue create` rejected every call over an
|
|
359
|
-
* absent label, the error landed in a bucket nobody rendered, and the
|
|
360
|
-
* 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).
|
|
361
301
|
*
|
|
362
302
|
* @param {object} args
|
|
363
303
|
* @param {number} args.signalCount
|
|
364
|
-
* @param {number} args.proposalCount
|
|
304
|
+
* @param {number} args.proposalCount
|
|
365
305
|
* @param {number} args.discardedCount
|
|
366
306
|
* @param {number} args.filedCount
|
|
367
307
|
* @param {string[]} [args.filingErrors]
|
|
@@ -396,8 +336,6 @@ export function assessRollupOutcome({
|
|
|
396
336
|
}
|
|
397
337
|
|
|
398
338
|
/**
|
|
399
|
-
* Render the "N signals in, zero proposals out" warning (Story #4828).
|
|
400
|
-
*
|
|
401
339
|
* @param {number} signalCount
|
|
402
340
|
* @param {Array<{ category: string, occurrences: number }>} categories
|
|
403
341
|
* @returns {string[]}
|
|
@@ -418,9 +356,6 @@ function renderZeroProposalLines(signalCount, categories) {
|
|
|
418
356
|
}
|
|
419
357
|
|
|
420
358
|
/**
|
|
421
|
-
* Render the "proposals cleared the threshold but none were filed" warning
|
|
422
|
-
* (Story #4828).
|
|
423
|
-
*
|
|
424
359
|
* @param {number} proposalCount
|
|
425
360
|
* @param {string[]} filingErrors
|
|
426
361
|
* @param {string[]} blockingSkipReasons
|
|
@@ -445,18 +380,7 @@ function renderUnfiledProposalLines(
|
|
|
445
380
|
}
|
|
446
381
|
|
|
447
382
|
/**
|
|
448
|
-
*
|
|
449
|
-
*
|
|
450
|
-
* The pre-#4824 row was `` `category` ×N `` and nothing else. That is exactly
|
|
451
|
-
* how a defect firing once per Story stayed invisible for eighteen
|
|
452
|
-
* consecutive Stories: an operator reading "×1" cannot tell a one-off from a
|
|
453
|
-
* systemic defect whose window was too narrow to see it recur. The row now
|
|
454
|
-
* names the emitting tools, the bucket fingerprint, and the number of
|
|
455
|
-
* distinct Stories it spans — the cross-run count the widened recurrence
|
|
456
|
-
* window produces.
|
|
457
|
-
*
|
|
458
|
-
* Every added field is optional so a caller passing a hand-built proposals
|
|
459
|
-
* object (or an older persisted one) still renders.
|
|
383
|
+
* Descriptive fields are optional so hand-built or older proposals render.
|
|
460
384
|
*
|
|
461
385
|
* @param {{ category: string, occurrences: number, tools?: string[], fingerprint?: string, storyCount?: number }} item
|
|
462
386
|
* @returns {string}
|
|
@@ -477,10 +401,6 @@ function renderDiscardedItem(item) {
|
|
|
477
401
|
}
|
|
478
402
|
|
|
479
403
|
/**
|
|
480
|
-
* Normalize the two loosely-typed inputs into the four buckets every section
|
|
481
|
-
* renderer reads. Absorbs the optional-chain / nullish-coalesce cluster that
|
|
482
|
-
* otherwise all lands on `buildFollowUpsCommentBody` (Story #4926).
|
|
483
|
-
*
|
|
484
404
|
* @param {object|null|undefined} proposals
|
|
485
405
|
* @param {object|null|undefined} graduated
|
|
486
406
|
* @returns {{ filed: object[], framework: object[], consumer: object[],
|
|
@@ -498,8 +418,6 @@ function normalizeRollupBuckets(proposals, graduated) {
|
|
|
498
418
|
}
|
|
499
419
|
|
|
500
420
|
/**
|
|
501
|
-
* Render the "**Filed**" section, or nothing when no proposal was filed.
|
|
502
|
-
*
|
|
503
421
|
* @param {object[]} filed
|
|
504
422
|
* @returns {string[]}
|
|
505
423
|
*/
|
|
@@ -516,8 +434,7 @@ function renderFiledSection(filed) {
|
|
|
516
434
|
}
|
|
517
435
|
|
|
518
436
|
/**
|
|
519
|
-
*
|
|
520
|
-
* an operator runs by hand when auto-filing produced nothing.
|
|
437
|
+
* Hand-run command stanzas, shown only when auto-filing produced nothing.
|
|
521
438
|
*
|
|
522
439
|
* @param {object[]} actionable framework + consumer, in that order
|
|
523
440
|
* @param {object[]} filed
|
|
@@ -535,8 +452,6 @@ function renderActionableSection(actionable, filed) {
|
|
|
535
452
|
}
|
|
536
453
|
|
|
537
454
|
/**
|
|
538
|
-
* Render the "**Below threshold (not filed)**" section.
|
|
539
|
-
*
|
|
540
455
|
* @param {object[]} discarded
|
|
541
456
|
* @returns {string[]}
|
|
542
457
|
*/
|
|
@@ -552,10 +467,6 @@ function renderDiscardedSection(discarded) {
|
|
|
552
467
|
}
|
|
553
468
|
|
|
554
469
|
/**
|
|
555
|
-
* Render the all-empty branch. Story #4828 — "no proposals" has two readings,
|
|
556
|
-
* and only one of them is a quiet run. Signals gathered but nothing routed is
|
|
557
|
-
* the third instance of the silence Stories #4578 and #4824 each fixed once.
|
|
558
|
-
*
|
|
559
470
|
* @param {{ empty: boolean, outcome: {zeroProposals: boolean},
|
|
560
471
|
* signalCount: number, categories: object[], storyCount: number }} args
|
|
561
472
|
* @returns {string[]}
|
|
@@ -577,8 +488,7 @@ function renderEmptySection({
|
|
|
577
488
|
}
|
|
578
489
|
|
|
579
490
|
/**
|
|
580
|
-
*
|
|
581
|
-
* 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.
|
|
582
492
|
*
|
|
583
493
|
* @param {object} args
|
|
584
494
|
* @returns {object}
|
|
@@ -596,17 +506,10 @@ function buildRollupPayload({
|
|
|
596
506
|
return {
|
|
597
507
|
storyId,
|
|
598
508
|
storyCount,
|
|
599
|
-
// Story #4828 — the corpus the roll-up actually read. Without it a
|
|
600
|
-
// reader cannot tell "0 proposals because nothing recurred" from
|
|
601
|
-
// "0 proposals because routing broke".
|
|
602
509
|
signalCount,
|
|
603
510
|
categories,
|
|
604
511
|
framework: framework.map((i) => i.category),
|
|
605
512
|
consumer: consumer.map((i) => i.category),
|
|
606
|
-
// Story #4824 — the machine-readable twin of the row above. A bare
|
|
607
|
-
// category list could not distinguish a genuine one-off from a
|
|
608
|
-
// recurrence the window was too narrow to see, so the count, the
|
|
609
|
-
// cross-Story span, and the shape fingerprint ride along.
|
|
610
513
|
discarded: discarded.map((i) => ({
|
|
611
514
|
category: i.category,
|
|
612
515
|
occurrences: i.occurrences,
|
|
@@ -614,12 +517,7 @@ function buildRollupPayload({
|
|
|
614
517
|
fingerprint: i.fingerprint ?? null,
|
|
615
518
|
})),
|
|
616
519
|
filed: filed.map((i) => ({ category: i.category, url: i.url ?? null })),
|
|
617
|
-
// Story #4578 — an empty roll-up over N>1 Stories is a claim worth
|
|
618
|
-
// flagging, not a success. Machine-readable twin of the warning
|
|
619
|
-
// prose so a caller need not regex the body.
|
|
620
520
|
emptyRollupSuspect: storyCount > 1 && empty && signalCount === 0,
|
|
621
|
-
// Story #4828 — the two remaining shapes that used to render as
|
|
622
|
-
// success. Machine-readable twins of the warning prose above.
|
|
623
521
|
zeroProposalSuspect: outcome.zeroProposals,
|
|
624
522
|
unfiledProposalSuspect: outcome.unfiledProposals,
|
|
625
523
|
filingErrors,
|
|
@@ -634,11 +532,8 @@ function buildRollupPayload({
|
|
|
634
532
|
* storyCount?: number,
|
|
635
533
|
* signalCount?: number,
|
|
636
534
|
* categories?: Array<{ category: string, occurrences: number }>,
|
|
637
|
-
* }} args - `storyCount` (default 1)
|
|
638
|
-
*
|
|
639
|
-
* `signalCount` / `categories` (Story #4828) are what the roll-up actually
|
|
640
|
-
* gathered, so a zero-proposal or zero-filed outcome can name its own
|
|
641
|
-
* 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.
|
|
642
537
|
* @returns {string}
|
|
643
538
|
*/
|
|
644
539
|
export function buildFollowUpsCommentBody({
|
|
@@ -709,18 +604,44 @@ export function buildFollowUpsCommentBody({
|
|
|
709
604
|
}
|
|
710
605
|
|
|
711
606
|
/**
|
|
712
|
-
*
|
|
713
|
-
*
|
|
714
|
-
*
|
|
715
|
-
*
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
607
|
+
* @param {number} sid
|
|
608
|
+
* @param {Array<object>} signals
|
|
609
|
+
* @param {object} [config]
|
|
610
|
+
* @returns {object}
|
|
611
|
+
*/
|
|
612
|
+
function composeStoryProposals(sid, signals, config) {
|
|
613
|
+
const repos = resolveFollowUpRepos(config);
|
|
614
|
+
return composeRoutedProposals({
|
|
615
|
+
anchorId: sid,
|
|
616
|
+
anchorKind: 'story',
|
|
617
|
+
frameworkRepo: repos.frameworkRepo,
|
|
618
|
+
consumerRepo: repos.consumerRepo,
|
|
619
|
+
signals,
|
|
620
|
+
unresolvedBlockedEvents: deriveUnresolvedBlockedEvents(signals),
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* @param {object} args
|
|
626
|
+
* @returns {Promise<object>}
|
|
627
|
+
*/
|
|
628
|
+
function fileStoryProposals({ sid, proposals, provider, config, cwd }) {
|
|
629
|
+
const repos = resolveFollowUpRepos(config);
|
|
630
|
+
return graduateRetroProposals({
|
|
631
|
+
epicId: sid,
|
|
632
|
+
provider,
|
|
633
|
+
config,
|
|
634
|
+
currentRepo: repos.currentRepo,
|
|
635
|
+
frameworkRepo: repos.repos.framework,
|
|
636
|
+
platformRepo: repos.repos.platform,
|
|
637
|
+
routedProposals: proposals,
|
|
638
|
+
cwd,
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
/**
|
|
643
|
+
* Called by the land tail after the merge is confirmed. Never throws — the
|
|
644
|
+
* land must not fail because follow-up filing flaked.
|
|
724
645
|
*
|
|
725
646
|
* @param {object} args
|
|
726
647
|
* @param {number} args.storyId
|
|
@@ -743,29 +664,12 @@ export async function captureStoryFollowUps({
|
|
|
743
664
|
}
|
|
744
665
|
try {
|
|
745
666
|
const signals = await gatherStoryFrictionSignals(sid, config);
|
|
746
|
-
const
|
|
747
|
-
const
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
frameworkRepo: repos.frameworkRepo,
|
|
751
|
-
consumerRepo: repos.consumerRepo,
|
|
752
|
-
signals,
|
|
753
|
-
// Derived, not hardcoded `[]` (Story #4649). This is the escape hatch
|
|
754
|
-
// the retired story-scope threshold carve-out was standing in for: a
|
|
755
|
-
// Story still parked at `agent::blocked` files at a single occurrence,
|
|
756
|
-
// while one that blocked and self-resolved nets out entirely.
|
|
757
|
-
unresolvedBlockedEvents: deriveUnresolvedBlockedEvents(signals),
|
|
758
|
-
});
|
|
759
|
-
const graduated = await graduateRetroProposals({
|
|
760
|
-
epicId: sid,
|
|
667
|
+
const proposals = composeStoryProposals(sid, signals, config);
|
|
668
|
+
const graduated = await fileStoryProposals({
|
|
669
|
+
sid,
|
|
670
|
+
proposals,
|
|
761
671
|
provider,
|
|
762
672
|
config,
|
|
763
|
-
currentRepo: repos.currentRepo,
|
|
764
|
-
// The resolved bucket object, not a re-split of the slug: routing is
|
|
765
|
-
// decided once in `github/framework-repo.js`.
|
|
766
|
-
frameworkRepo: repos.repos.framework,
|
|
767
|
-
platformRepo: repos.repos.platform,
|
|
768
|
-
routedProposals: proposals,
|
|
769
673
|
cwd,
|
|
770
674
|
});
|
|
771
675
|
const body = buildFollowUpsCommentBody({
|
|
@@ -775,30 +679,41 @@ export async function captureStoryFollowUps({
|
|
|
775
679
|
signalCount: signals.length,
|
|
776
680
|
categories: summarizeSignalCategories(signals),
|
|
777
681
|
});
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
682
|
+
const filedCount = graduated.filed?.length ?? 0;
|
|
683
|
+
const published = await publishFollowUpsRollup({
|
|
684
|
+
anchorId: sid,
|
|
685
|
+
body,
|
|
686
|
+
filedCount,
|
|
687
|
+
provider,
|
|
688
|
+
config,
|
|
689
|
+
});
|
|
690
|
+
progress?.('FOLLOW-UPS', published.summary);
|
|
783
691
|
return {
|
|
784
692
|
ok: true,
|
|
785
693
|
storyId: sid,
|
|
786
694
|
proposals,
|
|
787
695
|
graduated,
|
|
788
696
|
signalCount: signals.length,
|
|
697
|
+
commentPosted: published.posted,
|
|
698
|
+
artifactPath: published.artifactPath,
|
|
789
699
|
};
|
|
790
700
|
} catch (err) {
|
|
791
|
-
|
|
792
|
-
`[story-follow-ups] capture failed for #${sid}: ${err?.message ?? err}`,
|
|
793
|
-
);
|
|
794
|
-
progress?.(
|
|
795
|
-
'FOLLOW-UPS',
|
|
796
|
-
`⚠️ Follow-up capture failed (close continues): ${err?.message ?? err}`,
|
|
797
|
-
);
|
|
798
|
-
return {
|
|
799
|
-
ok: false,
|
|
800
|
-
reason: 'capture-failed',
|
|
801
|
-
error: String(err?.message ?? err),
|
|
802
|
-
};
|
|
701
|
+
return reportCaptureFailure(sid, err, progress);
|
|
803
702
|
}
|
|
804
703
|
}
|
|
704
|
+
|
|
705
|
+
/**
|
|
706
|
+
* @param {number} sid
|
|
707
|
+
* @param {unknown} err
|
|
708
|
+
* @param {((tag: string, msg: string) => void)} [progress]
|
|
709
|
+
* @returns {{ ok: false, reason: string, error: string }}
|
|
710
|
+
*/
|
|
711
|
+
function reportCaptureFailure(sid, err, progress) {
|
|
712
|
+
const detail = String(err?.message ?? err);
|
|
713
|
+
Logger.warn(`[story-follow-ups] capture failed for #${sid}: ${detail}`);
|
|
714
|
+
progress?.(
|
|
715
|
+
'FOLLOW-UPS',
|
|
716
|
+
`⚠️ Follow-up capture failed (close continues): ${detail}`,
|
|
717
|
+
);
|
|
718
|
+
return { ok: false, reason: 'capture-failed', error: detail };
|
|
719
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
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).
|
|
5
|
+
*
|
|
6
|
+
* @module lib/orchestration/story-init-envelope
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFileSync } from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
|
|
12
|
+
import { orchestrationLogDir } from '../config/temp-paths.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {{
|
|
16
|
+
* storyId: number|string,
|
|
17
|
+
* config?: object,
|
|
18
|
+
* readFileFn?: typeof readFileSync,
|
|
19
|
+
* }} args
|
|
20
|
+
* @returns {object|null} the parsed init result, or `null`.
|
|
21
|
+
*/
|
|
22
|
+
function readStoryInitEnvelope({ storyId, config, readFileFn = readFileSync }) {
|
|
23
|
+
const file = path.join(
|
|
24
|
+
orchestrationLogDir(config),
|
|
25
|
+
`story-init-result-${storyId}.log`,
|
|
26
|
+
);
|
|
27
|
+
try {
|
|
28
|
+
// Markers bracket the JSON: take the outermost brace span.
|
|
29
|
+
const fence = /\{[\s\S]*\}/.exec(readFileFn(file, 'utf8'));
|
|
30
|
+
const payload = fence ? JSON.parse(fence[0]) : null;
|
|
31
|
+
return payload && typeof payload === 'object' ? payload : null;
|
|
32
|
+
} catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param {{
|
|
39
|
+
* storyId: number|string,
|
|
40
|
+
* config?: object,
|
|
41
|
+
* readEnvelopeFn?: typeof readStoryInitEnvelope,
|
|
42
|
+
* }} args
|
|
43
|
+
* @returns {Record<string, unknown>|null}
|
|
44
|
+
*/
|
|
45
|
+
export function readRunScopedPin({
|
|
46
|
+
storyId,
|
|
47
|
+
config,
|
|
48
|
+
readEnvelopeFn = readStoryInitEnvelope,
|
|
49
|
+
}) {
|
|
50
|
+
const pin = readEnvelopeFn({ storyId, config })?.runScopedConfig;
|
|
51
|
+
return pin && typeof pin === 'object' ? pin : null;
|
|
52
|
+
}
|