@houseofwolvesllc/claude-scrum-skill 1.8.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,6 +11,7 @@ Fully autonomous project lifecycle driver. Plans sprints, executes stories via p
11
11
 
12
12
  ## Before You Start
13
13
 
14
+ 0. **v2.0.0 runtime check.** Confirm the Claude Code **Workflow tool** is available in this session. v2.0.0 invokes workflow scripts at `<skills-root>/_workflows/*.js` for sprint execution, Pass 2 epic elaboration, multi-spec queueing, emulation finding verification, and the review gate. If the Workflow tool is absent, abort with: "v2.0.0 requires the Claude Code Workflow tool. Update Claude Code, or install the v1.8.x fallback (`npm install --save-dev @houseofwolvesllc/claude-scrum-skill@1.8.1`)." Do not proceed.
14
15
  1. Read `../shared/references/CONVENTIONS.md` for all project management standards. Follow these conventions exactly. Pay particular attention to **Epic Structure → Design-Spike Epic** — orchestration honors the design-spike epic's gating, so implementation work in a scoped run does not begin until the design-spike epic completes. Also note **Frontmatter Fields → PRD Document Frontmatter** — the `depends_on` field controls inter-spec execution order in sequential multi-path mode.
15
16
  1a. **Multi-path mode and new flags:** when invoked with 2+ existing-file paths, `/project-orchestrate` runs in sequential multi-path mode (each spec receives its own complete orchestration end-to-end). Two new flags are accepted: `--skip-on-pause` (default off; advance the queue when a spec hits a safety gate instead of pausing) and `--merged` (default off; treat multi-path inputs as one combined legacy multi-spec project with a deprecation warning). See **Input Parsing and Mode Detection** for the full classification and **Sequential Multi-Path Mode** for execution details.
16
17
  2. Read `../shared/config.json` to determine the scaffolding mode (`scaffolding` key: `"local"`, `"github"`, `"jira"`, or `"trello"`, default: `"local"`). If `"local"`, also read the `paths.backlog` and `paths.context` values (`paths.context` defaults to `.claude-scrum-skill/context` and is where Step 3 subagents look for per-epic CONTEXT.md files). Read `../shared/references/PROVIDERS.md` for provider-specific API commands when using a remote provider.
@@ -381,94 +382,55 @@ After planning completes, update the state file with the sprint stories and thei
381
382
 
382
383
  ### Step 3: Story Execution
383
384
 
384
- Execute all `executor:claude` stories in the current sprint. Skip `executor:human` and `executor:cowork` stories — they will roll over to the next sprint automatically.
385
+ Execute all `executor:claude` stories in the current sprint by invoking the **sprint_pipeline.js** workflow script. Skip `executor:human` and `executor:cowork` stories — they roll over to the next sprint automatically.
385
386
 
386
- **Parallel execution via Task subagents:**
387
+ #### Path Resolution
387
388
 
388
- For stories with no unresolved dependencies, spawn parallel Task subagents (using the `Task` tool with `subagent_type: "Bash"` or `subagent_type: "general-purpose"` as appropriate). Each subagent receives:
389
+ The workflow script ships at `<skills-root>/_workflows/sprint_pipeline.js`, where `<skills-root>` is the parent directory of this SKILL.md's parent. For a SKILL.md at `~/.claude/skills/project-orchestrate/SKILL.md`, the workflow script absolute path is `~/.claude/skills/_workflows/sprint_pipeline.js`. The same algorithm works for global, local, and plugin install layouts.
389
390
 
390
- **Persona resolution:** Before spawning each subagent, resolve its persona:
391
+ #### Pre-spawn checks
391
392
 
392
- 1. **GitHub mode:** Check the story's labels for a `persona:*` label (e.g., `persona:ops`, `persona:research`).
393
- **Local mode:** Read the `persona` field from the story file's frontmatter.
394
- 2. If found, load the matching preamble from `../shared/references/PERSONAS.md`.
395
- 3. If no persona exists, use the `impl` preamble.
396
- 4. If the persona references a name not defined in `PERSONAS.md`, fall back
397
- to `impl` and log a warning.
393
+ Before invoking the workflow:
398
394
 
399
- **Subagent prompt structure:**
395
+ 1. **Independence check.** Exclude stories whose `blocked_by` references unresolved blockers. Only pass ready stories to the workflow.
396
+ 2. **Persona resolution.** For each story, resolve its persona (`impl`, `ops`, `research`) from labels (GitHub/Trello/Jira) or the `persona` frontmatter field (local mode). Default to `impl`. Build a `personaPreambles` map from the preambles in `../shared/references/PERSONAS.md` to pass to the workflow.
397
+ 3. **Skip human/cowork stories.** Log them as skipped in the state file before invoking.
400
398
 
401
- ```
402
- <persona preamble from PERSONAS.md>
399
+ #### Invocation
403
400
 
404
- ---
401
+ Invoke the Workflow tool with `scriptPath` set to the resolved absolute path and `args` set to:
405
402
 
406
- You are executing story #<number> for repo <owner/repo>.
407
-
408
- **IMPORTANT:** First read the project's CLAUDE.md file if it exists, and
409
- follow all instructions in it. CLAUDE.md is authoritative for stack,
410
- patterns, and style it overrides any general guidance in this preamble.
411
-
412
- **IMPORTANT:** Before writing any code, if `<paths.context>/<epic-slug>/CONTEXT.md`
413
- exists, read it in full. Treat its Naming Conventions, File Layout, Shared
414
- Types & Interfaces, Patterns to Follow, and Patterns to Avoid sections as
415
- binding for this epic — they override generic conventions in CLAUDE.md when
416
- in conflict, and you should follow them even when CLAUDE.md is silent. The
417
- `<paths.context>` and `<epic-slug>` values are substituted from the resolved
418
- config and the story's epic at spawn time.
419
-
420
- **Story:** <title>
421
- **Acceptance criteria:** <from issue body or story file>
422
- **Branch strategy:** Create branch `story/<number>-<slug>` from
423
- `release/<epic-slug>`, implement, commit, push, and open a PR targeting
424
- `release/<epic-slug>`.
425
-
426
- After implementation:
427
-
428
- GitHub mode:
429
- 1. Open a PR with a clear description of changes
430
- 2. Ensure CI passes
431
- 3. The PR should target the release branch, NOT development or main
432
- 4. Do NOT merge the PR — just open it and report back.
433
-
434
- Local mode:
435
- 1. Commit all changes to the story branch
436
- 2. Merge the story branch into release/<epic-slug>
437
- 3. Push the release branch
438
- 4. Report back what was implemented.
403
+ ```yaml
404
+ stories: <array of StorySchema-shaped story objects from the current sprint, filtered to executor:claude + ready>
405
+ epicSlug: <current epic slug>
406
+ releaseBranch: release/<epic-slug>
407
+ contextMdPath: <paths.context>/<epic-slug>/CONTEXT.md (or omit if no design-spike)
408
+ claudeMdPath: project CLAUDE.md absolute path (or omit if absent)
409
+ backendMode: local | github | jira | trello
410
+ repoIdentifier: <owner/repo> (github mode only)
411
+ personaPreambles: { impl: "...", ops: "...", research: "..." }
439
412
  ```
440
413
 
441
- **Execution rules:**
442
-
443
- 1. **Independence check:** Before spawning subagents, analyze story dependencies. Only spawn stories whose blockers are all resolved.
444
- 2. **Concurrency limit:** Run up to 3 subagents in parallel to avoid rate limiting.
445
- 3. **Progress tracking:** As each subagent completes, update the state file and check if any blocked stories are now unblocked. Spawn newly unblocked stories immediately.
446
- 4. **Failure handling:** If a subagent fails, retry once with additional context about the failure. If it fails again, mark the story as blocked with a note and continue with remaining stories.
447
- 5. **Story completion:**
448
- - **GitHub mode:** After a story PR is opened and CI passes, merge it to the release branch:
449
- ```bash
450
- gh pr merge <pr-number> --repo <owner/repo> --squash --auto
451
- ```
452
- - **Local mode:** The subagent merges the story branch directly into the release branch. After completion, update the story file's frontmatter to `status: done`.
453
- 6. **Skip human/cowork stories:** Log them as skipped in the state file. They roll over naturally during sprint release.
454
- 7. **Persona routing:** When resolving personas:
455
- - **GitHub mode:**
456
- ```bash
457
- persona=$(gh issue view <number> --repo <owner/repo> --json labels \
458
- --jq '[.labels[].name | select(startswith("persona:"))] | first // empty' \
459
- | sed 's/persona://')
460
- persona=${persona:-impl}
461
- ```
462
- - **Local mode:** Read the `persona` field from the story file's frontmatter. Default to `impl` if not set.
463
-
464
- Load the corresponding preamble section from `../shared/references/PERSONAS.md`
465
- and prepend it to the subagent prompt. Log the persona assignment in the
466
- state file.
467
-
468
- **Progress updates** — Print a concise progress line every 2-3 story completions:
414
+ Wait for the workflow to return. The return is `SprintStoryReturn[]` — one entry per completed (or blocked / failed) story per `lib/workflows/schemas/SprintStoryReturnSchema.json`.
415
+
416
+ #### Post-workflow persistence
417
+
418
+ For each entry in the workflow's return:
419
+
420
+ - `status: "done"` — Update the story file's frontmatter to `status: done`. Record `branch`, `prUrl` (github) or merge commit (local), and commit SHAs in the state file's "Current Sprint Stories" table.
421
+ - `status: "blocked"` Record `blockers[]` and `reason` in the state file. Add the `blocked` label to the story (or mark blocked locally). Continue.
422
+ - `status: "failed"` — Same persistence as blocked, plus log the failure for sprint-release to roll over.
423
+
424
+ #### Concurrency and barriers
425
+
426
+ The workflow runs up to `min(16, cpu_cores - 2)` stories concurrently with no per-stage barriers — each story's pipeline is independent, so one slow review doesn't gate other stories' implementations. The barrier-removal benefit is unconditional; the concurrency lift is conditional on host cores (a 4-core host gets concurrency 2, an 8-core host gets 6, a 18+-core host gets the full 16). On all hosts this still beats v1.x's hardcoded 3 + barriers model on most sprint sizes.
427
+
428
+ #### Progress updates
429
+
430
+ The workflow surfaces structured progress via the Workflow tool's UI. Additionally, the executing agent SHOULD emit a concise summary line after the workflow returns:
469
431
 
470
432
  ```
471
- Sprint 2: 5/8 stories done (13/19 pts) — #21 auth middleware ✓, #22 rate limiting ✓
433
+ Sprint 2: 5/8 stories done (13/19 pts) — 2 blocked, 1 needs review
472
434
  ```
473
435
 
474
436
  ### Step 4: Sprint Release
@@ -906,16 +868,20 @@ Applies when Mode Classification selected sequential multi-path mode (2+ tokens,
906
868
 
907
869
  ### Per-Spec Loop
908
870
 
871
+ The per-spec loop is **executed by the skill markdown** (not a wrapping workflow), because the inner per-spec orchestration invokes individual workflows (`sprint_pipeline.js`, `elaborate_epics.js`, etc.) via the Workflow tool. The Workflow tool's nesting constraint ("one level of nesting only") prevents a multi-spec-queue workflow from invoking sub-workflows that themselves invoke workflows; the skill markdown is the right layer to orchestrate per-spec iteration.
872
+
909
873
  For each spec in the topologically-sorted execution order:
910
874
 
911
- 1. Update the queue state file (see below): mark this spec's row as `in-progress`, record `Started` timestamp.
912
- 2. Invoke the full single-spec orchestration against this spec. This is the existing v1.7.1 flow — Phase 1 (Epic Completion Loop, including scaffolding via `/project-scaffold`), Phase 2 (Emulation Hardening Loop), Phase 3 (Project Cleanup), Step 16 (ADR Update). Step 17 (state file cleanup) is **suppressed** in multi-path mode; the wrapper handles archival instead.
875
+ 1. Update the queue state file: mark this spec's row as `in-progress`, record `Started` timestamp.
876
+ 2. Invoke the full single-spec orchestration against this spec re-enter Phase 1 (Epic Completion Loop, including scaffolding via `/project-scaffold`), Phase 2 (Emulation Hardening Loop), Phase 3 (Project Cleanup), Step 16 (ADR Update). Each of these phases internally invokes workflows (`sprint_pipeline.js`, `elaborate_epics.js`, `adversarial_verify.js`, `review_panel.js`) as documented in their respective sections. Step 17 (state file cleanup) is **suppressed** in multi-path mode; archive instead with the slug-suffixed naming below.
913
877
  3. On the spec's natural completion: archive `.claude-scrum-skill/orchestration-state.md` to `.claude-scrum-skill/orchestration-state-<spec-slug>.previous.md` BEFORE the next spec begins. Update the queue state file: mark this spec's row as `completed`, record `Completed` timestamp, update aggregate stats.
914
878
  4. On the spec's safety-gate pause:
915
- - **Without `--skip-on-pause`** (default): the per-spec state file remains at `.claude-scrum-skill/orchestration-state.md` with `Status: paused`. Update the queue state file: mark this spec's row as `paused`, set queue `Status: paused`. Exit the wrapper. The remaining specs in the queue are NOT started. The user resolves the gate, re-invokes `/project-orchestrate` with the same arguments, and the queue resumes from this spec.
879
+ - **Without `--skip-on-pause`** (default): per-spec state file remains at `.claude-scrum-skill/orchestration-state.md` with `Status: paused`. Update the queue state file: mark this spec's row as `paused`, set queue `Status: paused`. Exit. Remaining specs are NOT started. User resolves the gate and re-invokes; queue resumes from the paused spec.
916
880
  - **With `--skip-on-pause`**: archive `.claude-scrum-skill/orchestration-state.md` to `.claude-scrum-skill/orchestration-state-<spec-slug>.skipped.md`. Update the queue state file: mark this spec's row as `skipped`, record the pause reason. Continue to the next spec.
917
881
  5. Per-spec orchestration runs to completion (or pause) before the next spec begins — no interleaving of sprints, no concurrent execution.
918
882
 
883
+ After all specs are processed, emit the Cumulative Summary per the subsection below.
884
+
919
885
  ### Spec Slug Derivation
920
886
 
921
887
  A spec's slug is derived from its filename: `basename(path, ".md")`.
@@ -173,29 +173,27 @@ After Pass 1 completes, evaluate the epic count:
173
173
 
174
174
  ### Pass 2 — Per-Epic Elaboration
175
175
 
176
- Spawn one subagent per epic. Each subagent receives a focused context:
177
-
178
- - The **global preamble** from Pass 1 (project overview, glossary, NFRs)
179
- - Its **assigned epic's PRD slice**, extracted using `slice.start_line`
180
- and `slice.end_line` from the manifest
181
- - A **skeleton summary** of sibling epics (name, slug, one-paragraph
182
- description, dependencies) — for cross-epic dependency awareness, NOT
183
- for elaboration
184
-
185
- Each Pass 2 subagent produces the complete story list for its epic:
186
-
187
- - Story titles
188
- - Acceptance criteria
189
- - Technical context
190
- - Story points (per CONVENTIONS.md guidelines)
191
- - Executor assignment (per CONVENTIONS.md guidelines)
192
- - Persona designation (local mode: the `persona` frontmatter field; GitHub/Jira/Trello modes: a `persona:*` label — see CONVENTIONS.md "Persona Labels" and PERSONAS.md for the canonical set)
193
- - Dependency declarations (`blocked_by`, `blocks`)
194
- - All other required frontmatter fields
195
-
196
- **Concurrency cap:** Up to 3 Pass 2 subagents in parallel (matches
197
- `/project-orchestrate` Step 3 convention). Additional epics queue and
198
- start as earlier ones complete.
176
+ Pass 2 is performed by the **elaborate_epics.js** workflow script. Replaces the v1.x Task-based fan-out (concurrency cap of 3) with one parallel wave (concurrency 16) and schema-validated returns.
177
+
178
+ #### Path Resolution
179
+
180
+ Workflow script ships at `<skills-root>/_workflows/elaborate_epics.js`, where `<skills-root>` is the parent of this SKILL.md's parent directory. For `~/.claude/skills/project-scaffold/SKILL.md`, the absolute workflow path is `~/.claude/skills/_workflows/elaborate_epics.js`.
181
+
182
+ #### Invocation
183
+
184
+ Invoke the Workflow tool with `scriptPath` set to the resolved path and `args`:
185
+
186
+ ```yaml
187
+ skeleton: { project: { name, description, global_preamble, non_functional_requirements }, epics: [...] } # the Pass 1 manifest
188
+ prdPath: <absolute path to the PRD>
189
+ conventionsPath: ../shared/references/CONVENTIONS.md # optional but recommended
190
+ ```
191
+
192
+ The workflow returns `Epic[]` per `lib/workflows/schemas/EpicSchema.json`, each with `stories[]` populated. Failed epics return `null` in the array.
193
+
194
+ #### Per-epic context (encoded by the workflow)
195
+
196
+ Each `elaborate:<epic-slug>` agent receives the global preamble, its epic's PRD slice (using `slice.start_line` / `slice.end_line` from the manifest), and a sibling-epic skeleton summary for cross-epic dependency awareness. The output story shape matches `lib/workflows/schemas/StorySchema.json`: title, slug, acceptance_criteria, technical_context, points (Fibonacci), executor, persona, priority, blocked_by, blocks, labels.
199
197
 
200
198
  ### Story Assembly
201
199
 
@@ -47,6 +47,35 @@ default: `.claude-scrum-skill/specs`).
47
47
 
48
48
  Save the output spec to `<specs-path>/YYYYMMDD_hhmmss_{name}.md` where the timestamp is in YYYYMMDD*hhmmss format in **US Pacific Time (PST/PDT)** and `{name}` is a snake_case name that succinctly describes the feature or project. To get the current Pacific time, run `TZ='America/Los_Angeles' date '+%Y%m%d*%H%M%S'` via the Bash tool.
49
49
 
50
+ ### Schema-Validated Sibling Output (v2.0.0+)
51
+
52
+ In addition to the markdown spec document, write a sibling JSON file at `<specs-path>/YYYYMMDD_hhmmss_{name}.spec.json` conforming to `SpecSchema` (`<skills-root>/_workflows/schemas/SpecSchema.json`). Required fields:
53
+
54
+ ```json
55
+ {
56
+ "title": "<spec title>",
57
+ "overview": "<one-paragraph overview>",
58
+ "objectives": {
59
+ "primary": ["..."],
60
+ "secondary": ["..."]
61
+ },
62
+ "epics": [
63
+ {
64
+ "name": "<epic name>",
65
+ "slug": "<kebab-case>",
66
+ "description": "<one-paragraph>",
67
+ "depends_on": [],
68
+ "shared_design_concerns": [],
69
+ "slice": { "start_line": 0, "end_line": 0 }
70
+ }
71
+ ],
72
+ "dependencies": ["..."],
73
+ "design_concerns": ["..."]
74
+ }
75
+ ```
76
+
77
+ The JSON sibling lets downstream skills (`/project-scaffold` especially) consume the spec via schema-validated direct access rather than re-parsing the markdown. Both files MUST be produced; the markdown remains the human-readable canonical document.
78
+
50
79
  ## Guidelines for Success
51
80
 
52
81
  1. **Be Specific**: Avoid vague requirements; provide concrete details.