mandrel 1.94.0 → 2.1.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 +116 -99
- package/.agents/agents/acceptance-critic.md +9 -7
- package/.agents/agents/story-worker.md +45 -51
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +498 -1287
- package/.agents/docs/agentrc-reference.json +185 -80
- package/.agents/docs/configuration.md +132 -190
- package/.agents/docs/execution-reference.md +51 -25
- package/.agents/docs/quality-gates.md +25 -33
- package/.agents/docs/workflows.md +8 -8
- package/.agents/instructions.md +113 -139
- package/.agents/rules/ci-remediation.md +11 -15
- package/.agents/rules/git-conventions-reference.md +48 -58
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +83 -254
- package/.agents/schemas/audit-rules.json +59 -1
- package/.agents/schemas/audit-rules.schema.json +33 -1
- package/.agents/schemas/lifecycle/README.md +1 -2
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
- package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
- package/.agents/schemas/signal-event.schema.json +3 -3
- package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +22 -66
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/bootstrap.js +3 -3
- package/.agents/scripts/check-dead-exports.js +43 -104
- package/.agents/scripts/check-doc-links.js +2 -2
- package/.agents/scripts/check-lifecycle-lint.js +7 -10
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/deliver-recover.js +122 -0
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +20 -50
- package/.agents/scripts/generate-skills-index.js +17 -1
- package/.agents/scripts/generate-workflows-doc.js +4 -4
- package/.agents/scripts/lib/ITicketingProvider.js +1 -19
- package/.agents/scripts/lib/Logger.js +6 -10
- package/.agents/scripts/lib/audit-suite/runner.js +2 -2
- package/.agents/scripts/lib/audit-suite/selector.js +328 -28
- package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
- package/.agents/scripts/lib/baselines/kernel.js +206 -18
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
- package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
- package/.agents/scripts/lib/checks/index.js +3 -2
- package/.agents/scripts/lib/checks/loop-health.js +12 -11
- package/.agents/scripts/lib/checks/state.js +17 -248
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +39 -9
- package/.agents/scripts/lib/close-validation/gates.js +15 -15
- package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
- package/.agents/scripts/lib/close-validation/runner.js +13 -21
- package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +52 -35
- package/.agents/scripts/lib/config/explain.js +61 -48
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +29 -80
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +12 -15
- package/.agents/scripts/lib/config/runners.js +20 -66
- package/.agents/scripts/lib/config/temp-paths.js +30 -63
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +2 -7
- package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
- package/.agents/scripts/lib/config-settings-schema.js +100 -60
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +2 -2
- package/.agents/scripts/lib/duplicate-search.js +242 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +23 -14
- package/.agents/scripts/lib/format-generated-json.js +97 -0
- package/.agents/scripts/lib/framework-version.js +19 -190
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
- package/.agents/scripts/lib/git-utils.js +32 -20
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +10 -38
- package/.agents/scripts/lib/label-taxonomy.js +10 -55
- package/.agents/scripts/lib/observability/active-story-env.js +44 -165
- package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
- package/.agents/scripts/lib/observability/signal-validator.js +4 -4
- package/.agents/scripts/lib/observability/signals-writer.js +6 -82
- package/.agents/scripts/lib/observability/source-classifier.js +5 -5
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
- package/.agents/scripts/lib/orchestration/code-review.js +78 -436
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
- package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
- package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
- package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
- package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
- package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
- package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
- package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
- package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
- package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
- package/.agents/scripts/lib/planning-corpus.js +12 -281
- package/.agents/scripts/lib/preflight-runner.js +4 -4
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
- package/.agents/scripts/lib/signals/index.js +4 -17
- package/.agents/scripts/lib/signals/read.js +35 -35
- package/.agents/scripts/lib/signals/schema.js +8 -11
- package/.agents/scripts/lib/signals/span-tree.js +7 -7
- package/.agents/scripts/lib/signals/write.js +0 -1
- package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +17 -19
- package/.agents/scripts/lib/story-body/story-body.js +130 -75
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
- package/.agents/scripts/lib/validation-evidence.js +32 -60
- package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- package/.agents/scripts/lint-issue-body.js +71 -40
- package/.agents/scripts/mandrel-update-preflight.js +1 -1
- package/.agents/scripts/notify.js +4 -3
- package/.agents/scripts/plan-context.js +102 -80
- package/.agents/scripts/plan-persist.js +230 -279
- package/.agents/scripts/plan-run-epilogue.js +142 -0
- package/.agents/scripts/post-structured-comment.js +0 -38
- package/.agents/scripts/pr-watch-with-update.js +43 -22
- package/.agents/scripts/providers/github/compose.js +0 -1
- package/.agents/scripts/providers/github/errors.js +0 -19
- package/.agents/scripts/providers/github/issues.js +13 -39
- package/.agents/scripts/providers/github/mappers.js +5 -12
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -156
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/resolve-stories.js +236 -0
- package/.agents/scripts/run-coverage.js +4 -1
- package/.agents/scripts/run-lint.js +2 -2
- package/.agents/scripts/run-verify.js +31 -2
- package/.agents/scripts/signals-view.js +25 -21
- package/.agents/scripts/single-story-close.js +178 -26
- package/.agents/scripts/single-story-confirm-merge.js +313 -24
- package/.agents/scripts/single-story-init.js +35 -30
- package/.agents/scripts/stories-wave-tick.js +85 -10
- package/.agents/scripts/story-plan.js +28 -49
- package/.agents/scripts/update-ticket-state.js +14 -65
- package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
- package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
- package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
- package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
- package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
- package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
- package/.agents/skills/core/scope-triage/SKILL.md +31 -172
- package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
- package/.agents/skills/core/security-and-hardening/reference.md +375 -0
- package/.agents/skills/skills.index.json +3 -53
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +6 -7
- package/.agents/workflows/audit-clean-code.md +7 -7
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +9 -10
- package/.agents/workflows/audit-lighthouse.md +11 -3
- package/.agents/workflows/audit-navigability.md +13 -2
- package/.agents/workflows/audit-performance.md +5 -6
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +11 -12
- package/.agents/workflows/audit-security.md +4 -5
- package/.agents/workflows/audit-seo.md +13 -3
- package/.agents/workflows/audit-sre.md +3 -3
- package/.agents/workflows/audit-to-stories.md +20 -20
- package/.agents/workflows/audit-ux-ui.md +10 -3
- package/.agents/workflows/deliver.md +177 -176
- package/.agents/workflows/git-cleanup.md +5 -6
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
- package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
- package/.agents/workflows/helpers/code-review.md +75 -196
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
- package/.agents/workflows/helpers/deliver-story.md +606 -0
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/parallel-tooling.md +3 -3
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
- package/.agents/workflows/mandrel-update.md +2 -1
- package/.agents/workflows/plan.md +277 -145
- package/.agents/workflows/qa-assist.md +27 -33
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -6
- package/README.md +9 -8
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +70 -0
- package/lib/cli/registry.js +262 -19
- package/lib/cli/sync-agents.js +157 -0
- package/lib/cli/sync-commands.js +115 -6
- package/lib/cli/sync.js +168 -6
- package/lib/cli/update.js +105 -8
- package/lib/cli/version-helpers.js +131 -0
- package/lib/migrations/README.md +7 -5
- package/lib/migrations/index.js +12 -8
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
- package/package.json +2 -2
- package/.agents/agents/retro.md +0 -42
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer.md +0 -33
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/security-engineer.md +0 -111
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
- package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
- package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -66
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -852
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
- package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
- package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
- package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
- package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
- package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
- package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
- package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
- package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
- package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
- package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
- package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/slice-phase.js +0 -361
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -464
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
- package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
- package/.agents/workflows/helpers/deliver-epic.md +0 -998
- package/.agents/workflows/helpers/deliver-stories.md +0 -450
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -353
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- package/.agents/workflows/helpers/single-story-deliver.md +0 -557
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* lib/orchestration/retro-perf-heuristics.js — classify perf signals.
|
|
3
|
-
*
|
|
4
|
-
* Story #3042 / Task #3045 (Epic #3019). Pure functions that turn the
|
|
5
|
-
* `epic-perf-report.waveParallelism` row shape (Story #3025) into a flat
|
|
6
|
-
* list of perf signals. The retro renderer (`./retro/phases/compose-body.js`)
|
|
7
|
-
* consumes the list to surface a `## Performance Signals` section and a
|
|
8
|
-
* `## Recommended Follow-Ons` paste-ready stanza per signal.
|
|
9
|
-
*
|
|
10
|
-
* Signals (kinds):
|
|
11
|
-
*
|
|
12
|
-
* - `low-utilisation` — any wave whose `utilisation < thresholds.utilisation`.
|
|
13
|
-
* One signal per offending wave. The signal carries the wave index and
|
|
14
|
-
* the observed utilisation so the renderer can name the offender.
|
|
15
|
-
*
|
|
16
|
-
* - `high-bootstrap-share` — emitted when the summed `story-init` /
|
|
17
|
-
* bootstrap phase time across all waves exceeds
|
|
18
|
-
* `thresholds.bootstrapShare` of the cumulative `summedStoryMs`. This is
|
|
19
|
-
* a single signal across the whole report (not one per wave) because the
|
|
20
|
-
* framework remediation is an Epic-wide bootstrap-cost story, not a
|
|
21
|
-
* per-wave tweak. The signal payload carries the observed share.
|
|
22
|
-
*
|
|
23
|
-
* - `cap-binding-run` — emitted when `>= thresholds.capBindingRunLength`
|
|
24
|
-
* consecutive waves report `capBinding: true`. One signal per maximal
|
|
25
|
-
* run, carrying the run's first/last wave index and the run length so
|
|
26
|
-
* the renderer can attribute the run-length back to the deliver-runner
|
|
27
|
-
* concurrency cap.
|
|
28
|
-
*
|
|
29
|
-
* Threshold contract (`.agentrc.json → delivery.retro.perfThresholds`):
|
|
30
|
-
*
|
|
31
|
-
* - `utilisation`: number in [0, 1]. Default 0.6.
|
|
32
|
-
* - `bootstrapShare`: number in [0, 1]. Default 0.4.
|
|
33
|
-
* - `capBindingRunLength`: positive integer. Default 2.
|
|
34
|
-
*
|
|
35
|
-
* The function is total: it never throws on malformed input. A missing or
|
|
36
|
-
* malformed `report` returns `[]`. A missing `thresholds` falls back to the
|
|
37
|
-
* documented defaults.
|
|
38
|
-
*/
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Defaults mirroring `.agentrc.json → delivery.retro.perfThresholds` so
|
|
42
|
-
* callers (and tests) can omit `thresholds` and get the same behaviour as
|
|
43
|
-
* a resolved config with no overrides. Keep in lockstep with
|
|
44
|
-
* `lib/config/runners.js` (or wherever the resolver default lives) and the
|
|
45
|
-
* `agentrc.schema.json` defaults stanza.
|
|
46
|
-
*/
|
|
47
|
-
export const DEFAULT_RETRO_PERF_THRESHOLDS = Object.freeze({
|
|
48
|
-
utilisation: 0.6,
|
|
49
|
-
bootstrapShare: 0.4,
|
|
50
|
-
capBindingRunLength: 2,
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
function isObject(v) {
|
|
54
|
-
return v != null && typeof v === 'object' && !Array.isArray(v);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function clampUnit(n, fallback) {
|
|
58
|
-
if (typeof n !== 'number' || !Number.isFinite(n)) return fallback;
|
|
59
|
-
// Out-of-range values fall back to the documented default rather than
|
|
60
|
-
// being clamped — operators wiring nonsensical thresholds should see the
|
|
61
|
-
// safe default applied, not a silent 0/1 substitute that subtly changes
|
|
62
|
-
// the heuristic.
|
|
63
|
-
if (n < 0 || n > 1) return fallback;
|
|
64
|
-
return n;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function positiveInt(n, fallback) {
|
|
68
|
-
if (typeof n !== 'number' || !Number.isFinite(n)) return fallback;
|
|
69
|
-
if (!Number.isInteger(n) || n < 1) return fallback;
|
|
70
|
-
return n;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Resolve the threshold trio against the documented defaults. Exported for
|
|
75
|
-
* the test surface so callers can verify the fallback semantics in
|
|
76
|
-
* isolation.
|
|
77
|
-
*
|
|
78
|
-
* @param {object|null|undefined} thresholds
|
|
79
|
-
* @returns {{ utilisation: number, bootstrapShare: number, capBindingRunLength: number }}
|
|
80
|
-
*/
|
|
81
|
-
export function resolvePerfThresholds(thresholds) {
|
|
82
|
-
const src = isObject(thresholds) ? thresholds : {};
|
|
83
|
-
return {
|
|
84
|
-
utilisation: clampUnit(
|
|
85
|
-
src.utilisation,
|
|
86
|
-
DEFAULT_RETRO_PERF_THRESHOLDS.utilisation,
|
|
87
|
-
),
|
|
88
|
-
bootstrapShare: clampUnit(
|
|
89
|
-
src.bootstrapShare,
|
|
90
|
-
DEFAULT_RETRO_PERF_THRESHOLDS.bootstrapShare,
|
|
91
|
-
),
|
|
92
|
-
capBindingRunLength: positiveInt(
|
|
93
|
-
src.capBindingRunLength,
|
|
94
|
-
DEFAULT_RETRO_PERF_THRESHOLDS.capBindingRunLength,
|
|
95
|
-
),
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Extract the validated `waveParallelism` rows from the report. Rows whose
|
|
101
|
-
* `waveIndex` is not a non-negative integer are dropped (the schema requires
|
|
102
|
-
* one, but the heuristics module must tolerate malformed historical reports).
|
|
103
|
-
*
|
|
104
|
-
* @param {object|null|undefined} report
|
|
105
|
-
* @returns {Array<{ waveIndex: number, wallClockMs: number, summedStoryMs: number, utilisation: number, capBinding: boolean }>}
|
|
106
|
-
*/
|
|
107
|
-
function extractRows(report) {
|
|
108
|
-
if (!isObject(report)) return [];
|
|
109
|
-
const arr = Array.isArray(report.waveParallelism)
|
|
110
|
-
? report.waveParallelism
|
|
111
|
-
: [];
|
|
112
|
-
return arr
|
|
113
|
-
.filter(
|
|
114
|
-
(r) => isObject(r) && Number.isInteger(r.waveIndex) && r.waveIndex >= 0,
|
|
115
|
-
)
|
|
116
|
-
.map((r) => ({
|
|
117
|
-
waveIndex: r.waveIndex,
|
|
118
|
-
wallClockMs:
|
|
119
|
-
typeof r.wallClockMs === 'number' && r.wallClockMs > 0
|
|
120
|
-
? r.wallClockMs
|
|
121
|
-
: 0,
|
|
122
|
-
summedStoryMs:
|
|
123
|
-
typeof r.summedStoryMs === 'number' && r.summedStoryMs > 0
|
|
124
|
-
? r.summedStoryMs
|
|
125
|
-
: 0,
|
|
126
|
-
utilisation:
|
|
127
|
-
typeof r.utilisation === 'number' && Number.isFinite(r.utilisation)
|
|
128
|
-
? r.utilisation
|
|
129
|
-
: 0,
|
|
130
|
-
capBinding: Boolean(r.capBinding),
|
|
131
|
-
}));
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Build the `low-utilisation` signals — one per wave whose `utilisation` is
|
|
136
|
-
* strictly below the threshold. Returns `[]` when no row crosses the gate.
|
|
137
|
-
*
|
|
138
|
-
* Waves with `summedStoryMs <= 0` are skipped unconditionally: when no
|
|
139
|
-
* per-Story timing windows are present the computed utilisation is 0.0%
|
|
140
|
-
* because the numerator is 0, not because the wave was genuinely idle.
|
|
141
|
-
* Scoring unknown timing as low would flood the retro with non-actionable
|
|
142
|
-
* follow-ons (Story #3850).
|
|
143
|
-
*/
|
|
144
|
-
function detectLowUtilisation(rows, threshold) {
|
|
145
|
-
const out = [];
|
|
146
|
-
for (const row of rows) {
|
|
147
|
-
// Skip waves with no timing data — utilisation is unknown, not low.
|
|
148
|
-
if (row.summedStoryMs <= 0) continue;
|
|
149
|
-
if (row.utilisation < threshold) {
|
|
150
|
-
out.push({
|
|
151
|
-
kind: 'low-utilisation',
|
|
152
|
-
waveIndex: row.waveIndex,
|
|
153
|
-
utilisation: row.utilisation,
|
|
154
|
-
threshold,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return out;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Sum the bootstrap (story-init) phase time across per-Story summaries on the
|
|
163
|
-
* report. Returns the absolute milliseconds. Falls back to 0 when no Story
|
|
164
|
-
* summary in the report carries a `phaseTimingsMs['story-init']` entry — in
|
|
165
|
-
* that case the share check necessarily returns no signal.
|
|
166
|
-
*/
|
|
167
|
-
function sumBootstrapMs(report) {
|
|
168
|
-
if (!isObject(report)) return 0;
|
|
169
|
-
const stories = Array.isArray(report.storyPerfSummaries)
|
|
170
|
-
? report.storyPerfSummaries
|
|
171
|
-
: [];
|
|
172
|
-
let total = 0;
|
|
173
|
-
for (const s of stories) {
|
|
174
|
-
if (!isObject(s)) continue;
|
|
175
|
-
const timings = isObject(s.phaseTimingsMs) ? s.phaseTimingsMs : null;
|
|
176
|
-
if (!timings) continue;
|
|
177
|
-
const v = timings['story-init'];
|
|
178
|
-
if (typeof v === 'number' && Number.isFinite(v) && v > 0) {
|
|
179
|
-
total += v;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return total;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Build the (at-most-one) `high-bootstrap-share` signal. Returns `[]` when
|
|
187
|
-
* either the cumulative `summedStoryMs` is zero (no wave timing) or the
|
|
188
|
-
* observed bootstrap share is at-or-below the threshold.
|
|
189
|
-
*/
|
|
190
|
-
function detectHighBootstrapShare(rows, report, threshold) {
|
|
191
|
-
const totalStoryMs = rows.reduce((acc, r) => acc + r.summedStoryMs, 0);
|
|
192
|
-
if (totalStoryMs <= 0) return [];
|
|
193
|
-
const bootstrapMs = sumBootstrapMs(report);
|
|
194
|
-
if (bootstrapMs <= 0) return [];
|
|
195
|
-
const share = bootstrapMs / totalStoryMs;
|
|
196
|
-
if (share <= threshold) return [];
|
|
197
|
-
return [
|
|
198
|
-
{
|
|
199
|
-
kind: 'high-bootstrap-share',
|
|
200
|
-
share,
|
|
201
|
-
bootstrapMs,
|
|
202
|
-
summedStoryMs: totalStoryMs,
|
|
203
|
-
threshold,
|
|
204
|
-
},
|
|
205
|
-
];
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Walk the rows in `waveIndex` order and emit one `cap-binding-run` signal
|
|
210
|
-
* per maximal run of consecutive `capBinding: true` waves whose length is at
|
|
211
|
-
* least `threshold`.
|
|
212
|
-
*/
|
|
213
|
-
function detectCapBindingRuns(rows, threshold) {
|
|
214
|
-
const ordered = [...rows].sort((a, b) => a.waveIndex - b.waveIndex);
|
|
215
|
-
const out = [];
|
|
216
|
-
let runStart = null;
|
|
217
|
-
let runLen = 0;
|
|
218
|
-
for (let i = 0; i < ordered.length; i += 1) {
|
|
219
|
-
const row = ordered[i];
|
|
220
|
-
if (row.capBinding) {
|
|
221
|
-
if (runStart === null) runStart = row.waveIndex;
|
|
222
|
-
runLen += 1;
|
|
223
|
-
// End of array? Flush the run.
|
|
224
|
-
if (i === ordered.length - 1 && runLen >= threshold) {
|
|
225
|
-
out.push({
|
|
226
|
-
kind: 'cap-binding-run',
|
|
227
|
-
fromWaveIndex: runStart,
|
|
228
|
-
toWaveIndex: row.waveIndex,
|
|
229
|
-
runLength: runLen,
|
|
230
|
-
threshold,
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
} else {
|
|
234
|
-
if (runLen >= threshold && runStart !== null) {
|
|
235
|
-
out.push({
|
|
236
|
-
kind: 'cap-binding-run',
|
|
237
|
-
fromWaveIndex: runStart,
|
|
238
|
-
toWaveIndex: ordered[i - 1].waveIndex,
|
|
239
|
-
runLength: runLen,
|
|
240
|
-
threshold,
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
runStart = null;
|
|
244
|
-
runLen = 0;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
return out;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* Classify perf signals from an `epic-perf-report` payload.
|
|
252
|
-
*
|
|
253
|
-
* Always returns an array of signal objects. The array is empty when no
|
|
254
|
-
* signal trips. The caller (retro renderer) is responsible for suppressing
|
|
255
|
-
* the entire `## Performance Signals` and `## Recommended Follow-Ons`
|
|
256
|
-
* sections when this returns `[]`.
|
|
257
|
-
*
|
|
258
|
-
* @param {object|null|undefined} report `epic-perf-report` payload.
|
|
259
|
-
* @param {object|null|undefined} thresholds Optional override of
|
|
260
|
-
* `{ utilisation, bootstrapShare, capBindingRunLength }`. Defaults
|
|
261
|
-
* resolve via `DEFAULT_RETRO_PERF_THRESHOLDS`.
|
|
262
|
-
* @returns {Array<object>} Signal list.
|
|
263
|
-
*/
|
|
264
|
-
export function classifyPerfSignals(report, thresholds) {
|
|
265
|
-
const resolved = resolvePerfThresholds(thresholds);
|
|
266
|
-
const rows = extractRows(report);
|
|
267
|
-
if (rows.length === 0) return [];
|
|
268
|
-
const signals = [];
|
|
269
|
-
signals.push(...detectLowUtilisation(rows, resolved.utilisation));
|
|
270
|
-
signals.push(
|
|
271
|
-
...detectHighBootstrapShare(rows, report, resolved.bootstrapShare),
|
|
272
|
-
);
|
|
273
|
-
signals.push(...detectCapBindingRuns(rows, resolved.capBindingRunLength));
|
|
274
|
-
return signals;
|
|
275
|
-
}
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* lib/orchestration/retro-runner.js — In-process Retro module (sequencer).
|
|
3
|
-
*
|
|
4
|
-
* Story #1155 (Epic #1142, 5.40.0) — extracts the helper-driven
|
|
5
|
-
* `epic-retro` invocation into a callable module so the
|
|
6
|
-
* `/deliver` runner can fire Phase E without a separate LLM
|
|
7
|
-
* helper turn. (Story #2259, Epic #2172: the legacy deliver-runner
|
|
8
|
-
* CLI was retired once delivery moved entirely into the slash
|
|
9
|
-
* command.) The retro fires before `/deliver`'s finalize step
|
|
10
|
-
* opens the PR — the operator's PR-merge is the final human gate, not
|
|
11
|
-
* the retro itself.
|
|
12
|
-
*
|
|
13
|
-
* Story #3001 — the runner body was decomposed into `./retro/phases/`
|
|
14
|
-
* (one file per functional unit) following the established pattern at
|
|
15
|
-
* `./git-cleanup/phases/`, `./story-close/phases/`, and
|
|
16
|
-
* `./post-merge/phases/`. This file is now a thin sequencer that owns
|
|
17
|
-
* the `runRetro` entry point and re-exports the phase-level helpers so
|
|
18
|
-
* existing import sites stay unchanged.
|
|
19
|
-
*
|
|
20
|
-
* Public API:
|
|
21
|
-
* - `runRetro({ epicId, provider, logger })` → `{ posted, compact, scorecard, body, defectClasses }`.
|
|
22
|
-
* - `composeRetroBody(input)` (pure, exported for tests).
|
|
23
|
-
* - `gatherRetroSignals({ epicId, provider })` (exported for tests).
|
|
24
|
-
* - `appendChecksSection(body, findings)` (pure, exported for tests).
|
|
25
|
-
* - `deriveDefectClasses(routedProposals)` (pure, exported for tests).
|
|
26
|
-
*
|
|
27
|
-
* Story #4135 (Epic #4131, F11) — the runner now derives a
|
|
28
|
-
* **recurring-defect-class signal** from the routed-proposal actionable
|
|
29
|
-
* items (categories that recurred ≥2 times across review/deliver-caught
|
|
30
|
-
* friction, or a force-flagged `agent::blocked` category). The derived
|
|
31
|
-
* classes ride on the `runRetro` envelope as `defectClasses[]` and are
|
|
32
|
-
* stamped onto the proposed `gh issue create` commands as `friction::<class>`
|
|
33
|
-
* labels (the routed-proposals composer already emits that label), which is
|
|
34
|
-
* the durable substrate the `/plan` Phase 0 prior-feedback fetcher reads
|
|
35
|
-
* back to surface recurring classes to the planner. The derivation is
|
|
36
|
-
* **no-op-safe**: absent or empty routed proposals yield an empty array and
|
|
37
|
-
* no behavioural change to the existing retro/post path.
|
|
38
|
-
*
|
|
39
|
-
* Behaviour:
|
|
40
|
-
* - Reads child Stories' `story-perf-summary` comments to aggregate
|
|
41
|
-
* `frictionByCategory` totals (Story #1046 unified-summary path).
|
|
42
|
-
* - Reads child Stories' label sets to count HITL pause events
|
|
43
|
-
* (`agent::blocked`).
|
|
44
|
-
* - Reads the Epic's `parked-follow-ons` structured comment for the
|
|
45
|
-
* parked + recut counts (with a fallback to per-Story body grep on the
|
|
46
|
-
* `<!-- recut-of: #N -->` marker).
|
|
47
|
-
* - Selects the compact (clean-manifest) or full retro shape via
|
|
48
|
-
* `isCleanManifest`.
|
|
49
|
-
* - Posts the composed markdown as a `retro` structured comment on the
|
|
50
|
-
* Epic, terminated with the `retro-complete: <ISO>` HTML marker.
|
|
51
|
-
* - **Never** routes through `notify.js` — GitHub is the sole retro
|
|
52
|
-
* archive; the webhook must not see the retro body.
|
|
53
|
-
*/
|
|
54
|
-
|
|
55
|
-
import nodeFs from 'node:fs';
|
|
56
|
-
|
|
57
|
-
import { runChecks } from '../checks/index.js';
|
|
58
|
-
import { assembleState } from '../checks/state.js';
|
|
59
|
-
import { composeRetroBody } from './retro/phases/compose-body.js';
|
|
60
|
-
import { gatherRetroSignals } from './retro/phases/gather-signals.js';
|
|
61
|
-
import { composeAndPostRetro } from './retro/phases/post-and-mirror.js';
|
|
62
|
-
import { upsertStructuredComment } from './ticketing.js';
|
|
63
|
-
|
|
64
|
-
// Re-export phase-level helpers so existing import sites stay unchanged.
|
|
65
|
-
export { appendChecksSection } from './retro/phases/checks.js';
|
|
66
|
-
export {
|
|
67
|
-
composeRetroBody,
|
|
68
|
-
deriveDefectClasses,
|
|
69
|
-
} from './retro/phases/compose-body.js';
|
|
70
|
-
export { gatherRetroSignals } from './retro/phases/gather-signals.js';
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Public: compose and post the retro structured comment on the Epic.
|
|
74
|
-
*
|
|
75
|
-
* Story #1290 (Epic #1143) — at /deliver Phase 5, the runner invokes
|
|
76
|
-
* the self-healing checks registry with `scope: 'retro'` and
|
|
77
|
-
* `autoFix: false`. The retro is **read-only by construction**: the
|
|
78
|
-
* registry runner enforces the invariant by throwing if any caller flips
|
|
79
|
-
* `autoFix: true` under `scope: 'retro'`. Findings are appended to the
|
|
80
|
-
* retro body via `appendChecksSection`, which suppresses the section when
|
|
81
|
-
* findings are empty so the compact "🟢 Clean sprint" shape is preserved.
|
|
82
|
-
*
|
|
83
|
-
* Story #2252 — when `opts.bus` is supplied the runner emits
|
|
84
|
-
* `retro.start` immediately on entry and `retro.end` immediately before
|
|
85
|
-
* returning the envelope. On throw the helper emits `retro.end` with
|
|
86
|
-
* `posted: false` before re-throwing so the ledger always carries the
|
|
87
|
-
* closing boundary.
|
|
88
|
-
*
|
|
89
|
-
* @param {{
|
|
90
|
-
* epicId: number,
|
|
91
|
-
* provider: object,
|
|
92
|
-
* logger?: { info?: Function, warn?: Function },
|
|
93
|
-
* forceFull?: boolean,
|
|
94
|
-
* timestamp?: string,
|
|
95
|
-
* bus?: object|null,
|
|
96
|
-
* now?: () => number,
|
|
97
|
-
* manualInterventions?: number,
|
|
98
|
-
* frameworkRepo?: string,
|
|
99
|
-
* consumerRepo?: string,
|
|
100
|
-
* config?: object|null,
|
|
101
|
-
* gatherFn?: typeof gatherRetroSignals,
|
|
102
|
-
* composeFn?: typeof composeRetroBody,
|
|
103
|
-
* upsertFn?: typeof upsertStructuredComment,
|
|
104
|
-
* runChecksFn?: typeof runChecks,
|
|
105
|
-
* assembleStateFn?: typeof assembleState,
|
|
106
|
-
* cwd?: string,
|
|
107
|
-
* }} opts
|
|
108
|
-
* @returns {Promise<{
|
|
109
|
-
* posted: boolean,
|
|
110
|
-
* compact: boolean,
|
|
111
|
-
* scorecard: object,
|
|
112
|
-
* body: string,
|
|
113
|
-
* findings: object[],
|
|
114
|
-
* defectClasses: Array<{ category: string, occurrences: number, source: 'framework'|'consumer', label: string }>,
|
|
115
|
-
* commentId?: number,
|
|
116
|
-
* }>}
|
|
117
|
-
*/
|
|
118
|
-
export async function runRetro(opts = {}) {
|
|
119
|
-
const {
|
|
120
|
-
epicId,
|
|
121
|
-
provider,
|
|
122
|
-
logger,
|
|
123
|
-
forceFull = false,
|
|
124
|
-
timestamp,
|
|
125
|
-
bus,
|
|
126
|
-
now = Date.now,
|
|
127
|
-
manualInterventions = 0,
|
|
128
|
-
frameworkRepo,
|
|
129
|
-
consumerRepo,
|
|
130
|
-
config = null,
|
|
131
|
-
gatherFn = gatherRetroSignals,
|
|
132
|
-
composeFn = composeRetroBody,
|
|
133
|
-
upsertFn = upsertStructuredComment,
|
|
134
|
-
runChecksFn = runChecks,
|
|
135
|
-
assembleStateFn = assembleState,
|
|
136
|
-
cwd,
|
|
137
|
-
fsImpl = nodeFs,
|
|
138
|
-
perfThresholds = null,
|
|
139
|
-
} = opts;
|
|
140
|
-
|
|
141
|
-
if (!Number.isInteger(epicId) || epicId <= 0) {
|
|
142
|
-
throw new TypeError('runRetro: epicId is required (positive integer).');
|
|
143
|
-
}
|
|
144
|
-
if (!provider) {
|
|
145
|
-
throw new TypeError('runRetro: provider is required.');
|
|
146
|
-
}
|
|
147
|
-
// Epic #2646 Story C (Task #2700) — `bus` is now a hard input. The
|
|
148
|
-
// previous guarded `emitLifecycleSafe` helper that tolerated a null
|
|
149
|
-
// bus is gone.
|
|
150
|
-
if (!bus || typeof bus.emit !== 'function') {
|
|
151
|
-
throw new TypeError('runRetro: bus is required (object with emit()).');
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
logger?.info?.(`[retro-runner] Composing retro for Epic #${epicId}...`);
|
|
155
|
-
const startedAt = typeof now === 'function' ? now() : Date.now();
|
|
156
|
-
await bus.emit('retro.start', { epicId });
|
|
157
|
-
let retroPathWritten = null;
|
|
158
|
-
try {
|
|
159
|
-
return await composeAndPostRetro({
|
|
160
|
-
epicId,
|
|
161
|
-
provider,
|
|
162
|
-
logger,
|
|
163
|
-
forceFull,
|
|
164
|
-
timestamp,
|
|
165
|
-
bus,
|
|
166
|
-
now,
|
|
167
|
-
manualInterventions,
|
|
168
|
-
frameworkRepo,
|
|
169
|
-
consumerRepo,
|
|
170
|
-
config,
|
|
171
|
-
gatherFn,
|
|
172
|
-
composeFn,
|
|
173
|
-
upsertFn,
|
|
174
|
-
runChecksFn,
|
|
175
|
-
assembleStateFn,
|
|
176
|
-
cwd,
|
|
177
|
-
fsImpl,
|
|
178
|
-
startedAt,
|
|
179
|
-
perfThresholds,
|
|
180
|
-
onMirrorWritten: (p) => {
|
|
181
|
-
retroPathWritten = p;
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
} catch (err) {
|
|
185
|
-
// Surface the closing boundary even on throw — the ledger must
|
|
186
|
-
// always show a matched start/end pair.
|
|
187
|
-
const endedAt = typeof now === 'function' ? now() : Date.now();
|
|
188
|
-
const payload = {
|
|
189
|
-
epicId,
|
|
190
|
-
posted: false,
|
|
191
|
-
durationMs: Math.max(0, Math.floor(endedAt - startedAt)),
|
|
192
|
-
};
|
|
193
|
-
if (retroPathWritten) payload.retroPath = retroPathWritten;
|
|
194
|
-
await bus.emit('retro.end', payload);
|
|
195
|
-
throw err;
|
|
196
|
-
}
|
|
197
|
-
}
|