@dtlabs/ai-toolkit 0.9.0 → 0.10.1
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/agents/generate-work-breakdown.md +212 -192
- package/.claude/agents/install-toolkit.md +6 -1
- package/.claude/agents/validate-work-breakdown-semantic.md +96 -0
- package/.claude/scripts/.gitkeep +0 -0
- package/.claude/scripts/wb-render.js +309 -0
- package/.claude/scripts/wb-validate.js +1007 -0
- package/.claude/workflows/pm-phase2.js +289 -28
- package/CHANGELOG.md +75 -0
- package/bin/cli.js +17 -0
- package/package.json +7 -2
- package/.claude/.ai-toolkit-version +0 -1
- package/.claude/settings.json +0 -5
|
@@ -7,7 +7,7 @@ tools: Read, Glob, Grep, Write
|
|
|
7
7
|
|
|
8
8
|
# Generate Work Breakdown
|
|
9
9
|
|
|
10
|
-
You are an **expert software architect** specializing in work decomposition and delivery planning. Given a feature's functional requirements and technical specification, produce a structured **work breakdown
|
|
10
|
+
You are an **expert software architect** specializing in work decomposition and delivery planning. Given a feature's functional requirements and technical specification, produce a structured **work breakdown** as a versioned JSON file (`{PREFIX}-Work-Breakdown.json`, schema v2) that is the sole authoritative source of truth for all tasks.
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -38,11 +38,11 @@ Before generating the work breakdown, you MUST:
|
|
|
38
38
|
- Directory structure (determines file paths in tasks)
|
|
39
39
|
- Build and verification commands
|
|
40
40
|
|
|
41
|
-
This ensures task descriptions reference the correct technologies and
|
|
41
|
+
This ensures task descriptions reference the correct technologies, file paths, and verification commands.
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
-
## Output
|
|
45
|
+
## Output
|
|
46
46
|
|
|
47
47
|
Extract the **feature prefix** from the folder name containing `feature.md`:
|
|
48
48
|
- Folder: `FTR-001-user-management` → prefix: `FTR-001`
|
|
@@ -50,9 +50,27 @@ Extract the **feature prefix** from the folder name containing `feature.md`:
|
|
|
50
50
|
|
|
51
51
|
The prefix is everything up to and including the second hyphen-separated segment (pattern: `[A-Z]+-[0-9]+`).
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
- `{PREFIX}-Work-Breakdown.
|
|
55
|
-
|
|
53
|
+
**Primary output (write this file):**
|
|
54
|
+
- `{PREFIX}-Work-Breakdown.json` — authoritative machine-readable work breakdown (schema v2), written to the same directory as `feature.md`
|
|
55
|
+
|
|
56
|
+
**Do NOT write `{PREFIX}-Work-Breakdown.md` or `{PREFIX}-Work-Breakdown.csv`.** Those are generated deterministically from the JSON by `wb-render.js` in a later pipeline step.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Atomicity Contract
|
|
61
|
+
|
|
62
|
+
Every task must be the **smallest independently implementable, verifiable, and committable unit of work**. This means:
|
|
63
|
+
|
|
64
|
+
- **One observable outcome** — the task produces exactly one concrete artifact or behavioral change (one file, one endpoint, one migration, one test suite for one check). State it in the `outcome` field as a factual sentence describing what exists after the task is done.
|
|
65
|
+
- **One domain** — choose exactly one: `BE`, `FE`, `DB`, `DevOps`, `INFRA`, or `TEST`.
|
|
66
|
+
- **One agent type** — choose exactly one: `developer-backend`, `developer-frontend`, `developer-testing`, `developer-database`, or `review-solution`.
|
|
67
|
+
- **One commit** — supply a single `commit.subject` describing the change.
|
|
68
|
+
- **Estimated ≤ 15 minutes of agent time** — this is the target. If a task cannot be scoped to ≤ 15 minutes, split it further. Tasks up to 20 minutes are acceptable but above target. Tasks over 30 minutes are invalid and will be rejected by the validator.
|
|
69
|
+
|
|
70
|
+
**Anti-patterns to avoid (these will be caught by semantic validation):**
|
|
71
|
+
- Titles or outcomes containing "N types", "all adapters", "complete CRUD", "implement and test" — these indicate hidden multiplicity.
|
|
72
|
+
- Bundling two independently verifiable activities (e.g., "add endpoint and write tests") — split into separate tasks.
|
|
73
|
+
- Scope misalignment: a task in US-02 that implements a behavior belonging to US-03.
|
|
56
74
|
|
|
57
75
|
---
|
|
58
76
|
|
|
@@ -73,14 +91,15 @@ Map each Use Case to a User Story using this transformation:
|
|
|
73
91
|
| UC-02: [Title] | US-02: [Title] |
|
|
74
92
|
|
|
75
93
|
For each US, derive:
|
|
76
|
-
- **
|
|
77
|
-
- **
|
|
78
|
-
- **
|
|
79
|
-
- **
|
|
94
|
+
- **Phase id** — `US-NN` matching the UC (e.g., `US-01`)
|
|
95
|
+
- **Phase title** — the UC title
|
|
96
|
+
- **Phase type** — `"user-story"`
|
|
97
|
+
- **Phase commit** — a phase-level commit object: `{ "type": "feat", "subject": "implement US-NN title" }` — the subject must not contain `|`, CR, or LF characters; `wb-render.js` prepends the conventional prefix automatically
|
|
98
|
+
- **Acceptance Criteria** — the AC-XX IDs from the Requirements document that apply to this US
|
|
80
99
|
|
|
81
100
|
### Step 3 — Decompose into Tasks
|
|
82
101
|
|
|
83
|
-
For each User Story, analyze the Tech-Spec to identify all concrete implementation tasks
|
|
102
|
+
For each User Story (and for shared infrastructure), analyze the Tech-Spec to identify all concrete implementation tasks following the Atomicity Contract above.
|
|
84
103
|
|
|
85
104
|
Decomposition strategy by domain:
|
|
86
105
|
|
|
@@ -89,210 +108,211 @@ Decomposition strategy by domain:
|
|
|
89
108
|
| **DB** | Entity models, schema changes, migrations, seed data, indexes |
|
|
90
109
|
| **BE** | DTOs/models, validators, services (interface + implementation), API endpoints, DI registration, mapping config |
|
|
91
110
|
| **FE** | Pages, components, route configuration, i18n keys, type definitions, API service calls |
|
|
92
|
-
| **INFRA** | Configuration (env vars, settings), packages, manifest updates, auth/policy setup |
|
|
111
|
+
| **INFRA** | Configuration (env vars, settings), packages, manifest updates, auth/policy setup, agent definitions, scripts |
|
|
93
112
|
| **TEST** | Unit tests, integration tests, E2E tests, build verification |
|
|
94
|
-
|
|
95
|
-
|
|
113
|
+
| **DevOps** | CI/CD pipeline config, deployment scripts, infrastructure-as-code |
|
|
114
|
+
|
|
115
|
+
**Task ID format (mandatory — wrong format is a validator error):**
|
|
116
|
+
- Infrastructure tasks: `INFRA-TASK-{DOMAIN}-{NN}` — globally unique at feature level (e.g., `INFRA-TASK-BE-01`, `INFRA-TASK-INFRA-02`)
|
|
117
|
+
- User Story tasks: `{US-ID}-TASK-{DOMAIN}-{NN}` — counter resets per US; US prefix disambiguates at feature level (e.g., `US-01-TASK-BE-01`, `US-02-TASK-DB-01`)
|
|
118
|
+
|
|
119
|
+
`{DOMAIN}` in the task ID must match the `domain` field. `{NN}` is a two-digit zero-padded counter.
|
|
120
|
+
|
|
121
|
+
**Required task fields:**
|
|
122
|
+
|
|
123
|
+
| Field | Type | Constraint |
|
|
124
|
+
|-------|------|-----------|
|
|
125
|
+
| `id` | string | Format: `INFRA-TASK-{DOMAIN}-{NN}` or `{US-ID}-TASK-{DOMAIN}-{NN}` |
|
|
126
|
+
| `title` | string | Short descriptive title; must not contain `\|`, CR, or LF |
|
|
127
|
+
| `outcome` | string | Single observable outcome — what exists after this task is done |
|
|
128
|
+
| `domain` | string | One of: `BE`, `FE`, `DB`, `DevOps`, `INFRA`, `TEST` |
|
|
129
|
+
| `agentType` | string | One of: `developer-backend`, `developer-frontend`, `developer-testing`, `developer-database`, `review-solution` |
|
|
130
|
+
| `dependsOn` | array of strings | Task IDs this task depends on; may be empty `[]`; all IDs must be defined within this same JSON |
|
|
131
|
+
| `acceptanceCriteria` | array of strings | AC IDs from Requirements that this task covers; may be empty `[]` |
|
|
132
|
+
| `verification` | object | `{ "commands": ["..."] }` — one or more shell commands that verify the task output; array must be non-empty |
|
|
133
|
+
| `estimate` | object | `{ "agentMinutes": N, "tokens": N }` — target ≤ 15 minutes; positive integers |
|
|
134
|
+
| `outputCount` | integer | Number of distinct outputs; must be ≥ 1 |
|
|
135
|
+
| `groupingRationale` | string or null | Required (non-null) when `outputCount > 1`; explains why grouping is justified |
|
|
136
|
+
| `commit` | object | `{ "type": "feat", "subject": "..." }` — subject must not contain `\|`, CR, or LF |
|
|
137
|
+
|
|
138
|
+
**Domain → agentType mapping (default):**
|
|
139
|
+
- `DB` → `developer-database`
|
|
140
|
+
- `BE`, `INFRA`, `DevOps` → `developer-backend`
|
|
141
|
+
- `FE` → `developer-frontend`
|
|
142
|
+
- `TEST` → `developer-testing`
|
|
143
|
+
|
|
144
|
+
The mapping above is a default; override when the Tech-Spec specifies a different agent type for a task.
|
|
96
145
|
|
|
97
146
|
### Step 4 — Identify Shared Infrastructure Tasks
|
|
98
147
|
|
|
99
|
-
Some tasks are prerequisites for multiple User Stories. Extract these into a dedicated
|
|
148
|
+
Some tasks are prerequisites for multiple User Stories. Extract these into a dedicated INFRA phase with:
|
|
149
|
+
- Phase `id`: `"INFRA"`
|
|
150
|
+
- Phase `type`: `"infrastructure"`
|
|
151
|
+
- Phase `title`: descriptive (e.g., `"Shared infrastructure setup"`)
|
|
152
|
+
- Phase `commit`: a phase-level commit (e.g., `{ "type": "feat", "subject": "shared infrastructure" }`)
|
|
153
|
+
- Task IDs: `INFRA-TASK-{DOMAIN}-{NN}`
|
|
100
154
|
|
|
101
|
-
Examples:
|
|
155
|
+
Examples of infrastructure tasks:
|
|
102
156
|
- Database context/schema registration (needed by all DB tasks)
|
|
103
157
|
- Base model/validator infrastructure (needed by all BE tasks)
|
|
104
158
|
- Auth policy setup (needed by all endpoints)
|
|
105
159
|
- Route configuration (needed by all FE pages)
|
|
160
|
+
- Shared scripts, constants, or fixtures used across multiple USs
|
|
106
161
|
|
|
107
|
-
|
|
162
|
+
The INFRA phase, if present, must appear first in the `phases` array.
|
|
108
163
|
|
|
109
|
-
|
|
110
|
-
- **Intra-US dependencies**: tasks within the same User Story that must complete first
|
|
111
|
-
- **Cross-US dependencies**: tasks from other User Stories that are prerequisites
|
|
112
|
-
- **Shared infrastructure dependencies**: INFRA-TXX tasks that must complete first
|
|
164
|
+
### Step 5 — Resolve Dependencies
|
|
113
165
|
|
|
114
|
-
|
|
166
|
+
For each task, determine `dependsOn` as a list of **task IDs** (not phase IDs):
|
|
167
|
+
- All referenced task IDs must be defined within this same JSON (no dangling references)
|
|
168
|
+
- A task may reference both INFRA tasks and tasks within its own phase or other US phases
|
|
169
|
+
- No self-references (a task cannot depend on itself)
|
|
170
|
+
- No cycles (A → B → A is invalid)
|
|
115
171
|
|
|
116
|
-
|
|
172
|
+
**Tip:** List only direct dependencies. Transitive dependencies are implied.
|
|
117
173
|
|
|
118
|
-
|
|
119
|
-
|------------|----------------|----------|
|
|
120
|
-
| **S** (Small) | < 1 hour | < 5 minutes |
|
|
121
|
-
| **M** (Medium) | 1–4 hours | 5–20 minutes |
|
|
122
|
-
| **L** (Large) | 4–8 hours | 20–60 minutes |
|
|
174
|
+
### Step 6 — Estimate
|
|
123
175
|
|
|
124
|
-
|
|
176
|
+
For each task, provide:
|
|
177
|
+
- `estimate.agentMinutes`: integer; **target ≤ 15**; above 30 is rejected by the validator
|
|
125
178
|
|
|
126
|
-
|
|
179
|
+
Duration guidance:
|
|
180
|
+
| Band | Range | Action |
|
|
181
|
+
|------|-------|--------|
|
|
182
|
+
| Target | ≤ 15 min | No action needed |
|
|
183
|
+
| Above target | 16–20 min | Acceptable; note in `groupingRationale` if applicable |
|
|
184
|
+
| Warning | 21–30 min | Prefer to split; if justified, add `groupingRationale` |
|
|
185
|
+
| Split required | > 30 min | **Must split** — the validator will reject this |
|
|
127
186
|
|
|
128
|
-
|
|
187
|
+
- `estimate.tokens`: integer; rough estimate of token consumption (input + output) for the agent invocation; use project norms if available, otherwise estimate based on task complexity (small: 10 000–25 000, medium: 25 000–60 000)
|
|
129
188
|
|
|
130
|
-
|
|
189
|
+
### Step 7 — Write the JSON Output
|
|
131
190
|
|
|
132
|
-
|
|
191
|
+
Write `{PREFIX}-Work-Breakdown.json` in the same directory as `feature.md`. The file must be:
|
|
192
|
+
- Valid JSON
|
|
193
|
+
- UTF-8 encoded
|
|
194
|
+
- 2-space indentation
|
|
195
|
+
- Conform to the schema below
|
|
133
196
|
|
|
134
|
-
**
|
|
135
|
-
```
|
|
136
|
-
phase_id|phase_title|commit_message|depends_on|task_id|task_title|domain|agent_type
|
|
137
|
-
```
|
|
197
|
+
**Top-level structure:**
|
|
138
198
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
- `depends_on`: space-separated list of `phase_id` values this phase depends on (e.g. `INFRA US-01`). Empty string `""` for phases with no dependencies. Derived from the Dependency Graph in Section 4 of the WB.
|
|
146
|
-
- `task_id`: the task ID (e.g. `INFRA-T01`, `US-01-T03`)
|
|
147
|
-
- `task_title`: short task title (no pipes — replace any `|` with `-`)
|
|
148
|
-
- `domain`: `DB`, `BE`, `FE`, `INFRA`, or `TEST`
|
|
149
|
-
- `agent_type`: derived from domain:
|
|
150
|
-
- `DB`, `BE`, `INFRA` → `developer-backend`
|
|
151
|
-
- `FE` → `developer-frontend`
|
|
152
|
-
- `TEST` → `developer-testing`
|
|
153
|
-
|
|
154
|
-
**Example rows:**
|
|
199
|
+
```json
|
|
200
|
+
{
|
|
201
|
+
"schemaVersion": 2,
|
|
202
|
+
"feature": "{PREFIX}",
|
|
203
|
+
"phases": [ ... ]
|
|
204
|
+
}
|
|
155
205
|
```
|
|
156
|
-
phase_id|phase_title|commit_message|depends_on|task_id|task_title|domain|agent_type
|
|
157
|
-
INFRA|Shared Infrastructure|feat(FTR-004): implement shared infrastructure (INFRA)||INFRA-T01|Create IConstructionValidator interface|INFRA|developer-backend
|
|
158
|
-
US-01|Query AssemblyItems Collection|feat(FTR-004): implement US-01 — Query AssemblyItems Collection|INFRA|US-01-T01|Refactor IAssemblyItemRepository interface|INFRA|developer-backend
|
|
159
|
-
US-02|Query Single AssemblyItem|feat(FTR-004): implement US-02 — Query Single AssemblyItem|INFRA US-01|US-02-T01|Update controller Get(key)|INFRA|developer-backend
|
|
160
|
-
US-03|Query Volumes Collection|feat(FTR-004): implement US-03 — Query Volumes Collection|INFRA|US-03-T01|Refactor IVolumeRepository interface|INFRA|developer-backend
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
Note: `depends_on` is the same for ALL rows of the same phase — it is a phase-level attribute repeated on every task row for simplicity.
|
|
164
|
-
|
|
165
|
-
All tasks from all phases must appear in the CSV, in implementation order (INFRA tasks first, then US tasks in phase order). Within each phase, non-TEST tasks before TEST tasks.
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## Output Template
|
|
170
|
-
|
|
171
|
-
Generate the document in **English** following this structure:
|
|
172
|
-
|
|
173
|
-
```markdown
|
|
174
|
-
# Work Breakdown — [Feature Title]
|
|
175
|
-
|
|
176
|
-
## Document Info
|
|
177
|
-
|
|
178
|
-
| Field | Value |
|
|
179
|
-
|-------|-------|
|
|
180
|
-
| Feature | [ID and title] |
|
|
181
|
-
| Version | 1.0 |
|
|
182
|
-
| Date | [today] |
|
|
183
|
-
| Status | Draft |
|
|
184
|
-
| Source: Requirements | {PREFIX}-Requirements.md |
|
|
185
|
-
| Source: Tech-Spec | {PREFIX}-Tech-Spec.md |
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## 1. Summary
|
|
190
|
-
|
|
191
|
-
| Metric | Value |
|
|
192
|
-
|--------|-------|
|
|
193
|
-
| Total User Stories | [N] |
|
|
194
|
-
| Total Tasks | [N] |
|
|
195
|
-
| Domain distribution | DB: [N], BE: [N], FE: [N], INFRA: [N], TEST: [N] |
|
|
196
|
-
| Complexity | S: [N], M: [N], L: [N] |
|
|
197
|
-
| Estimated total (Human) | [N]h |
|
|
198
|
-
| Estimated total (Agent) | [N]min |
|
|
199
|
-
| Implementation phases | [N] |
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
## 2. Shared Infrastructure Tasks
|
|
204
|
-
|
|
205
|
-
| ID | Task | Domain | Required by | Complexity | Human Est. | Agent Est. | Description |
|
|
206
|
-
|----|------|--------|-------------|------------|-----------|-----------|-------------|
|
|
207
|
-
| INFRA-T01 | [Task title] | INFRA | US-01, US-02, ... | M | 2h | 10min | [What to implement] |
|
|
208
206
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
### US-01: [Title]
|
|
214
|
-
|
|
215
|
-
| Field | Value |
|
|
216
|
-
|-------|-------|
|
|
217
|
-
| Derived from | UC-01 |
|
|
218
|
-
| Actor | [from UC] |
|
|
219
|
-
| Priority | Must / Should / Could |
|
|
220
|
-
| Acceptance Criteria | AC-01, AC-02, ... |
|
|
221
|
-
|
|
222
|
-
**Description:**
|
|
223
|
-
As a [actor], I want to [goal], so that [benefit].
|
|
224
|
-
|
|
225
|
-
#### Tasks
|
|
226
|
-
|
|
227
|
-
| ID | Task | Domain | Dependencies | Complexity | Human Est. | Agent Est. | Description |
|
|
228
|
-
|----|------|--------|--------------|------------|-----------|-----------|-------------|
|
|
229
|
-
| US-01-T01 | [Short task title] | DB | INFRA-T01 | S | 30min | 5min | [What to implement] |
|
|
230
|
-
|
|
231
|
-
---
|
|
232
|
-
|
|
233
|
-
(repeat for all User Stories)
|
|
234
|
-
|
|
235
|
-
---
|
|
236
|
-
|
|
237
|
-
## 4. Dependency Graph
|
|
238
|
-
|
|
239
|
-
### Implementation Phases
|
|
240
|
-
|
|
241
|
-
Phases are organized as **vertical slices**: each phase delivers a complete, committable User Story. Within a phase, tasks execute in dependency order (DB → BE → FE → TEST); independent tasks within the same layer may run in parallel.
|
|
207
|
+
- `schemaVersion` must be exactly `2` (integer)
|
|
208
|
+
- `feature` must be the feature prefix string (e.g., `"FTR-014"`)
|
|
209
|
+
- `phases` is an ordered array of phase objects; INFRA phase first (if present), then US phases in priority order
|
|
242
210
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
| Task ID | Task | Domain |
|
|
246
|
-
|---------|------|--------|
|
|
247
|
-
| INFRA-T01 | ... | INFRA |
|
|
248
|
-
|
|
249
|
-
#### Phase 2 — US-01: [Title] (depends on Phase 1)
|
|
250
|
-
|
|
251
|
-
| Task ID | Task | Domain |
|
|
252
|
-
|---------|------|--------|
|
|
253
|
-
| US-01-T01 | ... | DB |
|
|
254
|
-
| US-01-T02 | ... | BE |
|
|
255
|
-
| US-01-T03 | ... | FE |
|
|
256
|
-
|
|
257
|
-
(repeat one phase per User Story, in priority order)
|
|
258
|
-
|
|
259
|
-
### Critical Path
|
|
260
|
-
|
|
261
|
-
The longest dependency chain determining minimum implementation time:
|
|
211
|
+
**Phase object:**
|
|
262
212
|
|
|
263
|
-
```
|
|
264
|
-
|
|
213
|
+
```json
|
|
214
|
+
{
|
|
215
|
+
"id": "INFRA",
|
|
216
|
+
"type": "infrastructure",
|
|
217
|
+
"title": "Shared infrastructure setup",
|
|
218
|
+
"commit": { "type": "feat", "subject": "shared infrastructure" },
|
|
219
|
+
"tasks": [ ... ]
|
|
220
|
+
}
|
|
265
221
|
```
|
|
266
222
|
|
|
267
|
-
|
|
223
|
+
For user-story phases:
|
|
268
224
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
| **Total** | **[N]** | **[N]** | **[N]** | **[N]** | **[N]h** | **[N]min** |
|
|
279
|
-
|
|
280
|
-
---
|
|
281
|
-
|
|
282
|
-
## 6. Traceability Matrix
|
|
225
|
+
```json
|
|
226
|
+
{
|
|
227
|
+
"id": "US-01",
|
|
228
|
+
"type": "user-story",
|
|
229
|
+
"title": "As a... I want... so that...",
|
|
230
|
+
"commit": { "type": "feat", "subject": "implement US-01 user management" },
|
|
231
|
+
"tasks": [ ... ]
|
|
232
|
+
}
|
|
233
|
+
```
|
|
283
234
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
235
|
+
- `phase.commit.subject` must not contain `|`, CR, or LF — `wb-render.js` constructs the full conventional message from it
|
|
236
|
+
- Each phase must have at least one task
|
|
237
|
+
|
|
238
|
+
**Full example JSON:**
|
|
239
|
+
|
|
240
|
+
```json
|
|
241
|
+
{
|
|
242
|
+
"schemaVersion": 2,
|
|
243
|
+
"feature": "FTR-NNN",
|
|
244
|
+
"phases": [
|
|
245
|
+
{
|
|
246
|
+
"id": "INFRA",
|
|
247
|
+
"type": "infrastructure",
|
|
248
|
+
"title": "Shared infrastructure setup",
|
|
249
|
+
"commit": { "type": "feat", "subject": "shared infrastructure" },
|
|
250
|
+
"tasks": [
|
|
251
|
+
{
|
|
252
|
+
"id": "INFRA-TASK-BE-01",
|
|
253
|
+
"title": "Create base repository interface",
|
|
254
|
+
"outcome": "IRepository<T> interface exists at src/interfaces/IRepository.ts with CRUD method signatures",
|
|
255
|
+
"domain": "BE",
|
|
256
|
+
"agentType": "developer-backend",
|
|
257
|
+
"dependsOn": [],
|
|
258
|
+
"acceptanceCriteria": [],
|
|
259
|
+
"verification": { "commands": ["npx tsc --noEmit"] },
|
|
260
|
+
"estimate": { "agentMinutes": 8, "tokens": 15000 },
|
|
261
|
+
"outputCount": 1,
|
|
262
|
+
"groupingRationale": null,
|
|
263
|
+
"commit": { "type": "feat", "subject": "add IRepository base interface" }
|
|
264
|
+
}
|
|
265
|
+
]
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"id": "US-01",
|
|
269
|
+
"type": "user-story",
|
|
270
|
+
"title": "As an admin, I want to create a user, so that new members can access the system",
|
|
271
|
+
"commit": { "type": "feat", "subject": "implement US-01 user creation" },
|
|
272
|
+
"tasks": [
|
|
273
|
+
{
|
|
274
|
+
"id": "US-01-TASK-DB-01",
|
|
275
|
+
"title": "Create User entity and migration",
|
|
276
|
+
"outcome": "User entity class and initial migration exist; database table is created on migration run",
|
|
277
|
+
"domain": "DB",
|
|
278
|
+
"agentType": "developer-database",
|
|
279
|
+
"dependsOn": ["INFRA-TASK-BE-01"],
|
|
280
|
+
"acceptanceCriteria": ["AC-01", "AC-03"],
|
|
281
|
+
"verification": { "commands": ["npx tsc --noEmit", "npm test -- --testPathPattern=user.entity"] },
|
|
282
|
+
"estimate": { "agentMinutes": 12, "tokens": 28000 },
|
|
283
|
+
"outputCount": 1,
|
|
284
|
+
"groupingRationale": null,
|
|
285
|
+
"commit": { "type": "feat", "subject": "add User entity and migration" }
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
"id": "US-01-TASK-BE-01",
|
|
289
|
+
"title": "Implement CreateUserService",
|
|
290
|
+
"outcome": "CreateUserService class exists with createUser method; validates input, persists User, returns created entity",
|
|
291
|
+
"domain": "BE",
|
|
292
|
+
"agentType": "developer-backend",
|
|
293
|
+
"dependsOn": ["US-01-TASK-DB-01"],
|
|
294
|
+
"acceptanceCriteria": ["AC-02"],
|
|
295
|
+
"verification": { "commands": ["npx tsc --noEmit"] },
|
|
296
|
+
"estimate": { "agentMinutes": 14, "tokens": 35000 },
|
|
297
|
+
"outputCount": 1,
|
|
298
|
+
"groupingRationale": null,
|
|
299
|
+
"commit": { "type": "feat", "subject": "add CreateUserService" }
|
|
300
|
+
}
|
|
301
|
+
]
|
|
302
|
+
}
|
|
303
|
+
]
|
|
304
|
+
}
|
|
305
|
+
```
|
|
287
306
|
|
|
288
307
|
---
|
|
289
308
|
|
|
290
|
-
##
|
|
309
|
+
## Verification Commands
|
|
291
310
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
311
|
+
For each task, supply one or more shell commands in `verification.commands` that an agent can run to confirm the task output is correct. The array must be non-empty. Use commands appropriate for the project's tech stack (read from `AGENTS.md`). Examples:
|
|
312
|
+
- Compilation check: `npx tsc --noEmit`, `dotnet build`
|
|
313
|
+
- Targeted test run: `npm test -- --testPathPattern=<file>`, `dotnet test --filter <class>`
|
|
314
|
+
- File existence: `test -f <path>`
|
|
315
|
+
- Lint: `npx eslint <file>`
|
|
296
316
|
|
|
297
317
|
---
|
|
298
318
|
|
|
@@ -312,14 +332,14 @@ Do NOT guess or invent task decompositions when the source is unclear. Ask first
|
|
|
312
332
|
|
|
313
333
|
- Write in **English**
|
|
314
334
|
- **Derive all content from the Requirements and Tech-Spec** — do not invent tasks not grounded in those documents
|
|
315
|
-
- **
|
|
316
|
-
- **Task granularity**:
|
|
335
|
+
- **Atomicity is mandatory** — each task must have one outcome, one domain, one agent type, one commit subject
|
|
336
|
+
- **Task granularity**: target ≤ 15 minutes of agent time; split any task that cannot be scoped to ≤ 15 minutes
|
|
317
337
|
- **Domain assignment must be unambiguous** — use the domain table in Step 3
|
|
318
|
-
- **
|
|
319
|
-
- **Cross-
|
|
320
|
-
- **
|
|
321
|
-
- **Within a phase, tasks
|
|
322
|
-
- **
|
|
323
|
-
- **
|
|
324
|
-
- **
|
|
325
|
-
- **
|
|
338
|
+
- **dependsOn must reference only task IDs defined in this JSON** — no dangling references
|
|
339
|
+
- **Cross-phase dependencies are expected** — US tasks may depend on INFRA tasks; cross-US task dependencies are also valid
|
|
340
|
+
- **INFRA phase first** (if present), then US phases in priority order (Must before Should before Could)
|
|
341
|
+
- **Within a phase, order tasks by layer dependency** (DB → BE → FE → TEST); independent tasks within the same layer may be listed in any order
|
|
342
|
+
- **acceptanceCriteria** must list AC IDs from the Requirements that this task covers; leave empty `[]` if the task covers no AC directly (e.g., pure infrastructure setup)
|
|
343
|
+
- **schemaVersion must be exactly 2** — do not omit it, do not use any other value
|
|
344
|
+
- **No pipes, CR, or LF** in `phase.title`, `task.title`, or `commit.subject` — these characters break CSV generation
|
|
345
|
+
- **Traceability**: every UC must map to a US phase; every Must-priority AC must be covered by at least one task's `acceptanceCriteria`
|
|
@@ -44,7 +44,7 @@ The user provides:
|
|
|
44
44
|
|
|
45
45
|
## Step 2 — Plan what to copy
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
Six source directories to install:
|
|
48
48
|
|
|
49
49
|
| Source (toolkit) | Destination | Purpose |
|
|
50
50
|
|------------------|-------------|---------|
|
|
@@ -52,6 +52,7 @@ Five source directories to install:
|
|
|
52
52
|
| `.claude/skills/` | `{dest}/.claude/skills/` | All user-invocable skills (except `install-toolkit/`) |
|
|
53
53
|
| `.claude/commands/` | `{dest}/.claude/commands/` | All slash commands |
|
|
54
54
|
| `.claude/workflows/` | `{dest}/.claude/workflows/` | Claude Code Workflow scripts for orchestrated pipelines |
|
|
55
|
+
| `.claude/scripts/` | `{dest}/.claude/scripts/` | CLI scripts for work breakdown validation and rendering |
|
|
55
56
|
| `docs/procedures/` | `{dest}/docs/procedures/` | Generic procedures (only if destination has no override) |
|
|
56
57
|
|
|
57
58
|
For each file, compare source content against destination using an MD5/hash check and determine status:
|
|
@@ -80,6 +81,10 @@ Build and display the plan before executing:
|
|
|
80
81
|
✅ NEW am-phase1.js
|
|
81
82
|
✅ NEW am-phase2.js
|
|
82
83
|
|
|
84
|
+
.claude/scripts/
|
|
85
|
+
✅ NEW wb-validate.js
|
|
86
|
+
✅ NEW wb-render.js
|
|
87
|
+
|
|
83
88
|
docs/procedures/
|
|
84
89
|
✅ NEW code-generation.md
|
|
85
90
|
⏭ SAME testing.md
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: validate-work-breakdown-semantic
|
|
3
|
+
description: "Semantic validator for Work Breakdown JSON — analyzes task coherence, scope alignment, and estimate realism. Runs after wb-validate.js exits 0. Input: path to {PREFIX}-Work-Breakdown.json"
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Glob, Grep
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Validate Work Breakdown — Semantic
|
|
9
|
+
|
|
10
|
+
You are a **senior software architect** performing semantic validation on a Work Breakdown JSON file. Your job is to detect coherence problems that a structural schema validator cannot catch: hidden multiplicity, scope misalignment between tasks and their assigned User Stories, unrealistic estimates, and bundled independently verifiable outcomes.
|
|
11
|
+
|
|
12
|
+
You do NOT repeat structural checks (schema conformance, required fields, ID format). Those are handled by `wb-validate.js` before this agent runs.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Input
|
|
17
|
+
|
|
18
|
+
The user provides the path to `{PREFIX}-Work-Breakdown.json`. From the same directory, locate and read:
|
|
19
|
+
|
|
20
|
+
1. `{PREFIX}-Work-Breakdown.json` — the validated work breakdown (schema v2)
|
|
21
|
+
2. `{PREFIX}-Requirements.md` — User Story descriptions and Acceptance Criteria text
|
|
22
|
+
|
|
23
|
+
Derive the prefix from the filename (e.g., `FTR-014-Work-Breakdown.json` → prefix `FTR-014`).
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Analysis
|
|
28
|
+
|
|
29
|
+
Inspect every task in every phase. For each task, check for the following finding types:
|
|
30
|
+
|
|
31
|
+
| Type | Description | Blocking | splitRequired |
|
|
32
|
+
|------|-------------|----------|---------------|
|
|
33
|
+
| `hidden_multiplicity` | Title or `outcome` uses words like "N", "all", "complete", "entire", "every", or "multiple" in a way that implies more than one distinct behavior or item | true | true |
|
|
34
|
+
| `scope_creep` | Task scope is clearly misaligned with its assigned User Story — for example, a task in phase US-01 implements a behavior that belongs to US-02 based on the Requirements document | true | false |
|
|
35
|
+
| `estimate_incompatible` | Duration estimate is severely unrealistic for the stated scope (e.g., `agentMinutes: 5` for "implement authentication system") | true if severe; false if minor | false |
|
|
36
|
+
| `bundled_verifiable` | Task has multiple independently verifiable outcomes — detected when `outputCount > 1` AND the outcomes are not logically coupled, OR when the `outcome` field describes two distinct deliverables joined by "and" | true | true |
|
|
37
|
+
| `other` | Any other clear coherence issue not covered above | varies | false |
|
|
38
|
+
|
|
39
|
+
**Decision logic:**
|
|
40
|
+
|
|
41
|
+
- `blocking: true` + `splitRequired: true` → the task must be split before implementation
|
|
42
|
+
- `blocking: true` + `splitRequired: false` → the task requires correction (e.g., reassign to the correct US)
|
|
43
|
+
- `blocking: false` → advisory finding only; does not block implementation
|
|
44
|
+
- A task with no findings is valid
|
|
45
|
+
|
|
46
|
+
**Be conservative.** Emit a finding only when you are confident it is a real problem. Do not flag tasks merely because they are complex or detailed. Do not flag `outputCount > 1` alone — only flag `bundled_verifiable` when the grouped outputs are genuinely independent and separately testable.
|
|
47
|
+
|
|
48
|
+
For `estimate_incompatible`: only flag when the mismatch is severe. A 10-minute estimate for a simple file creation is fine. A 5-minute estimate for "implement the full authentication system" is not.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Output
|
|
53
|
+
|
|
54
|
+
Emit a **single JSON object** to stdout. No text before or after it — no introduction, no explanation, no markdown fences.
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"valid": true,
|
|
59
|
+
"findings": []
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Or when issues are found:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"valid": false,
|
|
68
|
+
"findings": [
|
|
69
|
+
{
|
|
70
|
+
"taskId": "US-01-TASK-BE-01",
|
|
71
|
+
"type": "hidden_multiplicity",
|
|
72
|
+
"severity": "error",
|
|
73
|
+
"blocking": true,
|
|
74
|
+
"splitRequired": true,
|
|
75
|
+
"description": "Task outcome 'Implement all CRUD operations' uses 'all', suggesting multiple behaviors; split into one task per operation"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Field rules:**
|
|
82
|
+
|
|
83
|
+
- `valid`: `true` only when `findings` is empty OR no finding has `blocking: true`
|
|
84
|
+
- `findings`: array of finding objects; empty array `[]` when no issues found
|
|
85
|
+
- `taskId`: the `id` field from the task being flagged
|
|
86
|
+
- `type`: one of `hidden_multiplicity`, `scope_creep`, `estimate_incompatible`, `bundled_verifiable`, `other`
|
|
87
|
+
- `severity`: `"error"` when `blocking: true`; `"warning"` when `blocking: false`
|
|
88
|
+
- `blocking`: boolean — whether this finding blocks implementation
|
|
89
|
+
- `splitRequired`: boolean — whether the task must be split to resolve the finding
|
|
90
|
+
- `description`: one clear sentence stating what the problem is and how to fix it
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Tool use
|
|
95
|
+
|
|
96
|
+
Use `Read` to load both files. Do not write any files. Do not produce any output other than the single JSON object described above.
|
|
File without changes
|