@chris1807/claude-kit 2.3.3 → 2.3.5
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/README.md +1 -1
- package/package.json +1 -1
- package/templates/commands/create-work-item.md +242 -61
- package/templates/commands/edit-work-item.md +13 -7
- package/templates/commands/plan-backlog.md +12 -1
- package/templates/commands/quote-backlog.md +31 -18
- package/templates/commands/quote.md +14 -3
- package/templates/commands/rework.md +2 -2
- package/templates/infrastructure/CLAUDE-WORKFLOW.md +26 -3
package/README.md
CHANGED
|
@@ -692,7 +692,7 @@ Claude reviews for:
|
|
|
692
692
|
| `/quote-backlog` | `/quote-backlog [project]` | Sweep backlog for unpointed items ready to estimate — stories in `Design Approved`, bugs in `New` (bugs have no design states) → review completeness, check for duplicates, suggest rewrites, propose points + creator comments (10 at a time, approval-gated). Also audits the drop-out queue — tagged bugs and stories bounced to Design Review — for items whose creator answered but which nobody returned to the sweep |
|
|
693
693
|
| `/quote` | `/quote AB#1234` | Estimate a work item in story points (senior-calibrated Fibonacci rubric) |
|
|
694
694
|
| `/explain` | `/explain AB#1234` | Summarize and explain a work item in plain language |
|
|
695
|
-
| `/create-work-item` | `/create-work-item [description]` | Interactively draft and create a Feature, Bug, User Story, or Hot Fix — proposes story points (user must agree), creates pointed items in Dev Ready; on a Feature, also drafts its child stories with `Custom.Order` waves. Runs automatically for any plain-language request to create a work item |
|
|
695
|
+
| `/create-work-item` | `/create-work-item [description]` | Interactively draft and create a Feature, Bug, User Story, or Hot Fix — opens each with a plain-English Summary for the PM, then code-grounded Technical Details for the developer, proposes story points (user must agree), creates pointed items in Dev Ready; on a Feature, also drafts its child stories with `Custom.Order` waves. Runs automatically for any plain-language request to create a work item |
|
|
696
696
|
| `/edit-work-item` | `/edit-work-item AB#1234 [what to change]` | Revise an existing work item field-by-field. On a Feature, cascades into its child stories — updates, adds, retires, and re-sequences `Custom.Order` waves — with a safety gate on anything already past Dev Ready |
|
|
697
697
|
| `/cleanup-branches` | `/cleanup-branches` | Delete merged feature/work branches |
|
|
698
698
|
| `/close-orphan-tasks` | `/close-orphan-tasks --dry-run` | Close open Tasks whose parent is Ready to Deploy / Deployed / Closed |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chris1807/claude-kit",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.5",
|
|
4
4
|
"description": "Claude Code starter kit for Azure DevOps teams — agents, hooks, MCP servers, slash commands, and end-to-end work item → PR → release → deploy workflow automation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -51,7 +51,7 @@ You can paste as much detail as you want — I'll structure it.
|
|
|
51
51
|
Scan the user's response for:
|
|
52
52
|
|
|
53
53
|
- Direct image URLs (`.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.svg`)
|
|
54
|
-
- Azure DevOps attachment URLs (e.g. `https://dev.azure.com/.../_apis/wit/attachments/...`)
|
|
54
|
+
- Azure DevOps attachment URLs (e.g. `https://dev.azure.com/.../_apis/wit/attachments/...`) — to look at one before drafting, fetch it with `mcp__azure-devops__wit_work_item_attachment` (the attachment GUID and file name come out of that URL)
|
|
55
55
|
- Markdown image syntax (``)
|
|
56
56
|
- Pasted screenshot blob paths or local file paths to images
|
|
57
57
|
|
|
@@ -77,7 +77,34 @@ If you find nothing, say so in one line rather than omitting the section — "no
|
|
|
77
77
|
|
|
78
78
|
## Step 3: Develop the Plan
|
|
79
79
|
|
|
80
|
-
Translate the user's free-form requirements into a structured work item draft. The shape depends on the type
|
|
80
|
+
Translate the user's free-form requirements into a structured work item draft. The shape depends on the type, but every type serves **two readers**:
|
|
81
|
+
|
|
82
|
+
- **The PM** reads the **Summary** at the top: plain English, no code.
|
|
83
|
+
- **The developer and Claude Code** read everything below it: **technical**, specific, and grounded in the actual codebase. It should be enough to plan and implement the change without rediscovering where it lives.
|
|
84
|
+
|
|
85
|
+
Neither part substitutes for the other. A plain-English item is unimplementable, and an item that is only technical leaves the PM guessing.
|
|
86
|
+
|
|
87
|
+
### The Summary — every type, always first
|
|
88
|
+
|
|
89
|
+
Every work item starts with a **plain-English Summary** written for someone who has never seen the code: a PM, a stakeholder, a support lead. It is the first section of the draft and the first thing on the work item form (Step 8 routes it).
|
|
90
|
+
|
|
91
|
+
- **2–4 sentences** covering what is changing (or what is broken), who notices, and why it matters. On a Bug or Hot Fix, say what people see go wrong, who is affected, and what "fixed" looks like to them.
|
|
92
|
+
- **No technical vocabulary.** That means no code identifiers, file, field, or endpoint names, framework or database names, status codes, or unexplained acronyms. Name things the way a user sees them: the screen, the button, the report, the email. Write "The **Export** button on the Payments page shows an error instead of downloading the file," not "`GET /api/payments/export` returns 500."
|
|
93
|
+
- **No code spans.** If a sentence seems to need one, rewrite the sentence. Bold the one key outcome if it helps; the rest is plain prose.
|
|
94
|
+
- **Not a copy of the Technical Details.** The Summary is what a PM could repeat in a meeting. The sections below it carry the detail the team needs.
|
|
95
|
+
|
|
96
|
+
Check it before showing the draft: could a PM understand every word without asking a developer? If not, rewrite it.
|
|
97
|
+
|
|
98
|
+
### Technical Details — everything below the Summary
|
|
99
|
+
|
|
100
|
+
The **Technical Details** section replaces a plain-language description. It and the sections after it (acceptance criteria, repro steps, prior art) are written for the developer and for Claude Code running `/implement`. Use the real vocabulary:
|
|
101
|
+
|
|
102
|
+
- **Ground it in the code.** Start from what Step 2's codebase search found, then read enough of the relevant code to name what changes. Use real file paths, components, classes, services, endpoints and routes, collections or tables, fields, enums, and config keys, all in code spans. Never invent a path or a name. If you couldn't confirm something, mark it **(unverified)**.
|
|
103
|
+
- **Say what changes and where, layer by layer.** Cover the UI (screens, components, routes), the API (endpoints, request and response shape, validation), services and business rules, data (new or changed fields, indexes, migrations or backfills), permissions and roles, and integrations or background jobs. Skip a layer the work doesn't touch.
|
|
104
|
+
- **Name the rules and constraints.** Include business rules, edge cases, error handling, backward compatibility, and performance or security concerns, plus anything the implementer must not break.
|
|
105
|
+
- **It is not the implementation plan.** Name what changes, where, and under which rules. Leave step-by-step code to `/implement`, which plans from this section.
|
|
106
|
+
- **No working codebase in the session?** Then say **"Not verified against the code"** at the top of the section and write only what the user told you. Never fill the gap with guessed paths.
|
|
107
|
+
- **Sensitive data policy applies.** Never put a PII value or a credential in a work item. Refer to a sensitive field by its purpose ("the tax ID field").
|
|
81
108
|
|
|
82
109
|
### For a Feature:
|
|
83
110
|
|
|
@@ -86,16 +113,21 @@ Translate the user's free-form requirements into a structured work item draft. T
|
|
|
86
113
|
|
|
87
114
|
**Type:** Feature
|
|
88
115
|
|
|
89
|
-
###
|
|
90
|
-
{2–4 sentences
|
|
91
|
-
|
|
116
|
+
### Summary
|
|
117
|
+
{2–4 plain-English sentences for a non-technical reader — see "The Summary" above.}
|
|
118
|
+
|
|
119
|
+
### Technical Details
|
|
120
|
+
{The feature-level technical shape. Cover the architecture or approach, the layers and
|
|
121
|
+
existing components it touches (real paths), data-model changes, integrations, and the
|
|
122
|
+
shared foundation the child stories build on. Note any sequencing constraint: what must
|
|
123
|
+
land first sets `Custom.Order` in Step 3F. Leave per-story detail to the stories.}
|
|
92
124
|
|
|
93
125
|
### Business Value
|
|
94
126
|
{Why this is worth building — the problem it removes or the opportunity it opens.}
|
|
95
127
|
|
|
96
128
|
### Scope
|
|
97
129
|
- {each coherent, independently shippable chunk of work — these become the
|
|
98
|
-
child User Stories in Step
|
|
130
|
+
child User Stories in Step 3F}
|
|
99
131
|
- ...
|
|
100
132
|
|
|
101
133
|
### Out of Scope
|
|
@@ -123,9 +155,15 @@ A Feature carries **no story points** and **never moves to `Dev Ready`** — siz
|
|
|
123
155
|
|
|
124
156
|
**Type:** User Story
|
|
125
157
|
|
|
126
|
-
###
|
|
127
|
-
{2–4 sentences
|
|
128
|
-
|
|
158
|
+
### Summary
|
|
159
|
+
{2–4 plain-English sentences for a non-technical reader — see "The Summary" above.}
|
|
160
|
+
|
|
161
|
+
### Technical Details
|
|
162
|
+
{What changes and where, layer by layer: the UI components and routes, API endpoints
|
|
163
|
+
(with request/response shape and validation), services and business rules, data fields
|
|
164
|
+
and migrations, and permissions. Use real paths and names from the code. Include the
|
|
165
|
+
rules, edge cases, and constraints the implementer must respect. This is what
|
|
166
|
+
`/implement` plans from, and it never moves to the Task.}
|
|
129
167
|
|
|
130
168
|
### Acceptance Criteria
|
|
131
169
|
1. {Given/When/Then or numbered behavior — must be testable}
|
|
@@ -153,8 +191,15 @@ business or user value. Avoid implementation detail — that lives in tasks.}
|
|
|
153
191
|
**Priority:** {1 | 2 | 3 | 4}
|
|
154
192
|
**Severity:** {1 - Critical | 2 - High | 3 - Medium | 4 - Low}
|
|
155
193
|
|
|
156
|
-
###
|
|
157
|
-
{
|
|
194
|
+
### Summary
|
|
195
|
+
{2–4 plain-English sentences for a non-technical reader — see "The Summary" above.}
|
|
196
|
+
|
|
197
|
+
### Technical Details
|
|
198
|
+
{The failing code path: the screen or component, the endpoint and the request that
|
|
199
|
+
fails, and the exact error message, status, log line, or stack trace if known. Name
|
|
200
|
+
the likely root cause and where it lives (real file and method), marked
|
|
201
|
+
**(suspected)** unless you confirmed it in the code. Include the data condition that
|
|
202
|
+
triggers it.}
|
|
158
203
|
|
|
159
204
|
### Steps to Reproduce
|
|
160
205
|
1. ...
|
|
@@ -187,7 +232,7 @@ business or user value. Avoid implementation detail — that lives in tasks.}
|
|
|
187
232
|
A Hot Fix uses the same draft shape as a Bug. Two differences:
|
|
188
233
|
|
|
189
234
|
- **Severity and Priority are constrained.** A Hot Fix is by definition urgent — propose Priority `1` (or `2` at the loosest) and Severity `1 - Critical` or `2 - High`. If the requirements don't support that, the item is probably a Bug; say so before drafting.
|
|
190
|
-
- **Add a `### Production Impact` section** naming what is broken right now, which environment, and roughly who is affected.
|
|
235
|
+
- **Add a `### Production Impact` section** directly after `### Summary`, naming what is broken right now, which environment, and roughly who is affected. On an out-of-band change, this is the section the reviewer reads right after the Summary. It does not replace the Summary or the Technical Details — the Summary stays plain English for the PM, the Technical Details stay the developer's.
|
|
191
236
|
|
|
192
237
|
**Inferring Priority and Severity for Bugs and Hot Fixes:**
|
|
193
238
|
|
|
@@ -209,10 +254,83 @@ Propose initial values based on the requirements, then let the user override dur
|
|
|
209
254
|
|
|
210
255
|
Severity describes user impact; Priority describes scheduling urgency. They are independent — a Sev 2 can be Priority 3 if a workaround exists.
|
|
211
256
|
|
|
257
|
+
### Investment Category and Impact (every type)
|
|
258
|
+
|
|
259
|
+
Every User Story, Bug and Hot Fix gets an **Investment Category** (`Custom.InvestmentCategory`) and an **Impact** (`Custom.Impact`). Both are restricted picklists on the `Agile - CSI` process, and Serena's Monthly Executive and Backlog Grooming reports rank work by them. Propose both from the requirements, show them directly under the draft title with a one-line reason, and let the user change either. A Feature gets one pair that every child story inherits — the Feature type itself has neither field, so never write them to the Feature.
|
|
260
|
+
|
|
261
|
+
| Investment Category | Choose it when |
|
|
262
|
+
|---------------------|----------------|
|
|
263
|
+
| **Strategic Initiative** | part of a named initiative, launch, or client commitment (e.g. C2Q, the AI Assistant, Rotary) |
|
|
264
|
+
| **Quick Win** | small (about 3 points or fewer) with value out of proportion to that |
|
|
265
|
+
| **Risk Mitigation** | mainly reduces compliance, security, PII, data-integrity, or payment/financial risk |
|
|
266
|
+
| **Maintenance** | anything else that keeps the product working or improves it. The default |
|
|
267
|
+
|
|
268
|
+
| Impact | Choose it when |
|
|
269
|
+
|--------|----------------|
|
|
270
|
+
| **Strategic** | advances a company-level goal or a client commitment |
|
|
271
|
+
| **Large** | materially changes outcomes for many users or for a client |
|
|
272
|
+
| **Medium** | meaningfully improves a recurring workflow |
|
|
273
|
+
| **Small** | a minor improvement for a limited audience |
|
|
274
|
+
| **Tiny/One-off** | cosmetic, an edge case, or a one-time fix |
|
|
275
|
+
|
|
276
|
+
Impact is the difference the item makes, not its size. Spell the values exactly as above (`Tiny/One-off` included): Azure DevOps rejects anything else. Serena's Teams wizard chooses from the same tables, so an item reads the same whichever way it was created.
|
|
277
|
+
|
|
278
|
+
**Only where the process has the fields.** Every project on the `Agile - CSI` process has them (CSI Development, CST Development and the rest). Confirm once per session with `mcp__azure-devops__wit_work_item` (`action: get_type`) for the type being created; if `Custom.InvestmentCategory` and `Custom.Impact` aren't in its `fields`, leave both out of the draft, the confirmation, and the create call — writing a field the process doesn't define fails the create.
|
|
279
|
+
|
|
212
280
|
### Title Prefix
|
|
213
281
|
|
|
214
282
|
The title MUST start with one of the product prefixes from the project's CLAUDE.md (e.g. `COM`, `CDA`, `PAY`, `AUD`, `SER`, `PSSF`, `TPS`, `MTG`). If the project CLAUDE.md does not define a prefix table, ask the user which prefix to use before drafting. Format is `PREFIX - Title Here`.
|
|
215
283
|
|
|
284
|
+
### Step 3F: Decompose the Feature into child stories (Features only)
|
|
285
|
+
|
|
286
|
+
Directly under the Feature draft, in the same message, present the decomposition as a table — one row per proposed child User Story:
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
### Decomposition Plan — {n} child stories
|
|
290
|
+
|
|
291
|
+
| # | Order | Proposed title | Summary (one line) | Points | Mockup |
|
|
292
|
+
|---|-------|----------------|--------------------|--------|--------|
|
|
293
|
+
| 1 | 1 | {Prefix} - … | … | 3 | yes |
|
|
294
|
+
| 2 | 1 | {Prefix} - … | … | 2 | no |
|
|
295
|
+
| 3 | 2 | {Prefix} - … | … | 5 | yes |
|
|
296
|
+
|
|
297
|
+
**Sequencing:** Order 1 (#1, #2) ships first and the two are independent.
|
|
298
|
+
Order 2 (#3) needs #1's endpoint before it can render.
|
|
299
|
+
|
|
300
|
+
Total: {sum} points across {n} stories.
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
The Order column comes first on purpose — it matches the wave table `/implement` prints for a Feature (`implement.md`, "Execution Waves (Custom.Order)"), so the two commands produce visually identical artifacts.
|
|
304
|
+
|
|
305
|
+
**Each child is a full User Story draft.** Start from the Feature's **Scope** bullets — each one is a candidate child; if a bullet is really two stories, split it. Draft every child with the User Story shape above: its own plain-English Summary, Technical Details specific to that story (drawn from the Feature's Technical Details and the code), and testable acceptance criteria. The table's Summary column is a one-line version of that child's plain-English Summary — the same no-code rule applies, and it is the text that opens the child's description.
|
|
306
|
+
|
|
307
|
+
**Every child carries the same prefix as its parent Feature.** Validate all titles up front: an unprefixed child fails at create time, after the Feature already exists.
|
|
308
|
+
|
|
309
|
+
**Sizing baseline (state it in the draft, above or below the table):**
|
|
310
|
+
|
|
311
|
+
```
|
|
312
|
+
Story points assume a **senior developer working with Claude** — override any
|
|
313
|
+
value you disagree with.
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
> **Assume a senior developer working with Claude is the implementer.** Discount for what Claude removes — boilerplate, test scaffolding, mechanical wiring, codebase search. Do NOT discount for ambiguous AC, product decisions, data migrations, cross-team coordination, or verification needing a running environment.
|
|
317
|
+
|
|
318
|
+
That is the same baseline `/quote`, `/quote-backlog` and `/plan-backlog` estimate against, so a `/quote` run against a story created here should land on the same number. If the two disagree, one of them is wrong — reconcile it rather than explaining the gap away.
|
|
319
|
+
|
|
320
|
+
Use the modified Fibonacci scale `1, 2, 3, 5, 8`. **No child story may be larger than 8** — a 13 means the decomposition is wrong and that child must be split again.
|
|
321
|
+
|
|
322
|
+
**Count limits.** Between 2 and 10 child stories. Fewer than 2 means this should have been a User Story — say so and offer to switch the type instead of creating a one-child Feature. More than 10 means the Feature is too big — do NOT silently truncate; offer to (i) merge the smallest related stories or (ii) split this into two Features.
|
|
323
|
+
|
|
324
|
+
**Order validation — run it as a check, not a vibe:**
|
|
325
|
+
|
|
326
|
+
1. Orders are positive integers starting at 1, contiguous, no gaps.
|
|
327
|
+
2. For every dependency "story A needs story B", require `order(B) < order(A)`. **Equal orders with a dependency between them is an error**, and so is a dependency pointing at a *higher* order.
|
|
328
|
+
3. Every story at order N must be buildable against the merged state of orders 1..N-1 only — that is what "stories sharing an order are mutually independent" means.
|
|
329
|
+
4. If a check fails, do not present the plan: bump the dependent story's order, renumber, and re-validate first.
|
|
330
|
+
5. Render the result as the plain-language **Sequencing** paragraph shown above.
|
|
331
|
+
|
|
332
|
+
**Mockups are decided per child, not per Feature.** The Feature itself never gets a mockup. Use the same UI heuristic as Step 5 (a screen, a form, a button, a workflow) to set the Mockup column. Non-UI children are marked `No mockup — non-UI work`.
|
|
333
|
+
|
|
216
334
|
### Approval
|
|
217
335
|
|
|
218
336
|
After presenting the draft, ask:
|
|
@@ -223,9 +341,19 @@ Approve this draft? (yes / suggest changes / cancel)
|
|
|
223
341
|
|
|
224
342
|
**Wait for the user.** If they suggest changes, revise the draft and present it again — repeat until they approve or cancel. Do NOT proceed to story points, mockup, or project selection until approved.
|
|
225
343
|
|
|
344
|
+
For a **Feature**, that one gate approves the ENTIRE plan — the Feature and every child. Alongside ordinary wording changes, `suggest changes` covers these child-level edits:
|
|
345
|
+
|
|
346
|
+
- `edit 3: <what to change>` — retitle, re-summarize, re-point, or flip the mockup flag on child 3
|
|
347
|
+
- `add: <description>` — append a child, give it an order, and re-validate
|
|
348
|
+
- `remove 2` — drop a child; re-check that nothing depended on it and renumber the orders to close any gap
|
|
349
|
+
- `reorder 3 -> 1` — move a child between waves and re-run every ordering rule
|
|
350
|
+
- `split 4` / `merge 2,3` — the two most common reactions to a decomposition
|
|
351
|
+
|
|
352
|
+
After ANY of these: re-run the order validation, re-render the whole table, and re-ask the gate. Never accept approval of part of the plan.
|
|
353
|
+
|
|
226
354
|
## Step 4: Propose Story Points
|
|
227
355
|
|
|
228
|
-
**Skip this step entirely for a Feature.** A Feature's size is the sum of its child stories — the Feature itself gets no `StoryPoints` value and stays in `New`. Its stories
|
|
356
|
+
**Skip this step entirely for a Feature.** A Feature's size is the sum of its child stories — the Feature itself gets no `StoryPoints` value and stays in `New`. Its stories were pointed in Step 3F. Go to Step 5.
|
|
229
357
|
|
|
230
358
|
For a **Bug**, **User Story**, or **Hot Fix**, every work item this command creates gets a story point estimate — proposed automatically, applied only with the user's agreement.
|
|
231
359
|
|
|
@@ -307,6 +435,7 @@ Before creating anything in Azure DevOps, present a final summary and ask for on
|
|
|
307
435
|
**Title:** {Prefix} - {title}
|
|
308
436
|
**Type:** {Feature | Bug | User Story | Hot Fix}
|
|
309
437
|
**Project:** {project}
|
|
438
|
+
**Summary:** {the plain-English Summary, in full}
|
|
310
439
|
{for Bugs and Hot Fixes:}
|
|
311
440
|
**Priority:** {n}
|
|
312
441
|
**Severity:** {n - Label}
|
|
@@ -315,8 +444,9 @@ Before creating anything in Azure DevOps, present a final summary and ask for on
|
|
|
315
444
|
**Production Impact:** {one line}
|
|
316
445
|
{end for Hot Fixes}
|
|
317
446
|
{for Features:}
|
|
318
|
-
**
|
|
447
|
+
**Child stories:** {n} ({sum} points) — created with the Feature, per the approved Decomposition Plan
|
|
319
448
|
{end for Features}
|
|
449
|
+
**Investment Category · Impact:** {category} · {impact}{for Features: — on every child story}
|
|
320
450
|
**Story Points:** {n (agreed) | skipped | n/a — Features aren't pointed}
|
|
321
451
|
**Initial State:** {Dev Ready (pointed) | New (no points) | New (Feature)}
|
|
322
452
|
**Mockup:** {Embedded | Not requested | Skipped (non-UI)}
|
|
@@ -328,7 +458,7 @@ Create this work item now? (yes / edit / cancel)
|
|
|
328
458
|
|
|
329
459
|
**Wait for the user.**
|
|
330
460
|
- `yes` → proceed to Step 8
|
|
331
|
-
- `edit` → ask which field to revise (title,
|
|
461
|
+
- `edit` → ask which field to revise (title, summary, technical details, AC, priority, severity, production impact, investment category, impact, story points, project, mockup), revise it, then re-show this summary
|
|
332
462
|
- `cancel` → abort with no work item created and confirm "Cancelled — no work item created."
|
|
333
463
|
|
|
334
464
|
## Step 8: Render to HTML and Create
|
|
@@ -360,7 +490,7 @@ A description that is one long paragraph of plain prose is not acceptable — ev
|
|
|
360
490
|
- **Lists** are used instead of comma-separated prose whenever the draft contains 2+ parallel items (steps, files, references, acceptance criteria).
|
|
361
491
|
- **Section headings** *inside a field's own content* are kept — they become `<h3>` and structure the rendered output. The draft's **top-level** section headings are different: they are routing labels, not content, and the heading is dropped when its section becomes its own field (see below).
|
|
362
492
|
|
|
363
|
-
Apply this pass to every section (
|
|
493
|
+
Apply this pass to every section (Technical Details, Production Impact, Acceptance Criteria, Steps to Reproduce, Expected/Actual Behavior, Environment/Scope, Prior Art, Open Questions). Apply it equally to Bugs, Hot Fixes, User Stories, Features, and every child story. **The Summary is the exception:** it gets no code spans and no identifiers (Step 3), only an optional bolded outcome.
|
|
364
494
|
|
|
365
495
|
### Split the draft into fields — acceptance criteria never go in the description
|
|
366
496
|
|
|
@@ -374,14 +504,15 @@ Verify with `mcp__azure-devops__wit_work_item` (`action: get_type`) rather than
|
|
|
374
504
|
|
|
375
505
|
| Draft section | Goes to |
|
|
376
506
|
|---|---|
|
|
377
|
-
| `###
|
|
507
|
+
| `### Summary` | `System.Description` — the **first** block, under its own `<h3>Summary</h3>` |
|
|
508
|
+
| `### Technical Details` | `System.Description`, after the Summary, followed by the mockup `<img>`, user-supplied images, `Out of Scope`, `Prior Art`, and `Open Questions` |
|
|
378
509
|
| `### Acceptance Criteria` | `Microsoft.VSTS.Common.AcceptanceCriteria` — **never** also in the description |
|
|
379
510
|
|
|
380
511
|
**Bug** — its form renders only **Repro Steps** and **System Info**. It has **no Acceptance Criteria field**, and `System.Description` has **no control on the Bug form**, so anything routed there is invisible to a human reader:
|
|
381
512
|
|
|
382
513
|
| Draft section | Goes to |
|
|
383
514
|
|---|---|
|
|
384
|
-
| `###
|
|
515
|
+
| `### Summary`, `### Technical Details`, `### Steps to Reproduce`, `### Expected Behavior`, `### Actual Behavior`, `### Acceptance Criteria`, `### Prior Art`, `### Open Questions` | `Microsoft.VSTS.TCM.ReproSteps` — composed into one document, each under its own `<h3>`, in that order |
|
|
385
516
|
| `### Environment / Scope` | `Microsoft.VSTS.TCM.SystemInfo` |
|
|
386
517
|
| (the same composed body) | `System.Description` — a labelled **duplicate**, for tools that read it without checking the type. Never unique content. |
|
|
387
518
|
|
|
@@ -391,9 +522,13 @@ Do **not** send `Microsoft.VSTS.Common.AcceptanceCriteria` on a Bug. Still *writ
|
|
|
391
522
|
|
|
392
523
|
| Draft section | Goes to |
|
|
393
524
|
|---|---|
|
|
394
|
-
| `###
|
|
525
|
+
| `### Summary`, `### Production Impact`, `### Technical Details`, `### Prior Art`, `### Open Questions` | `System.Description`, in that order |
|
|
395
526
|
| `### Steps to Reproduce`, `### Expected Behavior`, `### Actual Behavior`, `### Environment / Scope` | `Microsoft.VSTS.TCM.ReproSteps` |
|
|
396
527
|
|
|
528
|
+
**Feature** — everything renders into `System.Description`, with `### Summary` first (see the Features bullet under *Call the create API*, and Phase 1 below for where the Decomposition block goes).
|
|
529
|
+
|
|
530
|
+
**The Summary always leads** the field the form displays and keeps its `<h3>Summary</h3>` heading, because it shares that field with other sections. It is never omitted.
|
|
531
|
+
|
|
397
532
|
**Omit an empty section entirely** — never emit a bare `<h3>` with nothing under it. A heading with no body reads as content that went missing.
|
|
398
533
|
|
|
399
534
|
**The rendered `System.Description` must not contain an "Acceptance Criteria" heading or its criteria** — not as `<h3>`, not as `<strong>`, not as a bolded line, not "for readability", not "so it reads as a complete document". Azure DevOps renders the AC field as its own section on the work item form, so a copy in the description gives the reader two lists that drift apart while leaving the real field empty. It also breaks estimation: an empty AC field is exactly what `/quote`, `/quote-backlog`, and `/plan-backlog` read to decide an item can't be sized, so criteria in the wrong field make a fully-specified story look unestimable and bounce it back to its creator.
|
|
@@ -406,75 +541,117 @@ This applies to **User Story**. It does **not** apply to Bug or Hot Fix: neither
|
|
|
406
541
|
|
|
407
542
|
### Call the create API
|
|
408
543
|
|
|
409
|
-
Call `mcp__azure-devops__wit_work_item_write`
|
|
544
|
+
Call `mcp__azure-devops__wit_work_item_write` with `action: "create"`:
|
|
410
545
|
|
|
411
546
|
- **project**: the chosen project
|
|
412
547
|
- **workItemType**: `Feature`, `Bug`, `User Story`, or `Hot Fix` (two words, exact casing)
|
|
413
|
-
- **
|
|
414
|
-
|
|
415
|
-
|
|
548
|
+
- **fields**: an **array of `{name, value, format}` objects** — *not* a JSON Patch document. The title is one of them (`System.Title`), not a separate parameter. Every large-text field needs `format: "Html"` or Azure DevOps may interpret it as Markdown. Every `value` is a **string**, so numerics are stringified (`"2"`, `"3"`, `"1"`).
|
|
549
|
+
|
|
550
|
+
```
|
|
551
|
+
mcp__azure-devops__wit_work_item_write
|
|
552
|
+
action: "create"
|
|
553
|
+
project: "{project}"
|
|
554
|
+
workItemType: "User Story"
|
|
555
|
+
fields: [
|
|
556
|
+
{ name: "System.Title", value: "{Prefix} - {title}" },
|
|
557
|
+
{ name: "System.Description", value: "<h3>Summary</h3><p>…</p><h3>Technical Details</h3>…", format: "Html" },
|
|
558
|
+
{ name: "Microsoft.VSTS.Common.AcceptanceCriteria", value: "<ol>…</ol>", format: "Html" }
|
|
559
|
+
]
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
The example above is a **User Story**. Other types carry different fields, and getting this wrong is invisible: **Azure DevOps accepts a write to a field a work item type does not have.** The value persists and reads back over the API while no form ever renders it — nothing raises, nothing logs. Confirm with `mcp__azure-devops__wit_work_item` (`action: get_type`) rather than assuming.
|
|
563
|
+
|
|
564
|
+
The fields to set:
|
|
565
|
+
- `System.Title` — the approved title, with its prefix
|
|
566
|
+
- `System.Description` — the rendered HTML: the `<h3>Summary</h3>` block first, then the Technical Details, the embedded mockup `<img>` and any user-supplied images, then the remaining sections per the routing tables above. On a **Bug** this is the labelled duplicate of the composed body, not unique content
|
|
416
567
|
- `Microsoft.VSTS.Common.AcceptanceCriteria` — **User Story only.** The rendered criteria list and **only** the criteria (no `<h3>Acceptance Criteria</h3>` wrapper, and no copy of it in `System.Description`); writing it is what clears the process template's placeholder tip. **Do not send this field on a Bug or a Hot Fix** — neither type has it
|
|
417
568
|
- `Microsoft.VSTS.Scheduling.StoryPoints` — the points agreed in Step 4 (omit entirely if the user skipped, and **always** for a Feature)
|
|
569
|
+
- `Custom.InvestmentCategory` and `Custom.Impact` — the approved values, on a User Story, Bug or Hot Fix. **Never on a Feature**; its pair goes on each child story instead. If a project's process rejects them, retry without them and say so in the confirmation
|
|
418
570
|
- For Features:
|
|
419
|
-
- Render `Business Value`, `Scope`, `Out of Scope`,
|
|
571
|
+
- Render `Summary` first, then `Technical Details`, `Business Value`, `Scope`, `Out of Scope`, `Success Criteria`, and `Prior Art`, into the description. Put `Success Criteria` in `Microsoft.VSTS.Common.AcceptanceCriteria` **only if** the process template exposes that field on Feature — if the create call rejects it, fold the block into the description and retry rather than dropping it.
|
|
420
572
|
- `Microsoft.VSTS.Common.BusinessValue` — only if the user supplied a number. Never invent one.
|
|
421
573
|
- Omit `Microsoft.VSTS.Scheduling.StoryPoints` entirely.
|
|
422
574
|
- For Bugs:
|
|
423
|
-
- `Microsoft.VSTS.TCM.ReproSteps` — the **whole composed body**:
|
|
575
|
+
- `Microsoft.VSTS.TCM.ReproSteps` — the **whole composed body**: summary, technical details, steps, expected behavior, actual behavior, acceptance criteria, prior art and open questions, each under its own `<h3>`. This is the Bug's field of record; its form shows no Description control. The acceptance criteria are folded in here because the Bug type has no Acceptance Criteria field.
|
|
424
576
|
- `Microsoft.VSTS.TCM.SystemInfo` — the `Environment / Scope` section. Omit the field entirely when there is no environment to record, rather than writing an empty value that leaves a blank box on the form.
|
|
425
577
|
- `Microsoft.VSTS.Common.Priority` — the chosen Priority (1–4)
|
|
426
578
|
- `Microsoft.VSTS.Common.Severity` — the chosen Severity (`1 - Critical`, `2 - High`, `3 - Medium`, `4 - Low`)
|
|
427
579
|
- For Hot Fixes:
|
|
428
580
|
- `Microsoft.VSTS.TCM.ReproSteps` — steps, expected behavior, actual behavior and `Environment / Scope` (this type has no System Info field). If the `Hot Fix` type in this process template doesn't expose `ReproSteps`, fold them into `System.Description` rather than dropping them.
|
|
429
|
-
- Render the `Production Impact` section into `System.Description` as an `<h3>` block
|
|
581
|
+
- Render the `Production Impact` section into `System.Description` as an `<h3>` block between the Summary and the Technical Details.
|
|
430
582
|
- No Priority/Severity — a Hot Fix is urgent by definition.
|
|
431
583
|
|
|
432
584
|
If the `Open Questions` section is non-empty, append it as a clearly-labeled HTML block (`<h3>Open Questions</h3><ul>...</ul>`) **to the field that work item type displays** — the composed `ReproSteps` body on a **Bug**, `System.Description` on a **User Story**, **Hot Fix**, or **Feature**. Putting it in the description of a Bug hides it from every reader.
|
|
433
585
|
|
|
434
|
-
###
|
|
586
|
+
### Call the create API (Feature — three phases)
|
|
435
587
|
|
|
436
|
-
|
|
588
|
+
A Feature and its children are created in one run, in this order. Nothing is created until the Step 3F plan was approved.
|
|
437
589
|
|
|
438
|
-
**
|
|
590
|
+
**Phase 1 — the Feature, first.** One `mcp__azure-devops__wit_work_item_write` `action: "create"` with `workItemType: "Feature"` and the `fields[]` shape above. Capture the returned id as `{fid}`.
|
|
591
|
+
|
|
592
|
+
The Feature's description is assembled in this order: the `<h3>Summary</h3>` block, then `<h3>Technical Details</h3>`, `<h3>Business Value</h3>`, and the other sections from the Features bullet above, then a `<h3>Decomposition</h3>` block, then any open questions. The Decomposition block carries the Step 3F plan **onto the work item** — an HTML `<table>` with one row per child (Order, Story, Points, Depends on, Mockup) followed by the **Sequencing** paragraph rendered as HTML. Without it the ordering rationale exists only in this chat; `/implement` re-derives the waves from `Custom.Order`, but the reviewer reading the Feature in Azure DevOps needs to see *why* the waves are ordered the way they are. (Child AB# ids do not exist yet in Phase 1 — the table names children by title.)
|
|
593
|
+
|
|
594
|
+
**If Phase 1 fails, stop — create nothing else.** Creating the Feature first is precisely what makes this failure harmless.
|
|
595
|
+
|
|
596
|
+
**Phase 2 — the children, in ascending execution order.** One `create` per child (`workItemType: "User Story"`), so the AB# sequence matches the wave sequence:
|
|
597
|
+
|
|
598
|
+
```
|
|
599
|
+
mcp__azure-devops__wit_work_item_write
|
|
600
|
+
action: "create"
|
|
601
|
+
project: "{project}"
|
|
602
|
+
workItemType: "User Story"
|
|
603
|
+
fields: [
|
|
604
|
+
{ name: "System.Title", value: "{Prefix} - …" },
|
|
605
|
+
{ name: "System.Description", value: "<h3>Summary</h3><p>…</p><h3>Technical Details</h3>…", format: "Html" },
|
|
606
|
+
{ name: "Microsoft.VSTS.Common.AcceptanceCriteria", value: "<ol>…</ol>", format: "Html" },
|
|
607
|
+
{ name: "Microsoft.VSTS.Scheduling.StoryPoints", value: "3" },
|
|
608
|
+
{ name: "Custom.Order", value: "1" },
|
|
609
|
+
{ name: "Custom.InvestmentCategory", value: "Strategic Initiative" },
|
|
610
|
+
{ name: "Custom.Impact", value: "Large" }
|
|
611
|
+
]
|
|
612
|
+
```
|
|
439
613
|
|
|
440
|
-
|
|
614
|
+
Each child is rendered and routed exactly like a standalone User Story: its own `<h3>Summary</h3>` block first, then its Technical Details, then either the mockup `<img>` from Step 5 or the `No mockup — non-UI work` note, with its criteria in `Microsoft.VSTS.Common.AcceptanceCriteria` only.
|
|
441
615
|
|
|
442
|
-
|
|
616
|
+
**`Custom.Order` rejection fallback.** `Custom.Order` comes from an inherited process and may be absent from the User Story form in some projects; `Microsoft.VSTS.Scheduling.StoryPoints` is absent from some templates. If the `create` is rejected because of either, retry that child once *without* both fields, then set them with a follow-up `action: "update"`:
|
|
443
617
|
|
|
444
|
-
|
|
618
|
+
```
|
|
619
|
+
mcp__azure-devops__wit_work_item_write
|
|
620
|
+
action: "update"
|
|
621
|
+
project: "{project}"
|
|
622
|
+
id: {childId}
|
|
623
|
+
updates: [ { op: "add", path: "/fields/Custom.Order", value: "1" } ]
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
If that also fails, report the child as created *without* an execution order — do not leave it silently unordered. `/implement` treats a child with no `Custom.Order` as a final catch-all wave, so **every** child must end up with a value.
|
|
627
|
+
|
|
628
|
+
**Phase 3 — link every child to the Feature in ONE call.** `updates` is an array, so this is a single call, not one per child:
|
|
445
629
|
|
|
446
630
|
```
|
|
447
|
-
|
|
631
|
+
mcp__azure-devops__wit_work_item_link_write
|
|
632
|
+
action: "link"
|
|
633
|
+
project: "{project}"
|
|
634
|
+
updates: [
|
|
635
|
+
{ id: {fid}, linkToId: {story1Id}, type: "child" },
|
|
636
|
+
{ id: {fid}, linkToId: {story2Id}, type: "child" }
|
|
637
|
+
]
|
|
448
638
|
```
|
|
449
639
|
|
|
450
|
-
|
|
640
|
+
`type: "child"` from the Feature is what produces `System.LinkTypes.Hierarchy-Forward` — the link type parameter is a closed enum of friendly names and the literal `System.LinkTypes.Hierarchy-Forward` string is **not** accepted.
|
|
451
641
|
|
|
452
|
-
|
|
642
|
+
**Do NOT use `mcp__azure-devops__wit_work_item_write` `action: "add_child"`.** Its `items[]` accepts only `{title, description, format, areaPath, iterationPath}` — there is no slot for AcceptanceCriteria, StoryPoints, or `Custom.Order`, so children created that way cannot satisfy the field requirements above.
|
|
453
643
|
|
|
454
|
-
|
|
455
|
-
2. Assign each story a **`Custom.Order`** value. Stories that can be built in parallel share the same number; a story that depends on an earlier one gets a higher number. Start at `1` and increment per wave. This field drives the wave ordering in `/implement` — a story with no value lands in a catch-all wave, so set it on every story.
|
|
456
|
-
3. Propose story points for each using the Step 4 rubric.
|
|
457
|
-
4. Present the whole set for approval at once:
|
|
644
|
+
**Partial-failure policy.** Never leave orphans and never roll back — this command has no delete path and must not grow one. If a child create fails mid-run: report which items already exist by AB#, then ask whether to retry the failed child or stop and leave the rest for manual creation. If Phase 3 fails after the children exist, report the ids and the exact link call to retry.
|
|
458
645
|
|
|
459
|
-
|
|
460
|
-
|---|-------|----------------|--------|---------|
|
|
646
|
+
### Move to Dev Ready (pointed items only)
|
|
461
647
|
|
|
462
|
-
|
|
463
|
-
Approve these child stories? (yes / change N / drop N / cancel)
|
|
464
|
-
```
|
|
648
|
+
If story points were agreed in Step 4, set `System.State` to `Dev Ready` via `mcp__azure-devops__wit_work_item_write` with `action: "update"` (`id` plus `updates: [ { op: "add", path: "/fields/System.State", value: "Dev Ready" } ]`) **after** the item is created (a separate call — new items start in `New`, and some process templates reject a non-initial state in the create call). If the state transition is rejected, report the error and leave the state as-is — don't silently retry through intermediate states. Items created without points stay in `New`.
|
|
465
649
|
|
|
466
|
-
|
|
467
|
-
5. On approval, create each story with `mcp__azure-devops__wit_work_item_write` (action `create`) in the same project, setting:
|
|
468
|
-
- `System.Description` and `Microsoft.VSTS.Common.AcceptanceCriteria` — rendered to HTML per the Step 8 rules
|
|
469
|
-
- `Custom.Order` — the wave number
|
|
470
|
-
- `Microsoft.VSTS.Scheduling.StoryPoints` — the agreed points
|
|
471
|
-
- `System.AssignedTo` — copied from the Feature if the Feature has an assignee; otherwise leave unset
|
|
472
|
-
6. Link each story to the Feature as a child via `mcp__azure-devops__wit_work_item_link_write` (`System.LinkTypes.Hierarchy-Reverse` from the story to the Feature).
|
|
473
|
-
7. Move each pointed story to `Dev Ready` in a follow-up update, per the Step 8 rule. **The Feature's state is never changed.**
|
|
650
|
+
The same applies to each child story of a Feature: every child was pointed in Step 3F, so each one gets the same `update` once Phase 3 has linked it.
|
|
474
651
|
|
|
475
|
-
|
|
652
|
+
**Features are never moved.** A Feature stays in `New` and advances only as its child stories are verified and closed — the same rule `/implement` follows.
|
|
476
653
|
|
|
477
|
-
## Step
|
|
654
|
+
## Step 9: Confirm
|
|
478
655
|
|
|
479
656
|
**Read the item back first**, and check the fields that type actually renders — a write to a field the type lacks *succeeds*, so reading back the wrong field proves nothing.
|
|
480
657
|
|
|
@@ -485,13 +662,15 @@ For a **User Story**, fetch `System.Description` and `Microsoft.VSTS.Common.Acce
|
|
|
485
662
|
|
|
486
663
|
For a **Bug**, fetch `Microsoft.VSTS.TCM.ReproSteps` and `Microsoft.VSTS.TCM.SystemInfo`:
|
|
487
664
|
|
|
488
|
-
1. `ReproSteps` carries every section —
|
|
665
|
+
1. `ReproSteps` carries every section — summary, technical details, steps, expected, actual, acceptance criteria — each under its own heading.
|
|
489
666
|
2. The environment is in `SystemInfo`.
|
|
490
667
|
3. No section appears **only** in `System.Description`, which the Bug form does not display.
|
|
491
668
|
|
|
492
|
-
For a **Hot Fix**, fetch `System.Description` and `Microsoft.VSTS.TCM.ReproSteps`, and confirm the narrative is in the former and the reproduction detail in the latter.
|
|
669
|
+
For a **Hot Fix**, fetch `System.Description` and `Microsoft.VSTS.TCM.ReproSteps`, and confirm the narrative — Summary, then Production Impact, then Technical Details — is in the former and the reproduction detail in the latter.
|
|
493
670
|
|
|
494
|
-
|
|
671
|
+
On **every** type, the displayed field (`System.Description`, or `ReproSteps` on a Bug) opens with the `<h3>Summary</h3>` block, and that block contains no `<code>`. A `Technical Details` block follows it. For a **Feature**, also confirm its description carries the `<h3>Decomposition</h3>` block, and check every child story created in Phase 2 the same way as a User Story, plus its `Custom.Order`.
|
|
672
|
+
|
|
673
|
+
If a check fails the write didn't take — fix it with `mcp__azure-devops__wit_work_item_write` `action: "update"` before reporting success. Don't report a created item you haven't read back.
|
|
495
674
|
|
|
496
675
|
After creation, report:
|
|
497
676
|
|
|
@@ -517,13 +696,15 @@ Next steps:
|
|
|
517
696
|
/implement AB#{id} — start working on it
|
|
518
697
|
```
|
|
519
698
|
|
|
520
|
-
For a **Feature**, use these next steps instead:
|
|
699
|
+
For a **Feature**, use these next steps instead — `{fid}` is the Feature's id, not a child's:
|
|
521
700
|
|
|
522
701
|
```
|
|
523
702
|
Next steps:
|
|
524
|
-
/explain AB#{
|
|
525
|
-
/plan-backlog
|
|
526
|
-
/implement AB#{
|
|
703
|
+
/explain AB#{fid} — re-read the feature in plain language
|
|
704
|
+
/plan-backlog — propose child Tasks for the Dev Ready stories
|
|
705
|
+
/implement AB#{fid} — implement the child stories in Custom.Order waves
|
|
527
706
|
```
|
|
528
707
|
|
|
708
|
+
`/quote` is not offered for a Feature: its size is the sum of its children, which are already pointed.
|
|
709
|
+
|
|
529
710
|
Do not assign the work item, set an iteration, or add tags unless the user explicitly asks — those are downstream decisions.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Edit an existing Azure DevOps work item. Usage: `/edit-work-item <work-item-id> [what to change]`
|
|
2
2
|
|
|
3
|
-
This command revises a work item that already exists — title, description, acceptance criteria, points, priority/severity, order. On a **Feature** it treats the Feature and its child User Stories as **one unit**: a change to the Feature's scope cascades into the children, new stories are drafted for new scope, stories that fell out of scope are retired, and `Custom.Order` is re-sequenced so the implementation waves still make sense.
|
|
3
|
+
This command revises a work item that already exists — title, description, acceptance criteria, points, priority/severity, Investment Category / Impact, order. On a **Feature** it treats the Feature and its child User Stories as **one unit**: a change to the Feature's scope cascades into the children, new stories are drafted for new scope, stories that fell out of scope are retired, and `Custom.Order` is re-sequenced so the implementation waves still make sense.
|
|
4
4
|
|
|
5
5
|
Parse `$ARGUMENTS`:
|
|
6
6
|
- **Work item ID** — accept `AB#1234`, `#1234`, or `1234`. Required. If missing, ask for it and stop.
|
|
@@ -14,6 +14,7 @@ Read the work item with `expand: Relations` so links and children come back. Col
|
|
|
14
14
|
- `System.Title`, `System.WorkItemType`, `System.State`, `System.AssignedTo`, `System.Tags`
|
|
15
15
|
- `System.Description`, `Microsoft.VSTS.Common.AcceptanceCriteria`
|
|
16
16
|
- `Microsoft.VSTS.Scheduling.StoryPoints`, `Custom.Order`
|
|
17
|
+
- For User Stories, Bugs and Hot Fixes: `Custom.InvestmentCategory` and `Custom.Impact` — the classification `/create-work-item` Step 3 defines (skip both if the process doesn't have them)
|
|
17
18
|
- For Bugs / Hot Fixes: `Microsoft.VSTS.TCM.ReproSteps`, `Microsoft.VSTS.Common.Priority`, `Microsoft.VSTS.Common.Severity`
|
|
18
19
|
- For Bugs: `Microsoft.VSTS.TCM.SystemInfo` — the Bug form's second rendered field, where the environment belongs
|
|
19
20
|
- Parent, children, and **linked pull requests** (`ArtifactLink` relations)
|
|
@@ -23,7 +24,7 @@ If the work item is not found, report the error and stop.
|
|
|
23
24
|
|
|
24
25
|
### If the item is a Feature
|
|
25
26
|
|
|
26
|
-
Also fetch every child via `wit_work_item` `get_batch` with fields `System.Id`, `System.Title`, `System.WorkItemType`, `System.State`, `System.AssignedTo`, `Custom.Order`, `Microsoft.VSTS.Scheduling.StoryPoints`, `System.Description`, `Microsoft.VSTS.Common.AcceptanceCriteria`. Children are the `System.LinkTypes.Hierarchy-Forward` relations. You need their full text — you cannot judge whether a story still fits the revised scope from its title alone.
|
|
27
|
+
Also fetch every child via `wit_work_item` `get_batch` with fields `System.Id`, `System.Title`, `System.WorkItemType`, `System.State`, `System.AssignedTo`, `Custom.Order`, `Microsoft.VSTS.Scheduling.StoryPoints`, `Custom.InvestmentCategory`, `Custom.Impact`, `System.Description`, `Microsoft.VSTS.Common.AcceptanceCriteria`. Children are the `System.LinkTypes.Hierarchy-Forward` relations. You need their full text — you cannot judge whether a story still fits the revised scope from its title alone.
|
|
27
28
|
|
|
28
29
|
## Step 2: Show the Current Item
|
|
29
30
|
|
|
@@ -33,6 +34,7 @@ Present what exists today, so the user is editing against reality and not memory
|
|
|
33
34
|
## AB#{id}: {title}
|
|
34
35
|
|
|
35
36
|
**Type:** {type} **State:** {state} **Points:** {n | not set} **Assigned:** {name | unassigned}
|
|
37
|
+
**Investment Category:** {value | not set} **Impact:** {value | not set} (User Story, Bug, Hot Fix)
|
|
36
38
|
**Linked PRs:** {#id (status), ... | none}
|
|
37
39
|
|
|
38
40
|
### Description
|
|
@@ -110,6 +112,7 @@ Produce a **field-level diff**, not a rewritten item. For every field you propos
|
|
|
110
112
|
+ 4. {added criterion}
|
|
111
113
|
|
|
112
114
|
**Story Points:** {n} → {m} ({one-line rationale})
|
|
115
|
+
**Investment Category / Impact:** {old} → {new} ({one-line reason})
|
|
113
116
|
**Priority / Severity:** {n} → {m} (Bugs only)
|
|
114
117
|
|
|
115
118
|
**Unchanged:** {list the fields you deliberately left alone}
|
|
@@ -118,9 +121,11 @@ Produce a **field-level diff**, not a rewritten item. For every field you propos
|
|
|
118
121
|
Rules for the draft:
|
|
119
122
|
|
|
120
123
|
- **Preserve, don't regenerate.** Keep existing wording that the change request doesn't touch. Never drop existing `<img>` tags, attachment URLs, or reference links.
|
|
124
|
+
- **Keep both halves true.** Every item has two readers (rules in `/create-work-item` Step 3). The PM reads the plain-English **Summary** at the top. The developer and Claude Code read the **Technical Details** below it, grounded in real paths and names from the code. If the change moves what the item does, revise both in this change set: the Summary in plain English, and the Technical Details against the code. If the item lacks either one, propose it here. Either way it shows in the diff like any other field change.
|
|
121
125
|
- **Points follow the `/quote` rubric** — modified Fibonacci (`1, 2, 3, 5, 8, 13, 21`), calibrated for a senior developer working with Claude assistance. Only propose a change if the scope actually moved. If the revised item now looks bigger than 21 points, recommend splitting it into a Feature instead of writing the number.
|
|
122
126
|
- **Prior art moves the number too, and it can move it *down*.** Added scope normally raises points, but scope that turns out to be a second or third consumer of something already built often costs less than the first one did — sometimes less than the raise it would otherwise earn. If the Step 3 search found precedent, say so in the points rationale rather than pricing the addition as new work.
|
|
123
|
-
- **
|
|
127
|
+
- **Keep the classification true.** If the change moves *why* the item exists or *how much it matters* — new scope that makes it part of an initiative, a fix that turns out to protect payment data, scope cut down to a one-off — propose new `Investment Category` / `Impact` values from the tables in `/create-work-item` Step 3, with a one-line reason. If either field is unset, propose it. A value a person already chose changes only when the edit gives a reason to; a wording tweak never does.
|
|
128
|
+
- **Never point a Feature** and never change a Feature's `System.State`. A Feature carries no Investment Category or Impact either — they live on its child stories.
|
|
124
129
|
- **Prefix rule holds** — if the title changes, it keeps its `PREFIX - ` prefix from the project's CLAUDE.md table.
|
|
125
130
|
|
|
126
131
|
### If the item is a Feature — cascade to the children
|
|
@@ -131,7 +136,7 @@ This is the point of the command. After drafting the Feature's own changes, eval
|
|
|
131
136
|
|---------|---------|--------|
|
|
132
137
|
| **Unchanged** | Still correct under the new scope | Leave it entirely alone |
|
|
133
138
|
| **Update** | Still belongs, but its title / description / AC / points no longer match | Draft a field-level diff for it |
|
|
134
|
-
| **Add** | The revised scope introduces work no existing story covers | Draft a new User Story (`/create-work-item` Step 3 shape) with proposed points |
|
|
139
|
+
| **Add** | The revised scope introduces work no existing story covers | Draft a new User Story (`/create-work-item` Step 3 shape) with proposed points, Investment Category and Impact — normally the same pair as its sibling stories |
|
|
135
140
|
| **Retire** | The revised scope no longer includes this work | Propose `System.State` = `Removed`, or unlinking from the Feature — user picks |
|
|
136
141
|
| **Split** | The story now carries two independently shippable slices | Propose narrowing the existing story and adding a sibling |
|
|
137
142
|
|
|
@@ -211,7 +216,7 @@ Default the comment question to **yes** for any item past `New`, and **no** for
|
|
|
211
216
|
|
|
212
217
|
## Step 7: Apply
|
|
213
218
|
|
|
214
|
-
Render every Markdown section to HTML first — Azure DevOps description and acceptance criteria fields do not render Markdown. Use the conversion table and the **emphasis and code spans** rules from `/create-work-item` Step 8: bold the noun phrase carrying each claim, wrap identifiers in `<code
|
|
219
|
+
Render every Markdown section to HTML first — Azure DevOps description and acceptance criteria fields do not render Markdown. Use the conversion table and the **emphasis and code spans** rules from `/create-work-item` Step 8: bold the noun phrase carrying each claim, wrap identifiers in `<code>` (never in the Summary, which has none), use lists for 2+ parallel items, keep `### Headings` as `<h3>`. The Summary stays the first block of the field the form displays. Preserve existing `<img>` tags exactly.
|
|
215
220
|
|
|
216
221
|
**Route each section to its own field, per work item type** — use the routing tables in `/create-work-item` Step 8. Editing is the moment routing gets silently undone: it is easy to render the whole reviewed document into the description and leave the real fields as they were. And a wrong field does not announce itself — **Azure DevOps accepts a write to a field a type does not carry**, so the value persists, reads back over the API, and renders nowhere.
|
|
217
222
|
|
|
@@ -231,8 +236,8 @@ Render every Markdown section to HTML first — Azure DevOps description and acc
|
|
|
231
236
|
Apply writes in this order, so a failure partway through leaves the most useful state behind:
|
|
232
237
|
|
|
233
238
|
1. **Update the parent item** — one `mcp__azure-devops__wit_work_item_write` (action `update`) call with every changed field. Never include `System.State` for a Feature.
|
|
234
|
-
2. **Update existing children** (verdict `Update`) — one call per story, points
|
|
235
|
-
3. **Create added children** — `mcp__azure-devops__wit_work_item_write` (action `create`) with description, acceptance criteria, `Custom.Order`, agreed `Microsoft.VSTS.Scheduling.StoryPoints`, and `System.AssignedTo` copied from the Feature if it has an assignee. Then link each to the Feature as a child via `mcp__azure-devops__wit_work_item_link_write` (`System.LinkTypes.Hierarchy-Reverse`), then move pointed ones to `Dev Ready` in a follow-up call.
|
|
239
|
+
2. **Update existing children** (verdict `Update`) — one call per story, points, `Custom.Order` and any classification change in the same call as the text changes. If points were set on a story still at or before `Dev Ready`, set `System.State` = `Dev Ready` in that same call.
|
|
240
|
+
3. **Create added children** — `mcp__azure-devops__wit_work_item_write` (action `create`) with description, acceptance criteria, `Custom.Order`, agreed `Microsoft.VSTS.Scheduling.StoryPoints`, the approved `Custom.InvestmentCategory` and `Custom.Impact`, and `System.AssignedTo` copied from the Feature if it has an assignee. Then link each to the Feature as a child via `mcp__azure-devops__wit_work_item_link_write` (`System.LinkTypes.Hierarchy-Reverse`), then move pointed ones to `Dev Ready` in a follow-up call.
|
|
236
241
|
4. **Re-order** any story whose only change is `Custom.Order` — one call each, touching that field alone.
|
|
237
242
|
5. **Retire** stories the user approved — set `System.State` = `Removed`, or remove the parent link, whichever the user chose. **Never delete a work item.**
|
|
238
243
|
6. **Post comments** (if the user said yes) via `mcp__azure-devops__wit_work_item_comment_write` — one short comment per edited item saying what changed and why, and naming the Feature edit that drove it (e.g. `Scope updated via edit of AB#6240: acceptance criteria 2 reworded to cover SSO; re-ordered from wave 3 to wave 2.`).
|
|
@@ -248,6 +253,7 @@ Updated AB#{id}: {title}
|
|
|
248
253
|
Type: {type}
|
|
249
254
|
Fields changed: {list}
|
|
250
255
|
Points: {n → m | unchanged}
|
|
256
|
+
Classification: {Investment Category · Impact} {(was … → now …) | (unchanged)}
|
|
251
257
|
State: {state} {(unchanged — Features are never moved) | (→ Dev Ready)}
|
|
252
258
|
URL: {work item URL}
|
|
253
259
|
|
|
@@ -187,7 +187,18 @@ Create the approved task with `mcp__azure-devops__wit_work_item_write` (action `
|
|
|
187
187
|
- `System.AreaPath` — copy from the parent
|
|
188
188
|
- `System.AssignedTo` — copy from the parent (pass the parent's `uniqueName` / email if its `System.AssignedTo` value is an identity object). If the parent is unassigned, leave this field unset rather than failing.
|
|
189
189
|
|
|
190
|
-
Then link the new task
|
|
190
|
+
Then link the new task to its parent story — `updates` is an array, so a whole batch of stories can be linked in one call:
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
mcp__azure-devops__wit_work_item_link_write
|
|
194
|
+
action: "link"
|
|
195
|
+
project: "{project}"
|
|
196
|
+
updates: [ { id: {storyId}, linkToId: {taskId}, type: "child" } ]
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
`type: "child"` from the story is what produces `System.LinkTypes.Hierarchy-Forward`. The parameter is a closed enum of friendly names — the literal `System.LinkTypes.Hierarchy-Forward` string is **not** accepted.
|
|
200
|
+
|
|
201
|
+
**Do not create the Task with `mcp__azure-devops__wit_work_item_write` `action: "add_child"`.** Its `items[]` accepts only `{title, description, format, areaPath, iterationPath}` — there is no slot for `OriginalEstimate`, `RemainingWork`, or `System.AssignedTo`, so a Task created that way silently loses the hour estimate this command exists to set. Create the Task with `action: "create"`, then link it.
|
|
191
202
|
|
|
192
203
|
If the create or link call fails, report the failure and ask the user whether to continue with the next story or abort the loop.
|
|
193
204
|
|
|
@@ -15,8 +15,9 @@ For each qualifying item:
|
|
|
15
15
|
2. **Checks whether the work is already implemented** — in the codebase, in commits, or under another ticket.
|
|
16
16
|
3. **Looks at the code when it makes sense** — to validate the described approach and suggest changes.
|
|
17
17
|
4. **Proposes a story point estimate** — using the same senior-calibrated rubric as `/quote`.
|
|
18
|
-
5. **
|
|
19
|
-
6. **
|
|
18
|
+
5. **Proposes an Investment Category and Impact** when the item has none — the classification `/create-work-item` Step 3 defines.
|
|
19
|
+
6. **Drafts a comment for the item's creator** when issues are found.
|
|
20
|
+
7. **Suggests a rewrite of the description, and of existing acceptance criteria,** when they need work — offered to the creator in the comment, or applied directly if the user chooses.
|
|
20
21
|
|
|
21
22
|
**Never author acceptance criteria from nothing.** The rewrite improves AC that are *already there* — it never fills an empty AC field. If the item has no acceptance criteria, the deliverable is a comment telling the creator the AC are missing and the item can't be estimated without them. Rewriting someone's AC is editing their intent; writing AC for a blank field is inventing it.
|
|
22
23
|
|
|
@@ -24,7 +25,7 @@ For each qualifying item:
|
|
|
24
25
|
|
|
25
26
|
**Nothing is written to Azure DevOps — no points, no comments — until the user has seen the full batch and approved.** This command never modifies code and never reassigns items. It makes exactly three kinds of change, all in Step 5:
|
|
26
27
|
|
|
27
|
-
- an item that **gets points** moves to **Dev Ready
|
|
28
|
+
- an item that **gets points** moves to **Dev Ready**, and gets an Investment Category and Impact if it had none;
|
|
28
29
|
- a **User Story** that **can't be quoted** because information is missing moves back to **Design Review**, so the next sweep doesn't pick it up again while the creator is still working on it;
|
|
29
30
|
- a **Bug** that can't be quoted gets a **`needs-info` tag** instead — its state stays `New`. `New` is the bottom of the Bug workflow, so there is no earlier state to send it back to; the tag is what drops it out of the next sweep. The Step 2 query excludes tagged items, and removing the tag re-queues the bug.
|
|
30
31
|
|
|
@@ -59,6 +60,7 @@ Numbers refer to the `#` column of the summary table, not to AB# ids — so `1,2
|
|
|
59
60
|
|
|
60
61
|
**What approval writes:**
|
|
61
62
|
- **Story Points** on items that got a number — each also moves to **Dev Ready**
|
|
63
|
+
- **Investment Category and Impact** on pointed items that had neither set — a value someone already chose is never overwritten
|
|
62
64
|
- **Design Review** on **User Stories** that couldn't be quoted — anything blocked on missing information goes back to the creator's queue so the next sweep skips it
|
|
63
65
|
- A **`needs-info` tag** on **Bugs** that couldn't be quoted — a Bug has no design state to return to, so the tag is what keeps the next sweep off it. Existing tags are preserved; the state stays `New`
|
|
64
66
|
- **Comments** to the creators of items where something was found
|
|
@@ -203,7 +205,7 @@ For each item in the batch, do all of 3a–3e before presenting anything. Collec
|
|
|
203
205
|
|
|
204
206
|
### 3a. Fetch the full work item
|
|
205
207
|
|
|
206
|
-
Fetch with `mcp__azure-devops__wit_work_item` (action `get`) expanding `relations`. Capture: title, type, description, acceptance criteria, tags, `System.CreatedBy` (display name + unique name — needed for the comment draft), child items, and any linked PRs, commits, or branches.
|
|
208
|
+
Fetch with `mcp__azure-devops__wit_work_item` (action `get`) expanding `relations`. Capture: title, type, description, acceptance criteria, tags, `Custom.InvestmentCategory` and `Custom.Impact`, `System.CreatedBy` (display name + unique name — needed for the comment draft), child items, and any linked PRs, commits, or branches.
|
|
207
209
|
|
|
208
210
|
### 3b. Completeness review
|
|
209
211
|
|
|
@@ -282,6 +284,14 @@ Two cases are the exception — no state change and no tag, because nothing is m
|
|
|
282
284
|
- **Needs to be split** (the work is understood, it's just too big) — the item keeps its current state; the deliverable is the split proposal.
|
|
283
285
|
- The user chooses to leave it alone at the Step 4 gate.
|
|
284
286
|
|
|
287
|
+
### 3e2. Propose the classification (pointed items with it unset)
|
|
288
|
+
|
|
289
|
+
For every item that gets a number in 3e, check `Custom.InvestmentCategory` and `Custom.Impact`. Where **either is unset**, propose a value from the tables in `/create-work-item` Step 3, with a one-line reason from what 3a–3d established. Impact is the difference the item makes, not its size.
|
|
290
|
+
|
|
291
|
+
- **Never overwrite a value someone set.** A set value is shown as-is; if it looks clearly wrong, note it in the item's detail block for the user — don't propose writing over it.
|
|
292
|
+
- Items that get **no points** (blocking gaps, duplicates, split candidates) get no classification either — nothing about them is written except the drop-out and the comment.
|
|
293
|
+
- **Only where the process has the fields.** Check `get_type` once per sweep; if the types don't carry `Custom.InvestmentCategory` / `Custom.Impact`, skip this step and leave the column out of Step 4.
|
|
294
|
+
|
|
285
295
|
### 3f. Draft the creator comment (only if issues were found)
|
|
286
296
|
|
|
287
297
|
If 3b–3d surfaced anything — gaps, a duplicate, a suggested approach change — draft a comment addressed to the item's creator (`System.CreatedBy`). Format:
|
|
@@ -321,7 +331,7 @@ The rewrite is a *suggestion*: by default it travels inside the creator comment
|
|
|
321
331
|
|
|
322
332
|
### Ultracode mode (optional fan-out)
|
|
323
333
|
|
|
324
|
-
Only when **ultracode is on** (a system-reminder confirms it, or the user typed `ultracode`): the analysis in 3a–3g is independent per item, so fan out **one agent per item** with the `Workflow` tool. Each agent does the full 3a–3g pass and returns a structured result (item id, creator, completeness verdict, duplicate findings, code notes, proposed points, draft comment, suggested rewrite) — use a `schema` so each agent returns validated JSON.
|
|
334
|
+
Only when **ultracode is on** (a system-reminder confirms it, or the user typed `ultracode`): the analysis in 3a–3g is independent per item, so fan out **one agent per item** with the `Workflow` tool. Each agent does the full 3a–3g pass and returns a structured result (item id, creator, completeness verdict, duplicate findings, code notes, proposed points, proposed classification, draft comment, suggested rewrite) — use a `schema` so each agent returns validated JSON.
|
|
325
335
|
|
|
326
336
|
**Never fan out Step 4 or Step 5** — presentation, approval, and every write stay sequential in the main loop. If ultracode is off, analyze the batch one item at a time; the output is identical either way.
|
|
327
337
|
|
|
@@ -333,16 +343,18 @@ Show the whole batch **before writing anything**. Start with the summary table:
|
|
|
333
343
|
Quote sweep — {project} backlog, unpointed (Stories: Design Approved · Bugs: New)
|
|
334
344
|
Batch: {n} of {total} qualifying items{ — run /quote-backlog again for the next 10}
|
|
335
345
|
|
|
336
|
-
| # | ID | Type | Title | Completeness | Points | Outcome | Comment | Rewrite |
|
|
337
|
-
|
|
338
|
-
| 1 | AB#4611 | Story | COM - Payment reminder emails | Complete | 5 | → Dev Ready | — | — |
|
|
339
|
-
| 2 | AB#4614 | Story | COM - Bulk close inactive accounts | Minor gaps | 8 | → Dev Ready | yes | — |
|
|
340
|
-
| 3 | AB#4617 | Story | PAY - Refund webhook handling | Blocking gaps | — | → Design Review | yes | yes |
|
|
341
|
-
| 4 | AB#4619 | Bug | PAY - Duplicate refund email | Complete | 3 | → Dev Ready | — | — |
|
|
342
|
-
| 5 | AB#4620 | Bug | COM - Audit log export 500s | Blocking gaps | — | + needs-info tag | yes | — |
|
|
343
|
-
| 6 | AB#4623 | Story | COM - Rebuild the reporting module | Too large | split | unchanged | yes | — |
|
|
346
|
+
| # | ID | Type | Title | Completeness | Points | Category · Impact | Outcome | Comment | Rewrite |
|
|
347
|
+
|----|----------|-------|------------------------------------|---------------|--------|----------------------------|------------------|---------|---------|
|
|
348
|
+
| 1 | AB#4611 | Story | COM - Payment reminder emails | Complete | 5 | Quick Win · Large | → Dev Ready | — | — |
|
|
349
|
+
| 2 | AB#4614 | Story | COM - Bulk close inactive accounts | Minor gaps | 8 | Maintenance · Medium (set) | → Dev Ready | yes | — |
|
|
350
|
+
| 3 | AB#4617 | Story | PAY - Refund webhook handling | Blocking gaps | — | — | → Design Review | yes | yes |
|
|
351
|
+
| 4 | AB#4619 | Bug | PAY - Duplicate refund email | Complete | 3 | Risk Mitigation · Small | → Dev Ready | — | — |
|
|
352
|
+
| 5 | AB#4620 | Bug | COM - Audit log export 500s | Blocking gaps | — | — | + needs-info tag | yes | — |
|
|
353
|
+
| 6 | AB#4623 | Story | COM - Rebuild the reporting module | Too large | split | — | unchanged | yes | — |
|
|
344
354
|
```
|
|
345
355
|
|
|
356
|
+
**Category · Impact** shows the proposal for pointed items that had none, and `(set)` where the item already carried a value that will be left alone.
|
|
357
|
+
|
|
346
358
|
The **Type** column matters — it decides the outcome, so show it. The **Outcome** column is what will actually be written: `→ Dev Ready` for pointed items of either type, `→ Design Review` for **User Stories** that can't be quoted until the creator supplies something, `+ needs-info tag` for **Bugs** in the same situation (state stays `New` — a Bug has no design state to return to), and `unchanged` for anything else (a split proposal, or an item already past Dev Ready).
|
|
347
359
|
|
|
348
360
|
Then a detail block per item — estimate reasoning (2–3 bullets), completeness findings, duplicate evidence with links/IDs, code notes, the **full text of any draft comment**, and the **full text of any suggested rewrite**. The user must be able to read every word that would be posted.
|
|
@@ -359,7 +371,7 @@ Approve? (all / numbers e.g. "1,2,4" / edit N / skip N / apply rewrite N / cance
|
|
|
359
371
|
|
|
360
372
|
- `all` → apply every proposed write (points, state changes, tags, and comments) in Step 5; rewrites stay inside the comments as suggestions
|
|
361
373
|
- `1,2,4` → apply only those items; the rest are recorded as skipped
|
|
362
|
-
- `edit N` → ask what to change on item N (points value, comment text, or rewrite text), revise, re-show that item, ask again
|
|
374
|
+
- `edit N` → ask what to change on item N (points value, Investment Category / Impact, comment text, or rewrite text), revise, re-show that item, ask again
|
|
363
375
|
- `apply rewrite N` → write item N's rewrite directly onto the work item in Step 5 (instead of only suggesting it in the comment). This covers the description, the title if the rewrite included one, and rewritten AC **only where the item already had AC** — an empty AC field is never populated, under this or any other option
|
|
364
376
|
- `skip N` → drop item N, re-ask for the rest. A skipped item gets **nothing** written — no comment, no state change, no tag — so it keeps its current state (`Design Approved` for a Story, `New` for a Bug) and will reappear in the next sweep. Say that out loud when confirming a skip, so the user isn't surprised to see it again
|
|
365
377
|
- `cancel` → stop with **zero changes** to Azure DevOps
|
|
@@ -368,7 +380,7 @@ Approve? (all / numbers e.g. "1,2,4" / edit N / skip N / apply rewrite N / cance
|
|
|
368
380
|
|
|
369
381
|
Only for approved items, in batch order:
|
|
370
382
|
|
|
371
|
-
1. **Set Story Points and move to Dev Ready** (items with a proposed number): in one `mcp__azure-devops__wit_work_item_write` (action `update`) call, set `Microsoft.VSTS.Scheduling.StoryPoints` **and** `System.State` = `Dev Ready
|
|
383
|
+
1. **Set Story Points and move to Dev Ready** (items with a proposed number): in one `mcp__azure-devops__wit_work_item_write` (action `update`) call, set `Microsoft.VSTS.Scheduling.StoryPoints` **and** `System.State` = `Dev Ready` — plus the proposed `Custom.InvestmentCategory` / `Custom.Impact`, only for the ones that were unset. The state change applies only to `User Story`, `Bug`, and `Hot Fix` types, and never moves an item backward — if an item is somehow already past Dev Ready, set the points only and note it. Touch no other field — assignee, iteration, and tags stay as they are.
|
|
372
384
|
2. **Send unquotable User Stories back to Design Review** (approved `User Story` items with **no** proposed points, where the blocker is missing information): set `System.State` = `Design Review` via `mcp__azure-devops__wit_work_item_write` (action `update`). Do this **before** posting the comment in step 4, so the creator's notification arrives with the item already back in their queue. Rules:
|
|
373
385
|
|
|
374
386
|
- **`User Story` only.** Do not attempt this on a `Bug` or a `Hot Fix` — those types have no `Design Review` state, so the update fails at runtime in the middle of the batch. They take step 3 instead.
|
|
@@ -402,6 +414,7 @@ If a write fails, report the failure and ask whether to continue with the remain
|
|
|
402
414
|
Items analyzed: {n} (of {total} qualifying — {remaining} left for the next run)
|
|
403
415
|
{n_stories} stories (Design Approved) · {n_bugs} bugs (New)
|
|
404
416
|
✓ Points set: {n_pointed} (total {sum} pts — each moved to Dev Ready)
|
|
417
|
+
✓ Classified: {n_classified} given an Investment Category and Impact
|
|
405
418
|
↩ Design Review: {n_design_review} stories not quoted — moved back to the creator, out of the next sweep
|
|
406
419
|
⚑ needs-info: {n_tagged} bugs not quoted — tagged, state left at New, out of the next sweep
|
|
407
420
|
✓ Comments: {n_comments} posted to creators
|
|
@@ -411,8 +424,8 @@ Items analyzed: {n} (of {total} qualifying — {remaining} left for the next
|
|
|
411
424
|
⚑ Stale drop-outs: {n_stale} answered since leaving the sweep — still excluded ({n_stale_bugs} tagged bugs, {n_stale_stories} bounced stories)
|
|
412
425
|
|
|
413
426
|
Pointed items:
|
|
414
|
-
- AB#4611: 5 pts
|
|
415
|
-
- AB#4614: 8 pts (comment posted)
|
|
427
|
+
- AB#4611: 5 pts · Quick Win · Large
|
|
428
|
+
- AB#4614: 8 pts (comment posted) · classification already set
|
|
416
429
|
- ...
|
|
417
430
|
|
|
418
431
|
Moved back to Design Review (stories, no points — waiting on the creator):
|
|
@@ -437,4 +450,4 @@ Next steps:
|
|
|
437
450
|
/quote AB#{id} — re-estimate a single item after the creator responds
|
|
438
451
|
```
|
|
439
452
|
|
|
440
|
-
Do not create tasks or assign items — those are downstream decisions. Pointed items are now Dev Ready, so `/plan-backlog` picks them up on its next run. Stories moved to Design Review and bugs tagged `needs-info` are both out of the Step 2 query, so the next `/quote-backlog` run reaches genuinely new items instead of re-reviewing the ones still waiting on their creator — re-quote one with `/quote AB#{id}` once they respond, or let them move the story back to Design Approved / drop the bug's tag themselves. Make no change other than the
|
|
453
|
+
Do not create tasks or assign items — those are downstream decisions. Pointed items are now Dev Ready, so `/plan-backlog` picks them up on its next run. Stories moved to Design Review and bugs tagged `needs-info` are both out of the Step 2 query, so the next `/quote-backlog` run reaches genuinely new items instead of re-reviewing the ones still waiting on their creator — re-quote one with `/quote AB#{id}` once they respond, or let them move the story back to Design Approved / drop the bug's tag themselves. Make no change other than the ones described in Step 5 — **Step 2b's audit is read-only**, and it never clears a tag on the creator's behalf.
|
|
@@ -8,7 +8,7 @@ Read the work item from Azure DevOps using the project from the current repo's C
|
|
|
8
8
|
|
|
9
9
|
If the work item is not found, report the error and stop.
|
|
10
10
|
|
|
11
|
-
Capture: title, type, description, acceptance criteria, repro steps (on a Bug), attached child items, any existing `Story Points` / `Effort` field value, and the item's **full current tag list** — both the tags that hint at scope (e.g. `spike`, `research`, `infra`) and the rest, because Step 5b appends to that list and must not clobber it.
|
|
11
|
+
Capture: title, type, description, acceptance criteria, repro steps (on a Bug), attached child items, any existing `Story Points` / `Effort` field value, the current `Custom.InvestmentCategory` and `Custom.Impact` (User Story, Bug, Hot Fix), and the item's **full current tag list** — both the tags that hint at scope (e.g. `spike`, `research`, `infra`) and the rest, because Step 5b appends to that list and must not clobber it.
|
|
12
12
|
|
|
13
13
|
## Step 2: Size the Work
|
|
14
14
|
|
|
@@ -63,6 +63,14 @@ If the item has child items, size each child as well and present the parent's to
|
|
|
63
63
|
|
|
64
64
|
**If the item can't be estimated at all, don't guess a number.** An item is *not estimable* when the gap is information only its creator can close — no acceptance criteria (or, on a Bug, no repro steps), a description that contradicts itself, scope you can't bound, or work that looks like it may already be done under another ticket. Report it as **needs more information**, list exactly what's missing, and go to Step 5 instead of Step 4. This is different from **needs to be split**: a split candidate is understood work that's simply too big, and it keeps its current state.
|
|
65
65
|
|
|
66
|
+
### Classify it too, when nobody has
|
|
67
|
+
|
|
68
|
+
User Stories, Bugs and Hot Fixes carry an **Investment Category** (`Custom.InvestmentCategory`) and an **Impact** (`Custom.Impact`) — restricted picklists that Serena's reports rank work by. When the item you're sizing has **either one unset**, propose a value for it from the tables in `/create-work-item` Step 3, with a one-line reason drawn from the same reading you just did. Impact is the difference the item makes, not its size: a 2-point item can be Strategic.
|
|
69
|
+
|
|
70
|
+
- **Never overwrite a value a person set.** If both are already set, show them as they are. If one looks clearly wrong in light of what you read, say so in a line, but don't propose writing it — that's an `/edit-work-item` change.
|
|
71
|
+
- **Not for a Feature or a Task** — neither type has the fields.
|
|
72
|
+
- **Only where the process has them.** If `get_type` for the item's type doesn't list `Custom.InvestmentCategory` / `Custom.Impact`, skip this section entirely.
|
|
73
|
+
|
|
66
74
|
## Step 3: Display the Estimate
|
|
67
75
|
|
|
68
76
|
Output a compact estimate — not a quote block. Format:
|
|
@@ -77,6 +85,8 @@ Output a compact estimate — not a quote block. Format:
|
|
|
77
85
|
- {bullet on test/doc burden}
|
|
78
86
|
|
|
79
87
|
**Comparable to:** {one-line analogy to a similar past story, or "no obvious comparable in recent work"}
|
|
88
|
+
|
|
89
|
+
**Classification:** {Investment Category} · {Impact} — {proposed: one-line reason | already set}
|
|
80
90
|
```
|
|
81
91
|
|
|
82
92
|
If child items were sized, append:
|
|
@@ -107,14 +117,15 @@ If the item isn't estimable, report that instead of a number:
|
|
|
107
117
|
|
|
108
118
|
This step applies when you produced a **number**. If the item was reported as *needs more information*, skip to Step 5.
|
|
109
119
|
|
|
110
|
-
After displaying the estimate, ask the user: *"Want me to set Story Points = {n} on AB#{id}? (This will also move it to Dev Ready.)"*
|
|
120
|
+
After displaying the estimate, ask the user: *"Want me to set Story Points = {n} on AB#{id}? (This will also move it to Dev Ready.)"* When you proposed a classification, name it in the same question — *"…and Investment Category = {category}, Impact = {impact}?"* — and accept a changed value or "points only" as the answer.
|
|
111
121
|
|
|
112
122
|
Only update the work item if the user explicitly says yes. Do not modify anything otherwise.
|
|
113
123
|
|
|
114
124
|
When the user agrees, in the **same** `wit_work_item_write` (action `update`) call:
|
|
115
125
|
|
|
116
126
|
1. Set `Microsoft.VSTS.Scheduling.StoryPoints` to the agreed value (the user's number wins if they adjusted it).
|
|
117
|
-
2. Set `
|
|
127
|
+
2. Set `Custom.InvestmentCategory` / `Custom.Impact` to the agreed values — only the ones you proposed because they were unset, and only if the user didn't decline them.
|
|
128
|
+
3. Set `System.State` to `Dev Ready` — **but only if** the work item type is `User Story`, `Bug`, or `Hot Fix` **and** the item is not already past Dev Ready in the workflow (e.g. `Active`, `Code Review`, `Testing`, `Staging`, `Ready to Deploy`). Never move an item backward — if it's already past Dev Ready, set the points only and mention the state was left alone.
|
|
118
129
|
|
|
119
130
|
**Never change the state of a Feature or a Task** — if the sized item is a Feature, persist points only (or per-child points on the children, each of which does get Dev Ready if it qualifies).
|
|
120
131
|
|
|
@@ -358,7 +358,7 @@ If the user provided hours (suggested or overridden):
|
|
|
358
358
|
|
|
359
359
|
```html
|
|
360
360
|
<h3>Summary</h3>
|
|
361
|
-
<p>{1–2 sentences
|
|
361
|
+
<p>{1–2 plain-English sentences a PM could follow: what the tester found and what will change, named the way a user sees it. No code identifiers (those go under Fix). Bold the key outcome with <strong>...</strong>.}</p>
|
|
362
362
|
<h3>Fix</h3>
|
|
363
363
|
<ul>
|
|
364
364
|
<li>{What changes. Wrap code identifiers, method names, fields, file paths, and literal values in <code>...</code>.}</li>
|
|
@@ -370,7 +370,7 @@ If the user provided hours (suggested or overridden):
|
|
|
370
370
|
</ul>
|
|
371
371
|
```
|
|
372
372
|
|
|
373
|
-
|
|
373
|
+
In Fix and Reference, render any code identifiers (method names, fields, file paths, hashes, literal values) inside `<code>` spans, and emphasize the key claim/value in each sentence with `<strong>`. Do not submit a wall of plain prose — every rework task must have at least the `Summary` and `Fix` sections in this shape.
|
|
374
374
|
- `Microsoft.VSTS.Scheduling.OriginalEstimate` — the agreed hours
|
|
375
375
|
- `Microsoft.VSTS.Scheduling.RemainingWork` — the agreed hours
|
|
376
376
|
- `System.AreaPath` — same as the parent
|
|
@@ -114,6 +114,13 @@ Claude maintains persistent memory across sessions in `~/.claude/projects/.../me
|
|
|
114
114
|
|
|
115
115
|
Every Feature, User Story, Bug, or Hot Fix Claude creates goes through `/create-work-item`, whether or not the user typed the command. "Log a bug that the export 500s", "make a story for bulk assign", "open a ticket for this" all mean: invoke `create-work-item` with the Skill tool, passing the request text as the arguments. Never create one with a direct `wit_work_item_write` call. That skips the prior-art and duplicate checks, the title prefix, the AC field, the proposed points, and the user's approval of the draft. The `work-item-intent.sh` hook adds a reminder to any prompt that reads like a creation request.
|
|
116
116
|
|
|
117
|
+
**Every work item serves two readers.**
|
|
118
|
+
|
|
119
|
+
- **The PM reads the Summary.** It is the first section: 2–4 plain-English sentences on what is changing or broken, who notices, and why it matters. It names screens and buttons the way users see them, with no code identifiers, endpoints, field names, or jargon.
|
|
120
|
+
- **The developer and Claude Code read everything below it.** That starts with **Technical Details**, grounded in the actual codebase: real file paths, components, endpoints, data fields, business rules, and constraints, layer by layer. It must be enough for `/implement` to plan from without rediscovering where the change lives. Nothing is guessed: an unconfirmed name is marked *(unverified)*, and a session without the code says so.
|
|
121
|
+
|
|
122
|
+
`/create-work-item` writes both on every type, including a Feature's child stories. `/edit-work-item` keeps both current and proposes either one when it's missing.
|
|
123
|
+
|
|
117
124
|
This includes items Claude decides to raise itself, such as a defect found mid-task or out-of-scope work. Propose it, and if the user agrees, run `/create-work-item` with what you found.
|
|
118
125
|
|
|
119
126
|
Work items a command creates as one of its own steps keep that command's flow: child Tasks from `/implement`, `/rework`, `/plan-backlog`, and `/plan-sprint`, and child stories from `/create-work-item` and `/edit-work-item`. A new Bug or Story requested in the middle of one of those commands still goes through `/create-work-item`.
|
|
@@ -136,6 +143,22 @@ These rules apply to **every** command or flow that creates or estimates work it
|
|
|
136
143
|
**The drop-out mechanism has no expiry, so every sweep must audit it.** Removing the `needs-info` tag is the *only* thing that re-queues a bug, and moving a story back to `Design Approved` is the only thing that re-queues a story. A creator who supplies the missing information but leaves the tag on — or answers in a comment instead of editing the field — makes the item invisible to every future sweep, permanently. That failure looks exactly like a clean backlog. `/quote-backlog` Step 2b therefore audits tagged items for activity after the tag was applied and reports the stale ones; it never clears a tag on the creator's behalf. Two traps when writing such a check: automation bots bump a revision after nearly every human write, so the *latest* revision author is unreliable — scan the whole range after the tag revision; and a `System.CommentCount` increase counts as a creator response.
|
|
137
144
|
6. **Never assume two work item types share a state list.** WIQL doesn't validate state names, so a query filtering on a state the type doesn't have returns **zero rows instead of an error** — the classic symptom is a backlog sweep that silently never surfaces a single bug. Confirm with `mcp__azure-devops__wit_work_item` (`action: get_type`) before writing a state name into a query or an update. In CSI Development (verified 2026-09-06): `User Story` has `New → Dev Ready → In Design → Design Review → Design Approved → Active → Code Review → Ready for Testing → Testing → Ready for Staging → Staging → Ready to Deploy → Deployed → Closed`; `Bug` and `Hot Fix` have the same list minus the three design states (`New → Dev Ready → Active → Code Review → …`). `Ready for Staging` and `Staging` were added on 2026-09-06 so every environment has a state — see **Work Item States ↔ Environments** below.
|
|
138
145
|
|
|
146
|
+
### Work Item Classification — Investment Category and Impact
|
|
147
|
+
|
|
148
|
+
User Stories, Bugs and Hot Fixes carry two restricted picklists (added 2026-10-05 on the `Agile - CSI` process, so every project on it has them). Serena's Monthly Executive and Backlog Grooming reports rank and summarize work by them:
|
|
149
|
+
|
|
150
|
+
| Field | Reference name | Values |
|
|
151
|
+
|---|---|---|
|
|
152
|
+
| Investment Category | `Custom.InvestmentCategory` | Strategic Initiative, Quick Win, Risk Mitigation, Maintenance |
|
|
153
|
+
| Impact | `Custom.Impact` | Strategic, Large, Medium, Small, Tiny/One-off |
|
|
154
|
+
|
|
155
|
+
1. **Every User Story, Bug and Hot Fix Claude creates gets both, proposed and agreed like points.** `/create-work-item` proposes them with a one-line reason; the user confirms or changes them. A Feature gets one pair that each of its child stories inherits — **the Feature itself never carries them**, and neither does a Task.
|
|
156
|
+
2. **Estimating fills the gaps.** `/quote` and `/quote-backlog` propose both for an item that has neither set and write them in the same update as its points.
|
|
157
|
+
3. **A value a person chose is never overwritten silently.** Only `/edit-work-item` changes a set value, and only when the edit gives a reason to — shown in the change set like any other field.
|
|
158
|
+
4. **Impact is the difference an item makes, not its size.** Choose from the definitions in `/create-work-item` Step 3, and spell values exactly — `Tiny/One-off` included. Azure DevOps rejects anything else.
|
|
159
|
+
5. **Priority is not impact.** Most delivered items carry Priority 1 or 2 (2 is the default), so it says nothing about which work mattered. Never derive or backfill Impact from it.
|
|
160
|
+
6. **Only where the process has the fields.** Confirm with `get_type` on an unfamiliar project; if the type doesn't list them, leave them out — writing an undefined field fails the whole create or update.
|
|
161
|
+
|
|
139
162
|
### Branching Strategy
|
|
140
163
|
|
|
141
164
|
#### Target Branch-to-Environment Mapping
|
|
@@ -372,9 +395,9 @@ All deployment and release operations are available as slash commands:
|
|
|
372
395
|
| `/qa` | `/qa AB#1234 [env]` | Verify the item is fully deployed with a green pipeline → open the app in a real browser → sign in as a test account → full regression of the screens the story touched → pass/fail comment (never a state change) |
|
|
373
396
|
| `/plan-backlog` | `/plan-backlog [project]` | Sweep backlog for Dev Ready stories with points and no tasks → propose child tasks with hours |
|
|
374
397
|
| `/plan-sprint` | `/plan-sprint [project]` | Sweep the current sprint for stories/bugs with no child tasks → propose one child task with hours per item |
|
|
375
|
-
| `/quote-backlog` | `/quote-backlog [project]` | Sweep backlog for unpointed items ready to estimate — stories in `Design Approved`, **bugs in `New`** (bugs have no design states) → review completeness, check for duplicates, suggest rewrites, propose points + creator comments (10 at a time, approval-gated). Pointed items move to Dev Ready; stories that can't be quoted move back to **Design Review**, bugs that can't be quoted get a **`needs-info`** tag, so the next sweep skips them. Every run also audits the drop-out queue (tagged bugs **and** stories bounced to Design Review) and reports any whose creator answered but which nobody returned to the sweep — neither mechanism expires, so those are otherwise invisible forever |
|
|
376
|
-
| `/quote` | `/quote AB#1234` | Estimate story points for one work item; on approval, sets
|
|
377
|
-
| `/create-work-item` | `/create-work-item [description]` | Interactively draft and create a Feature, Bug, User Story, or Hot Fix — proposes story points (user must agree) and creates pointed items in Dev Ready; on a Feature, also drafts its child stories with `Custom.Order` waves. Runs automatically for any plain-language request to create a work item |
|
|
398
|
+
| `/quote-backlog` | `/quote-backlog [project]` | Sweep backlog for unpointed items ready to estimate — stories in `Design Approved`, **bugs in `New`** (bugs have no design states) → review completeness, check for duplicates, suggest rewrites, propose points (+ Investment Category / Impact where unset) + creator comments (10 at a time, approval-gated). Pointed items move to Dev Ready; stories that can't be quoted move back to **Design Review**, bugs that can't be quoted get a **`needs-info`** tag, so the next sweep skips them. Every run also audits the drop-out queue (tagged bugs **and** stories bounced to Design Review) and reports any whose creator answered but which nobody returned to the sweep — neither mechanism expires, so those are otherwise invisible forever |
|
|
399
|
+
| `/quote` | `/quote AB#1234` | Estimate story points for one work item, and propose Investment Category / Impact if it has none; on approval, sets them and moves the item to Dev Ready. If it can't be estimated, offers to send a story back to **Design Review** or tag a bug **`needs-info`** |
|
|
400
|
+
| `/create-work-item` | `/create-work-item [description]` | Interactively draft and create a Feature, Bug, User Story, or Hot Fix — opens each with a plain-English Summary for the PM, then code-grounded Technical Details for the developer, proposes story points and Investment Category / Impact (user must agree) and creates pointed items in Dev Ready; on a Feature, also drafts its child stories with `Custom.Order` waves. Runs automatically for any plain-language request to create a work item |
|
|
378
401
|
| `/edit-work-item` | `/edit-work-item AB#1234 [what to change]` | Revise an existing work item field-by-field. On a Feature, cascades the change into its child stories — updates, adds, retires, and re-sequences `Custom.Order` waves — with a safety gate on anything already past Dev Ready |
|
|
379
402
|
| `/cleanup-branches` | `/cleanup-branches` | Delete merged branches |
|
|
380
403
|
| `/close-orphan-tasks` | `/close-orphan-tasks [scope] [--dry-run]` | Close open Tasks whose parent is Ready to Deploy / Deployed / Closed |
|