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.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +6 -0
- package/docs/how-to/workflows/run-test-design.md +15 -0
- package/docs/reference/configuration.md +20 -19
- package/package.json +1 -1
- package/src/workflows/testarch/bmad-testarch-test-design/SKILL.md +3 -1
- package/src/workflows/testarch/bmad-testarch-test-design/instructions.md +1 -1
- package/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-01-detect-mode.md +74 -27
- package/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-01b-resume.md +47 -22
- package/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-02-load-context.md +6 -1
- package/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-03-risk-and-testability.md +4 -1
- package/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-04-coverage-plan.md +4 -1
- package/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-05-generate-output.md +5 -2
- package/src/workflows/testarch/bmad-testarch-test-design/workflow-plan.md +1 -0
|
@@ -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.
|
|
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.
|
|
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
|
-
| `
|
|
443
|
-
| `
|
|
444
|
-
| `
|
|
445
|
-
| `
|
|
446
|
-
| `
|
|
447
|
-
| `
|
|
448
|
-
| `trace` | `
|
|
449
|
-
| `trace` | `
|
|
450
|
-
| `
|
|
451
|
-
| `
|
|
452
|
-
| `teach-me-testing` | `
|
|
453
|
-
| `teach-me-testing` | `tea-academy/{user_name}/
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
|
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
|
|
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:
|
|
28
|
-
- Focus:
|
|
29
|
-
- Limits: Do not re-execute completed steps
|
|
30
|
-
- Dependencies:
|
|
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.
|
|
38
|
+
### 1. Select the Run to Resume
|
|
37
39
|
|
|
38
|
-
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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)
|
package/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-03-risk-and-testability.md
CHANGED
|
@@ -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
|
-
-
|
|
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)
|