bmad-method-test-architecture-enterprise 1.22.2 → 1.22.3-next.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.
@@ -31,7 +31,7 @@
31
31
  "name": "bmad-method-test-architecture-enterprise",
32
32
  "source": "./",
33
33
  "description": "Master Test Architect module for quality strategy, test automation, CI/CD quality gates, and structured testing education. Part of the BMad Method ecosystem.",
34
- "version": "1.22.2",
34
+ "version": "1.22.3-next.0",
35
35
  "author": {
36
36
  "name": "Murat K Ozcan (TEA Creator) & Brian (BMad) Madison"
37
37
  },
package/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Fixed
11
+
12
+ - `test-design` progress checkpoints now carry run identity, so a run for one epic no longer clobbers an interrupted run for another ([#128](https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise/issues/128)). Every create-mode step wrote to a single fixed `{test_artifacts}/test-design-progress.md`, and each step's save appended to whatever was already there, so a second epic's run merged its content and its `stepsCompleted` into the first epic's checkpoint; resuming the first epic afterwards read the second epic's state. `step-01-detect-mode.md` now resolves `run_scope` and `run_key` (`system`, or `epic-{epic_num}`) before the first save, checkpoints are written to `{test_artifacts}/test-design-progress-{run_key}.md`, and the frontmatter carries `runScope` and `runKey`. Resolving `epic_num` in step 1 also removes the late "if `epic_num` is unclear, ask the user" prompt in `step-05-generate-output.md`, so a plan and its checkpoint always name the same run.
13
+ - `test-design` create mode no longer merges two runs into one checkpoint. When a checkpoint already exists for the same scope, step 1 reports its `lastStep` and `lastSaved` and asks whether to resume or start over, and starting over replaces the file instead of appending to it.
14
+ - `test-design` resume mode selects the checkpoint belonging to the run being resumed, asks which run to continue when several checkpoints exist and no scope was named, and refuses a checkpoint whose `runKey` does not match. Checkpoints written under the old fixed name are detected, confirmed with the user, and migrated.
15
+
10
16
  ## [1.22.2] - 2026-08-14
11
17
 
12
18
  ### Added
@@ -63,6 +63,21 @@ For epic-level:
63
63
 
64
64
  TEA generates test design document(s) based on mode.
65
65
 
66
+ ## Interrupting and Resuming a Run
67
+
68
+ Each run saves its progress to its own checkpoint under `{test_artifacts}`:
69
+
70
+ | Run | Checkpoint |
71
+ | ------------ | ---------------------------------- |
72
+ | System-level | `test-design-progress-system.md` |
73
+ | Epic-level | `test-design-progress-epic-{N}.md` |
74
+
75
+ The workflow resolves that name in its first step, from the mode and the epic you named. Interrupting a run for one epic and then running test design for another epic leaves the first epic's checkpoint untouched, so you can come back to it.
76
+
77
+ Pick **[R] Resume** to continue. Name the scope you want (for example "resume epic 3") when checkpoints exist for more than one run; without a scope TEA lists the candidates and asks. TEA refuses to resume a checkpoint that belongs to a different run rather than continuing into it.
78
+
79
+ Checkpoints written before this behavior existed use the old fixed name `test-design-progress.md`. Resume picks that file up, asks you to confirm which run it belongs to, and migrates it to the new name.
80
+
66
81
  ## What You Get
67
82
 
68
83
  **System-Level Output (TWO Documents):**
@@ -432,25 +432,26 @@ Outputs currently land directly under `{test_artifacts}` at the paths listed bel
432
432
 
433
433
  ## TEA Output Files
434
434
 
435
- Paths are relative to `{test_artifacts}` unless noted. Each is declared in the workflow's `workflow.yaml`.
436
-
437
- | Workflow | Output |
438
- | ------------------ | --------------------------------------------------------------------------------------------- |
439
- | `test-design` | `test-design-architecture.md` and `test-design-qa.md` (system-level writes both) |
440
- | `test-design` | `test-design/{project_name}-handoff.md` (system-level; feeds BMAD `create-epics-and-stories`) |
441
- | `test-design` | `test-design-epic-{epic_num}.md` (epic-level) |
442
- | `framework` | `{project-root}/tests/README.md` |
443
- | `atdd` | `atdd-checklist-{story_key}.md` |
444
- | `automate` | `automation-summary.md` |
445
- | `test-review` | `test-review.md` (override per run with the `output_file_override` variable) |
446
- | `nfr-assess` | `nfr-assessment.md` |
447
- | `trace` | `traceability-matrix.md` |
448
- | `trace` | `e2e-trace-summary.json` (machine-readable summary for CI/CD and reporting) |
449
- | `trace` | `gate-decision.json` (emitted only when the collection is gate-eligible) |
450
- | `ci` | `{project-root}/.github/workflows/test.yml` (GitHub Actions default; per-platform otherwise) |
451
- | `teach-me-testing` | `teaching-progress/{user_name}-tea-progress.yaml` |
452
- | `teach-me-testing` | `tea-academy/{user_name}/session-{N}-notes.md` |
453
- | `teach-me-testing` | `tea-academy/{user_name}/tea-completion-summary.md` |
435
+ Paths are relative to `{test_artifacts}` unless noted. Deliverables are declared in the workflow's `workflow.yaml`; resume checkpoints are declared in the step files that write them.
436
+
437
+ | Workflow | Output |
438
+ | ------------------ | --------------------------------------------------------------------------------------------------- |
439
+ | `test-design` | `test-design-architecture.md` and `test-design-qa.md` (system-level writes both) |
440
+ | `test-design` | `test-design/{project_name}-handoff.md` (system-level; feeds BMAD `create-epics-and-stories`) |
441
+ | `test-design` | `test-design-epic-{epic_num}.md` (epic-level) |
442
+ | `test-design` | `test-design-progress-{run_key}.md` (resume checkpoint; `run_key` is `system` or `epic-{epic_num}`) |
443
+ | `framework` | `{project-root}/tests/README.md` |
444
+ | `atdd` | `atdd-checklist-{story_key}.md` |
445
+ | `automate` | `automation-summary.md` |
446
+ | `test-review` | `test-review.md` (override per run with the `output_file_override` variable) |
447
+ | `nfr-assess` | `nfr-assessment.md` |
448
+ | `trace` | `traceability-matrix.md` |
449
+ | `trace` | `e2e-trace-summary.json` (machine-readable summary for CI/CD and reporting) |
450
+ | `trace` | `gate-decision.json` (emitted only when the collection is gate-eligible) |
451
+ | `ci` | `{project-root}/.github/workflows/test.yml` (GitHub Actions default; per-platform otherwise) |
452
+ | `teach-me-testing` | `teaching-progress/{user_name}-tea-progress.yaml` |
453
+ | `teach-me-testing` | `tea-academy/{user_name}/session-{N}-notes.md` |
454
+ | `teach-me-testing` | `tea-academy/{user_name}/tea-completion-summary.md` |
454
455
 
455
456
  `trace` also reads an optional input it never writes: `live-verification-results.json`. Any producer may write it (an agent, a shell script, a CI job, or a person recording an outcome by hand). See [Live Verification Results](/docs/reference/live-verification-results.md) for the contract.
456
457
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "bmad-method-test-architecture-enterprise",
4
- "version": "1.22.2",
4
+ "version": "1.22.3-next.0",
5
5
  "description": "Master Test Architect for quality strategy, test automation, and release gates",
6
6
  "keywords": [
7
7
  "bmad",
@@ -84,4 +84,6 @@ This workflow uses **tri-modal step-file architecture**:
84
84
  - **If V:** Load `{skill-root}/steps-v/step-01-validate.md`
85
85
  - **If E:** Load `{skill-root}/steps-e/step-01-assess.md`
86
86
 
87
- Resume mode reads explicit progress metadata from the progress file (`workflowStatus`, `nextStep`, `totalSteps`) and falls back to legacy `lastStep` data when needed.
87
+ Each run writes its own progress checkpoint at `{test_artifacts}/test-design-progress-{run_key}.md`, where `run_key` is `system` for a system-level run and `epic-{epic_num}` for an epic-level one. Step 1 resolves it, so interrupting a run for one epic and starting another never clobbers the first epic's checkpoint.
88
+
89
+ Resume mode selects the checkpoint matching the run being resumed, asks when several exist and no scope was named, and refuses to continue a checkpoint whose `runKey` belongs to a different run. It reads explicit progress metadata (`workflowStatus`, `nextStep`, `totalSteps`) and falls back to legacy `lastStep` data when needed.
@@ -55,7 +55,7 @@ Load, read completely, and execute:
55
55
  If the user selects **Resume** mode, load, read completely, and execute:
56
56
  `{skill-root}/steps-c/step-01b-resume.md`
57
57
 
58
- This checks the output document for progress tracking frontmatter and routes to the next incomplete step.
58
+ This selects the progress checkpoint belonging to the run being resumed, reads its progress tracking frontmatter, and routes to the next incomplete step. Checkpoints are named `test-design-progress-{run_key}.md` under `{test_artifacts}`, so each epic and the system-level run keep their own.
59
59
 
60
60
  ---
61
61
 
@@ -1,15 +1,16 @@
1
1
  ---
2
2
  name: 'step-01-detect-mode'
3
- description: 'Determine system-level vs epic-level mode and validate prerequisites'
3
+ description: 'Determine system-level vs epic-level mode, resolve run identity, and validate prerequisites'
4
4
  nextStepFile: '{skill-root}/steps-c/step-02-load-context.md'
5
- outputFile: '{test_artifacts}/test-design-progress.md'
5
+ resumeStepFile: '{skill-root}/steps-c/step-01b-resume.md'
6
+ outputFile: '{test_artifacts}/test-design-progress-{run_key}.md'
6
7
  ---
7
8
 
8
9
  # Step 1: Detect Mode & Prerequisites
9
10
 
10
11
  ## STEP GOAL
11
12
 
12
- Determine whether to run **System-Level** or **Epic-Level** test design, and confirm required inputs are available.
13
+ Determine whether to run **System-Level** or **Epic-Level** test design, resolve the run identity that names this run's progress checkpoint, and confirm required inputs are available.
13
14
 
14
15
  ## MANDATORY EXECUTION RULES
15
16
 
@@ -98,33 +99,75 @@ State which mode you will use and why. Then proceed.
98
99
 
99
100
  ---
100
101
 
101
- ### 4. Save Progress
102
+ ## 4. Resolve Run Identity
103
+
104
+ Every run writes a progress checkpoint whose filename carries the run's identity, so an interrupted run for one scope is never clobbered by a run for another. Resolve `run_scope` and `run_key` **now**, before any progress is saved.
105
+
106
+ ### System-Level Mode
107
+
108
+ Set `run_scope` to `system-level` and `run_key` to `system`. A project has one system-level test design, so every system-level run shares this checkpoint.
109
+
110
+ ### Epic-Level Mode
111
+
112
+ Set `run_scope` to `epic-level`, then resolve `epic_num` here rather than at output time:
113
+
114
+ 1. Use the epic the user named in this invocation.
115
+ 2. Otherwise take the epic number from the epic and story documents identified in the prerequisite check, reading it from document metadata, the H1 heading, or the filename.
116
+ 3. If `epic_num` is still ambiguous, list the candidate epics and ask the user which one this run covers. **Halt** until they answer.
117
+
118
+ Set `run_key` to `epic-{epic_num}`.
119
+
120
+ If the epic carries no number, derive a stable slug from its title and use that in place of the number:
121
+
122
+ - lowercase the title
123
+ - collapse runs of whitespace to a single `-`
124
+ - strip every character that is not alphanumeric or `-`
125
+ - trim leading and trailing hyphens
126
+ - truncate to 64 characters
127
+
128
+ Carry `epic_num`, `run_scope`, and `run_key` forward through every remaining step. Step 5 writes `{test_artifacts}/test-design-epic-{epic_num}.md` from the same `epic_num`, so a plan and its checkpoint always name the same run.
129
+
130
+ ---
131
+
132
+ ## 5. Check for an Existing Checkpoint
133
+
134
+ Check whether `{outputFile}` already exists. A checkpoint at this path belongs to a previous run of the **same** scope; checkpoints for other scopes live under their own filenames and are never read or written here.
135
+
136
+ - **Does not exist:** this is a fresh run. Proceed to Save Progress.
137
+ - **Exists with `workflowStatus: 'in-progress'`:** a previous run for this scope was interrupted. Display its `lastStep` and `lastSaved`, then ask:
138
+
139
+ > "An unfinished test-design run for `{run_key}` was last saved {lastSaved} at step {lastStep}. Resume it, or start over? Starting over replaces the checkpoint."
140
+
141
+ **Halt** until the user answers. If they resume, load `{resumeStepFile}`, read it completely, and execute it. If they start over, replace `{outputFile}` entirely in Save Progress.
142
+
143
+ - **Exists with `workflowStatus: 'completed'`:** a finished run for this scope. Replace `{outputFile}` entirely in Save Progress.
144
+
145
+ **Never merge two runs into one checkpoint.** A `stepsCompleted` array carried over from a prior run makes the resume dashboard and its routing report steps this run never performed.
146
+
147
+ ---
148
+
149
+ ### 6. Save Progress
102
150
 
103
151
  **Save this step's accumulated work to `{outputFile}`.**
104
152
 
105
- - **If `{outputFile}` does not exist** (first save), create it with YAML frontmatter:
106
-
107
- ```yaml
108
- ---
109
- workflowStatus: 'in-progress'
110
- totalSteps: 5
111
- stepsCompleted: ['step-01-detect-mode']
112
- lastStep: 'step-01-detect-mode'
113
- nextStep: '{nextStepFile}'
114
- lastSaved: '{date}'
115
- ---
116
- ```
117
-
118
- Then write this step's output below the frontmatter.
119
-
120
- - **If `{outputFile}` already exists**, update:
121
- - Set `workflowStatus: 'in-progress'`
122
- - Set `totalSteps: 5`
123
- - Add `'step-01-detect-mode'` to `stepsCompleted` array (only if not already present)
124
- - Set `lastStep: 'step-01-detect-mode'`
125
- - Set `nextStep: '{nextStepFile}'`
126
- - Set `lastSaved: '{date}'`
127
- - Append this step's output to the appropriate section of the document.
153
+ Write the file with YAML frontmatter, replacing any prior content as decided in the previous section:
154
+
155
+ ```yaml
156
+ ---
157
+ runScope: '{run_scope}'
158
+ runKey: '{run_key}'
159
+ workflowStatus: 'in-progress'
160
+ totalSteps: 5
161
+ stepsCompleted: ['step-01-detect-mode']
162
+ lastStep: 'step-01-detect-mode'
163
+ nextStep: '{nextStepFile}'
164
+ lastSaved: '{date}'
165
+ ---
166
+ ```
167
+
168
+ Then write this step's output below the frontmatter.
169
+
170
+ `runScope` and `runKey` are this run's identity. Later steps carry both forward unchanged, and Resume mode refuses to continue a checkpoint whose `runKey` does not match the run being resumed.
128
171
 
129
172
  Load next step: `{nextStepFile}`
130
173
 
@@ -133,8 +176,12 @@ Load next step: `{nextStepFile}`
133
176
  ### ✅ SUCCESS:
134
177
 
135
178
  - Step completed in full with required outputs
179
+ - `run_scope` and `run_key` resolved before the first save, and the checkpoint written to the path they name
180
+ - Any pre-existing checkpoint for this scope was reported to the user and either resumed or replaced
136
181
 
137
182
  ### ❌ SYSTEM FAILURE:
138
183
 
139
184
  - Skipped sequence steps or missing outputs
185
+ - Saving progress before run identity is resolved, or writing to a checkpoint path that carries no run identity
186
+ - Appending this run's progress to a checkpoint left by a previous run
140
187
  **Master Rule:** Skipping steps is FORBIDDEN.
@@ -1,14 +1,16 @@
1
1
  ---
2
2
  name: 'step-01b-resume'
3
- description: 'Resume interrupted workflow from last completed step'
4
- outputFile: '{test_artifacts}/test-design-progress.md'
3
+ description: 'Resume an interrupted run from its own checkpoint, matched by run identity'
4
+ outputFile: '{test_artifacts}/test-design-progress-{run_key}.md'
5
+ progressGlob: '{test_artifacts}/test-design-progress-*.md'
6
+ legacyOutputFile: '{test_artifacts}/test-design-progress.md'
5
7
  ---
6
8
 
7
9
  # Step 1b: Resume Workflow
8
10
 
9
11
  ## STEP GOAL
10
12
 
11
- Resume an interrupted workflow by loading the existing output document, displaying progress, and routing to the next incomplete step.
13
+ Resume an interrupted workflow by selecting the checkpoint that belongs to the run being resumed, loading its progress, displaying it, and routing to the next incomplete step.
12
14
 
13
15
  ## MANDATORY EXECUTION RULES
14
16
 
@@ -24,19 +26,40 @@ Resume an interrupted workflow by loading the existing output document, displayi
24
26
 
25
27
  ## CONTEXT BOUNDARIES:
26
28
 
27
- - Available context: Output document with progress frontmatter
28
- - Focus: Load progress and route to next step
29
- - Limits: Do not re-execute completed steps
30
- - Dependencies: Output document must exist from a previous run
29
+ - Available context: progress checkpoints written by previous runs
30
+ - Focus: Select the correct run's checkpoint, load its progress, and route to the next step
31
+ - Limits: Do not re-execute completed steps; do not resume a checkpoint belonging to a different run
32
+ - Dependencies: A checkpoint must exist from a previous run of the same scope
31
33
 
32
34
  ## MANDATORY SEQUENCE
33
35
 
34
36
  **CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise.
35
37
 
36
- ### 1. Load Output Document
38
+ ### 1. Select the Run to Resume
37
39
 
38
- Read `{outputFile}` and parse YAML frontmatter for:
40
+ Each run writes its own checkpoint at `{outputFile}`, where `run_key` is `system` for system-level runs and `epic-{epic_num}` for epic-level runs. Build the candidate list:
39
41
 
42
+ 1. List every file matching `{progressGlob}`.
43
+ 2. Also check `{legacyOutputFile}`. Runs from before checkpoints carried run identity wrote to that fixed name.
44
+
45
+ Then select one:
46
+
47
+ - **No candidates:** display "⚠️ **No previous progress found.** There is no checkpoint to resume from. Please use **[C] Create** to start a fresh workflow run." **Halt.**
48
+
49
+ - **The user named a scope in this invocation** (a specific epic, or system-level): resolve `run_key` exactly as `step-01-detect-mode.md` does, then select `{outputFile}` for that key. If no checkpoint exists for it, display "⚠️ **No progress found for `{run_key}`.** Checkpoints exist for: {list of candidate run keys}. Use **[C] Create** to start a run for `{run_key}`, or name one of the listed scopes." **Halt.** Never fall back to another scope's checkpoint.
50
+
51
+ - **Exactly one candidate and no scope named:** select it and state which run it belongs to before continuing.
52
+
53
+ - **More than one candidate and no scope named:** list each candidate with its `runKey`, `lastStep`, and `lastSaved`, and ask which run to resume. **Halt** until the user answers.
54
+
55
+ ---
56
+
57
+ ### 2. Load the Selected Checkpoint
58
+
59
+ Read the selected checkpoint and parse YAML frontmatter for:
60
+
61
+ - `runScope` — `system-level` or `epic-level`
62
+ - `runKey` — this run's identity
40
63
  - `workflowStatus` — overall workflow state (`in-progress` or `completed`)
41
64
  - `totalSteps` — total number of create-mode workflow steps
42
65
  - `stepsCompleted` — array of completed step names
@@ -44,6 +67,10 @@ Read `{outputFile}` and parse YAML frontmatter for:
44
67
  - `nextStep` — next step file to execute
45
68
  - `lastSaved` — timestamp of last save
46
69
 
70
+ **Run identity check.** When the user named a scope in this invocation, `runKey` must equal the `run_key` resolved for it. If it does not, display "⚠️ **Checkpoint belongs to a different run** (`{runKey}`, not `{run_key}`). Refusing to resume." **Halt.** Do not read its progress state and do not report its `workflowStatus`. When the user named no scope, adopt the checkpoint's own `runScope` and `runKey` as this run's identity.
71
+
72
+ **Legacy checkpoint migration.** If `runKey` is absent, the checkpoint predates run identity and cannot be proven to belong to any scope. Ask the user which run it covers (a specific epic, or system-level) and **halt** until they answer. Resolve `run_scope` and `run_key` from their answer exactly as `step-01-detect-mode.md` does, write the checkpoint's content to `{outputFile}` with `runScope` and `runKey` added, delete `{legacyOutputFile}`, and continue from the migrated file.
73
+
47
74
  If `workflowStatus`, `totalSteps`, or `nextStep` are missing (legacy progress file), infer them from `lastStep` using this mapping:
48
75
 
49
76
  - `'step-01-detect-mode'` → `workflowStatus: 'in-progress'`, `totalSteps: 5`, `nextStep: './step-02-load-context.md'`
@@ -52,20 +79,15 @@ If `workflowStatus`, `totalSteps`, or `nextStep` are missing (legacy progress fi
52
79
  - `'step-04-coverage-plan'` → `workflowStatus: 'in-progress'`, `totalSteps: 5`, `nextStep: './step-05-generate-output.md'`
53
80
  - `'step-05-generate-output'` → `workflowStatus: 'completed'`, `totalSteps: 5`, `nextStep: ''`
54
81
 
55
- **If `{outputFile}` does not exist**, display:
56
-
57
- "⚠️ **No previous progress found.** There is no output document to resume from. Please use **[C] Create** to start a fresh workflow run."
58
-
59
- **THEN:** Halt. Do not proceed.
60
-
61
82
  ---
62
83
 
63
- ### 2. Display Progress Dashboard
84
+ ### 3. Display Progress Dashboard
64
85
 
65
86
  Display:
66
87
 
67
88
  "📋 **Workflow Resume — Test Design and Risk Assessment**
68
89
 
90
+ **Run:** {runKey} ({runScope})
69
91
  **Workflow status:** {workflowStatus}
70
92
  **Last saved:** {lastSaved}
71
93
  **Last completed step:** {lastStep}
@@ -74,7 +96,7 @@ Display:
74
96
 
75
97
  ---
76
98
 
77
- ### 3. Route to Next Step
99
+ ### 4. Route to Next Step
78
100
 
79
101
  If `workflowStatus` is `'completed'`, display:
80
102
  "✅ **All steps completed.** Use **[V] Validate** to review outputs or **[E] Edit** to make revisions."
@@ -93,7 +115,7 @@ If `nextStep` is one of the known create-mode step files below, load it, read co
93
115
 
94
116
  **THEN:** Halt.
95
117
 
96
- The existing content in `{outputFile}` provides context from previously completed steps.
118
+ The existing content in the selected checkpoint provides context from previously completed steps. Every later step continues writing to that same checkpoint, so `runScope` and `runKey` stay unchanged for the rest of the run.
97
119
 
98
120
  ---
99
121
 
@@ -101,16 +123,19 @@ The existing content in `{outputFile}` provides context from previously complete
101
123
 
102
124
  ### ✅ SUCCESS:
103
125
 
104
- - Output document loaded and parsed correctly
126
+ - The checkpoint belonging to the requested run was selected, and any ambiguity was resolved by asking
127
+ - Checkpoint loaded and parsed correctly
105
128
  - Explicit or legacy progress state resolved correctly
106
- - Progress dashboard displayed accurately
129
+ - Progress dashboard displayed accurately, including run identity
107
130
  - Routed to correct next step
108
131
 
109
132
  ### ❌ SYSTEM FAILURE:
110
133
 
111
- - Not loading output document
134
+ - Resuming a checkpoint whose `runKey` differs from the run being resumed
135
+ - Silently picking one checkpoint when several exist
136
+ - Not loading the checkpoint
112
137
  - Incorrect progress display
113
138
  - Routing to wrong step
114
139
  - Re-executing completed steps
115
140
 
116
- **Master Rule:** Resume MUST route to the exact next incomplete step. Never re-execute completed steps.
141
+ **Master Rule:** Resume MUST route to the exact next incomplete step of the run it was asked to resume. Never re-execute completed steps, and never continue another run's checkpoint.
@@ -3,7 +3,7 @@ name: 'step-02-load-context'
3
3
  description: 'Load documents, configuration, and knowledge fragments for the chosen mode'
4
4
  nextStepFile: '{skill-root}/steps-c/step-03-risk-and-testability.md'
5
5
  knowledgeIndex: './resources/tea-index.csv'
6
- outputFile: '{test_artifacts}/test-design-progress.md'
6
+ outputFile: '{test_artifacts}/test-design-progress-{run_key}.md'
7
7
  ---
8
8
 
9
9
  # Step 2: Load Context & Knowledge Base
@@ -81,6 +81,8 @@ Extract:
81
81
 
82
82
  ### Epic-Level Mode (Phase 4)
83
83
 
84
+ Load documents for the epic identified by the `epic_num` resolved in step 1. Do not widen the scope to other epics and do not re-derive `epic_num`.
85
+
84
86
  Load:
85
87
 
86
88
  - Epic and story docs with acceptance criteria
@@ -221,6 +223,8 @@ Summarize what was loaded and confirm with the user if anything is missing.
221
223
 
222
224
  ```yaml
223
225
  ---
226
+ runScope: '{run_scope}'
227
+ runKey: '{run_key}'
224
228
  workflowStatus: 'in-progress'
225
229
  totalSteps: 5
226
230
  stepsCompleted: ['step-02-load-context']
@@ -233,6 +237,7 @@ Summarize what was loaded and confirm with the user if anything is missing.
233
237
  Then write this step's output below the frontmatter.
234
238
 
235
239
  - **If `{outputFile}` already exists**, update:
240
+ - Leave `runScope` and `runKey` exactly as step 1 wrote them
236
241
  - Set `workflowStatus: 'in-progress'`
237
242
  - Set `totalSteps: 5`
238
243
  - Add `'step-02-load-context'` to `stepsCompleted` array (only if not already present)
@@ -2,7 +2,7 @@
2
2
  name: 'step-03-risk-and-testability'
3
3
  description: 'Perform testability review (system-level) and risk assessment'
4
4
  nextStepFile: '{skill-root}/steps-c/step-04-coverage-plan.md'
5
- outputFile: '{test_artifacts}/test-design-progress.md'
5
+ outputFile: '{test_artifacts}/test-design-progress-{run_key}.md'
6
6
  ---
7
7
 
8
8
  # Step 3: Testability & Risk Assessment
@@ -96,6 +96,8 @@ Summarize the highest risks and their mitigation priorities.
96
96
 
97
97
  ```yaml
98
98
  ---
99
+ runScope: '{run_scope}'
100
+ runKey: '{run_key}'
99
101
  workflowStatus: 'in-progress'
100
102
  totalSteps: 5
101
103
  stepsCompleted: ['step-03-risk-and-testability']
@@ -108,6 +110,7 @@ Summarize the highest risks and their mitigation priorities.
108
110
  Then write this step's output below the frontmatter.
109
111
 
110
112
  - **If `{outputFile}` already exists**, update:
113
+ - Leave `runScope` and `runKey` exactly as step 1 wrote them
111
114
  - Set `workflowStatus: 'in-progress'`
112
115
  - Set `totalSteps: 5`
113
116
  - Add `'step-03-risk-and-testability'` to `stepsCompleted` array (only if not already present)
@@ -2,7 +2,7 @@
2
2
  name: 'step-04-coverage-plan'
3
3
  description: 'Design test coverage, priorities, execution strategy, and estimates'
4
4
  nextStepFile: '{skill-root}/steps-c/step-05-generate-output.md'
5
- outputFile: '{test_artifacts}/test-design-progress.md'
5
+ outputFile: '{test_artifacts}/test-design-progress-{run_key}.md'
6
6
  ---
7
7
 
8
8
  # Step 4: Coverage Plan & Execution Strategy
@@ -111,6 +111,8 @@ Define thresholds:
111
111
 
112
112
  ```yaml
113
113
  ---
114
+ runScope: '{run_scope}'
115
+ runKey: '{run_key}'
114
116
  workflowStatus: 'in-progress'
115
117
  totalSteps: 5
116
118
  stepsCompleted: ['step-04-coverage-plan']
@@ -123,6 +125,7 @@ Define thresholds:
123
125
  Then write this step's output below the frontmatter.
124
126
 
125
127
  - **If `{outputFile}` already exists**, update:
128
+ - Leave `runScope` and `runKey` exactly as step 1 wrote them
126
129
  - Set `workflowStatus: 'in-progress'`
127
130
  - Set `totalSteps: 5`
128
131
  - Add `'step-04-coverage-plan'` to `stepsCompleted` array (only if not already present)
@@ -2,7 +2,7 @@
2
2
  name: 'step-05-generate-output'
3
3
  description: 'Generate output documents with adaptive orchestration (agent-team, subagent, or sequential)'
4
4
  outputFile: '{test_artifacts}/test-design-epic-{epic_num}.md'
5
- progressFile: '{test_artifacts}/test-design-progress.md'
5
+ progressFile: '{test_artifacts}/test-design-progress-{run_key}.md'
6
6
  ---
7
7
 
8
8
  # Step 5: Generate Outputs & Validate
@@ -119,7 +119,7 @@ If `resolvedMode` is `agent-team` or `subagent`, these two documents can be gene
119
119
  Generate **one** document:
120
120
 
121
121
  - `{outputFile}` using `test-design-template.md`
122
- - If `epic_num` is unclear, ask the user
122
+ - Use the `epic_num` resolved in step 1. It is the value that named this run's progress checkpoint, so the plan and its checkpoint always identify the same run. Do not re-derive it and do not ask the user again.
123
123
 
124
124
  Epic-level mode remains single-worker by default (one output artifact).
125
125
 
@@ -198,6 +198,8 @@ Summarize:
198
198
 
199
199
  ```yaml
200
200
  ---
201
+ runScope: '{run_scope}'
202
+ runKey: '{run_key}'
201
203
  workflowStatus: 'completed'
202
204
  totalSteps: 5
203
205
  stepsCompleted: ['step-05-generate-output']
@@ -210,6 +212,7 @@ Summarize:
210
212
  Then write this step's output below the frontmatter.
211
213
 
212
214
  - **If `{progressFile}` already exists**, update:
215
+ - Leave `runScope` and `runKey` exactly as step 1 wrote them
213
216
  - Set `workflowStatus: 'completed'`
214
217
  - Set `totalSteps: 5`
215
218
  - Add `'step-05-generate-output'` to `stepsCompleted` array (only if not already present)
@@ -20,3 +20,4 @@
20
20
 
21
21
  - {test_artifacts}/test-design-qa.md (system-level)
22
22
  - {test_artifacts}/test-design-epic-{epic_num}.md (epic-level)
23
+ - {test_artifacts}/test-design-progress-{run_key}.md (resume checkpoint; run_key is `system` or `epic-{epic_num}`)