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,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Streaming signals reader (Epic #1181 / Story #1438 / Task #1459).
|
|
3
3
|
*
|
|
4
|
-
* Provides one async-iterator entry point — `read({
|
|
4
|
+
* Provides one async-iterator entry point — `read({ run, story?, kind?,
|
|
5
5
|
* config? })` — that consumers use instead of opening the NDJSON file
|
|
6
6
|
* themselves. The reader streams line-by-line so callers never load the
|
|
7
7
|
* full file into memory (50MB+ traces stay under file size in RSS).
|
|
8
8
|
*
|
|
9
9
|
* On-disk layout (resolved via `lib/config/temp-paths.js`):
|
|
10
10
|
*
|
|
11
|
-
* <tempRoot>/
|
|
11
|
+
* <tempRoot>/run-<run>/story-<story>/signals.ndjson
|
|
12
12
|
*
|
|
13
13
|
* When `story` is omitted, the reader fans out across every
|
|
14
|
-
* `story-<id>/signals.ndjson` under `<tempRoot>/
|
|
15
|
-
*
|
|
14
|
+
* `story-<id>/signals.ndjson` under `<tempRoot>/run-<run>/`. When the
|
|
15
|
+
* run directory is missing, the iterator yields nothing (consumers
|
|
16
16
|
* treat absence as "no signals yet").
|
|
17
17
|
*
|
|
18
18
|
* ## Filter semantics
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* argument are yielded. Filtering happens after the per-line JSON
|
|
22
22
|
* parse + envelope guard (see `lib/signals/schema.js`).
|
|
23
23
|
* - `story` — narrows to a single Story's stream; otherwise we walk
|
|
24
|
-
* every Story directory under the
|
|
24
|
+
* every Story directory under the run.
|
|
25
25
|
*
|
|
26
26
|
* ## Warn-once policy (AC #3)
|
|
27
27
|
*
|
|
@@ -46,8 +46,8 @@ import fs from 'node:fs/promises';
|
|
|
46
46
|
import path from 'node:path';
|
|
47
47
|
import { createInterface } from 'node:readline';
|
|
48
48
|
import {
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
runArtifactPath,
|
|
50
|
+
runTempDir,
|
|
51
51
|
signalsFile,
|
|
52
52
|
storyTempDir,
|
|
53
53
|
} from '../config/temp-paths.js';
|
|
@@ -145,43 +145,43 @@ async function* streamFile(target, kindFilter) {
|
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
/**
|
|
148
|
-
* List every `stories/story-<id>/signals.ndjson` path under the
|
|
149
|
-
* `<tempRoot>/
|
|
150
|
-
*
|
|
148
|
+
* List every `stories/story-<id>/signals.ndjson` path under the run's
|
|
149
|
+
* `<tempRoot>/run-<run>/` directory. Returns an empty array when the
|
|
150
|
+
* run directory is missing.
|
|
151
151
|
*
|
|
152
152
|
* The returned paths are sorted by Story ID ascending so the iterator's
|
|
153
153
|
* output is stable across runs.
|
|
154
154
|
*
|
|
155
155
|
* Story #2940 nested per-Story directories under a `stories/` segment.
|
|
156
|
-
*
|
|
156
|
+
* Run-level signals continue to live at the run root.
|
|
157
157
|
*
|
|
158
|
-
* @param {number}
|
|
158
|
+
* @param {number} run
|
|
159
159
|
* @param {object | undefined} config
|
|
160
160
|
* @returns {Promise<string[]>}
|
|
161
161
|
*/
|
|
162
|
-
async function
|
|
163
|
-
const
|
|
164
|
-
let
|
|
162
|
+
async function listRunStorySignalsFiles(run, config) {
|
|
163
|
+
const runDir = runTempDir(run, config);
|
|
164
|
+
let runEntries;
|
|
165
165
|
try {
|
|
166
|
-
|
|
166
|
+
runEntries = await fs.readdir(runDir, { withFileTypes: true });
|
|
167
167
|
} catch {
|
|
168
168
|
return [];
|
|
169
169
|
}
|
|
170
|
-
let
|
|
170
|
+
let hasRunLevelSignals = false;
|
|
171
171
|
let hasStoriesDir = false;
|
|
172
|
-
for (const ent of
|
|
172
|
+
for (const ent of runEntries) {
|
|
173
173
|
if (ent.isDirectory() && ent.name === 'stories') {
|
|
174
174
|
hasStoriesDir = true;
|
|
175
175
|
} else if (ent.isFile() && ent.name === 'signals.ndjson') {
|
|
176
176
|
// Story #1430 — wave-runner lifecycle signals land here.
|
|
177
|
-
|
|
177
|
+
hasRunLevelSignals = true;
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
const storyIds = [];
|
|
181
181
|
if (hasStoriesDir) {
|
|
182
182
|
let storyEntries;
|
|
183
183
|
try {
|
|
184
|
-
storyEntries = await fs.readdir(path.join(
|
|
184
|
+
storyEntries = await fs.readdir(path.join(runDir, 'stories'), {
|
|
185
185
|
withFileTypes: true,
|
|
186
186
|
});
|
|
187
187
|
} catch {
|
|
@@ -195,43 +195,43 @@ async function listEpicStorySignalsFiles(epic, config) {
|
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
197
|
storyIds.sort((a, b) => a - b);
|
|
198
|
-
// Yield
|
|
198
|
+
// Yield run-level signals first (wave-start precedes per-Story friction),
|
|
199
199
|
// then walk the per-Story streams in ascending ID order.
|
|
200
|
-
const targets =
|
|
201
|
-
? [
|
|
200
|
+
const targets = hasRunLevelSignals
|
|
201
|
+
? [runArtifactPath(run, 'signals.ndjson', config)]
|
|
202
202
|
: [];
|
|
203
203
|
for (const sid of storyIds) {
|
|
204
|
-
targets.push(path.join(storyTempDir(
|
|
204
|
+
targets.push(path.join(storyTempDir(run, sid, config), 'signals.ndjson'));
|
|
205
205
|
}
|
|
206
206
|
return targets;
|
|
207
207
|
}
|
|
208
208
|
|
|
209
209
|
/**
|
|
210
|
-
* Stream every event matching `{
|
|
211
|
-
* configured `tempRoot`'s `
|
|
210
|
+
* Stream every event matching `{ run, story?, kind? }` from the
|
|
211
|
+
* configured `tempRoot`'s `run-<run>/[story-<story>/]signals.ndjson`
|
|
212
212
|
* file(s).
|
|
213
213
|
*
|
|
214
214
|
* Returns an async iterable so callers can `for await` over it without
|
|
215
215
|
* buffering. The reader is **streaming** — peak memory stays below the
|
|
216
216
|
* file size for any input.
|
|
217
217
|
*
|
|
218
|
-
* @param {{
|
|
218
|
+
* @param {{ run: number, story?: number, kind?: string, config?: object }} args
|
|
219
219
|
* @returns {AsyncGenerator<object>}
|
|
220
220
|
*
|
|
221
221
|
* @example
|
|
222
|
-
* for await (const evt of read({
|
|
223
|
-
* for await (const evt of read({
|
|
222
|
+
* for await (const evt of read({ run: 1181 })) { ... }
|
|
223
|
+
* for await (const evt of read({ run: 1181, story: 1438, kind: 'friction' })) { ... }
|
|
224
224
|
*/
|
|
225
225
|
export async function* read(args) {
|
|
226
226
|
if (args == null || typeof args !== 'object') {
|
|
227
227
|
throw new TypeError(
|
|
228
|
-
`signals/read: args must be an object with at minimum {
|
|
228
|
+
`signals/read: args must be an object with at minimum { run }; got ${args}`,
|
|
229
229
|
);
|
|
230
230
|
}
|
|
231
|
-
const {
|
|
232
|
-
if (!isPositiveInt(
|
|
231
|
+
const { run, story, kind, config } = args;
|
|
232
|
+
if (!isPositiveInt(run)) {
|
|
233
233
|
throw new RangeError(
|
|
234
|
-
`signals/read:
|
|
234
|
+
`signals/read: run must be a positive integer (got ${run})`,
|
|
235
235
|
);
|
|
236
236
|
}
|
|
237
237
|
if (story !== undefined && !isPositiveInt(story)) {
|
|
@@ -259,8 +259,8 @@ export async function* read(args) {
|
|
|
259
259
|
const kindFilter = kind ?? null;
|
|
260
260
|
const targets =
|
|
261
261
|
story !== undefined
|
|
262
|
-
? [signalsFile(
|
|
263
|
-
: await
|
|
262
|
+
? [signalsFile(run, story, config)]
|
|
263
|
+
: await listRunStorySignalsFiles(run, config);
|
|
264
264
|
|
|
265
265
|
for (const target of targets) {
|
|
266
266
|
yield* streamFile(target, kindFilter);
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* shape guards (Epic #1181 / Story #1438 / Task #1458).
|
|
4
4
|
*
|
|
5
5
|
* Both writers (`lib/observability/signals-writer.js` callers) and
|
|
6
|
-
* readers (`lib/signals/read.js`,
|
|
6
|
+
* readers (`lib/signals/read.js`, the retro's gather-signals phase)
|
|
7
7
|
* import their field names from this module so the on-disk NDJSON shape
|
|
8
8
|
* stays under one schema.
|
|
9
9
|
*
|
|
@@ -19,15 +19,12 @@
|
|
|
19
19
|
*
|
|
20
20
|
* Signals-writer `appendSignal` call sites:
|
|
21
21
|
* - `friction` — quality-gate / runtime friction (diagnose-friction.js,
|
|
22
|
-
* lib/gates/friction.js
|
|
23
|
-
* worktree-reap.js, lifecycle-emit.js)
|
|
22
|
+
* lib/gates/friction.js)
|
|
24
23
|
* - `acceptance-eval` — acceptance-eval.js per-criterion terminus signal.
|
|
25
|
-
* - `wave-start` / `wave-complete` — `
|
|
26
|
-
*
|
|
27
|
-
* `wave-start` also anchors span-tree Story spans)
|
|
24
|
+
* - `wave-start` / `wave-complete` — wave-window anchors; `wave-start` also
|
|
25
|
+
* anchors span-tree Story spans
|
|
28
26
|
* - `wave-end` — span-tree pairing anchor (retained for span-tree)
|
|
29
|
-
* - `state-transition` — notification-derived window anchor
|
|
30
|
-
* waveParallelism bucketer.
|
|
27
|
+
* - `state-transition` — notification-derived window anchor.
|
|
31
28
|
*
|
|
32
29
|
* The `dispatched` kind was deleted in the Epic #4406 signal-contract
|
|
33
30
|
* cutover — it had no live emitter and no consumer.
|
|
@@ -80,9 +77,9 @@ export const EVENT_KINDS = Object.freeze({
|
|
|
80
77
|
FRICTION: 'friction',
|
|
81
78
|
TRACE: 'trace',
|
|
82
79
|
// Wave-window forensics signals: `wave-start` / `wave-end` anchor the
|
|
83
|
-
// span-tree's Story spans
|
|
84
|
-
//
|
|
85
|
-
//
|
|
80
|
+
// span-tree's Story spans. Story #4545 deleted the `waveParallelism`
|
|
81
|
+
// consumer (perf-aggregator) with the execution-analysis surface; these
|
|
82
|
+
// kinds stay as the span-tree's anchors.
|
|
86
83
|
WAVE_START: 'wave-start',
|
|
87
84
|
WAVE_END: 'wave-end',
|
|
88
85
|
WAVE_COMPLETE: 'wave-complete',
|
|
@@ -192,15 +192,15 @@ function bootstrapStoryWindow(storyNode, ts) {
|
|
|
192
192
|
* from `buildSpanTree` so the outer function's CRAP score stays under
|
|
193
193
|
* the new-method ceiling.
|
|
194
194
|
*
|
|
195
|
-
* @param {object} state — mutable accumulator (stories, tasksByStory,
|
|
195
|
+
* @param {object} state — mutable accumulator (stories, tasksByStory, run)
|
|
196
196
|
* @param {unknown} evt
|
|
197
197
|
* @returns {void}
|
|
198
198
|
*/
|
|
199
199
|
function ingestEvent(state, evt) {
|
|
200
200
|
if (evt == null || typeof evt !== 'object') return;
|
|
201
201
|
|
|
202
|
-
const
|
|
203
|
-
if (state.
|
|
202
|
+
const eRun = epicOf(evt);
|
|
203
|
+
if (state.run == null && eRun != null) state.run = eRun;
|
|
204
204
|
|
|
205
205
|
const ts = tsOf(evt);
|
|
206
206
|
const sid = storyOf(evt);
|
|
@@ -258,11 +258,11 @@ function finalizeStory(state, story) {
|
|
|
258
258
|
* Build the span tree from an async iterable of signal events.
|
|
259
259
|
*
|
|
260
260
|
* @param {AsyncIterable<object> | Iterable<object>} iter
|
|
261
|
-
* @returns {Promise<{
|
|
261
|
+
* @returns {Promise<{ run: number | null, stories: Array<object> }>}
|
|
262
262
|
*
|
|
263
263
|
* @example
|
|
264
264
|
* import { read, buildSpanTree } from './lib/signals/index.js';
|
|
265
|
-
* const tree = await buildSpanTree(read({
|
|
265
|
+
* const tree = await buildSpanTree(read({ run: 1181 }));
|
|
266
266
|
*/
|
|
267
267
|
export async function buildSpanTree(iter) {
|
|
268
268
|
if (iter == null || typeof iter !== 'object') {
|
|
@@ -274,7 +274,7 @@ export async function buildSpanTree(iter) {
|
|
|
274
274
|
// Accumulator state. `stories` keys are `storyKeyOf(sid)` strings;
|
|
275
275
|
// `tasksByStory` mirrors that and holds per-task sub-maps.
|
|
276
276
|
const state = {
|
|
277
|
-
|
|
277
|
+
run: null,
|
|
278
278
|
stories: new Map(),
|
|
279
279
|
tasksByStory: new Map(),
|
|
280
280
|
};
|
|
@@ -287,5 +287,5 @@ export async function buildSpanTree(iter) {
|
|
|
287
287
|
storyEntries.sort(compareNodeIds);
|
|
288
288
|
for (const story of storyEntries) finalizeStory(state, story);
|
|
289
289
|
|
|
290
|
-
return {
|
|
290
|
+
return { run: state.run, stories: storyEntries };
|
|
291
291
|
}
|
|
@@ -41,7 +41,13 @@ export async function flipLabelAndNotify({
|
|
|
41
41
|
config,
|
|
42
42
|
progress,
|
|
43
43
|
}) {
|
|
44
|
-
const labelFlipped = await flipLabel(
|
|
44
|
+
const labelFlipped = await flipLabel(
|
|
45
|
+
provider,
|
|
46
|
+
storyId,
|
|
47
|
+
story,
|
|
48
|
+
progress,
|
|
49
|
+
config,
|
|
50
|
+
);
|
|
45
51
|
if (!labelFlipped) return;
|
|
46
52
|
await fireStoryClosingNotify({
|
|
47
53
|
notifyFn: notifyFn ?? defaultNotify,
|
|
@@ -55,7 +61,7 @@ export async function flipLabelAndNotify({
|
|
|
55
61
|
});
|
|
56
62
|
}
|
|
57
63
|
|
|
58
|
-
async function flipLabel(provider, storyId, story, progress) {
|
|
64
|
+
async function flipLabel(provider, storyId, story, progress, config) {
|
|
59
65
|
try {
|
|
60
66
|
// Story #3385 — flip to `agent::closing`, NOT `agent::done`. The
|
|
61
67
|
// canonical mutator (`transitionTicketState`) only closes the GitHub
|
|
@@ -81,8 +87,13 @@ async function flipLabel(provider, storyId, story, progress) {
|
|
|
81
87
|
// notification that `transitionTicketState` would dispatch is
|
|
82
88
|
// redundant with the typed `story-closing` event that
|
|
83
89
|
// `fireStoryClosingNotify` emits immediately afterwards.
|
|
90
|
+
//
|
|
91
|
+
// `config` is threaded so the on-disk board-metadata cache (issue #4555)
|
|
92
|
+
// lands under the project's configured `tempRoot` rather than the
|
|
93
|
+
// framework default, matching every other transition call site.
|
|
84
94
|
await transitionTicketState(provider, storyId, STATE_LABELS.CLOSING, {
|
|
85
95
|
ticketSnapshot: story,
|
|
96
|
+
config,
|
|
86
97
|
});
|
|
87
98
|
progress?.('LABELS', `🏷️ Story #${storyId} → agent::closing`);
|
|
88
99
|
return true;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Shared builder for the `evaluateProtection` context the boot-sweep
|
|
5
5
|
* engine ([`sweepMergedBranches`](../single-story-sweep.js)) threads into
|
|
6
6
|
* every candidate protection check. Single-homed here so the three boot
|
|
7
|
-
* callers — `single-story-init.js
|
|
7
|
+
* callers — `single-story-init.js` and the
|
|
8
8
|
* `boot-sweep.js` CLI — build an identical ctx instead of each re-wiring
|
|
9
9
|
* the git/gh/ticket ports.
|
|
10
10
|
*
|
|
@@ -30,6 +30,8 @@ const FRONTMATTER_DELIMITER = '---';
|
|
|
30
30
|
const POLICY_HEADING_RE = /^## Policy Capsule\s*$/;
|
|
31
31
|
const ANY_H2_RE = /^## /;
|
|
32
32
|
const BULLET_RE = /^- /;
|
|
33
|
+
/** An indented (wrapped) continuation of the bullet above it. */
|
|
34
|
+
const CONTINUATION_RE = /^\s+\S/;
|
|
33
35
|
|
|
34
36
|
/**
|
|
35
37
|
* Repo root resolver. Walks up from the SKILL.md path until we find a
|
|
@@ -85,8 +87,14 @@ function extractFrontmatterBlock(lines, skillPath) {
|
|
|
85
87
|
/**
|
|
86
88
|
* Scan the body for the '## Policy Capsule' heading and count contiguous
|
|
87
89
|
* top-level '- ' bullets that follow it, stopping at the next '## ' heading
|
|
88
|
-
* or end-of-file. Blank lines inside the bullet run do not reset the count
|
|
89
|
-
*
|
|
90
|
+
* or end-of-file. Blank lines inside the bullet run do not reset the count.
|
|
91
|
+
*
|
|
92
|
+
* An **indented** continuation line belongs to the bullet above it — capsule
|
|
93
|
+
* bullets routinely wrap at the document's prose width — so it neither counts
|
|
94
|
+
* as a new bullet nor terminates the run. Only a **flush-left**, non-blank,
|
|
95
|
+
* non-bullet line after the run terminates it (Story #4546: treating any
|
|
96
|
+
* non-bullet line as a terminator counted a wrapped 5-bullet capsule as 1 and
|
|
97
|
+
* tripped the floor in validate-skills.js).
|
|
90
98
|
*/
|
|
91
99
|
function findPolicyCapsule(lines, bodyStart) {
|
|
92
100
|
let headingIndex = -1;
|
|
@@ -114,8 +122,13 @@ function findPolicyCapsule(lines, bodyStart) {
|
|
|
114
122
|
// Blank lines inside or before the bullet run are tolerated.
|
|
115
123
|
continue;
|
|
116
124
|
}
|
|
125
|
+
if (sawBulletRun && CONTINUATION_RE.test(line)) {
|
|
126
|
+
// Indented continuation of the bullet above — same bullet, not a
|
|
127
|
+
// terminator. Wrapped capsule bullets are the norm, not an error.
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
117
130
|
if (sawBulletRun) {
|
|
118
|
-
//
|
|
131
|
+
// Flush-left, non-blank, non-bullet line after the run terminates it.
|
|
119
132
|
break;
|
|
120
133
|
}
|
|
121
134
|
// Leading prose between heading and the first bullet is allowed.
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* lib/story-adjacency.js — the single story-level adjacency builder.
|
|
3
3
|
*
|
|
4
|
-
* Both
|
|
4
|
+
* Both pre-v2 Epic wave wrappers and the v2 `/deliver` ready-set path bottom out in the shared
|
|
5
5
|
* `lib/Graph.js` kernel (`detectCycle` / `assignLayers` / `computeWaves`),
|
|
6
6
|
* but each historically re-implemented the step that turns a list of Story
|
|
7
7
|
* records into the `Map<storyId, number[]>` adjacency the kernel consumes.
|
|
8
|
-
* This module is now the one home for that step; the
|
|
8
|
+
* This module is now the one home for that step; the live consumer is:
|
|
9
9
|
*
|
|
10
|
-
* - `lib/orchestration/epic-runner/phases/build-wave-dag.js`
|
|
11
|
-
* (`buildStoryDag` → `computeWaves`)
|
|
12
|
-
* - `lib/orchestration/dispatch-pipeline.js`
|
|
13
|
-
* (`buildStoryDispatchGraph` → `computeStoryWaves`)
|
|
14
10
|
* - `lib/wave-runner/ready-set.js` (`selectReadySet`, the path-agnostic
|
|
15
|
-
* continuous scheduler the
|
|
16
|
-
* and the Epic path both dispatch through)
|
|
11
|
+
* continuous scheduler the `stories-wave-tick.js` adapter dispatches through)
|
|
17
12
|
* - `stories-wave-tick.js` (for cycle detection, before delegating
|
|
18
13
|
* selection to `selectReadySet`)
|
|
19
14
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
15
|
+
* (Pre-v2: `epic-runner/phases/build-wave-dag.js` and `dispatch-pipeline.js`
|
|
16
|
+
* also called here; both entry seams were deleted.)
|
|
17
|
+
*
|
|
18
|
+
* Dependency source order (must stay aligned with `manifest-builder.js` and
|
|
19
|
+
* `helpers/deliver-story.md` so planning and runtime scheduling never disagree):
|
|
22
20
|
* 1. Canonical: `blocked by #NNN` / `depends on #NNN` parsed from the
|
|
23
|
-
* Story body via `parseBlockedBy` (the same parser
|
|
24
|
-
* uses).
|
|
21
|
+
* Story body via `parseBlockedBy` (the same parser planning uses).
|
|
25
22
|
* 2. Fallback: an explicit `dependencies` (ticket shape) or
|
|
26
23
|
* `dependsOn` (operator-DAG shape) array on the Story record.
|
|
27
24
|
*
|
|
@@ -45,16 +42,17 @@ import { parseBlockedBy } from './dependency-parser.js';
|
|
|
45
42
|
* Story records (live ticket payloads, fixture tickets, or operator
|
|
46
43
|
* DAG nodes).
|
|
47
44
|
* @param {object} [opts]
|
|
48
|
-
* @param {boolean} [opts.dropForeign=
|
|
49
|
-
* matching the
|
|
45
|
+
* @param {boolean} [opts.dropForeign=false] When `false` (the v2 default,
|
|
46
|
+
* matching the `/deliver` path — `stories-wave-tick.js` and the
|
|
47
|
+
* `selectReadySet` core), the operator-DAG contract is preserved: a
|
|
48
|
+
* dependency on an id absent from the input is treated as not-yet-done
|
|
49
|
+
* and withholds the dependent until it completes. When `true` (the
|
|
50
|
+
* pre-v2 Epic-scoped-wrapper semantics), edges pointing at ids outside
|
|
50
51
|
* the supplied story set are dropped so the DAG stays closed over the
|
|
51
|
-
* scheduled set.
|
|
52
|
-
* `selectReadySet` core) passes `false` to preserve the operator-DAG
|
|
53
|
-
* contract, where a dependency on an id absent from the input is treated
|
|
54
|
-
* as not-yet-done and withholds the dependent until it completes.
|
|
52
|
+
* scheduled set.
|
|
55
53
|
* @returns {Map<number, number[]>}
|
|
56
54
|
*/
|
|
57
|
-
export function buildStoryAdjacency(stories, { dropForeign =
|
|
55
|
+
export function buildStoryAdjacency(stories, { dropForeign = false } = {}) {
|
|
58
56
|
const records = Array.isArray(stories) ? stories : [];
|
|
59
57
|
const storyIds = new Set(records.map((s) => Number(s?.id ?? s?.number)));
|
|
60
58
|
const adjacency = new Map();
|