mandrel 1.59.0 → 1.60.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 +14 -14
- package/.agents/docs/SDLC.md +129 -134
- package/.agents/docs/configuration.md +16 -16
- package/.agents/docs/workflows.md +6 -8
- package/.agents/instructions.md +12 -11
- package/.agents/personas/architect.md +1 -1
- package/.agents/personas/product.md +1 -1
- package/.agents/personas/project-manager.md +14 -14
- package/.agents/personas/technical-writer.md +1 -1
- package/.agents/rules/changelog-style.md +5 -5
- package/.agents/rules/git-conventions.md +3 -3
- package/.agents/schemas/agentrc.schema.json +3 -3
- package/.agents/schemas/dispatch-manifest.json +4 -4
- package/.agents/schemas/epic-spec.schema.json +15 -45
- package/.agents/schemas/lifecycle/README.md +1 -1
- package/.agents/schemas/lifecycle/story.dispatch.end.schema.json +1 -1
- package/.agents/schemas/lifecycle/story.dispatch.start.schema.json +1 -1
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +1 -1
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/README.md +1 -1
- package/.agents/scripts/acceptance-eval.js +1 -1
- package/.agents/scripts/acceptance-spec-reconciler.js +2 -2
- package/.agents/scripts/analyze-execution.js +2 -2
- package/.agents/scripts/audit-to-stories.js +1 -1
- package/.agents/scripts/check-doc-links.js +2 -3
- package/.agents/scripts/diagnose-friction.js +1 -1
- package/.agents/scripts/dispatcher.js +2 -2
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/epic-audit-prepare.js +3 -3
- package/.agents/scripts/epic-deliver-note-intervention.js +2 -2
- package/.agents/scripts/epic-deliver-preflight.js +6 -6
- package/.agents/scripts/epic-deliver-prepare.js +1 -1
- package/.agents/scripts/epic-execute-record-wave.js +4 -4
- package/.agents/scripts/epic-plan-healthcheck.js +6 -10
- package/.agents/scripts/epic-plan-spec-validate.js +1 -1
- package/.agents/scripts/epic-reconcile.js +11 -29
- package/.agents/scripts/evidence-gate.js +1 -1
- package/.agents/scripts/generate-workflows-doc.js +1 -1
- package/.agents/scripts/hierarchy-gate.js +7 -11
- package/.agents/scripts/lib/ITicketingProvider.js +1 -1
- package/.agents/scripts/lib/audit-suite/selector.js +1 -1
- package/.agents/scripts/lib/audit-to-stories/seed-epic-from-findings.js +2 -2
- package/.agents/scripts/lib/baseline-snapshot.js +7 -7
- package/.agents/scripts/lib/bdd-runner-detect.js +1 -1
- package/.agents/scripts/lib/bdd-scenario-scanner.js +3 -3
- package/.agents/scripts/lib/bootstrap/baselines-layout-migration.js +1 -1
- package/.agents/scripts/lib/bootstrap/branch-protection.js +1 -1
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +1 -1
- package/.agents/scripts/lib/bootstrap/commit-push.js +2 -2
- package/.agents/scripts/lib/codebase-snapshot.js +1 -1
- package/.agents/scripts/lib/config/explain.js +1 -1
- package/.agents/scripts/lib/config/runners.js +2 -2
- package/.agents/scripts/lib/config/runtime.js +1 -1
- package/.agents/scripts/lib/config/temp-paths.js +2 -2
- package/.agents/scripts/lib/config-settings-schema-delivery.js +2 -2
- package/.agents/scripts/lib/config-settings-schema-quality.js +1 -1
- package/.agents/scripts/lib/config-settings-schema.js +3 -3
- package/.agents/scripts/lib/duplicate-search.js +1 -1
- package/.agents/scripts/lib/dynamic-workflow/capability.js +1 -1
- package/.agents/scripts/lib/epic-plan-clarity.js +1 -1
- package/.agents/scripts/lib/epic-plan-ideation.js +1 -1
- package/.agents/scripts/lib/feedback-loop/memory-freshness.js +1 -1
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +1 -1
- package/.agents/scripts/lib/findings/classify-finding.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +10 -10
- package/.agents/scripts/lib/label-constants.js +3 -4
- package/.agents/scripts/lib/label-taxonomy.js +3 -8
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +1 -1
- package/.agents/scripts/lib/orchestration/code-review.js +5 -5
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +8 -9
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +3 -3
- package/.agents/scripts/lib/orchestration/detectors-phase.js +2 -2
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +30 -38
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +9 -25
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +1 -1
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +8 -8
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +1 -1
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +7 -21
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +3 -3
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +26 -13
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +1 -1
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/prompts.js +1 -1
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +2 -2
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +1 -1
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +3 -3
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +4 -4
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +3 -3
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +6 -21
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +7 -7
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +1 -1
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +2 -2
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +4 -4
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +4 -4
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +8 -8
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +4 -4
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +7 -15
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +72 -41
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +2 -4
- package/.agents/scripts/lib/orchestration/file-assumptions.js +2 -2
- package/.agents/scripts/lib/orchestration/finalize/close-planning-tickets.js +1 -1
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +2 -2
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +1 -1
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -3
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +1 -1
- package/.agents/scripts/lib/orchestration/manifest-builder.js +5 -5
- package/.agents/scripts/lib/orchestration/parked-follow-ons.js +2 -2
- package/.agents/scripts/lib/orchestration/plan-runner/plan-router.js +5 -5
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +3 -3
- package/.agents/scripts/lib/orchestration/preflight-cache.js +1 -1
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +1 -1
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +1 -1
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +2 -2
- package/.agents/scripts/lib/orchestration/retro-runner.js +3 -3
- package/.agents/scripts/lib/orchestration/review-depth.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/spec-freshness.js +1 -1
- package/.agents/scripts/lib/orchestration/spec-renderer.js +36 -73
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +1 -1
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +1 -1
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +2 -2
- package/.agents/scripts/lib/orchestration/task-body-validator.js +6 -6
- package/.agents/scripts/lib/orchestration/ticket-lease.js +1 -1
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +2 -2
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +1 -10
- package/.agents/scripts/lib/orchestration/ticket-validator.js +25 -70
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +5 -12
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +8 -8
- package/.agents/scripts/lib/orchestration/ticketing/state.js +3 -3
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +2 -2
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +1 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +1 -1
- package/.agents/scripts/lib/preflight-runner.js +1 -1
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +4 -5
- package/.agents/scripts/lib/presentation/manifest-builder.js +28 -34
- package/.agents/scripts/lib/presentation/manifest-formatter.js +3 -4
- package/.agents/scripts/lib/presentation/manifest-helpers.js +1 -1
- package/.agents/scripts/lib/presentation/manifest-procedures.js +4 -4
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +4 -23
- package/.agents/scripts/lib/presentation/manifest-renderer.js +1 -1
- package/.agents/scripts/lib/presentation/manifest-story-views.js +2 -11
- package/.agents/scripts/lib/signals/schema.js +1 -1
- package/.agents/scripts/lib/spec/index.js +1 -1
- package/.agents/scripts/lib/spec/loader.js +2 -2
- package/.agents/scripts/lib/spec/state.js +7 -16
- package/.agents/scripts/lib/story-init/context-resolver.js +3 -3
- package/.agents/scripts/lib/story-init/state-transitioner.js +2 -2
- package/.agents/scripts/lib/story-init/task-graph-builder.js +7 -7
- package/.agents/scripts/lib/story-lifecycle.js +8 -8
- package/.agents/scripts/lib/story-plan.js +1 -1
- package/.agents/scripts/lib/templates/decomposer-prompts.js +59 -52
- package/.agents/scripts/lib/wave-runner/tick.js +1 -1
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +1 -1
- package/.agents/scripts/lifecycle-emit.js +1 -1
- package/.agents/scripts/providers/github/board-add.js +1 -1
- package/.agents/scripts/providers/github/errors.js +1 -1
- package/.agents/scripts/providers/github/mappers.js +2 -2
- package/.agents/scripts/providers/github/tickets.js +4 -4
- package/.agents/scripts/resync-status-column.js +1 -1
- package/.agents/scripts/retro-run.js +2 -2
- package/.agents/scripts/run-lint.js +1 -1
- package/.agents/scripts/single-story-init.js +1 -1
- package/.agents/scripts/stories-wave-tick.js +5 -5
- package/.agents/scripts/story-close.js +1 -1
- package/.agents/scripts/story-init.js +13 -16
- package/.agents/scripts/story-phase.js +5 -5
- package/.agents/scripts/story-plan.js +3 -3
- package/.agents/scripts/sync-branch-from-base.js +1 -1
- package/.agents/scripts/validate-docs-freshness.js +1 -1
- package/.agents/scripts/wave-tick.js +1 -1
- package/.agents/skills/core/analyze-execution/SKILL.md +2 -2
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +21 -26
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +23 -56
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +4 -4
- package/.agents/skills/core/hydrate-context/SKILL.md +2 -2
- package/.agents/skills/core/idea-refinement/SKILL.md +4 -4
- package/.agents/skills/core/knowledge-transfer/SKILL.md +2 -2
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +1 -1
- package/.agents/skills/core/scope-triage/SKILL.md +9 -10
- package/.agents/skills/core/using-agent-skills/SKILL.md +1 -1
- package/.agents/skills/skills.index.json +7 -7
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/workflows/agents-update.md +2 -2
- package/.agents/workflows/audit-architecture.md +2 -2
- package/.agents/workflows/audit-clean-code.md +2 -2
- package/.agents/workflows/audit-dependencies.md +1 -1
- package/.agents/workflows/audit-devops.md +1 -1
- package/.agents/workflows/audit-documentation.md +2 -2
- package/.agents/workflows/audit-lighthouse.md +1 -1
- package/.agents/workflows/audit-performance.md +2 -2
- package/.agents/workflows/audit-privacy.md +1 -1
- package/.agents/workflows/audit-quality.md +2 -2
- package/.agents/workflows/audit-security.md +2 -2
- package/.agents/workflows/audit-seo.md +1 -1
- package/.agents/workflows/audit-sre.md +1 -1
- package/.agents/workflows/audit-to-stories.md +10 -10
- package/.agents/workflows/audit-ux-ui.md +1 -1
- package/.agents/workflows/deliver.md +85 -0
- package/.agents/workflows/explain.md +3 -3
- package/.agents/workflows/git-merge-pr.md +1 -1
- package/.agents/workflows/git-pr-all.md +13 -10
- package/.agents/workflows/git-push.md +6 -3
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +1 -1
- package/.agents/workflows/helpers/code-review.md +5 -5
- package/.agents/workflows/{epic-deliver.md → helpers/deliver-epic.md} +43 -43
- package/.agents/workflows/{story-deliver.md → helpers/deliver-stories.md} +25 -25
- package/.agents/workflows/helpers/diagnose.md +1 -1
- package/.agents/workflows/helpers/epic-audit.md +6 -6
- package/.agents/workflows/helpers/epic-deliver-story.md +13 -13
- package/.agents/workflows/helpers/epic-plan-decompose.md +23 -23
- package/.agents/workflows/helpers/epic-plan-spec.md +6 -6
- package/.agents/workflows/helpers/epic-testing.md +3 -3
- package/.agents/workflows/helpers/parallel-tooling.md +1 -1
- package/.agents/workflows/{epic-plan.md → helpers/plan-epic.md} +84 -84
- package/.agents/workflows/{story-plan.md → helpers/plan-story.md} +43 -43
- package/.agents/workflows/helpers/signals.md +1 -1
- package/.agents/workflows/helpers/single-story-deliver.md +11 -11
- package/.agents/workflows/helpers/worktree-lifecycle.md +18 -18
- package/.agents/workflows/onboard.md +17 -17
- package/.agents/workflows/plan.md +89 -0
- package/.agents/workflows/qa-explore.md +1 -1
- package/.agents/workflows/qa-run-harness.md +1 -1
- package/README.md +4 -12
- package/docs/CHANGELOG.md +1149 -0
- package/lib/cli/__tests__/update-changelog-surface.test.js +357 -0
- package/lib/cli/__tests__/update-reexec.test.js +513 -0
- package/lib/cli/init.js +31 -29
- package/lib/cli/update.js +413 -52
- package/package.json +2 -1
- package/.agents/scripts/lib/orchestration/reconciler.js +0 -137
|
@@ -4,7 +4,7 @@ description:
|
|
|
4
4
|
Work Breakdown) for a GitHub Epic.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# /epic
|
|
7
|
+
# helpers/plan-epic — Epic planning path (invoked by /plan)
|
|
8
8
|
|
|
9
9
|
## Role
|
|
10
10
|
|
|
@@ -14,11 +14,11 @@ Director / Architect
|
|
|
14
14
|
|
|
15
15
|
You are the master orchestrator for the v5 Epic-Centric ticketing pipeline. Your
|
|
16
16
|
goal is to transform a high-level Epic into a fully decomposed, ready-to-execute
|
|
17
|
-
backlog of
|
|
17
|
+
backlog of Stories.
|
|
18
18
|
|
|
19
|
-
`/
|
|
20
|
-
phase helpers — [`helpers/epic-plan-spec.md`](
|
|
21
|
-
[`helpers/epic-plan-decompose.md`](
|
|
19
|
+
`/plan` is the unified planning entry point. It delegates to the two
|
|
20
|
+
phase helpers — [`helpers/epic-plan-spec.md`](epic-plan-spec.md) and
|
|
21
|
+
[`helpers/epic-plan-decompose.md`](epic-plan-decompose.md) — and runs
|
|
22
22
|
both phases sequentially with a human confirmation gate between them. The Epic
|
|
23
23
|
ID is the single positional argument.
|
|
24
24
|
|
|
@@ -34,12 +34,12 @@ artifacts you author.
|
|
|
34
34
|
- Wait for user validation before migrating to Phase 8 when
|
|
35
35
|
`planningRisk.requiresReview` is true (or the operator passes
|
|
36
36
|
`--force-review`). Low-risk Epics auto-proceed after spec validation.
|
|
37
|
-
See [SDLC § Adaptive planning risk routing](
|
|
37
|
+
See [SDLC § Adaptive planning risk routing](../../docs/SDLC.md#adaptive-planning-risk-routing)
|
|
38
38
|
for the full envelope shape and the planner-selected
|
|
39
39
|
`acceptance::n-a` route.
|
|
40
40
|
- Delegate Phase 7 and Phase 8 to the
|
|
41
|
-
[`helpers/epic-plan-spec.md`](
|
|
42
|
-
[`helpers/epic-plan-decompose.md`](
|
|
41
|
+
[`helpers/epic-plan-spec.md`](epic-plan-spec.md) and
|
|
42
|
+
[`helpers/epic-plan-decompose.md`](epic-plan-decompose.md)
|
|
43
43
|
procedures respectively — they own the Epic lifecycle label transitions and
|
|
44
44
|
the `epic-plan-state` checkpoint. This wrapper must not apply those labels
|
|
45
45
|
directly.
|
|
@@ -78,7 +78,7 @@ Phase 5 (Re-Plan Detection).
|
|
|
78
78
|
to the operator and **STOP**. Do not proceed to Phase 2 until the
|
|
79
79
|
user explicitly confirms the direction. This is the same gate the
|
|
80
80
|
skill's own Phase 3 enforces; surfacing it here makes the wait
|
|
81
|
-
contract visible to `/
|
|
81
|
+
contract visible to `/plan` callers. When the Phase 1.5 verdict is
|
|
82
82
|
`story` or `borderline`, this stop carries the three-way choice the
|
|
83
83
|
triage gate defines (below) instead of a plain confirm.
|
|
84
84
|
|
|
@@ -87,18 +87,18 @@ Phase 5 (Re-Plan Detection).
|
|
|
87
87
|
This phase runs **only** on the ideation path, immediately after Phase 1
|
|
88
88
|
produces the sharpened one-pager. It is **skipped entirely** when an Epic ID
|
|
89
89
|
argument was supplied (the existing-Epic path jumps straight to Phase 5), and
|
|
90
|
-
it is **skipped** when `/
|
|
91
|
-
[`/
|
|
90
|
+
it is **skipped** when `/plan` was entered via a scope-triage handoff from
|
|
91
|
+
[`/plan`](plan-story.md) — a handoff is a triage decision already made,
|
|
92
92
|
and re-triaging it would re-litigate a settled call (the no-re-triage rule the
|
|
93
93
|
skill states once).
|
|
94
94
|
|
|
95
95
|
1. **Activate the scope-triage skill**: Read
|
|
96
|
-
[`<agentRoot>/skills/core/scope-triage/SKILL.md`](
|
|
96
|
+
[`<agentRoot>/skills/core/scope-triage/SKILL.md`](../../skills/core/scope-triage/SKILL.md)
|
|
97
97
|
via the `Read` tool (resolve `<agentRoot>` from `project.paths.agentRoot` —
|
|
98
98
|
default `.agents`) and apply its rubric to the Phase 1 one-pager. The skill
|
|
99
99
|
anchors its sizing judgment **by reference** to
|
|
100
100
|
`DELIVERABLE_GRANULARITY_GUIDANCE` / `DEFAULT_TASK_SIZING` in
|
|
101
|
-
[`ticket-validator-sizing.js`](
|
|
101
|
+
[`ticket-validator-sizing.js`](../../scripts/lib/orchestration/ticket-validator-sizing.js)
|
|
102
102
|
and emits one verdict: `epic` | `story` | `borderline`. The verdict is
|
|
103
103
|
host-LLM judgment — there is **no `--flag`**, no scorer, no schema, and no
|
|
104
104
|
label transition.
|
|
@@ -111,9 +111,9 @@ skill states once).
|
|
|
111
111
|
presents a **three-way operator choice**:
|
|
112
112
|
- **Recommended: single Story** (with the triage rationale) — persist the
|
|
113
113
|
one-pager to a notes file and hand off to
|
|
114
|
-
`/
|
|
115
|
-
scope-triage handoff so `/
|
|
116
|
-
`/
|
|
114
|
+
`/plan --from-notes <path>`, identifying the invocation as a
|
|
115
|
+
scope-triage handoff so `/plan` skips its own gate. Then **exit
|
|
116
|
+
`/plan`**.
|
|
117
117
|
- **Plan as Epic anyway** — ignore the recommendation and continue to
|
|
118
118
|
Phase 2 with the one-pager.
|
|
119
119
|
- **Abort** — stop planning entirely.
|
|
@@ -133,7 +133,7 @@ opening a duplicate.
|
|
|
133
133
|
|
|
134
134
|
1. **Invoke the duplicate-search module**: Call
|
|
135
135
|
`findSimilarOpenEpics({ onePager, provider })` exported from
|
|
136
|
-
[`.agents/scripts/lib/duplicate-search.js`](
|
|
136
|
+
[`.agents/scripts/lib/duplicate-search.js`](../../scripts/lib/duplicate-search.js).
|
|
137
137
|
The `provider` is the resolved ticketing provider
|
|
138
138
|
(`provider-factory.js`), and `onePager` is the markdown returned by
|
|
139
139
|
Phase 1.
|
|
@@ -142,7 +142,7 @@ opening a duplicate.
|
|
|
142
142
|
list, render the candidates (id, title, score, URL) and **STOP**. Do
|
|
143
143
|
not proceed to Phase 3 until the user either (a) confirms the new
|
|
144
144
|
Epic is genuinely distinct or (b) chooses to fold the idea into one of
|
|
145
|
-
the existing Epics, in which case `/
|
|
145
|
+
the existing Epics, in which case `/plan` exits and the operator
|
|
146
146
|
resumes work on the existing Epic ID.
|
|
147
147
|
|
|
148
148
|
3. **No-match fast path**: If the module returns `[]`, proceed
|
|
@@ -155,9 +155,9 @@ new Epic is genuinely distinct).
|
|
|
155
155
|
|
|
156
156
|
1. **Render the body**: Call
|
|
157
157
|
`renderEpicBody({ onePager, template })` exported from
|
|
158
|
-
[`.agents/scripts/lib/epic-plan-ideation.js`](
|
|
158
|
+
[`.agents/scripts/lib/epic-plan-ideation.js`](../../scripts/lib/epic-plan-ideation.js).
|
|
159
159
|
The `template` argument is the contents of
|
|
160
|
-
[`.agents/templates/epic-from-idea.md`](
|
|
160
|
+
[`.agents/templates/epic-from-idea.md`](../../templates/epic-from-idea.md),
|
|
161
161
|
which carries the five canonical sections (Context, Goal, Non-Goals,
|
|
162
162
|
Scope, Acceptance Criteria). Sections missing from the one-pager are
|
|
163
163
|
rendered as `_(not specified)_` rather than left as raw `{{token}}`
|
|
@@ -180,7 +180,7 @@ new Epic is genuinely distinct).
|
|
|
180
180
|
**Board membership (Story #3822)**: the provider's `createIssue`
|
|
181
181
|
adds the new Epic to the configured Projects V2 board via the
|
|
182
182
|
shared `addIssueToBoard` helper
|
|
183
|
-
([`providers/github/board-add.js`](
|
|
183
|
+
([`providers/github/board-add.js`](../../scripts/providers/github/board-add.js))
|
|
184
184
|
— idempotent, non-fatal (warn-on-error), and a no-op when no
|
|
185
185
|
project number is configured — so the Epic lands on the board
|
|
186
186
|
without relying on GitHub's "Auto-add to project" built-in
|
|
@@ -216,13 +216,13 @@ planned.
|
|
|
216
216
|
> tickets. Do you want to **re-plan**? This will **overwrite the PRD,
|
|
217
217
|
> Tech Spec, and Acceptance Spec in place** (same issue numbers, refreshed
|
|
218
218
|
> bodies, comment history preserved) and **close-and-recreate** all
|
|
219
|
-
>
|
|
219
|
+
> child Story tickets."
|
|
220
220
|
|
|
221
221
|
3. **If user confirms re-plan**: Pass `--force` to all subsequent script
|
|
222
222
|
invocations. Under `--force`, the three context tickets (PRD, Tech Spec,
|
|
223
223
|
Acceptance Spec) are overwritten in place — their issue numbers, Epic
|
|
224
224
|
sub-issue links, and prior discussion are preserved, and each receives a
|
|
225
|
-
one-line regeneration audit comment.
|
|
225
|
+
one-line regeneration audit comment. Child Story tickets are still
|
|
226
226
|
closed and recreated, because a re-decomposition can legitimately produce a
|
|
227
227
|
different ticket set.
|
|
228
228
|
4. **If user declines**: Abort gracefully.
|
|
@@ -243,8 +243,8 @@ The advisory runs **only** when **both** hold:
|
|
|
243
243
|
1. **Phase 5 found no planning artifacts** — the Epic body has no
|
|
244
244
|
`## Planning Artifacts` section linking a PRD / Tech Spec (i.e. Phase 5
|
|
245
245
|
did **not** enter its re-plan branch).
|
|
246
|
-
2. **The Epic has no open
|
|
247
|
-
|
|
246
|
+
2. **The Epic has no open Story children** — no open `type::story`
|
|
247
|
+
sub-issues are linked to this Epic.
|
|
248
248
|
|
|
249
249
|
If **either** condition fails, **skip this phase silently** and continue to
|
|
250
250
|
Phase 6. It must **never** fire on the re-plan path: recommending a "downgrade
|
|
@@ -256,14 +256,14 @@ triage on the one-pager before the Epic existed.
|
|
|
256
256
|
### Triage
|
|
257
257
|
|
|
258
258
|
1. **Activate the scope-triage skill**: Read
|
|
259
|
-
[`<agentRoot>/skills/core/scope-triage/SKILL.md`](
|
|
259
|
+
[`<agentRoot>/skills/core/scope-triage/SKILL.md`](../../skills/core/scope-triage/SKILL.md)
|
|
260
260
|
via the `Read` tool (resolve `<agentRoot>` from `project.paths.agentRoot` —
|
|
261
261
|
default `.agents`) and apply its rubric to the **Epic body**. The skill is
|
|
262
262
|
artifact-agnostic — it reads the same against an Epic body as against a
|
|
263
263
|
one-pager or a Story draft — and anchors its sizing judgment **by
|
|
264
264
|
reference** to `DELIVERABLE_GRANULARITY_GUIDANCE` / `DEFAULT_TASK_SIZING`
|
|
265
265
|
in
|
|
266
|
-
[`ticket-validator-sizing.js`](
|
|
266
|
+
[`ticket-validator-sizing.js`](../../scripts/lib/orchestration/ticket-validator-sizing.js).
|
|
267
267
|
It emits one verdict: `epic` | `story` | `borderline`. The verdict is
|
|
268
268
|
host-LLM judgment — there is **no `--flag`**, no scorer, no schema, and no
|
|
269
269
|
label transition behind this gate. Do **not** restate the skill's rubric or
|
|
@@ -299,11 +299,11 @@ closes the Epic in its favor, and **every** issue mutation below happens
|
|
|
299
299
|
1. **Seed a notes file from the Epic body.** Write the Epic's Context / Goal /
|
|
300
300
|
Scope / Acceptance Criteria into a seed file under
|
|
301
301
|
`temp/epic-[Epic_ID]/scope-triage-seed.md` (the `temp/` tree is gitignored).
|
|
302
|
-
This is the same notes-file shape `/
|
|
302
|
+
This is the same notes-file shape `/plan --from-notes` consumes.
|
|
303
303
|
|
|
304
|
-
2. **Hand off to `/
|
|
305
|
-
[`/
|
|
306
|
-
**identifying the invocation as a scope-triage handoff** so `/
|
|
304
|
+
2. **Hand off to `/plan --from-notes`.** Invoke
|
|
305
|
+
[`/plan --from-notes temp/epic-[Epic_ID]/scope-triage-seed.md`](plan-story.md),
|
|
306
|
+
**identifying the invocation as a scope-triage handoff** so `/plan`
|
|
307
307
|
skips its own escalation gate (the skill's no-re-triage rule — a handoff is
|
|
308
308
|
a settled triage decision, and re-running the gate on the receiving side
|
|
309
309
|
would re-litigate it and risk a ping-pong between the two workflows). The
|
|
@@ -311,7 +311,7 @@ closes the Epic in its favor, and **every** issue mutation below happens
|
|
|
311
311
|
(`Converted from Epic #[Epic_ID] — scope triaged as a standalone Story`) so
|
|
312
312
|
the audit trail is bidirectional.
|
|
313
313
|
|
|
314
|
-
3. **Close the Epic in favor of the replacement.** Once `/
|
|
314
|
+
3. **Close the Epic in favor of the replacement.** Once `/plan` has
|
|
315
315
|
created the replacement Story (capture its number as `#N`), close the Epic
|
|
316
316
|
with a cross-linking comment:
|
|
317
317
|
|
|
@@ -326,10 +326,10 @@ closes the Epic in its favor, and **every** issue mutation below happens
|
|
|
326
326
|
give a reviewer the full bidirectional trail.
|
|
327
327
|
|
|
328
328
|
The conversion mutates two issues (creates the Story, closes the Epic) — both
|
|
329
|
-
behind the single operator confirmation above. After conversion `/
|
|
329
|
+
behind the single operator confirmation above. After conversion `/plan`
|
|
330
330
|
exits: the work now lives on the standalone Story, which the operator delivers
|
|
331
|
-
via [`/single-story-deliver`](
|
|
332
|
-
[`/
|
|
331
|
+
via [`/single-story-deliver`](single-story-deliver.md) or
|
|
332
|
+
[`/deliver`](deliver-stories.md).
|
|
333
333
|
|
|
334
334
|
## Phase 6: Epic Clarity Gate
|
|
335
335
|
|
|
@@ -338,7 +338,7 @@ Detection) and the Phase 5.5 story-sized advisory, and before Phase 7
|
|
|
338
338
|
(PRD, Tech Spec & Acceptance Spec). The gate scores the Epic body
|
|
339
339
|
against the five canonical
|
|
340
340
|
sections from
|
|
341
|
-
[`.agents/templates/epic-from-idea.md`](
|
|
341
|
+
[`.agents/templates/epic-from-idea.md`](../../templates/epic-from-idea.md)
|
|
342
342
|
(Context, Goal, Non-Goals, Scope, Acceptance Criteria) and either
|
|
343
343
|
skips fast (when the Epic body is already clear) or drops into a
|
|
344
344
|
refinement loop seeded from the current Epic body. The scorer also
|
|
@@ -352,8 +352,8 @@ canonical headings. A `clear` verdict requires **both** ≥ 4 of 5
|
|
|
352
352
|
sections present **and** the **Acceptance Criteria** section present —
|
|
353
353
|
AC is a required section, not one of the four optional passers, so an
|
|
354
354
|
Epic with no Acceptance Criteria is always `needs-refinement` (it would
|
|
355
|
-
otherwise hard-fail the `/
|
|
356
|
-
[`lib/epic-plan-clarity.js`](
|
|
355
|
+
otherwise hard-fail the `/deliver` start gate downstream). See
|
|
356
|
+
[`lib/epic-plan-clarity.js`](../../scripts/lib/epic-plan-clarity.js)
|
|
357
357
|
for the scoring logic.
|
|
358
358
|
|
|
359
359
|
1. **Score the body**: Run the clarity-check CLI in context-emission
|
|
@@ -373,7 +373,7 @@ for the scoring logic.
|
|
|
373
373
|
|
|
374
374
|
3. **Needs-refinement path**: When `verdict === 'needs-refinement'`,
|
|
375
375
|
activate the
|
|
376
|
-
[`core/idea-refinement`](
|
|
376
|
+
[`core/idea-refinement`](../../skills/core/idea-refinement/SKILL.md)
|
|
377
377
|
skill **seeded from the current Epic body** (not a blank seed),
|
|
378
378
|
with `missingOrPlaceholder` as the convergence target. The skill
|
|
379
379
|
runs its three-phase divergent → convergent → sharpen loop and
|
|
@@ -381,9 +381,9 @@ for the scoring logic.
|
|
|
381
381
|
|
|
382
382
|
4. **Re-render the body**: Call
|
|
383
383
|
`renderEpicBody({ onePager, template })` from
|
|
384
|
-
[`lib/epic-plan-ideation.js`](
|
|
384
|
+
[`lib/epic-plan-ideation.js`](../../scripts/lib/epic-plan-ideation.js)
|
|
385
385
|
(the same helper Phase 3 uses), passing the contents of
|
|
386
|
-
[`.agents/templates/epic-from-idea.md`](
|
|
386
|
+
[`.agents/templates/epic-from-idea.md`](../../templates/epic-from-idea.md).
|
|
387
387
|
Write the result to `temp/epic-[Epic_ID]/clarity-update.md`.
|
|
388
388
|
|
|
389
389
|
5. **HITL stop — confirm the diff**: Display the diff between the
|
|
@@ -421,11 +421,11 @@ for the scoring logic.
|
|
|
421
421
|
> `lib/orchestration/epic-plan-lease-guard.js`). The lease rides the Epic's
|
|
422
422
|
> single assignee: the operator (`github.operatorHandle` in `.agentrc.json`)
|
|
423
423
|
> claims the Epic for the duration of the plan. The guard **fails closed**:
|
|
424
|
-
> `/
|
|
424
|
+
> `/plan` emits no `story.heartbeat` during its run (heartbeats are a
|
|
425
425
|
> delivery-time signal), so there is no live-heartbeat source to judge a
|
|
426
426
|
> concurrent plan's liveness from. Any **foreign assignee** is therefore
|
|
427
427
|
> treated as a live claim — the persist half **exits non-zero and names the
|
|
428
|
-
> current owner**, so two `/
|
|
428
|
+
> current owner**, so two `/plan` runs cannot drive the same Epic
|
|
429
429
|
> concurrently. Pass **`--steal`** to forcibly transfer a foreign claim once
|
|
430
430
|
> you have confirmed the other run is dead. An **unassigned** Epic, or one
|
|
431
431
|
> **already held by this operator**, is taken (or re-affirmed) silently. The
|
|
@@ -448,14 +448,14 @@ for the scoring logic.
|
|
|
448
448
|
> (`context::acceptance-spec`). The Acceptance Spec captures the
|
|
449
449
|
> stable-ID acceptance criteria table (`| AC ID | Outcome | Feature
|
|
450
450
|
> File | Scenario | Disposition |`) that drives close-time
|
|
451
|
-
> reconciliation during `/
|
|
451
|
+
> reconciliation during `/deliver` Phase 6. Operators may opt out
|
|
452
452
|
> for refactor-only or docs-only Epics by applying the
|
|
453
453
|
> `acceptance::n-a` label to the Epic ticket — when present, the
|
|
454
454
|
> `epic-plan-spec-author` skill skips the Acceptance Spec output and
|
|
455
455
|
> the runtime gates (start gate, finalize reconciler) honour the
|
|
456
456
|
> waiver — the spec ticket itself need not be authored or approved when
|
|
457
457
|
> the waiver is set. See [SDLC § Acceptance Spec — the third planning
|
|
458
|
-
> context ticket](
|
|
458
|
+
> context ticket](../../docs/SDLC.md#acceptance-spec--the-third-planning-context-ticket)
|
|
459
459
|
> for the full lifecycle.
|
|
460
460
|
|
|
461
461
|
<!-- separator: adjacent blockquotes -->
|
|
@@ -475,7 +475,7 @@ for the scoring logic.
|
|
|
475
475
|
> **Durability.** The per-Epic tree is durable across runs: only the
|
|
476
476
|
> wrapper scripts perform intra-phase cleanup of files they wrote in
|
|
477
477
|
> the same invocation (see
|
|
478
|
-
> [`lib/plan-phase-cleanup.js`](
|
|
478
|
+
> [`lib/plan-phase-cleanup.js`](../../scripts/lib/plan-phase-cleanup.js)).
|
|
479
479
|
> Nothing else garbage-collects the tree, so cross-Epic artifacts —
|
|
480
480
|
> retros, perf reports, signals, manifests — accumulate until an
|
|
481
481
|
> operator explicitly removes them.
|
|
@@ -489,7 +489,7 @@ for the scoring logic.
|
|
|
489
489
|
```
|
|
490
490
|
|
|
491
491
|
2. **Activate the `epic-plan-spec-author` skill**: Read
|
|
492
|
-
[`<agentRoot>/skills/core/epic-plan-spec-author/SKILL.md`](
|
|
492
|
+
[`<agentRoot>/skills/core/epic-plan-spec-author/SKILL.md`](../../skills/core/epic-plan-spec-author/SKILL.md)
|
|
493
493
|
via the `Read` tool (resolve `<agentRoot>` from
|
|
494
494
|
`project.paths.agentRoot` — default `.agents`) and execute its
|
|
495
495
|
procedure with `[Epic_ID]` as input. The skill reads
|
|
@@ -532,8 +532,8 @@ for the scoring logic.
|
|
|
532
532
|
|
|
533
533
|
# Re-planning (--force overwrites the three context tickets IN PLACE —
|
|
534
534
|
# same PRD / Tech Spec / Acceptance Spec issue numbers, refreshed bodies,
|
|
535
|
-
# tickets kept open, one regeneration audit comment each.
|
|
536
|
-
#
|
|
535
|
+
# tickets kept open, one regeneration audit comment each. Child Story
|
|
536
|
+
# tickets are still close-and-recreate at decomposition time.)
|
|
537
537
|
node .agents/scripts/epic-plan-spec.js --epic [Epic_ID] \
|
|
538
538
|
--prd temp/epic-[Epic_ID]/prd.md \
|
|
539
539
|
--techspec temp/epic-[Epic_ID]/techspec.md \
|
|
@@ -560,7 +560,7 @@ for the scoring logic.
|
|
|
560
560
|
PRD, Tech Spec, and Acceptance Spec on GitHub. Approval is the
|
|
561
561
|
user's verbal OK in this session — the three context tickets stay
|
|
562
562
|
**open** through delivery and are closed automatically by
|
|
563
|
-
`/
|
|
563
|
+
`/deliver` when the Epic PR opens. Do NOT proceed
|
|
564
564
|
to decomposition until the user confirms the plan is accurate.
|
|
565
565
|
- **Low risk** (`requiresReview === false` and no `--force-review`):
|
|
566
566
|
Emit the auto-proceed message from the persist stdout
|
|
@@ -571,7 +571,7 @@ for the scoring logic.
|
|
|
571
571
|
|
|
572
572
|
5. **Tech Spec freshness check (advisory)**: After the Tech Spec issue
|
|
573
573
|
is created, `epic-plan-spec.js` runs
|
|
574
|
-
[`validateSpecFreshness`](
|
|
574
|
+
[`validateSpecFreshness`](../../scripts/lib/orchestration/spec-freshness.js)
|
|
575
575
|
against the authored Tech Spec body, probing every cited path-shape
|
|
576
576
|
reference (backticked paths, `// header` lines in code blocks, and
|
|
577
577
|
inline mentions of paths under `.agents/`, `src/`, `lib/`, `app/`,
|
|
@@ -598,11 +598,11 @@ for the scoring logic.
|
|
|
598
598
|
6. **BDD scenario cross-reference (advisory)**: When the project has
|
|
599
599
|
adopted BDD, `epic-plan-spec.js` populates the planner-context
|
|
600
600
|
envelope with `bddScenarios` — the output of
|
|
601
|
-
[`scanBddScenarios`](
|
|
601
|
+
[`scanBddScenarios`](../../scripts/lib/bdd-scenario-scanner.js) over
|
|
602
602
|
the canonical feature roots resolved by
|
|
603
|
-
[`resolveFeatureRoots`](
|
|
603
|
+
[`resolveFeatureRoots`](../../scripts/lib/bdd-runner-detect.js)
|
|
604
604
|
(`tests/features`, `features`, `test/features`). The Acceptance
|
|
605
|
-
Engineer step in the [`epic-plan-spec-author`](
|
|
605
|
+
Engineer step in the [`epic-plan-spec-author`](../../skills/core/epic-plan-spec-author/SKILL.md)
|
|
606
606
|
skill scores each planned AC against the scenario index via
|
|
607
607
|
`findBestScenarioMatch`; when an existing scenario covers an AC's
|
|
608
608
|
outcome, the AC's `Scenario` column is annotated with `<file>:L<line>`
|
|
@@ -615,7 +615,7 @@ for the scoring logic.
|
|
|
615
615
|
7. **Cleanup**: The wrapper script (`epic-plan-spec.js`) deletes the Phase 7
|
|
616
616
|
temp files automatically on success — no operator action required. The
|
|
617
617
|
cleanup contract lives in
|
|
618
|
-
[`lib/plan-phase-cleanup.js`](
|
|
618
|
+
[`lib/plan-phase-cleanup.js`](../../scripts/lib/plan-phase-cleanup.js).
|
|
619
619
|
**Run the Phase 7.5 spec-validate gate (below) on
|
|
620
620
|
`temp/epic-[Epic_ID]/techspec.md` *before* this cleanup deletes the file** —
|
|
621
621
|
the gate reads the authored spec from temp.
|
|
@@ -631,7 +631,7 @@ for the scoring logic.
|
|
|
631
631
|
|
|
632
632
|
**Why this gate exists.** Phase 8.3 (Holistic Consolidation) reconciles the
|
|
633
633
|
draft ticket array against the Tech Spec's `## Delivery Slicing` section, which
|
|
634
|
-
the [`epic-plan-decompose-author`](
|
|
634
|
+
the [`epic-plan-decompose-author`](../../skills/core/epic-plan-decompose-author/SKILL.md)
|
|
635
635
|
skill uses as the capability-boundary anchor (see Phase 8 step 2 below). When
|
|
636
636
|
the authored Tech Spec omits that section, the consolidation pass runs against a
|
|
637
637
|
void and produces groupings that reflect **technical shape** (e.g. cron jobs
|
|
@@ -651,7 +651,7 @@ node .agents/scripts/epic-plan-spec-validate.js \
|
|
|
651
651
|
insensitive; the gate also accepts the variant `## Delivery slicing` and the
|
|
652
652
|
shorthand `## Slicing`). Continue to Phase 8.
|
|
653
653
|
- **Exit non-zero** — the required section is missing. The gate is implemented
|
|
654
|
-
by [`lib/orchestration/spec-section-validator.js`](
|
|
654
|
+
by [`lib/orchestration/spec-section-validator.js`](../../scripts/lib/orchestration/spec-section-validator.js)
|
|
655
655
|
and prints an operator-visible message naming the missing section and the two
|
|
656
656
|
recovery paths:
|
|
657
657
|
|
|
@@ -680,20 +680,20 @@ node .agents/scripts/epic-plan-spec-validate.js \
|
|
|
680
680
|
|
|
681
681
|
> **Open-children guard (workflow guard).** Before persisting the breakdown,
|
|
682
682
|
> `epic-plan-decompose.js` refuses to run when the Epic **already has open
|
|
683
|
-
>
|
|
683
|
+
> Story children**, unless `--force` (close + recreate the tree) or
|
|
684
684
|
> `--resume` (continue a partial persist) is set. This stops a re-run from
|
|
685
|
-
> stacking a duplicate
|
|
685
|
+
> stacking a duplicate Story set on top of an existing one — the
|
|
686
686
|
> phase exits non-zero and lists the open children. Once persist completes,
|
|
687
687
|
> the Epic-lease acquired in Phase 7 is **released** (best-effort; a release
|
|
688
688
|
> failure never fails decompose).
|
|
689
689
|
|
|
690
690
|
<!-- separator: adjacent blockquotes -->
|
|
691
691
|
|
|
692
|
-
> **Hierarchy.** The decomposer emits
|
|
692
|
+
> **Hierarchy.** The decomposer emits a flat Story backlog under the Epic.
|
|
693
693
|
> Acceptance criteria and verification steps are inlined on each Story
|
|
694
694
|
> body (`acceptance[]` / `verify[]` fields) and resolved against the
|
|
695
695
|
> Acceptance Spec context ticket at close time. See
|
|
696
|
-
> [`.agents/instructions.md` § 5.D](
|
|
696
|
+
> [`.agents/instructions.md` § 5.D](../../instructions.md) for the full
|
|
697
697
|
> contract.
|
|
698
698
|
|
|
699
699
|
1. **Gather Decomposition Context**:
|
|
@@ -703,7 +703,7 @@ node .agents/scripts/epic-plan-spec-validate.js \
|
|
|
703
703
|
```
|
|
704
704
|
|
|
705
705
|
2. **Activate the `epic-plan-decompose-author` skill**: Read
|
|
706
|
-
[`<agentRoot>/skills/core/epic-plan-decompose-author/SKILL.md`](
|
|
706
|
+
[`<agentRoot>/skills/core/epic-plan-decompose-author/SKILL.md`](../../skills/core/epic-plan-decompose-author/SKILL.md)
|
|
707
707
|
via the `Read` tool (resolve `<agentRoot>` from
|
|
708
708
|
`project.paths.agentRoot` — default `.agents`) and execute its
|
|
709
709
|
procedure with `[Epic_ID]` as input. The skill reads
|
|
@@ -732,17 +732,17 @@ node .agents/scripts/epic-plan-spec-validate.js \
|
|
|
732
732
|
3. **Phase 8.3 — Holistic Consolidation (HITL diff gate)**: After the
|
|
733
733
|
draft `temp/epic-[Epic_ID]/tickets.json` exists and **before** the persist
|
|
734
734
|
call below, activate the
|
|
735
|
-
[`epic-plan-consolidate`](
|
|
735
|
+
[`epic-plan-consolidate`](../../skills/core/epic-plan-consolidate/SKILL.md)
|
|
736
736
|
skill with `[Epic_ID]` as input. This is a **separate critic pass with
|
|
737
737
|
fresh context** (not a self-review appended to the author skill): it reads
|
|
738
738
|
the draft array plus the PRD / Tech Spec, reconciles the draft against the
|
|
739
739
|
Tech Spec `## Delivery Slicing` target, and emits a **consolidated**
|
|
740
740
|
`tickets.json` plus a human-readable
|
|
741
741
|
`temp/epic-[Epic_ID]/consolidation-report.md`. Its operations are
|
|
742
|
-
scope-preserving only — **merge Stories
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
742
|
+
scope-preserving only — **merge sibling Stories and rewire
|
|
743
|
+
`depends_on`** — and it MUST NOT add scope or invent tickets; it
|
|
744
|
+
consolidates fragmented slices by merging them into a cohesive Story,
|
|
745
|
+
never by splitting one. It runs **before** the deterministic
|
|
746
746
|
validator (step 4), so the validator re-checks its output and the critic
|
|
747
747
|
cannot emit an invalid plan.
|
|
748
748
|
|
|
@@ -754,7 +754,7 @@ node .agents/scripts/epic-plan-spec-validate.js \
|
|
|
754
754
|
|
|
755
755
|
4. **Persist to GitHub**: Run the decompose CLI's persist half. It
|
|
756
756
|
validates the ticket array (`validateAndNormalizeTickets`), creates
|
|
757
|
-
the
|
|
757
|
+
the Story issues, flips the Epic to `agent::ready`, and
|
|
758
758
|
writes the `epic-plan-state` checkpoint.
|
|
759
759
|
|
|
760
760
|
```bash
|
|
@@ -771,7 +771,7 @@ node .agents/scripts/epic-plan-spec-validate.js \
|
|
|
771
771
|
- Hierarchy completeness, dependency-DAG acyclicity, and `risk::high`
|
|
772
772
|
labelling are deterministic invariants enforced by
|
|
773
773
|
`validateAndNormalizeTickets` in
|
|
774
|
-
[`lib/orchestration/ticket-validator.js`](
|
|
774
|
+
[`lib/orchestration/ticket-validator.js`](../../scripts/lib/orchestration/ticket-validator.js);
|
|
775
775
|
its output during decomposition is the canonical proof — no manual
|
|
776
776
|
re-check needed.
|
|
777
777
|
- **File-assumption gate (Story #2636)**: Each Story's `body.changes`
|
|
@@ -810,13 +810,12 @@ node .agents/scripts/epic-plan-spec-validate.js \
|
|
|
810
810
|
|
|
811
811
|
6. **Audit**:
|
|
812
812
|
- Check the Epic's comment thread to ensure the backlog summary was posted.
|
|
813
|
-
- Verify that at least one `type::
|
|
814
|
-
was created.
|
|
813
|
+
- Verify that at least one `type::story` issue was created.
|
|
815
814
|
|
|
816
815
|
7. **Cleanup**: The wrapper script (`epic-plan-decompose.js`) deletes the
|
|
817
816
|
Phase 8 temp files automatically on success — no operator action required.
|
|
818
817
|
The cleanup contract lives in
|
|
819
|
-
[`lib/plan-phase-cleanup.js`](
|
|
818
|
+
[`lib/plan-phase-cleanup.js`](../../scripts/lib/plan-phase-cleanup.js).
|
|
820
819
|
|
|
821
820
|
## Phase 9: Execution Roadmap (Story Dispatch)
|
|
822
821
|
|
|
@@ -835,19 +834,19 @@ node .agents/scripts/epic-plan-spec-validate.js \
|
|
|
835
834
|
> **Manifest persistence (v5.9.0):** the dispatcher also posts the manifest
|
|
836
835
|
> as a `dispatch-manifest` structured comment on the Epic (idempotent —
|
|
837
836
|
> re-runs replace the prior comment). That comment is the source of truth for
|
|
838
|
-
> the Wave Completeness Gate in `/
|
|
837
|
+
> the Wave Completeness Gate in `/deliver` Step 0.5 and for any external
|
|
839
838
|
> wave-tracking tooling.
|
|
840
839
|
|
|
841
840
|
3. **Handoff**: Provide the user with the recommended next step:
|
|
842
841
|
|
|
843
|
-
> "Planning is complete. Run `/
|
|
844
|
-
> loop, or pick a single Story from Wave 0 and run `/
|
|
842
|
+
> "Planning is complete. Run `/deliver #[Epic ID]` to start the wave
|
|
843
|
+
> loop, or pick a single Story from Wave 0 and run `/deliver #[Story
|
|
845
844
|
> ID]` to drive it directly."
|
|
846
845
|
|
|
847
846
|
## Phase 10: Readiness Health Check
|
|
848
847
|
|
|
849
848
|
Run the post-plan health check to validate the backlog before handing off to
|
|
850
|
-
`/
|
|
849
|
+
`/deliver`. The default mode runs only the cheap checks
|
|
851
850
|
(config + git remote) and targets sub-2-second turnaround. The script itself
|
|
852
851
|
always exits 0; the structured JSON on stdout reports findings.
|
|
853
852
|
|
|
@@ -899,7 +898,7 @@ triaged it (e.g. a known `origin` outage during a maintenance window).
|
|
|
899
898
|
## Phase 11: Plan Comprehension Gate
|
|
900
899
|
|
|
901
900
|
An **opt-in, advisory** gate that offers the operator a guided walkthrough of
|
|
902
|
-
the freshly planned backlog before they hand off to `/
|
|
901
|
+
the freshly planned backlog before they hand off to `/deliver`. The plan
|
|
903
902
|
is the moment the operator authorizes an autonomous fan-out of subagents — this
|
|
904
903
|
phase exists so they can *understand and endorse* the approach while it is
|
|
905
904
|
still free to change, not after the code lands.
|
|
@@ -931,15 +930,15 @@ forcing the walkthrough.
|
|
|
931
930
|
### 2. Run the walkthrough (when offered and accepted)
|
|
932
931
|
|
|
933
932
|
Activate the
|
|
934
|
-
[`core/knowledge-transfer`](
|
|
933
|
+
[`core/knowledge-transfer`](../../skills/core/knowledge-transfer/SKILL.md) skill
|
|
935
934
|
with the **plan** as the subject — the Epic body, the linked PRD / Tech Spec
|
|
936
|
-
context tickets, the decomposition (
|
|
935
|
+
context tickets, the decomposition (Stories with inline
|
|
937
936
|
`acceptance[]` / `verify[]`), and the Phase 9 wave roadmap. The skill owns the
|
|
938
937
|
method (restate-first, the why-ladder, mastery gates, depth levels, optional
|
|
939
938
|
quizzing, the persistent `temp/comprehension-*.md` checklist).
|
|
940
939
|
|
|
941
940
|
**Interruptible at every checkpoint.** Each step MUST offer an explicit
|
|
942
|
-
"I'm good — proceed to `/
|
|
941
|
+
"I'm good — proceed to `/deliver`" exit. The instant the operator takes
|
|
943
942
|
it, stop the walkthrough and advance to Phase 12. Never trap the operator in
|
|
944
943
|
the loop.
|
|
945
944
|
|
|
@@ -957,7 +956,7 @@ condition.
|
|
|
957
956
|
the notification script:
|
|
958
957
|
|
|
959
958
|
```bash
|
|
960
|
-
node .agents/scripts/notify.js [Epic_ID] "Planning complete, review tickets. Backlog decomposition complete. Epic is ready for /
|
|
959
|
+
node .agents/scripts/notify.js [Epic_ID] "Planning complete, review tickets. Backlog decomposition complete. Epic is ready for /deliver." --action
|
|
961
960
|
```
|
|
962
961
|
|
|
963
962
|
## Troubleshooting
|
|
@@ -965,9 +964,10 @@ condition.
|
|
|
965
964
|
- If `epic-plan-spec.js --emit-context` fails, confirm the Epic exists and
|
|
966
965
|
has a body with enough initial context.
|
|
967
966
|
- If `epic-plan-decompose.js` rejects the tickets file, re-read the
|
|
968
|
-
validator's error message — the most common causes are a
|
|
969
|
-
`
|
|
970
|
-
dependency cycle in the Story `depends_on`
|
|
967
|
+
validator's error message — the most common causes are a ticket whose
|
|
968
|
+
`type` is not `story`, a Story missing its inline `acceptance[]` /
|
|
969
|
+
`verify[]` contract, or a dependency cycle in the Story `depends_on`
|
|
970
|
+
graph.
|
|
971
971
|
- If decomposition persisted the tickets but the Epic is not on `agent::ready`,
|
|
972
972
|
you likely called `runDecomposePhase` from `epic-plan-decompose.js`
|
|
973
973
|
directly without completing the persist flow — only the CLI surface
|