mandrel 1.94.0 → 2.0.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 +59 -73
- package/.agents/agents/story-worker.md +12 -13
- package/.agents/docs/SDLC.md +489 -1285
- package/.agents/docs/agentrc-reference.json +177 -67
- package/.agents/docs/configuration.md +104 -138
- package/.agents/docs/execution-reference.md +17 -20
- package/.agents/docs/quality-gates.md +13 -19
- package/.agents/docs/workflows.md +3 -3
- package/.agents/instructions.md +70 -81
- package/.agents/rules/ci-remediation.md +8 -12
- package/.agents/rules/git-conventions-reference.md +6 -7
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +54 -214
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/risk-verdict.schema.json +0 -13
- package/.agents/scripts/analyze-execution.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/check-lifecycle-lint.js +6 -9
- package/.agents/scripts/check-prepush-recovery.js +1 -1
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- 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 +5 -5
- 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 -4
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
- package/.agents/scripts/lib/checks/index.js +2 -1
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +16 -7
- package/.agents/scripts/lib/close-validation/gates.js +2 -2
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +45 -29
- package/.agents/scripts/lib/config/explain.js +55 -36
- package/.agents/scripts/lib/config/limits.js +17 -58
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +1 -1
- package/.agents/scripts/lib/config/runners.js +17 -50
- package/.agents/scripts/lib/config/temp-paths.js +19 -14
- 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 +24 -148
- package/.agents/scripts/lib/config-settings-schema-quality.js +8 -14
- package/.agents/scripts/lib/config-settings-schema.js +52 -38
- 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 +211 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +5 -5
- package/.agents/scripts/lib/framework-version.js +2 -3
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
- package/.agents/scripts/lib/git-utils.js +32 -6
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/label-constants.js +10 -23
- package/.agents/scripts/lib/label-taxonomy.js +9 -43
- package/.agents/scripts/lib/observability/active-story-env.js +1 -1
- package/.agents/scripts/lib/observability/hook-heartbeat.js +20 -52
- package/.agents/scripts/lib/observability/source-classifier.js +3 -3
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +8 -5
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +83 -20
- package/.agents/scripts/lib/orchestration/code-review.js +20 -268
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- 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/lifecycle/emit-loop-tick.js +8 -8
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
- 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 +13 -13
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
- 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/phases/code-review.js +15 -12
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
- package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
- package/.agents/scripts/lib/orchestration/ticket-validator.js +2 -7
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
- package/.agents/scripts/lib/planning-corpus.js +16 -11
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/story-adjacency.js +11 -14
- package/.agents/scripts/lib/story-body/story-body.js +124 -70
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
- package/.agents/scripts/lib/validation-evidence.js +1 -1
- package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
- 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 +64 -74
- package/.agents/scripts/plan-persist.js +121 -280
- package/.agents/scripts/plan-run-epilogue.js +97 -0
- package/.agents/scripts/providers/github/issues.js +17 -33
- package/.agents/scripts/providers/github/mappers.js +0 -12
- package/.agents/scripts/providers/github/tickets.js +2 -5
- package/.agents/scripts/resolve-plan-run.js +117 -0
- package/.agents/scripts/signals-view.js +24 -19
- package/.agents/scripts/single-story-close.js +11 -14
- package/.agents/scripts/single-story-confirm-merge.js +39 -23
- package/.agents/scripts/single-story-init.js +29 -20
- package/.agents/scripts/stories-wave-tick.js +6 -6
- package/.agents/scripts/story-plan.js +26 -47
- package/.agents/scripts/update-ticket-state.js +6 -15
- package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
- package/.agents/skills/core/idea-refinement/SKILL.md +6 -6
- package/.agents/skills/core/scope-triage/SKILL.md +28 -172
- package/.agents/skills/skills.index.json +3 -43
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +3 -3
- package/.agents/workflows/audit-clean-code.md +3 -3
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +5 -5
- package/.agents/workflows/audit-lighthouse.md +3 -3
- package/.agents/workflows/audit-navigability.md +3 -2
- package/.agents/workflows/audit-performance.md +3 -3
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +3 -3
- package/.agents/workflows/audit-security.md +3 -3
- package/.agents/workflows/audit-seo.md +3 -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 +3 -3
- package/.agents/workflows/deliver.md +122 -174
- package/.agents/workflows/git-cleanup.md +3 -4
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +16 -29
- package/.agents/workflows/helpers/code-review.md +70 -193
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
- package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/parallel-tooling.md +1 -1
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
- package/.agents/workflows/mandrel-update.md +2 -1
- package/.agents/workflows/plan.md +112 -145
- package/.agents/workflows/qa-assist.md +24 -30
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -2
- package/README.md +9 -8
- package/docs/CHANGELOG.md +30 -0
- package/lib/migrations/index.js +6 -5
- 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-spec.schema.json +0 -153
- 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/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- 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/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/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/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/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/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/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/post-merge-pipeline.js +0 -205
- 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-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/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/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* emits the set of Stories safe to dispatch **on this beat** — a Story
|
|
12
12
|
* becomes dispatchable the instant its own dependencies are done, under the
|
|
13
13
|
* same global concurrency cap and the same file-overlap co-dispatch guard
|
|
14
|
-
*
|
|
14
|
+
* `lib/wave-runner/ready-set.js` applies everywhere. There is no wave barrier: this no longer batches
|
|
15
15
|
* Stories into fully-draining waves; it selects continuously.
|
|
16
16
|
*
|
|
17
17
|
* The previous static wave-batch plan (group N must fully drain before
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
* `/deliver` uses — `resolveConfig` + `getRunners` reading
|
|
51
51
|
* `delivery.deliverRunner.concurrencyCap` (default 3) — so a
|
|
52
52
|
* `.agentrc.local.json` override is honored. A `--concurrency <n>` CLI flag
|
|
53
|
-
* overrides the config-resolved value for that run only. This
|
|
54
|
-
*
|
|
55
|
-
*
|
|
53
|
+
* overrides the config-resolved value for that run only. This shares one
|
|
54
|
+
* deterministic config source (`delivery.deliverRunner.concurrencyCap`) and
|
|
55
|
+
* one scheduling kernel with every `/deliver` multi-Story invocation.
|
|
56
56
|
*
|
|
57
57
|
* On cycle detection, exits with code 2 and sets cycleError in the envelope.
|
|
58
58
|
*/
|
|
@@ -74,7 +74,7 @@ Continuous ready-set planner for standalone Story delivery. Consumes a
|
|
|
74
74
|
dependency graph of Story IDs plus the live run progress and emits the set
|
|
75
75
|
of Stories safe to dispatch on this beat — a Story is dispatchable the
|
|
76
76
|
instant its own dependencies are done — plus the resolved per-beat
|
|
77
|
-
concurrency cap and the same file-overlap guard
|
|
77
|
+
concurrency cap and the same file-overlap guard as selectReadySet.
|
|
78
78
|
|
|
79
79
|
Input DAG format (JSON array):
|
|
80
80
|
[{ "id": 101, "dependsOn": [] }, { "id": 102, "dependsOn": [101] }]
|
|
@@ -257,7 +257,7 @@ export function parseConcurrencyOverride(raw) {
|
|
|
257
257
|
/**
|
|
258
258
|
* Resolve the per-beat concurrency cap.
|
|
259
259
|
*
|
|
260
|
-
* Mirrors the `/deliver` seam (`
|
|
260
|
+
* Mirrors the `/deliver` multi-Story seam (`helpers/deliver-story.md`): resolve the
|
|
261
261
|
* project config (which deep-merges `.agentrc.local.json` over `.agentrc.json`)
|
|
262
262
|
* then read `delivery.deliverRunner.concurrencyCap` via `getRunners` (default
|
|
263
263
|
* 3). An explicit `override` (the `--concurrency <n>` CLI flag) wins over
|
|
@@ -2,33 +2,17 @@
|
|
|
2
2
|
/* node:coverage ignore file */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* story-plan.js —
|
|
5
|
+
* story-plan.js — QA helper for promote round-trips and `--emit-context`
|
|
6
|
+
* envelope emission.
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Canonical operator planning is `plan-context.js` + `plan-persist.js` (see
|
|
9
|
+
* `.agents/workflows/plan.md`). Use this CLI only for QA promote
|
|
10
|
+
* round-trips (`--body` / `--dry-run`) or test harnesses that need the
|
|
11
|
+
* standalone envelope shape.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* corpus-aware `corpusContext` — the docs digest plus relevant
|
|
15
|
-
* existing-Epic Tech Spec excerpts, Story #4432) and print it as
|
|
16
|
-
* JSON on stdout. Logs route to stderr so the envelope is
|
|
17
|
-
* byte-clean for `JSON.parse`.
|
|
18
|
-
* 2. Persist mode — given a `--body <file>` authored by the host
|
|
19
|
-
* LLM after operator confirmation, validate the shape and persist
|
|
20
|
-
* via `provider.createIssue` (which also adds the new Story to
|
|
21
|
-
* the configured Projects V2 board — Story #3822) with
|
|
22
|
-
* `type::story` + the chosen persona label, falling back to
|
|
23
|
-
* `gh issue create` when the provider lacks a createIssue
|
|
24
|
-
* analogue. Prints `Next: /single-story-deliver <id>`.
|
|
25
|
-
* 3. `--dry-run` — same as persist but exits without touching
|
|
26
|
-
* GitHub. Echoes the rendered body and the `gh` argv it would
|
|
27
|
-
* have run.
|
|
28
|
-
*
|
|
29
|
-
* Mirrors the `/plan` pattern: deterministic Node I/O wrappers
|
|
30
|
-
* with HITL gating handled by the host LLM in chat. No external LLM
|
|
31
|
-
* APIs are called from this script.
|
|
13
|
+
* Operator planning:
|
|
14
|
+
* node .agents/scripts/plan-context.js --seed "…" | --seed-file <path> | --tickets <ids>
|
|
15
|
+
* node .agents/scripts/plan-persist.js --stories … --risk-verdict …
|
|
32
16
|
*/
|
|
33
17
|
|
|
34
18
|
import { readFile } from 'node:fs/promises';
|
|
@@ -53,10 +37,10 @@ import {
|
|
|
53
37
|
|
|
54
38
|
const HELP = `\
|
|
55
39
|
Usage:
|
|
56
|
-
story-plan.js --emit-context (--
|
|
57
|
-
[--
|
|
40
|
+
story-plan.js --emit-context (--seed "<seed>" | --seed-file <file>) \\
|
|
41
|
+
[--refine | --no-refine] [--pretty]
|
|
58
42
|
|
|
59
|
-
story-plan.js --body <file> [--
|
|
43
|
+
story-plan.js --body <file> [--dry-run]
|
|
60
44
|
|
|
61
45
|
story-plan.js --help
|
|
62
46
|
|
|
@@ -66,12 +50,11 @@ Modes:
|
|
|
66
50
|
draft body using the envelope and the body template.
|
|
67
51
|
--body <file> Persist a pre-authored body. Validates shape (required
|
|
68
52
|
sections, no Epic: ref, AC checklist non-empty) and
|
|
69
|
-
calls \`gh issue create\` with type::story
|
|
53
|
+
calls \`gh issue create\` with type::story.
|
|
70
54
|
--dry-run With --body: print the body and the gh argv that would
|
|
71
55
|
be invoked, then exit 0. No GitHub mutations.
|
|
72
56
|
|
|
73
57
|
Options:
|
|
74
|
-
--persona <name> Persona label (default: engineer).
|
|
75
58
|
--refine Force the idea-refinement hint on regardless of seed
|
|
76
59
|
length. Default heuristic: refine when seed < 200
|
|
77
60
|
chars.
|
|
@@ -80,17 +63,17 @@ Options:
|
|
|
80
63
|
`;
|
|
81
64
|
|
|
82
65
|
/**
|
|
83
|
-
* Resolve the seed string from --
|
|
66
|
+
* Resolve the seed string from --seed or --seed-file. One of the two
|
|
84
67
|
* must be present in --emit-context mode.
|
|
85
68
|
*/
|
|
86
|
-
async function resolveSeed({
|
|
87
|
-
if (
|
|
88
|
-
throw new Error('Pass either --
|
|
69
|
+
async function resolveSeed({ seed, seedFile }) {
|
|
70
|
+
if (seed && seedFile) {
|
|
71
|
+
throw new Error('Pass either --seed or --seed-file, not both.');
|
|
89
72
|
}
|
|
90
|
-
if (
|
|
91
|
-
if (
|
|
73
|
+
if (seed) return seed;
|
|
74
|
+
if (seedFile) return (await readFile(seedFile, 'utf8')).trim();
|
|
92
75
|
throw new Error(
|
|
93
|
-
'--emit-context requires --
|
|
76
|
+
'--emit-context requires --seed "<seed>" or --seed-file <file>.',
|
|
94
77
|
);
|
|
95
78
|
}
|
|
96
79
|
|
|
@@ -147,12 +130,11 @@ async function runEmitContext({
|
|
|
147
130
|
write = (s) => process.stdout.write(s),
|
|
148
131
|
}) {
|
|
149
132
|
const seed = await resolveSeed({
|
|
150
|
-
|
|
151
|
-
|
|
133
|
+
seed: values.seed,
|
|
134
|
+
seedFile: values['seed-file'],
|
|
152
135
|
});
|
|
153
136
|
const override = values.refine ? 'on' : values['no-refine'] ? 'off' : null;
|
|
154
137
|
const refine = shouldRefine({ seed, override });
|
|
155
|
-
const persona = values.persona ?? 'engineer';
|
|
156
138
|
|
|
157
139
|
// Corpus lookup uses the raw (un-defaulted) docsContextFiles list, same
|
|
158
140
|
// as the `/deliver` per-Epic digest builder: `config.project` fills in
|
|
@@ -186,7 +168,6 @@ async function runEmitContext({
|
|
|
186
168
|
const envelope = buildContextEnvelope({
|
|
187
169
|
seed,
|
|
188
170
|
refine,
|
|
189
|
-
persona,
|
|
190
171
|
bodyTemplate,
|
|
191
172
|
duplicateCandidates,
|
|
192
173
|
techStack,
|
|
@@ -221,8 +202,7 @@ async function runPersist({
|
|
|
221
202
|
}
|
|
222
203
|
|
|
223
204
|
const title = extractTitle(body);
|
|
224
|
-
const
|
|
225
|
-
const labels = [TYPE_LABELS.STORY, `persona::${persona}`];
|
|
205
|
+
const labels = [TYPE_LABELS.STORY];
|
|
226
206
|
const argv = renderGhArgv({ title, bodyPath, labels });
|
|
227
207
|
|
|
228
208
|
if (dryRun) {
|
|
@@ -264,7 +244,7 @@ async function runPersist({
|
|
|
264
244
|
}
|
|
265
245
|
|
|
266
246
|
write(`${JSON.stringify({ issueNumber, title, labels }, null, 2)}\n`);
|
|
267
|
-
Logger.info(`Next: /
|
|
247
|
+
Logger.info(`Next: /deliver ${issueNumber}`);
|
|
268
248
|
}
|
|
269
249
|
|
|
270
250
|
/* node:coverage ignore next */
|
|
@@ -272,10 +252,9 @@ async function main() {
|
|
|
272
252
|
const { values } = parseArgs({
|
|
273
253
|
options: {
|
|
274
254
|
'emit-context': { type: 'boolean', default: false },
|
|
275
|
-
|
|
276
|
-
'
|
|
255
|
+
seed: { type: 'string' },
|
|
256
|
+
'seed-file': { type: 'string' },
|
|
277
257
|
body: { type: 'string' },
|
|
278
|
-
persona: { type: 'string' },
|
|
279
258
|
refine: { type: 'boolean', default: false },
|
|
280
259
|
'no-refine': { type: 'boolean', default: false },
|
|
281
260
|
pretty: { type: 'boolean', default: false },
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* .agents/scripts/update-ticket-state.js — CLI
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* This file preserves backward compatibility for CLI usage and existing
|
|
8
|
-
* testing patterns.
|
|
9
|
-
*
|
|
10
|
-
* Successor to the retired mandrel MCP tools. See ADR 20260424-702a in docs/decisions.md for the migration table.
|
|
2
|
+
* .agents/scripts/update-ticket-state.js — CLI entrypoint for ticket
|
|
3
|
+
* label transitions. Core logic lives in `lib/orchestration/ticketing.js`;
|
|
4
|
+
* this file is the operator-facing command surface (not a compatibility
|
|
5
|
+
* layer).
|
|
11
6
|
*/
|
|
12
7
|
|
|
13
8
|
import { parseArgs } from 'node:util';
|
|
@@ -33,7 +28,6 @@ if (
|
|
|
33
28
|
const { values } = parseArgs({
|
|
34
29
|
args: process.argv.slice(2),
|
|
35
30
|
options: {
|
|
36
|
-
task: { type: 'string' },
|
|
37
31
|
ticket: { type: 'string' },
|
|
38
32
|
state: { type: 'string' },
|
|
39
33
|
'remove-label': { type: 'string' },
|
|
@@ -43,17 +37,14 @@ if (
|
|
|
43
37
|
strict: false,
|
|
44
38
|
});
|
|
45
39
|
|
|
46
|
-
|
|
47
|
-
// ticket type, not just Tasks). Both continue to work.
|
|
48
|
-
const idSource = values.ticket ?? values.task;
|
|
49
|
-
const ticketId = Number.parseInt(idSource, 10);
|
|
40
|
+
const ticketId = Number.parseInt(values.ticket, 10);
|
|
50
41
|
const state = values.state;
|
|
51
42
|
const removeLabel = values['remove-label'];
|
|
52
43
|
|
|
53
44
|
if (Number.isNaN(ticketId) || (!state && !removeLabel)) {
|
|
54
45
|
throw new Error(
|
|
55
46
|
'Usage: node update-ticket-state.js ' +
|
|
56
|
-
'
|
|
47
|
+
'--ticket <id> ' +
|
|
57
48
|
'[--state <state> | --remove-label <label>]',
|
|
58
49
|
);
|
|
59
50
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: analyze-execution
|
|
3
3
|
description: >-
|
|
4
|
-
Aggregate per-Story or per-
|
|
4
|
+
Aggregate per-Story or per-plan-run execution signals into a structured
|
|
5
5
|
perf-summary or perf-report and upsert it onto the corresponding GitHub
|
|
6
|
-
ticket. Use after a Story closes (Story mode) or
|
|
7
|
-
|
|
6
|
+
ticket. Use after a Story closes (Story mode) or during run closeout
|
|
7
|
+
(plan-run mode). Reads NDJSON via
|
|
8
8
|
`lib/signals/read` and writes a single structured comment.
|
|
9
9
|
allowed_tools:
|
|
10
10
|
- Read
|
|
@@ -16,42 +16,42 @@ allowed_tools:
|
|
|
16
16
|
## Policy Capsule
|
|
17
17
|
|
|
18
18
|
- Invoke via the wrapping CLI `node .agents/scripts/analyze-execution.js`; do not duplicate the read/write logic from this Skill body.
|
|
19
|
-
- Resolve mode strictly by flags:
|
|
20
|
-
- Read NDJSON signals only through `lib/signals/read` (the async-iterator entry point). Never open `<tempRoot>/
|
|
19
|
+
- Resolve mode strictly by flags: Story + run id → Story mode; run id alone → plan-run mode. The current CLI still spells the run-id flag as `--epic <id>`; treat that value as the run id and do not add a second executor path here.
|
|
20
|
+
- Read NDJSON signals only through `lib/signals/read` (the async-iterator entry point). Never open `<tempRoot>/run-<id>/stories/story-<sid>/signals.ndjson` directly — the reader owns the warn-once malformed-JSON policy.
|
|
21
21
|
- Emit a single structured GitHub comment per ticket (`<!-- structured:story-perf-summary -->` or `<!-- structured:epic-perf-report -->`); rely on `upsertStructuredComment` for idempotence — never post duplicates.
|
|
22
|
-
- Never rename or alter the structured-marker IDs; the retro composer and
|
|
22
|
+
- Never rename or alter the structured-marker IDs; the retro composer and run dashboard grep them verbatim.
|
|
23
23
|
- Validate the structured payload against `docs/data-dictionary.md §StoryPerfSummary` or `§EpicPerfReport` before posting. Schema violations exit non-zero.
|
|
24
|
-
- Soft-fail (exit 0 with a warning) when NDJSON is missing for a Story or
|
|
24
|
+
- Soft-fail (exit 0 with a warning) when NDJSON is missing for a Story or a plan-run has no children — observability output MUST NOT block the close pipeline.
|
|
25
25
|
- Do not write to disk. Persistence is GitHub; the Skill is read-NDJSON + post-comment only.
|
|
26
26
|
|
|
27
27
|
## Role
|
|
28
28
|
|
|
29
29
|
Observability writer. Composes the structured `story-perf-summary` /
|
|
30
30
|
`epic-perf-report` comment bodies the retro composer downstream renders
|
|
31
|
-
into the
|
|
31
|
+
into the run dashboard.
|
|
32
32
|
|
|
33
33
|
## When to use
|
|
34
34
|
|
|
35
|
-
- **Story mode** — after `story-close.js` finishes, the
|
|
35
|
+
- **Story mode** — after `single-story-close.js` finishes, the close
|
|
36
36
|
pipeline dispatches this Skill (or the wrapping script) to roll up the
|
|
37
37
|
Story's NDJSON signals into a single `<!-- structured:story-perf-summary -->`
|
|
38
38
|
marker comment on the Story ticket.
|
|
39
|
-
- **
|
|
40
|
-
composer), the Skill fans out across every Story under the
|
|
39
|
+
- **Plan-run mode** — during run closeout (or the retro
|
|
40
|
+
composer), the Skill fans out across every Story under the plan-run,
|
|
41
41
|
reads each Story's structured perf summary, and posts a single
|
|
42
|
-
`<!-- structured:epic-perf-report -->` marker on the
|
|
42
|
+
`<!-- structured:epic-perf-report -->` marker on the run ticket.
|
|
43
43
|
|
|
44
44
|
## Inputs
|
|
45
45
|
|
|
46
46
|
The Skill reads (never writes) the NDJSON signal stream at:
|
|
47
47
|
|
|
48
48
|
```text
|
|
49
|
-
<tempRoot>/
|
|
49
|
+
<tempRoot>/run-<id>/stories/story-<sid>/signals.ndjson
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
Use the `lib/signals/read` async-iterator entry point — never open the
|
|
53
53
|
file directly. Story mode also reads `phase-timings.json` written by
|
|
54
|
-
|
|
54
|
+
the close pipeline.
|
|
55
55
|
|
|
56
56
|
## Outputs
|
|
57
57
|
|
|
@@ -64,8 +64,8 @@ the new one.
|
|
|
64
64
|
|
|
65
65
|
### Step 1 — Resolve mode
|
|
66
66
|
|
|
67
|
-
If both
|
|
68
|
-
If only
|
|
67
|
+
If both Story id and run id are supplied → Story mode.
|
|
68
|
+
If only run id is supplied → plan-run mode. The script
|
|
69
69
|
`analyze-execution.js` is the dispatcher today; this Skill documents the
|
|
70
70
|
contract the dispatcher implements.
|
|
71
71
|
|
|
@@ -77,6 +77,9 @@ node .agents/scripts/analyze-execution.js --story <sid> --epic <eid>
|
|
|
77
77
|
node .agents/scripts/analyze-execution.js --epic <eid>
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
+
`--epic <eid>` is the legacy spelling of the run-id flag in the current
|
|
81
|
+
CLI; treat `<eid>` as the run id for path/layout purposes.
|
|
82
|
+
|
|
80
83
|
### Step 3 — Validate the structured payload before posting
|
|
81
84
|
|
|
82
85
|
The payload must conform to `docs/data-dictionary.md §StoryPerfSummary`
|
|
@@ -92,7 +95,7 @@ the contract so we never silently emit malformed comments.
|
|
|
92
95
|
- Do **not** rename the structured-marker IDs
|
|
93
96
|
(`<!-- structured:story-perf-summary -->`,
|
|
94
97
|
`<!-- structured:epic-perf-report -->`); the retro composer and the
|
|
95
|
-
|
|
98
|
+
run dashboard both grep for them verbatim.
|
|
96
99
|
- Soft-failure mode is intentional: missing NDJSON for a Story or no
|
|
97
|
-
children for
|
|
100
|
+
children for a plan-run returns exit 0 with a warning so close pipelines
|
|
98
101
|
never block on observability output.
|
|
@@ -35,12 +35,12 @@ structured divergent and convergent thinking.
|
|
|
35
35
|
|
|
36
36
|
## Activation
|
|
37
37
|
|
|
38
|
-
Called from `/plan`
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
Called from [`/plan`](../../../workflows/plan.md) during ideation when the
|
|
39
|
+
operator supplies `--seed "<text>"` (or runs ideation with no seed and
|
|
40
|
+
the host collects one interactively). The skill sharpens freeform intent
|
|
41
|
+
into canonical planning sections that `/plan` then folds into a Story.
|
|
42
|
+
There is no separate Epic Clarity Gate path in v2 — N=1 Story authoring
|
|
43
|
+
with a folded `## Spec` is the lean default.
|
|
44
44
|
|
|
45
45
|
## Usage
|
|
46
46
|
|
|
@@ -1,189 +1,45 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: scope-triage
|
|
3
3
|
description:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
planning gate that needs the canonical story-vs-epic rubric.
|
|
4
|
+
Optional split-advisory for `/plan`. Under v2 there is no epic|story routing
|
|
5
|
+
verdict — `/plan` always authors Stories. Use this skill only when judging
|
|
6
|
+
whether a draft should stay one Story or legitimately split (near-zero
|
|
7
|
+
overlap or an architectural seam).
|
|
9
8
|
---
|
|
10
9
|
|
|
11
|
-
# scope-triage
|
|
10
|
+
# scope-triage (split advisory)
|
|
12
11
|
|
|
13
12
|
## Policy Capsule
|
|
14
13
|
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
- There is **no** `epic | story | borderline` routing verdict in v2. `/plan`
|
|
15
|
+
is a single path that emits **one Story by default**.
|
|
16
|
+
- This skill is an optional **split advisory**: should the author keep one
|
|
17
|
+
Story, or does the seed clear the default-single split policy?
|
|
18
|
+
- Anchor sizing judgment to `DEFAULT_MODEL_CAPACITY` and
|
|
19
|
+
`DELIVERABLE_GRANULARITY_GUIDANCE` in
|
|
20
20
|
[`ticket-validator-sizing.js`](../../../scripts/lib/orchestration/ticket-validator-sizing.js).
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
it is read-on-demand library content, evaluated with judgment per
|
|
26
|
-
[`.agents/instructions.md` § 1.B](../../../instructions.md).
|
|
27
|
-
- Lead with **cohesion**, the same primary heuristic the sizing SSOT leads
|
|
28
|
-
with: one Story is *one coherent change with one reason to exist*. The file /
|
|
29
|
-
acceptance ceilings are the backstop, not the first cut.
|
|
30
|
-
- Bias toward `epic` only when the work genuinely spans multiple independent
|
|
31
|
-
capabilities, crosses subsystems, or carries a real dependency graph. Being
|
|
32
|
-
wrong in the `epic` direction is cheap — the Phase 8.3 consolidation pass and
|
|
33
|
-
the sizing validator catch an over-planned Story later. Being wrong in the
|
|
34
|
-
`story` direction is expensive — a story-sized scope pushed through the full
|
|
35
|
-
Epic ceremony pays a sectioned-Epic-body (Tech Spec + Acceptance Table) +
|
|
36
|
-
Story backlog +
|
|
37
|
-
`epic/<id>` integration-branch tax for a degenerate one-Story output.
|
|
38
|
-
- Keep the rubric prose **artifact-agnostic**. The thing under judgment may be a
|
|
39
|
-
sharpened one-pager, an existing Epic body, or a draft Story — the rubric
|
|
40
|
-
reads the same against all three so every consumer reuses it verbatim.
|
|
21
|
+
Do not restate numeric thresholds.
|
|
22
|
+
- Lead with **cohesion**: one Story is one coherent change with one reason
|
|
23
|
+
to exist. Coupled work stays one Story and uses `## Slicing` for
|
|
24
|
+
intra-session checkpoints.
|
|
41
25
|
|
|
42
|
-
##
|
|
26
|
+
## Split policy (when N>1 is allowed)
|
|
43
27
|
|
|
44
|
-
|
|
28
|
+
Split into sibling Stories **only** when:
|
|
45
29
|
|
|
46
|
-
|
|
30
|
+
1. **Near-zero overlap** — genuinely independent capabilities that happen to
|
|
31
|
+
share a seed idea, or
|
|
32
|
+
2. **Architectural seam** — different deployables, or a migration vs the
|
|
33
|
+
feature that consumes it.
|
|
47
34
|
|
|
48
|
-
|
|
35
|
+
Otherwise keep one Story. Persist refuses coupled splits via
|
|
36
|
+
`assertAcceptancePartition` (identical AC text across Stories).
|
|
49
37
|
|
|
50
|
-
|
|
51
|
-
change a reviewer would accept as a single PR — the
|
|
52
|
-
`DELIVERABLE_GRANULARITY_GUIDANCE.definition` notion of a Story.
|
|
53
|
-
- **Acceptance fits one Story.** The acceptance-criteria list reads as the
|
|
54
|
-
binding contract of one coherent capability rather than spanning many
|
|
55
|
-
independent outcomes. Acceptance mass is advisory-only (the
|
|
56
|
-
`softAcceptanceCount` nudge in `DEFAULT_TASK_SIZING` — there is no hard
|
|
57
|
-
ceiling), so the question is cohesion, not count.
|
|
58
|
-
- **Footprint fits Story sizing.** The plausible file footprint fits the Story
|
|
59
|
-
width described by `DEFAULT_TASK_SIZING` (the `softFiles` / `hardFiles`
|
|
60
|
-
knobs); a legitimately broad-but-cohesive change would declare `wide` rather
|
|
61
|
-
than being two Stories.
|
|
62
|
-
- **No novel architecture, no high-risk trigger.** The work introduces no novel
|
|
63
|
-
architectural decision and matches none of the `planning.riskHeuristics` in
|
|
64
|
-
`.agentrc.json` (destructive/irreversible changes, shared auth/security,
|
|
65
|
-
CI/CD gate changes, monorepo-wide rewrites, destructive migrations).
|
|
66
|
-
- **Decomposition would degenerate.** Running it through `/plan` would
|
|
67
|
-
plausibly yield exactly **one Feature with one Story** — the shape the Phase
|
|
68
|
-
8.3 consolidation skill flags only after all the spec authoring is already
|
|
69
|
-
sunk cost.
|
|
38
|
+
## Advisory output
|
|
70
39
|
|
|
71
|
-
|
|
40
|
+
Emit one of:
|
|
72
41
|
|
|
73
|
-
|
|
42
|
+
- `keep-single` — default; fold complexity into `## Spec` / `## Slicing`
|
|
43
|
+
- `split` — list the proposed Stories and the seam/overlap rationale
|
|
74
44
|
|
|
75
|
-
-
|
|
76
|
-
capabilities that each stand alone as a unit of work.
|
|
77
|
-
- **Cross-subsystem blast radius.** The change reaches across subsystems that
|
|
78
|
-
do not share one cohesive reason to exist.
|
|
79
|
-
- **A real dependency graph.** The work has internal ordering — slices that
|
|
80
|
-
must land before others — rather than one atomic change.
|
|
81
|
-
|
|
82
|
-
### `borderline`
|
|
83
|
-
|
|
84
|
-
The work is genuinely on the line — it could reasonably be one ambitious Story
|
|
85
|
-
or a small Epic, and neither call is clearly right. **Present the choice rather
|
|
86
|
-
than deciding for the operator.** Do not force a verdict to avoid the third
|
|
87
|
-
option; a borderline scope surfaced as borderline is the correct output.
|
|
88
|
-
|
|
89
|
-
## Change-Request Triage Rubric
|
|
90
|
-
|
|
91
|
-
A **change request** — "fix this", "tweak that", "extend the existing X" —
|
|
92
|
-
is the common case this rubric routes cheaply: a delta against a surface the
|
|
93
|
-
project already shipped, not a from-scratch capability. Route it to `story`
|
|
94
|
-
by default when all three delta signals hold; treat any one signal's absence
|
|
95
|
-
as a prompt to re-check, not an automatic `epic` bump.
|
|
96
|
-
|
|
97
|
-
### Delta signals
|
|
98
|
-
|
|
99
|
-
- **Delta to an already-delivered surface.** The request references a
|
|
100
|
-
concrete existing capability (a module, workflow, script, or shipped
|
|
101
|
-
feature) rather than proposing a new one. "Fix the flaky retry in
|
|
102
|
-
`evidence-gate.js`" is a delta; "add a retry framework" is not.
|
|
103
|
-
- **Existing corpus covers the touched area.** The project's docs digest
|
|
104
|
-
and/or an already-closed or in-flight Epic's Tech Spec section already
|
|
105
|
-
describe the surface being changed — the standalone-Story path can draft
|
|
106
|
-
against that inherited context (`corpusContext` in the `/plan --idea`
|
|
107
|
-
envelope) instead of re-deriving architecture from a blank slate. When no
|
|
108
|
-
corpus hit exists for the touched area, that is a signal the request may
|
|
109
|
-
be reaching into genuinely new territory — re-check the `epic` signals
|
|
110
|
-
below before defaulting to `story`.
|
|
111
|
-
- **Footprint fits Story sizing.** The plausible file footprint and
|
|
112
|
-
acceptance-criteria count still fit the Story width in
|
|
113
|
-
`DEFAULT_TASK_SIZING` (per the `story` verdict signals above) — a change
|
|
114
|
-
request that fans out across independent subsystems is sized like an Epic
|
|
115
|
-
regardless of how small the originating request sounded.
|
|
116
|
-
|
|
117
|
-
### Story-verdict rationale template
|
|
118
|
-
|
|
119
|
-
Use this template to record the verdict — it names which delta signal
|
|
120
|
-
carried the call, so a reviewer can sanity-check the routing decision without
|
|
121
|
-
re-deriving it:
|
|
122
|
-
|
|
123
|
-
```text
|
|
124
|
-
Verdict: story
|
|
125
|
-
Delta: <the existing surface this change targets>
|
|
126
|
-
Corpus hit: <docs digest section / Epic # and Tech Spec excerpt that covers
|
|
127
|
-
this area, or "none — re-checked epic signals, still story-sized">
|
|
128
|
-
Footprint: <rough file/AC count vs DEFAULT_TASK_SIZING>
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### Worked example
|
|
132
|
-
|
|
133
|
-
> Request: "The `/plan` standalone-Story path always drafts from a blank
|
|
134
|
-
> slate even when a change request is a small delta against something we
|
|
135
|
-
> already shipped — thread the existing docs digest and matching Epic
|
|
136
|
-
> Tech Spec sections into the draft context."
|
|
137
|
-
>
|
|
138
|
-
> ```text
|
|
139
|
-
> Verdict: story
|
|
140
|
-
> Delta: story-plan.js's --emit-context envelope and the plan-story.md
|
|
141
|
-
> Phase 2 drafting instructions — both already exist and ship today.
|
|
142
|
-
> Corpus hit: Epic #4429's own Tech Spec section (this rubric's parent
|
|
143
|
-
> Epic) already describes the docs-digest reuse pattern from
|
|
144
|
-
> orchestration/docs-digest.js.
|
|
145
|
-
> Footprint: one new lib module (planning-corpus.js), one envelope field,
|
|
146
|
-
> one helper-doc instruction — comfortably inside DEFAULT_TASK_SIZING's
|
|
147
|
-
> softFiles/softAcceptanceCount band.
|
|
148
|
-
> ```
|
|
149
|
-
|
|
150
|
-
## Handoff & no-re-triage rule
|
|
151
|
-
|
|
152
|
-
A workflow entered via a scope-triage **handoff** MUST NOT re-triage. A handoff
|
|
153
|
-
*is* a triage decision already made — re-running this gate on the receiving side
|
|
154
|
-
would re-litigate a settled call and risk a ping-pong between two planning
|
|
155
|
-
workflows. Handoff invocations identify themselves as such (e.g. `/plan`
|
|
156
|
-
entered via a `/plan` scope-triage escalation, or `/plan` entered
|
|
157
|
-
via an `/plan` Phase 1.5 handoff), and the receiving workflow skips its own
|
|
158
|
-
scope-triage gate when it detects the handoff marker.
|
|
159
|
-
|
|
160
|
-
## When to use
|
|
161
|
-
|
|
162
|
-
- **`/plan` Phase 1.5** (ideation path only) — judge the sharpened
|
|
163
|
-
one-pager Phase 1 produced before the Epic ceremony is paid for. The verdict
|
|
164
|
-
folds into the existing Phase 1 HITL stop; on a `story` / `borderline`
|
|
165
|
-
verdict the operator may hand off to
|
|
166
|
-
[`/plan --from-notes`](../../../workflows/helpers/plan-story.md).
|
|
167
|
-
- Any other planning gate that needs the canonical story-vs-epic rubric. Keep
|
|
168
|
-
the rubric here as the SSOT; consumers reference this file rather than
|
|
169
|
-
forking the prose.
|
|
170
|
-
|
|
171
|
-
## Output
|
|
172
|
-
|
|
173
|
-
A single verdict (`epic` | `story` | `borderline`) plus a one-paragraph
|
|
174
|
-
rationale grounded in the signals above. The rationale names the deciding
|
|
175
|
-
signal (cohesion, capability count, blast radius, dependency graph, or sizing
|
|
176
|
-
fit) so the operator can sanity-check the call before acting on it.
|
|
177
|
-
|
|
178
|
-
## Anti-patterns to avoid
|
|
179
|
-
|
|
180
|
-
- **Restating the sizing numbers.** Reference `DEFAULT_TASK_SIZING` /
|
|
181
|
-
`DELIVERABLE_GRANULARITY_GUIDANCE`; never copy the thresholds into this file
|
|
182
|
-
(they would drift from the validator).
|
|
183
|
-
- **Auto-routing on the verdict.** The verdict is advisory; the operator
|
|
184
|
-
decides. Never silently fork a workflow on a `story` verdict.
|
|
185
|
-
- **Forcing a binary call.** When the work is genuinely on the line, emit
|
|
186
|
-
`borderline` and present the choice. Do not collapse it to `epic` or `story`
|
|
187
|
-
to look decisive.
|
|
188
|
-
- **Re-triaging after a handoff.** A handoff is a settled decision. Skip the
|
|
189
|
-
gate when the invocation identifies itself as a scope-triage handoff.
|
|
45
|
+
Never auto-route. The operator (or `--yes` default = `keep-single`) decides.
|