mandrel 1.59.0 → 1.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +86 -44
- package/.agents/docs/SDLC.md +135 -141
- package/.agents/docs/configuration.md +77 -20
- package/.agents/docs/quality-gates.md +796 -0
- package/.agents/docs/workflows.md +6 -9
- 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/runtime-deps.json +2 -2
- 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 +2 -2
- package/.agents/scripts/acceptance-eval.js +1 -1
- package/.agents/scripts/acceptance-spec-reconciler.js +2 -2
- package/.agents/scripts/agents-bootstrap-github.js +23 -119
- 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 +47 -1
- package/.agents/scripts/lib/bootstrap/commit-push.js +2 -2
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +7 -9
- package/.agents/scripts/lib/bootstrap/manifest.js +21 -1
- package/.agents/scripts/lib/bootstrap/merge-methods.js +31 -16
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +32 -11
- 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/sync-agentrc.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/detect-package-manager.js +72 -0
- 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/errors/index.js +4 -4
- 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 +5 -10
- package/.agents/scripts/lib/onboard/detect-stack.js +10 -10
- package/.agents/scripts/lib/onboard/init-tail.js +218 -0
- package/.agents/scripts/lib/onboard/scaffold-docs.js +18 -3
- 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/runtime-deps/preflight.js +6 -6
- 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/lib/worktree/node-modules-strategy.js +5 -2
- 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 +16 -31
- 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/agents-sync-config.md +3 -2
- 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/plan.md +131 -0
- package/.agents/workflows/qa-explore.md +1 -1
- package/.agents/workflows/qa-run-harness.md +1 -1
- package/README.md +19 -39
- package/bin/mandrel.js +235 -16
- package/docs/CHANGELOG.md +1173 -0
- package/lib/cli/doctor.js +45 -3
- package/lib/cli/init.js +97 -36
- package/lib/cli/registry.js +41 -145
- package/lib/cli/sync.js +122 -23
- package/lib/cli/uninstall.js +42 -7
- package/lib/cli/update.js +524 -210
- package/lib/cli/version-helpers.js +59 -0
- package/package.json +7 -6
- package/.agents/scripts/lib/orchestration/reconciler.js +0 -137
- package/.agents/workflows/onboard.md +0 -208
- package/lib/cli/__tests__/migrate.test.js +0 -268
- package/lib/cli/__tests__/sync-local-zone.test.js +0 -247
- package/lib/cli/__tests__/sync.test.js +0 -372
- package/lib/cli/__tests__/update-major.test.js +0 -217
- package/lib/cli/__tests__/update.test.js +0 -696
- package/lib/cli/__tests__/version-check.test.js +0 -398
- package/lib/migrations/__tests__/index.test.js +0 -216
|
@@ -7,7 +7,7 @@ description: >-
|
|
|
7
7
|
# Code Review (helper)
|
|
8
8
|
|
|
9
9
|
> **Helper module.** Not a slash command. Invoked automatically from
|
|
10
|
-
> `/
|
|
10
|
+
> `/deliver` (Story scope) and `/deliver` Phase 5 (Epic scope).
|
|
11
11
|
> To run a review directly, invoke the parent workflow — operators do not
|
|
12
12
|
> call this helper by hand.
|
|
13
13
|
|
|
@@ -17,7 +17,7 @@ is merged upstream. It runs in two scopes:
|
|
|
17
17
|
- **Story scope** — reviews the diff between a Story branch and its parent
|
|
18
18
|
Epic branch, before `story-close.js` merges the Story into the Epic.
|
|
19
19
|
- **Epic scope** — reviews the cumulative diff between an Epic branch and
|
|
20
|
-
`main`, before `/
|
|
20
|
+
`main`, before `/deliver` opens the integration pull request.
|
|
21
21
|
|
|
22
22
|
> **Persona**: `architect` · **Skills**: `core/code-review-and-quality`,
|
|
23
23
|
> `core/security-and-hardening`
|
|
@@ -43,7 +43,7 @@ the argument envelope.
|
|
|
43
43
|
|
|
44
44
|
`depth` is the risk-derived thoroughness lever introduced by Story #3876 and
|
|
45
45
|
made a live consumed signal end to end by Story #3937. The Epic caller
|
|
46
|
-
(`/
|
|
46
|
+
(`/deliver` Phase 5) resolves it from the Epic's judged `planningRisk`
|
|
47
47
|
envelope via
|
|
48
48
|
[`resolveReviewDepthForEpic`](../../scripts/lib/orchestration/code-review.js)
|
|
49
49
|
(`high` → `deep`, `low` → `light`, everything else — including a missing
|
|
@@ -54,7 +54,7 @@ It is an **input-only** signal: it changes *how thorough* the review is, never
|
|
|
54
54
|
the findings envelope (`{ status, severity, posted, report, halted,
|
|
55
55
|
blockerReason }`) nor the posted `code-review` structured-comment body. An
|
|
56
56
|
absent or malformed `depth` is treated as `standard`, so an Epic that skipped
|
|
57
|
-
`/
|
|
57
|
+
`/plan` still gets a passing review with no new failure mode.
|
|
58
58
|
|
|
59
59
|
How each tier changes the review protocol:
|
|
60
60
|
|
|
@@ -307,7 +307,7 @@ When `selectedAudits` is non-empty:
|
|
|
307
307
|
2. **Append** a `## Cross-phase re-check` section to the **existing**
|
|
308
308
|
`audit-results` structured comment on the Epic ticket. Do **not** post
|
|
309
309
|
a new comment; the comment is idempotent and downstream consumers
|
|
310
|
-
(the code-review trim, `/
|
|
310
|
+
(the code-review trim, `/deliver` Pillar 2, the retro helper)
|
|
311
311
|
read it once. The append carries the re-checked lens names, the new
|
|
312
312
|
findings (if any), and the focused-fix commit SHAs that triggered the
|
|
313
313
|
re-run, so reviewers can trace each finding back to the change set
|
|
@@ -10,16 +10,16 @@ description: >-
|
|
|
10
10
|
inspects the surface area.
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
-
# /epic
|
|
13
|
+
# helpers/deliver-epic — Epic delivery path (invoked by /deliver)
|
|
14
14
|
|
|
15
15
|
## Overview
|
|
16
16
|
|
|
17
|
-
`/
|
|
17
|
+
`/deliver` is the **single SDL execution command** in the 5.40 surface.
|
|
18
18
|
It opens a PR against `main` and auto-merges when every signal certifies a
|
|
19
19
|
clean run; otherwise it falls back to the operator-merges-button path.
|
|
20
20
|
|
|
21
21
|
```text
|
|
22
|
-
/
|
|
22
|
+
/deliver <epicId>
|
|
23
23
|
→ Phase 1 — prepare (epic-deliver-prepare.js)
|
|
24
24
|
→ Phase 2 — wave loop (wave-tick.js + Agent fan-out × concurrencyCap)
|
|
25
25
|
→ Phase 3 — close-validation (lint + test + ratchets on epic/<id>)
|
|
@@ -33,8 +33,8 @@ clean run; otherwise it falls back to the operator-merges-button path.
|
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
The argument is always an Epic ID (`type::epic`). Story IDs go to
|
|
36
|
-
[`/
|
|
37
|
-
[`helpers/epic-deliver-story`](
|
|
36
|
+
[`/deliver`](deliver-stories.md) (standalone) or the
|
|
37
|
+
[`helpers/epic-deliver-story`](epic-deliver-story.md) helper
|
|
38
38
|
(Epic-attached, invoked by this workflow's fan-out); Tasks are not directly
|
|
39
39
|
executable.
|
|
40
40
|
Story dispatch is in-session via the Agent tool — no subprocess is
|
|
@@ -45,11 +45,11 @@ spawned.
|
|
|
45
45
|
## Arguments
|
|
46
46
|
|
|
47
47
|
```text
|
|
48
|
-
/
|
|
48
|
+
/deliver <epicId> [--skip-epic-audit] [--skip-code-review] [--skip-retro] [--full-retro]
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
- `epicId` — must carry `type::epic`. Otherwise STOP and tell the operator
|
|
52
|
-
to use `/
|
|
52
|
+
to use `/deliver <id>` (standalone Story) or open the parent Epic.
|
|
53
53
|
- `--skip-epic-audit` — skip Phase 4 (log the override). Use only when the
|
|
54
54
|
change-set audits are known to be irrelevant (e.g., docs-only Epic).
|
|
55
55
|
- `--skip-code-review` — skip Phase 5 (log the override).
|
|
@@ -79,7 +79,7 @@ Every other runtime modifier is sourced from the Epic's labels or from
|
|
|
79
79
|
typed events on the in-session lifecycle bus; a fixed roster of
|
|
80
80
|
listeners performs the side effects. Phase 7, 8.5, and 9 each fire
|
|
81
81
|
exactly one lifecycle event via the generic
|
|
82
|
-
[`lifecycle-emit.js`](
|
|
82
|
+
[`lifecycle-emit.js`](../../scripts/lifecycle-emit.js) CLI
|
|
83
83
|
(`--event epic.close.end` / `--event epic.automerge.start` /
|
|
84
84
|
`--event epic.merge.armed`); the matching listener chain runs the
|
|
85
85
|
bus-driven side effects (acceptance reconcile, automerge-armer,
|
|
@@ -88,20 +88,20 @@ Every other runtime modifier is sourced from the Epic's labels or from
|
|
|
88
88
|
the canonical manual sequence and `finalizer.js` for the listener's
|
|
89
89
|
no-op disclaimer. The append-only NDJSON ledger at
|
|
90
90
|
`temp/epic-<id>/lifecycle.ndjson` is the resume target. See
|
|
91
|
-
[`docs/LIFECYCLE.md`](
|
|
91
|
+
[`docs/LIFECYCLE.md`](../../../docs/LIFECYCLE.md) for the bus
|
|
92
92
|
contract, event taxonomy, ledger format, and listener model.
|
|
93
93
|
|
|
94
|
-
> **Hierarchy.** `/
|
|
95
|
-
> (Epic →
|
|
94
|
+
> **Hierarchy.** `/deliver` operates over the 2-tier hierarchy
|
|
95
|
+
> (Epic → Story). The fan-out is one `Agent` tool call per
|
|
96
96
|
> Story per wave (§ 2b); Story branches merge into `epic/<id>` with
|
|
97
97
|
> `--no-ff` via `story-close.js`; the close-validation chain
|
|
98
98
|
> (Phase 3), epic-audit, code-review, retro, finalize, and auto-merge
|
|
99
99
|
> gates all operate on Story-level units.
|
|
100
|
-
> [`helpers/epic-deliver-story`](
|
|
100
|
+
> [`helpers/epic-deliver-story`](epic-deliver-story.md) runs a
|
|
101
101
|
> single Story-implementation phase per Story against the Story's
|
|
102
102
|
> inline `acceptance[]` / `verify[]` fields. See
|
|
103
|
-
> [`.agents/instructions.md` § 5.D](
|
|
104
|
-
> [`.agents/docs/SDLC.md` § Ticket hierarchy](
|
|
103
|
+
> [`.agents/instructions.md` § 5.D](../../instructions.md) and
|
|
104
|
+
> [`.agents/docs/SDLC.md` § Ticket hierarchy](../../docs/SDLC.md) for the full
|
|
105
105
|
> contract.
|
|
106
106
|
|
|
107
107
|
---
|
|
@@ -132,7 +132,7 @@ flip the Epic to `agent::blocked`, surface the envelope in chat for the
|
|
|
132
132
|
operator, and halt before Phase 1's `epic-deliver-prepare.js` call.
|
|
133
133
|
Resume after the operator unblocks (raising the threshold in
|
|
134
134
|
`.agentrc.json`, splitting the Epic, or accepting the cost) by re-running
|
|
135
|
-
`/
|
|
135
|
+
`/deliver <epicId>` — the preflight is idempotent and the second
|
|
136
136
|
run upserts the same comment in place.
|
|
137
137
|
|
|
138
138
|
Threshold defaults live in `delivery.preflight.*` in `.agentrc.json`
|
|
@@ -157,7 +157,7 @@ and upserts the `epic-run-state` checkpoint. Treat the printed JSON as
|
|
|
157
157
|
> **Preflight guards (Story #3482 / F-workflow-guards).** Before the
|
|
158
158
|
> snapshot phase runs — and before any worktree is created — prepare runs
|
|
159
159
|
> two **fail-closed** guards
|
|
160
|
-
> ([`lib/orchestration/epic-deliver-lease-guard.js`](
|
|
160
|
+
> ([`lib/orchestration/epic-deliver-lease-guard.js`](../../scripts/lib/orchestration/epic-deliver-lease-guard.js)):
|
|
161
161
|
>
|
|
162
162
|
> 1. **Checkout safety.** Prepare refuses to start when the working tree is
|
|
163
163
|
> dirty or HEAD is on a branch other than the expected one (`epic/<id>`
|
|
@@ -182,23 +182,23 @@ and upserts the `epic-run-state` checkpoint. Treat the printed JSON as
|
|
|
182
182
|
> `epic-merge-lock.js` continues to serialize same-machine sessions.
|
|
183
183
|
>
|
|
184
184
|
> Both guards throw on failure, which `runAsCli` maps to `process.exit(1)`
|
|
185
|
-
> per [`orchestration-error-handling.md`](
|
|
185
|
+
> per [`orchestration-error-handling.md`](../../rules/orchestration-error-handling.md).
|
|
186
186
|
|
|
187
187
|
Once the preflight guards pass, the snapshot phase applies one more gate:
|
|
188
188
|
|
|
189
189
|
> **Acceptance-spec start gate.** Before the wave loop fans out, the
|
|
190
190
|
> snapshot phase
|
|
191
|
-
> ([`lib/orchestration/epic-runner/phases/snapshot.js`](
|
|
191
|
+
> ([`lib/orchestration/epic-runner/phases/snapshot.js`](../../scripts/lib/orchestration/epic-runner/phases/snapshot.js))
|
|
192
192
|
> asserts that the Epic either carries the `acceptance::n-a` waiver
|
|
193
193
|
> label **or** has a linked `context::acceptance-spec` ticket. The
|
|
194
194
|
> ticket's GitHub state (open / closed) is **not** checked —
|
|
195
195
|
> presence is sufficient, matching the PRD and Tech Spec contract.
|
|
196
|
-
> The reviewer's OK during `/
|
|
196
|
+
> The reviewer's OK during `/plan` Phase 7 is the approval
|
|
197
197
|
> signal, not a manual ticket-close action. Neither condition met →
|
|
198
198
|
> the snapshot throws a clear error
|
|
199
199
|
> (`[epic-deliver] Epic #<id> cannot launch: …`) and `runAsCli`
|
|
200
200
|
> maps it to `process.exit(1)`. Operator remediation: either run
|
|
201
|
-
> `/
|
|
201
|
+
> `/plan` Phase 7 to author the spec, or apply the
|
|
202
202
|
> `acceptance::n-a` label to opt out.
|
|
203
203
|
|
|
204
204
|
---
|
|
@@ -206,7 +206,7 @@ Once the preflight guards pass, the snapshot phase applies one more gate:
|
|
|
206
206
|
## Phase 2 — Wave loop
|
|
207
207
|
|
|
208
208
|
The wave-loop state machine lives in
|
|
209
|
-
[`lib/wave-runner/tick.js`](
|
|
209
|
+
[`lib/wave-runner/tick.js`](../../scripts/lib/wave-runner/tick.js) — one
|
|
210
210
|
stateless `tick({ epic })` call returns one `WaveTickResult` describing
|
|
211
211
|
the next action. The slash command's job is to call `tick()` via its CLI
|
|
212
212
|
shim, dispatch from `nextAction.stories` via the Agent tool, persist the
|
|
@@ -243,7 +243,7 @@ only the two wave-window forensics signals that have a live consumer —
|
|
|
243
243
|
`waveParallelism` report (and `wave-start` anchors span-tree Story spans).
|
|
244
244
|
Story #3909 retired the write-only wave events with no reader (`wave-tick`,
|
|
245
245
|
`epic-complete`) — they duplicated the checkpoint + rollup. The
|
|
246
|
-
[`signals` helper](
|
|
246
|
+
[`signals` helper](signals.md) (`node .agents/scripts/signals-view.js`)
|
|
247
247
|
renders the forensics signals in the span-tree view.
|
|
248
248
|
|
|
249
249
|
### 2b. Dispatch — fan out per-Story Agent calls
|
|
@@ -252,7 +252,7 @@ renders the forensics signals in the span-tree view.
|
|
|
252
252
|
invoke `helpers/epic-deliver-story` yourself. Emit **one `Agent` tool call per
|
|
253
253
|
Story** in `nextAction.stories` (even when `length === 1` — the
|
|
254
254
|
parent-child boundary keeps the return-parser uniform). The *children*
|
|
255
|
-
run [`helpers/epic-deliver-story`](
|
|
255
|
+
run [`helpers/epic-deliver-story`](epic-deliver-story.md). Use
|
|
256
256
|
`subagent_type: general-purpose`.
|
|
257
257
|
|
|
258
258
|
Emit **one assistant turn** with **N parallel `Agent` calls** where
|
|
@@ -276,7 +276,7 @@ the cap, never wait for a whole batch before refilling.
|
|
|
276
276
|
**Ledger the dispatch BEFORE the Agent call.** Immediately before each
|
|
277
277
|
per-Story `Agent` tool call (one shell-out per Story, every attempt —
|
|
278
278
|
including retries from a refill), invoke
|
|
279
|
-
[`lifecycle-emit-story-dispatch.js`](
|
|
279
|
+
[`lifecycle-emit-story-dispatch.js`](../../scripts/lifecycle-emit-story-dispatch.js)
|
|
280
280
|
so the lifecycle ledger durably records the dispatch attempt. The
|
|
281
281
|
emit must happen **before** the Agent call fires — never after — so
|
|
282
282
|
that a host-process crash mid-Agent leaves a `story.dispatch.start`
|
|
@@ -425,7 +425,7 @@ one in-flight Story has been silent for ≥ the threshold:
|
|
|
425
425
|
|
|
426
426
|
**On a stall.** When the watchdog exits non-zero, post the envelope
|
|
427
427
|
verbatim as a `wave-stall` structured comment on the Epic (use
|
|
428
|
-
[`post-structured-comment.js`](
|
|
428
|
+
[`post-structured-comment.js`](../../scripts/post-structured-comment.js)
|
|
429
429
|
with `--kind wave-stall`), then re-evaluate the affected Stories: if a
|
|
430
430
|
child sub-agent has crashed (no `story.dispatch.end`, no recent
|
|
431
431
|
heartbeat, no commit on `story-<id>`), re-dispatch the Story per § 2b
|
|
@@ -465,14 +465,14 @@ the Epic branch; if any drifts, refresh and commit
|
|
|
465
465
|
## Phase 4 — Epic audit (change-set lenses)
|
|
466
466
|
|
|
467
467
|
Skip when `--skip-epic-audit`. Otherwise auto-invoke
|
|
468
|
-
[`helpers/epic-audit.md`](
|
|
469
|
-
[`epic-audit-prepare.js`](
|
|
470
|
-
[`selectAudits`](
|
|
468
|
+
[`helpers/epic-audit.md`](epic-audit.md) inline. The helper runs
|
|
469
|
+
[`epic-audit-prepare.js`](../../scripts/epic-audit-prepare.js) to ask the
|
|
470
|
+
[`selectAudits`](../../scripts/lib/audit-suite/index.js) SDK which lenses fire
|
|
471
471
|
at the `gate3` close gate, **unions in the model-judged risk-routed lenses**
|
|
472
472
|
(Story #3889 — `epic-audit-prepare.js` reads the Epic's `planningRisk`
|
|
473
473
|
envelope off the `epic-plan-state` checkpoint and maps each high-risk axis to
|
|
474
474
|
its lens via `resolveAuditLenses`), then dispatches each selected lens through
|
|
475
|
-
[`runAuditSuite`](
|
|
475
|
+
[`runAuditSuite`](../../scripts/lib/audit-suite/index.js). A high-risk Epic
|
|
476
476
|
therefore auto-runs its mapped lenses (e.g. a `security`-axis Epic runs
|
|
477
477
|
`audit-security`) even when the change set alone did not select them; a
|
|
478
478
|
low-risk Epic adds nothing. Findings are persisted as an `audit-results`
|
|
@@ -492,7 +492,7 @@ structured comment on the Epic.
|
|
|
492
492
|
|
|
493
493
|
Skip when `--skip-code-review`. Otherwise resolve the **risk-derived review
|
|
494
494
|
depth** for this Epic, then auto-invoke
|
|
495
|
-
[`helpers/code-review.md`](
|
|
495
|
+
[`helpers/code-review.md`](code-review.md) inline (read-only audit)
|
|
496
496
|
with the argument envelope `{ scope: 'epic', ticketId: <epicId>, baseRef:
|
|
497
497
|
'main', headRef: 'epic/<epicId>', depth: <reviewDepth> }`. The helper
|
|
498
498
|
persists findings as a `code-review` structured comment on the Epic.
|
|
@@ -500,11 +500,11 @@ persists findings as a `code-review` structured comment on the Epic.
|
|
|
500
500
|
The `depth` is the live epic-scope producer for Story #3876's review-depth
|
|
501
501
|
lever (Story #3937). Resolve it from the Epic's judged risk envelope the same
|
|
502
502
|
best-effort way Phase 4 routes audit lenses — via
|
|
503
|
-
[`resolveReviewDepthForEpic`](
|
|
503
|
+
[`resolveReviewDepthForEpic`](../../scripts/lib/orchestration/code-review.js),
|
|
504
504
|
which reads `planningRisk.overallLevel` off the Epic's `epic-plan-state`
|
|
505
505
|
checkpoint and maps it: `high` → `deep`, `low` → `light`, everything else
|
|
506
506
|
(including a missing/unparseable checkpoint, or an Epic that skipped
|
|
507
|
-
`/
|
|
507
|
+
`/plan`) → `standard`. The helper threads `depth` into `runCodeReview`,
|
|
508
508
|
which forwards it to every provider's `runReview` input; the LLM-backed
|
|
509
509
|
providers (codex, security-review, ultrareview) render it into the prompt they
|
|
510
510
|
emit so a high-risk Epic gets a deeper adversarial pass and a low-risk one a
|
|
@@ -527,12 +527,12 @@ runner via its CLI wrapper:
|
|
|
527
527
|
node .agents/scripts/retro-run.js --epic <epicId>
|
|
528
528
|
```
|
|
529
529
|
|
|
530
|
-
[`retro-run.js`](
|
|
530
|
+
[`retro-run.js`](../../scripts/retro-run.js) resolves the config/provider,
|
|
531
531
|
constructs a lifecycle bus with a `LedgerWriter` (so the run's
|
|
532
532
|
`retro.start` / `retro.end` boundaries land in
|
|
533
533
|
`temp/epic-<epicId>/lifecycle.ndjson`), and calls `runRetro` — the
|
|
534
534
|
canonical compose-and-post surface at
|
|
535
|
-
[`.agents/scripts/lib/orchestration/retro-runner.js`](
|
|
535
|
+
[`.agents/scripts/lib/orchestration/retro-runner.js`](../../scripts/lib/orchestration/retro-runner.js).
|
|
536
536
|
Propagate `--full-retro` to bypass the compact-path heuristic.
|
|
537
537
|
|
|
538
538
|
Retro fires here (before the PR opens) so it stays in the operator's
|
|
@@ -541,7 +541,7 @@ local session with full env access (env vars, credentials, MCP).
|
|
|
541
541
|
After the GitHub upsert succeeds, the retro body is also **mirrored
|
|
542
542
|
locally** to the per-Epic temp tree at `temp/epic-<epicId>/retro.md`
|
|
543
543
|
(path resolved via
|
|
544
|
-
[`lib/config/temp-paths.js`](
|
|
544
|
+
[`lib/config/temp-paths.js`](../../scripts/lib/config/temp-paths.js)'s
|
|
545
545
|
`epicRetroMirrorPath`, which honours `project.paths.tempRoot`).
|
|
546
546
|
Operators can read the retro without re-fetching from GitHub. GitHub
|
|
547
547
|
remains the source of truth — a mirror-write failure only logs a warn
|
|
@@ -592,16 +592,16 @@ responsibility below runs inside the listener chain — the operator
|
|
|
592
592
|
shells nothing manually. The `Finalizer` listener (Story #2894 —
|
|
593
593
|
bus-owned finalize) composes three helpers under
|
|
594
594
|
`.agents/scripts/lib/orchestration/finalize/` and emits the canonical
|
|
595
|
-
chain.** Treat this section as a runtime contract — `/
|
|
595
|
+
chain.** Treat this section as a runtime contract — `/deliver`
|
|
596
596
|
just fires the emit and reads the resulting ledger.
|
|
597
597
|
|
|
598
598
|
1. **Acceptance-spec reconciliation — bus-driven.** The
|
|
599
599
|
`AcceptanceReconciler` listener invokes
|
|
600
|
-
[`acceptance-spec-reconciler.js`](
|
|
600
|
+
[`acceptance-spec-reconciler.js`](../../scripts/acceptance-spec-reconciler.js)
|
|
601
601
|
to diff the AC IDs declared in the linked `context::acceptance-spec`
|
|
602
602
|
body against `@ac-*` / `@pending` tags in `tests/features/**`. A
|
|
603
603
|
non-OK reconciliation throws (per
|
|
604
|
-
[`rules/orchestration-error-handling.md`](
|
|
604
|
+
[`rules/orchestration-error-handling.md`](../../rules/orchestration-error-handling.md)),
|
|
605
605
|
aborting finalize **before** any PR is opened or planning artifacts
|
|
606
606
|
are closed — so the PRD, Tech Spec, and Acceptance Spec stay open
|
|
607
607
|
until the AC coverage gap is fixed. The reconciler returns
|
|
@@ -611,10 +611,10 @@ just fires the emit and reads the resulting ledger.
|
|
|
611
611
|
start gate in Phase 1 would normally catch that first).
|
|
612
612
|
2. **PR open — bus-driven (Story #2894).** On
|
|
613
613
|
`acceptance.reconcile.ok` the `Finalizer` listener invokes
|
|
614
|
-
[`openOrLocatePr`](
|
|
614
|
+
[`openOrLocatePr`](../../scripts/lib/orchestration/finalize/open-or-locate-pr.js)
|
|
615
615
|
with `{ epicId, headBranch: 'epic/<id>', baseBranch: 'main' }`.
|
|
616
616
|
The helper probes for an existing open PR on the head branch
|
|
617
|
-
first (idempotent locate path — a re-run of `/
|
|
617
|
+
first (idempotent locate path — a re-run of `/deliver`
|
|
618
618
|
on the same branch short-circuits without opening a duplicate)
|
|
619
619
|
and only opens a new PR when none exists. The listener then
|
|
620
620
|
emits `pr.created` → `epic.finalize.end` and **stops** (Story
|
|
@@ -627,17 +627,17 @@ just fires the emit and reads the resulting ledger.
|
|
|
627
627
|
driven later from the gated watch path (`pr.created` → `Watcher`
|
|
628
628
|
→ `epic.watch.end` → `AutomergePredicate` → `epic.merge.ready` →
|
|
629
629
|
`AutomergeArmer`) re-entered in Phase 8.5. The merge-lockout rule
|
|
630
|
-
in [`check-lifecycle-lint.js`](
|
|
630
|
+
in [`check-lifecycle-lint.js`](../../scripts/check-lifecycle-lint.js)
|
|
631
631
|
keeps `gh pr merge --auto --squash --delete-branch` confined to
|
|
632
632
|
`AutomergeArmer` — Phase 7 never shells the merge command.
|
|
633
633
|
3. **Planning-artifact close + hand-off — bus-driven (Story
|
|
634
634
|
#2894).** After `openOrLocatePr` returns, the `Finalizer` chains
|
|
635
|
-
[`closePlanningTickets`](
|
|
635
|
+
[`closePlanningTickets`](../../scripts/lib/orchestration/finalize/close-planning-tickets.js)
|
|
636
636
|
to close the three planning context tickets
|
|
637
637
|
(`context::prd`, `context::tech-spec`, `context::acceptance-spec`)
|
|
638
638
|
so the Epic's `Closes #<id>` auto-close path is not blocked by
|
|
639
639
|
open sub-issues, then
|
|
640
|
-
[`postHandoffComment`](
|
|
640
|
+
[`postHandoffComment`](../../scripts/lib/orchestration/finalize/post-handoff-comment.js)
|
|
641
641
|
to upsert the canonical `epic-handoff` structured comment naming
|
|
642
642
|
the PR URL. Both helpers are idempotent — already-closed tickets
|
|
643
643
|
are counted under `alreadyClosed`, and the handoff comment is
|
|
@@ -4,20 +4,20 @@ description: >-
|
|
|
4
4
|
computes a dependency-aware wave plan via `stories-wave-tick.js`, asks the
|
|
5
5
|
operator to confirm the plan, then fans out parallel Agent calls per wave
|
|
6
6
|
— each delegating to `helpers/single-story-deliver`. Stories without an
|
|
7
|
-
`Epic: #N` reference only; Epic-attached Stories use `/
|
|
7
|
+
`Epic: #N` reference only; Epic-attached Stories use `/deliver`.
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# /
|
|
10
|
+
# helpers/deliver-stories — multi-Story delivery path (invoked by /deliver)
|
|
11
11
|
|
|
12
12
|
## Overview
|
|
13
13
|
|
|
14
|
-
`/
|
|
14
|
+
`/deliver` is the **operator-facing multi-Story delivery command**. It
|
|
15
15
|
takes one or more Story IDs, builds a dependency-aware wave plan, optionally
|
|
16
16
|
confirms it with the operator, and fans out one Agent call per Story per wave
|
|
17
17
|
— parallel within each wave, serialised across waves.
|
|
18
18
|
|
|
19
19
|
```text
|
|
20
|
-
/
|
|
20
|
+
/deliver 101 102 103
|
|
21
21
|
→ Phase 0 — Validate input & build DAG
|
|
22
22
|
→ Phase 1 — stories-wave-tick.js → wave plan + operator confirmation
|
|
23
23
|
→ Phase 2 — for each wave:
|
|
@@ -26,22 +26,22 @@ confirms it with the operator, and fans out one Agent call per Story per wave
|
|
|
26
26
|
→ Phase 3 — Summary
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
**When to use `/
|
|
29
|
+
**When to use `/deliver` vs. other commands:**
|
|
30
30
|
|
|
31
31
|
| Scenario | Command |
|
|
32
32
|
| --- | --- |
|
|
33
|
-
| 1+ standalone Stories (no `Epic: #N` in body) | `/
|
|
33
|
+
| 1+ standalone Stories (no `Epic: #N` in body) | `/deliver <id> [<id>...]` |
|
|
34
34
|
| Exactly one standalone Story (lighter path) | `/single-story-deliver <id>` |
|
|
35
|
-
| Epic-attached Stories (have `Epic: #N`) | `/
|
|
35
|
+
| Epic-attached Stories (have `Epic: #N`) | `/deliver <epicId>` |
|
|
36
36
|
|
|
37
|
-
`/
|
|
37
|
+
`/deliver` **refuses** Stories that carry an `Epic: #N` reference in
|
|
38
38
|
their body. Those Stories belong to an Epic's dispatch manifest and must flow
|
|
39
|
-
through `/
|
|
39
|
+
through `/deliver`. Use `/single-story-deliver` for a single Epic-free
|
|
40
40
|
Story when you want the leaner one-story path without wave machinery.
|
|
41
41
|
|
|
42
42
|
> **Concurrency cap.** The cap is resolved **deterministically in code** by
|
|
43
43
|
> `stories-wave-tick.js` (Phase 1a) — the same `resolveConfig` + `getRunners`
|
|
44
|
-
> seam `/
|
|
44
|
+
> seam `/deliver` uses — and emitted as the `concurrencyCap` field on the
|
|
45
45
|
> `stories-wave-plan` envelope. The default is 3; override persistently via
|
|
46
46
|
> `delivery.deliverRunner.concurrencyCap` in `.agentrc.json` (a
|
|
47
47
|
> `.agentrc.local.json` override is honored) or per-run via the `--concurrency`
|
|
@@ -53,7 +53,7 @@ Story when you want the leaner one-story path without wave machinery.
|
|
|
53
53
|
## Arguments
|
|
54
54
|
|
|
55
55
|
```text
|
|
56
|
-
/
|
|
56
|
+
/deliver <storyId> [<storyId> ...] [--dep <fromId>:<toId> ...] [--yes] [--concurrency <n>]
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
- `storyId` — One or more GitHub issue numbers carrying `type::story` and
|
|
@@ -79,7 +79,7 @@ For each supplied Story ID:
|
|
|
79
79
|
|
|
80
80
|
1. Confirm the issue exists and carries the `type::story` label.
|
|
81
81
|
2. Confirm the issue body does **not** contain an `Epic: #N` reference. If
|
|
82
|
-
it does, STOP and tell the operator to use `/
|
|
82
|
+
it does, STOP and tell the operator to use `/deliver <epicId>`
|
|
83
83
|
instead.
|
|
84
84
|
3. Collect `blocked by #N` references between the supplied Story IDs.
|
|
85
85
|
References to Story IDs outside the supplied set are advisory warnings
|
|
@@ -112,7 +112,7 @@ node .agents/scripts/stories-wave-tick.js --dag '<dag-json>'
|
|
|
112
112
|
node .agents/scripts/stories-wave-tick.js --dag '<dag-json>' --concurrency <n>
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
-
When the operator passed `--concurrency <n>` to `/
|
|
115
|
+
When the operator passed `--concurrency <n>` to `/deliver`, forward it
|
|
116
116
|
verbatim to `stories-wave-tick.js`. The script resolves the cap from config
|
|
117
117
|
(`delivery.deliverRunner.concurrencyCap`, default 3) and the override wins for
|
|
118
118
|
that run.
|
|
@@ -184,7 +184,7 @@ envelope field is the single deterministic source.
|
|
|
184
184
|
Each Agent call:
|
|
185
185
|
|
|
186
186
|
1. Names the Story ID and instructs the child to invoke
|
|
187
|
-
[`helpers/single-story-deliver`](
|
|
187
|
+
[`helpers/single-story-deliver`](single-story-deliver.md)
|
|
188
188
|
for that Story.
|
|
189
189
|
2. States the **return contract** (see § 2c).
|
|
190
190
|
3. Reminds the child of the **non-interactive contract**: no clarifying
|
|
@@ -226,7 +226,7 @@ After every Story in a wave returns:
|
|
|
226
226
|
- **Any `status === 'blocked'`** → STOP the wave loop. Post a summary
|
|
227
227
|
of blocked Stories and their `blockerCommentId` references. Do not
|
|
228
228
|
dispatch the next wave. Wait for the operator to resolve each blocker
|
|
229
|
-
and re-run `/
|
|
229
|
+
and re-run `/deliver` with the same set (already-done Stories
|
|
230
230
|
will short-circuit because `single-story-close.js` is idempotent).
|
|
231
231
|
- **Any `status === 'failed'`** → STOP the wave loop. Report the
|
|
232
232
|
failures. The operator must fix the failing Stories before re-running.
|
|
@@ -238,7 +238,7 @@ After every Story in a wave returns:
|
|
|
238
238
|
Print a final run summary:
|
|
239
239
|
|
|
240
240
|
```text
|
|
241
|
-
/
|
|
241
|
+
/deliver — 3 Stories delivered in 2 waves
|
|
242
242
|
|
|
243
243
|
Wave 0: #101 ✅ done, #103 ✅ done
|
|
244
244
|
Wave 1: #102 ✅ done
|
|
@@ -265,8 +265,8 @@ Story's suite is green and the close-validation gates already pass — and
|
|
|
265
265
|
key is unset or `false`, story-deliver behaves exactly as documented above
|
|
266
266
|
and this stage is skipped entirely.
|
|
267
267
|
|
|
268
|
-
The stage adopts the [`refactorer`](
|
|
269
|
-
[`core/refactoring-discipline`](
|
|
268
|
+
The stage adopts the [`refactorer`](../../personas/refactorer.md) persona and the
|
|
269
|
+
[`core/refactoring-discipline`](../../skills/core/refactoring-discipline/SKILL.md)
|
|
270
270
|
skill to drive a behaviour-preserving pass that lowers CRAP and removes
|
|
271
271
|
duplication on the files the Story already touched:
|
|
272
272
|
|
|
@@ -277,7 +277,7 @@ duplication on the files the Story already touched:
|
|
|
277
277
|
must be reverted.
|
|
278
278
|
- **Advisory, not a gate.** This stage does **not** introduce a new
|
|
279
279
|
close-validation gate and does **not** change the semantics of the existing
|
|
280
|
-
[close-validation](
|
|
280
|
+
[close-validation](../../scripts/lib/close-validation/runner.js) chain (typecheck,
|
|
281
281
|
lint, test, format, maintainability, coverage, crap). The canonical gates
|
|
282
282
|
remain the single source of pass/fail at close; the refactor stage only adds
|
|
283
283
|
an extra behaviour-preserving cleanup commit when enabled.
|
|
@@ -293,7 +293,7 @@ duplication on the files the Story already touched:
|
|
|
293
293
|
`/single-story-deliver` is idempotent at every phase:
|
|
294
294
|
`single-story-init.js` reuses an existing worktree and
|
|
295
295
|
`single-story-close.js` short-circuits when the Story is already closed.
|
|
296
|
-
Re-running `/
|
|
296
|
+
Re-running `/deliver` with the same Story set after a partial
|
|
297
297
|
failure is safe — already-done Stories produce no-op outcomes; only the
|
|
298
298
|
blocked or unstarted Stories execute.
|
|
299
299
|
|
|
@@ -313,15 +313,15 @@ blocked or unstarted Stories execute.
|
|
|
313
313
|
`node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
|
|
314
314
|
This CLI is the authoritative mechanism — there is no separate
|
|
315
315
|
state-mutation MCP server to degrade from (see
|
|
316
|
-
[`.agents/instructions.md` § 1.D](
|
|
316
|
+
[`.agents/instructions.md` § 1.D](../../instructions.md)).
|
|
317
317
|
|
|
318
318
|
---
|
|
319
319
|
|
|
320
320
|
## See also
|
|
321
321
|
|
|
322
|
-
- [`helpers/single-story-deliver`](
|
|
322
|
+
- [`helpers/single-story-deliver`](single-story-deliver.md) — the
|
|
323
323
|
per-Story worker this command delegates to.
|
|
324
|
-
- [`/
|
|
324
|
+
- [`/deliver`](deliver-epic.md) — full Epic wave loop for
|
|
325
325
|
Epic-attached Stories.
|
|
326
|
-
- [`helpers/epic-deliver-story`](
|
|
327
|
-
per-Story worker `/
|
|
326
|
+
- [`helpers/epic-deliver-story`](epic-deliver-story.md) — the
|
|
327
|
+
per-Story worker `/deliver` uses internally.
|
|
@@ -9,7 +9,7 @@ description: >-
|
|
|
9
9
|
|
|
10
10
|
> **Helper, not a slash command.** Files under `workflows/helpers/` are not
|
|
11
11
|
> projected into the mandrel plugin command tree. The same `lib/checks/` registry runs
|
|
12
|
-
> automatically as preflight inside `/
|
|
12
|
+
> automatically as preflight inside `/deliver`, `/story-close`, and
|
|
13
13
|
> `npm test` — this viewer exists only for ad-hoc inspection. Invoke the
|
|
14
14
|
> backing script directly: `node .agents/scripts/diagnose.js [args]`.
|
|
15
15
|
|
|
@@ -8,8 +8,8 @@ description: >-
|
|
|
8
8
|
# Epic Audit (helper)
|
|
9
9
|
|
|
10
10
|
> **Helper module.** Not a slash command. Invoked automatically from
|
|
11
|
-
> `/
|
|
12
|
-
> `agent::done`). To run an audit directly, use `/
|
|
11
|
+
> `/deliver` Phase 4 once the wave loop completes (all Stories at
|
|
12
|
+
> `agent::done`). To run an audit directly, use `/deliver [Epic_ID]` — it
|
|
13
13
|
> delegates here (or pass `--skip-epic-audit` to bypass).
|
|
14
14
|
|
|
15
15
|
This helper runs the **change-set-aware audit pass** on an Epic branch
|
|
@@ -32,7 +32,7 @@ change-set selection. Both lens sources fire through the **same**
|
|
|
32
32
|
`runAuditSuite` dispatch below — no new audit machinery.
|
|
33
33
|
|
|
34
34
|
> **When to run**: After Phase 3 close-validation passes and before Phase 5
|
|
35
|
-
> code-review. `/
|
|
35
|
+
> code-review. `/deliver` invokes this automatically once the wave loop
|
|
36
36
|
> completes and all Stories reach `agent::done`.
|
|
37
37
|
>
|
|
38
38
|
> **Persona**: `architect` · **Skills**: `core/code-review-and-quality`,
|
|
@@ -94,7 +94,7 @@ resolved by the shared `resolveDepth` resolver from the Epic's model-judged
|
|
|
94
94
|
risk envelope (`overallLevel` off the `epic-plan-state` checkpoint) folded
|
|
95
95
|
with `changedFilesCount`: a high-risk **or** wide-footprint Epic resolves to
|
|
96
96
|
`deep`, a low-risk small one to `light`, and everything else — including an
|
|
97
|
-
Epic that skipped `/
|
|
97
|
+
Epic that skipped `/plan` and has no checkpoint — to `standard`.
|
|
98
98
|
|
|
99
99
|
Depth changes **how deeply** each lens runs, never **which** lenses fire:
|
|
100
100
|
|
|
@@ -274,8 +274,8 @@ The body MUST include:
|
|
|
274
274
|
### Severity gating
|
|
275
275
|
|
|
276
276
|
- **Any 🔴 Critical Blocker** → STOP. Relay to the operator and let
|
|
277
|
-
`/
|
|
278
|
-
- **Only 🟠/🟡/🟢** → log as non-blocking and return to `/
|
|
277
|
+
`/deliver` Phase 4 record a manual intervention.
|
|
278
|
+
- **Only 🟠/🟡/🟢** → log as non-blocking and return to `/deliver`
|
|
279
279
|
Phase 5 (code-review).
|
|
280
280
|
|
|
281
281
|
## Constraints
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: >-
|
|
3
3
|
Helper — not a slash command. Execute one Epic-attached Story end-to-end on
|
|
4
|
-
behalf of `/
|
|
4
|
+
behalf of `/deliver`. Calls `story-init.js`, `cd`s into the worktree,
|
|
5
5
|
runs the Story-implementation phase against the inline acceptance[] /
|
|
6
6
|
verify[] arrays, writes a `story-run-progress` snapshot per transition, and
|
|
7
7
|
finally calls `story-close.js` to merge into the Epic branch and reap the
|
|
@@ -13,19 +13,19 @@ caller: epic-deliver.md
|
|
|
13
13
|
|
|
14
14
|
> **Not a slash command.** This file lives in `helpers/` and is not projected
|
|
15
15
|
> into the mandrel plugin command tree. It is invoked exclusively by the
|
|
16
|
-
> [`/
|
|
17
|
-
> call (`subagent_type: general-purpose`). Run `/
|
|
16
|
+
> [`/deliver`](deliver-epic.md) per-wave fan-out via an `Agent` tool
|
|
17
|
+
> call (`subagent_type: general-purpose`). Run `/deliver <epicId>` from
|
|
18
18
|
> the operator surface, not this helper directly.
|
|
19
19
|
|
|
20
20
|
## Overview
|
|
21
21
|
|
|
22
22
|
`epic-deliver-story` is the **single-Story worker** for Epic-attached Stories.
|
|
23
|
-
It sits below [`/
|
|
23
|
+
It sits below [`/deliver`](deliver-epic.md) (which fans out one Story
|
|
24
24
|
sub-agent per slot, per wave) and runs one Story from init to close in one
|
|
25
25
|
invocation.
|
|
26
26
|
|
|
27
27
|
```text
|
|
28
|
-
/
|
|
28
|
+
/deliver <epicId>
|
|
29
29
|
→ for each wave N:
|
|
30
30
|
Agent tool × concurrencyCap parallel calls (one assistant turn):
|
|
31
31
|
helpers/epic-deliver-story <storyId>
|
|
@@ -36,10 +36,10 @@ invocation.
|
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
The argument is always a **Story ID** (`type::story`). Epic IDs go through
|
|
39
|
-
[`/
|
|
39
|
+
[`/deliver`](deliver-epic.md).
|
|
40
40
|
|
|
41
41
|
**Standalone Stories** (no `Epic: #N` in body) use
|
|
42
|
-
[`/
|
|
42
|
+
[`/deliver`](deliver-stories.md) instead — that workflow's helper
|
|
43
43
|
branches from `main`, opens its PR directly to `main`, and skips the
|
|
44
44
|
Epic-scoped machinery (cascade, dispatch manifest, dashboard regen). This
|
|
45
45
|
helper requires a parent Epic and will refuse to initialize a Story that lacks
|
|
@@ -56,7 +56,7 @@ the `Epic: #N` reference.
|
|
|
56
56
|
|
|
57
57
|
## Non-interactive execution contract
|
|
58
58
|
|
|
59
|
-
`epic-deliver-story` runs as a sub-agent of `/
|
|
59
|
+
`epic-deliver-story` runs as a sub-agent of `/deliver`'s per-wave fan-out
|
|
60
60
|
(common case) or interactively for a single Story. Sub-agent runs share
|
|
61
61
|
the parent's permissions but have **no input channel** mid-run.
|
|
62
62
|
|
|
@@ -93,7 +93,7 @@ node .agents/scripts/story-init.js --story <storyId>
|
|
|
93
93
|
> prevention is cheaper: just give Bash the 10-minute timeout and block.
|
|
94
94
|
|
|
95
95
|
The script validates `type::story`, checks blockers, traces the
|
|
96
|
-
|
|
96
|
+
Epic → PRD/Tech-Spec hierarchy, seeds `story-<id>` from the
|
|
97
97
|
Epic branch, and (when worktree isolation is on) runs `git worktree add`
|
|
98
98
|
at `.worktrees/story-<id>/`. The Story flips to `agent::executing`. A
|
|
99
99
|
`story-init` structured comment is upserted with the Story's inline
|
|
@@ -130,7 +130,7 @@ The Step 0 result envelope carries a `prepare.renderedBody` field — the
|
|
|
130
130
|
markdown body for the initial Story-phase table. **Relay it verbatim to
|
|
131
131
|
chat** so operators see the initial progress block before the first commit
|
|
132
132
|
lands. Do the same after every transition in Step 1 / Step 3 (the body is
|
|
133
|
-
the Story-level rollup the parent `/
|
|
133
|
+
the Story-level rollup the parent `/deliver` aggregator reads).
|
|
134
134
|
|
|
135
135
|
---
|
|
136
136
|
|
|
@@ -291,7 +291,7 @@ When run as a sub-agent, return one JSON object:
|
|
|
291
291
|
> existing `storyId` / `branchDeleted` / `phase` / `detail` /
|
|
292
292
|
> `renderedBody` fields — do **not** add new envelope fields). Do not
|
|
293
293
|
> narrate the steps you took to get there, and do not prescribe how
|
|
294
|
-
> `/
|
|
294
|
+
> `/deliver`'s aggregator should do its job downstream. The parent
|
|
295
295
|
> reads structured state from this envelope and the `story-run-progress`
|
|
296
296
|
> snapshot; prose process commentary only bloats the hydrated prompt
|
|
297
297
|
> (`delivery.maxTokenBudget` elision).
|
|
@@ -307,7 +307,7 @@ regardless of the reap status.
|
|
|
307
307
|
`renderedBody` is the **most recent** `renderedBody` returned by
|
|
308
308
|
`story-phase.js` (typically the `phase: 'done'` snapshot at close,
|
|
309
309
|
or the `phase: 'blocked'` snapshot on a blocker). The parent
|
|
310
|
-
`/
|
|
310
|
+
`/deliver` may inline a digest of this in its wave-level Notable
|
|
311
311
|
section. When run interactively (no parent), omit it — the chat already
|
|
312
312
|
has the latest body relayed during Step 1 / Step 3.
|
|
313
313
|
|
|
@@ -328,7 +328,7 @@ running this helper against an already-closed Story is safe.
|
|
|
328
328
|
only integration target is the parent Epic's integration branch. If
|
|
329
329
|
`story-close.js` short-circuits, no-ops, or otherwise fails to merge,
|
|
330
330
|
**do NOT** fall back to `gh pr create --base main`, **do NOT** invoke
|
|
331
|
-
`/
|
|
331
|
+
`/deliver` on the same Story, and **do NOT** open a PR by
|
|
332
332
|
hand against `main`. Such a PR orphans the change on `main` and forces
|
|
333
333
|
a manual `git merge origin/main` back into `epic/<id>` to recover (the
|
|
334
334
|
Epic #2880 wave-5 / Story #2960 friction note). The framework refuses
|