@chris1807/claude-kit 2.3.4 → 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/package.json +1 -1
- package/templates/commands/create-work-item.md +178 -52
- package/templates/commands/edit-work-item.md +11 -6
- 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/infrastructure/CLAUDE-WORKFLOW.md +19 -3
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
|
|
|
@@ -120,14 +120,14 @@ The **Technical Details** section replaces a plain-language description. It and
|
|
|
120
120
|
{The feature-level technical shape. Cover the architecture or approach, the layers and
|
|
121
121
|
existing components it touches (real paths), data-model changes, integrations, and the
|
|
122
122
|
shared foundation the child stories build on. Note any sequencing constraint: what must
|
|
123
|
-
land first sets `Custom.Order` in Step
|
|
123
|
+
land first sets `Custom.Order` in Step 3F. Leave per-story detail to the stories.}
|
|
124
124
|
|
|
125
125
|
### Business Value
|
|
126
126
|
{Why this is worth building — the problem it removes or the opportunity it opens.}
|
|
127
127
|
|
|
128
128
|
### Scope
|
|
129
129
|
- {each coherent, independently shippable chunk of work — these become the
|
|
130
|
-
child User Stories in Step
|
|
130
|
+
child User Stories in Step 3F}
|
|
131
131
|
- ...
|
|
132
132
|
|
|
133
133
|
### Out of Scope
|
|
@@ -232,7 +232,7 @@ triggers it.}
|
|
|
232
232
|
A Hot Fix uses the same draft shape as a Bug. Two differences:
|
|
233
233
|
|
|
234
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.
|
|
235
|
-
- **Add a `### Production Impact` section** 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.
|
|
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.
|
|
236
236
|
|
|
237
237
|
**Inferring Priority and Severity for Bugs and Hot Fixes:**
|
|
238
238
|
|
|
@@ -254,10 +254,83 @@ Propose initial values based on the requirements, then let the user override dur
|
|
|
254
254
|
|
|
255
255
|
Severity describes user impact; Priority describes scheduling urgency. They are independent — a Sev 2 can be Priority 3 if a workaround exists.
|
|
256
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
|
+
|
|
257
280
|
### Title Prefix
|
|
258
281
|
|
|
259
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`.
|
|
260
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
|
+
|
|
261
334
|
### Approval
|
|
262
335
|
|
|
263
336
|
After presenting the draft, ask:
|
|
@@ -268,9 +341,19 @@ Approve this draft? (yes / suggest changes / cancel)
|
|
|
268
341
|
|
|
269
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.
|
|
270
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
|
+
|
|
271
354
|
## Step 4: Propose Story Points
|
|
272
355
|
|
|
273
|
-
**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.
|
|
274
357
|
|
|
275
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.
|
|
276
359
|
|
|
@@ -361,8 +444,9 @@ Before creating anything in Azure DevOps, present a final summary and ask for on
|
|
|
361
444
|
**Production Impact:** {one line}
|
|
362
445
|
{end for Hot Fixes}
|
|
363
446
|
{for Features:}
|
|
364
|
-
**
|
|
447
|
+
**Child stories:** {n} ({sum} points) — created with the Feature, per the approved Decomposition Plan
|
|
365
448
|
{end for Features}
|
|
449
|
+
**Investment Category · Impact:** {category} · {impact}{for Features: — on every child story}
|
|
366
450
|
**Story Points:** {n (agreed) | skipped | n/a — Features aren't pointed}
|
|
367
451
|
**Initial State:** {Dev Ready (pointed) | New (no points) | New (Feature)}
|
|
368
452
|
**Mockup:** {Embedded | Not requested | Skipped (non-UI)}
|
|
@@ -374,7 +458,7 @@ Create this work item now? (yes / edit / cancel)
|
|
|
374
458
|
|
|
375
459
|
**Wait for the user.**
|
|
376
460
|
- `yes` → proceed to Step 8
|
|
377
|
-
- `edit` → ask which field to revise (title, summary, technical details, AC, priority, severity, story points, project, mockup), revise it, then re-show this summary
|
|
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
|
|
378
462
|
- `cancel` → abort with no work item created and confirm "Cancelled — no work item created."
|
|
379
463
|
|
|
380
464
|
## Step 8: Render to HTML and Create
|
|
@@ -406,7 +490,7 @@ A description that is one long paragraph of plain prose is not acceptable — ev
|
|
|
406
490
|
- **Lists** are used instead of comma-separated prose whenever the draft contains 2+ parallel items (steps, files, references, acceptance criteria).
|
|
407
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).
|
|
408
492
|
|
|
409
|
-
Apply this pass to every section (Technical Details, Acceptance Criteria, Steps to Reproduce, Expected/Actual Behavior, Environment/Scope, Open Questions). Apply it equally to Bugs, Hot Fixes, and
|
|
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.
|
|
410
494
|
|
|
411
495
|
### Split the draft into fields — acceptance criteria never go in the description
|
|
412
496
|
|
|
@@ -441,7 +525,7 @@ Do **not** send `Microsoft.VSTS.Common.AcceptanceCriteria` on a Bug. Still *writ
|
|
|
441
525
|
| `### Summary`, `### Production Impact`, `### Technical Details`, `### Prior Art`, `### Open Questions` | `System.Description`, in that order |
|
|
442
526
|
| `### Steps to Reproduce`, `### Expected Behavior`, `### Actual Behavior`, `### Environment / Scope` | `Microsoft.VSTS.TCM.ReproSteps` |
|
|
443
527
|
|
|
444
|
-
**Feature** — everything renders into `System.Description`, with `### Summary` first (see the Features bullet under *Call the create API
|
|
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).
|
|
445
529
|
|
|
446
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.
|
|
447
531
|
|
|
@@ -457,21 +541,38 @@ This applies to **User Story**. It does **not** apply to Bug or Hot Fix: neither
|
|
|
457
541
|
|
|
458
542
|
### Call the create API
|
|
459
543
|
|
|
460
|
-
Call `mcp__azure-devops__wit_work_item_write`
|
|
544
|
+
Call `mcp__azure-devops__wit_work_item_write` with `action: "create"`:
|
|
461
545
|
|
|
462
546
|
- **project**: the chosen project
|
|
463
547
|
- **workItemType**: `Feature`, `Bug`, `User Story`, or `Hot Fix` (two words, exact casing)
|
|
464
|
-
- **
|
|
465
|
-
|
|
466
|
-
|
|
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
|
|
467
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
|
|
468
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
|
|
469
570
|
- For Features:
|
|
470
|
-
- Render `Summary` first, then `Technical Details`, `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.
|
|
471
572
|
- `Microsoft.VSTS.Common.BusinessValue` — only if the user supplied a number. Never invent one.
|
|
472
573
|
- Omit `Microsoft.VSTS.Scheduling.StoryPoints` entirely.
|
|
473
574
|
- For Bugs:
|
|
474
|
-
- `Microsoft.VSTS.TCM.ReproSteps` — the **whole composed body**: summary, technical details, steps, expected behavior, actual behavior, acceptance criteria and open questions, each under its own `<h3>`. This is the Bug's field of record; its form shows no Description control.
|
|
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.
|
|
475
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.
|
|
476
577
|
- `Microsoft.VSTS.Common.Priority` — the chosen Priority (1–4)
|
|
477
578
|
- `Microsoft.VSTS.Common.Severity` — the chosen Severity (`1 - Critical`, `2 - High`, `3 - Medium`, `4 - Low`)
|
|
@@ -482,52 +583,75 @@ Call `mcp__azure-devops__wit_work_item_write` (action `create`) with:
|
|
|
482
583
|
|
|
483
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.
|
|
484
585
|
|
|
485
|
-
###
|
|
586
|
+
### Call the create API (Feature — three phases)
|
|
486
587
|
|
|
487
|
-
|
|
588
|
+
A Feature and its children are created in one run, in this order. Nothing is created until the Step 3F plan was approved.
|
|
488
589
|
|
|
489
|
-
**
|
|
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}`.
|
|
490
591
|
|
|
491
|
-
|
|
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.)
|
|
492
593
|
|
|
493
|
-
|
|
594
|
+
**If Phase 1 fails, stop — create nothing else.** Creating the Feature first is precisely what makes this failure harmless.
|
|
494
595
|
|
|
495
|
-
|
|
596
|
+
**Phase 2 — the children, in ascending execution order.** One `create` per child (`workItemType: "User Story"`), so the AB# sequence matches the wave sequence:
|
|
496
597
|
|
|
497
598
|
```
|
|
498
|
-
|
|
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
|
+
]
|
|
499
612
|
```
|
|
500
613
|
|
|
501
|
-
|
|
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.
|
|
502
615
|
|
|
503
|
-
|
|
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"`:
|
|
504
617
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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:
|
|
629
|
+
|
|
630
|
+
```
|
|
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
|
+
]
|
|
638
|
+
```
|
|
639
|
+
|
|
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.
|
|
641
|
+
|
|
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.
|
|
509
643
|
|
|
510
|
-
|
|
511
|
-
|---|-------|----------------|--------|---------|
|
|
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.
|
|
512
645
|
|
|
513
|
-
|
|
646
|
+
### Move to Dev Ready (pointed items only)
|
|
514
647
|
|
|
515
|
-
|
|
516
|
-
Approve these child stories? (yes / change N / drop N / cancel)
|
|
517
|
-
```
|
|
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`.
|
|
518
649
|
|
|
519
|
-
|
|
520
|
-
5. On approval, create each story with `mcp__azure-devops__wit_work_item_write` (action `create`) in the same project, setting:
|
|
521
|
-
- `System.Description` and `Microsoft.VSTS.Common.AcceptanceCriteria` — rendered to HTML per the Step 8 rules, Summary first
|
|
522
|
-
- `Custom.Order` — the wave number
|
|
523
|
-
- `Microsoft.VSTS.Scheduling.StoryPoints` — the agreed points
|
|
524
|
-
- `System.AssignedTo` — copied from the Feature if the Feature has an assignee; otherwise leave unset
|
|
525
|
-
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).
|
|
526
|
-
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.
|
|
527
651
|
|
|
528
|
-
|
|
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.
|
|
529
653
|
|
|
530
|
-
## Step
|
|
654
|
+
## Step 9: Confirm
|
|
531
655
|
|
|
532
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.
|
|
533
657
|
|
|
@@ -538,15 +662,15 @@ For a **User Story**, fetch `System.Description` and `Microsoft.VSTS.Common.Acce
|
|
|
538
662
|
|
|
539
663
|
For a **Bug**, fetch `Microsoft.VSTS.TCM.ReproSteps` and `Microsoft.VSTS.TCM.SystemInfo`:
|
|
540
664
|
|
|
541
|
-
1. `ReproSteps` carries every section —
|
|
665
|
+
1. `ReproSteps` carries every section — summary, technical details, steps, expected, actual, acceptance criteria — each under its own heading.
|
|
542
666
|
2. The environment is in `SystemInfo`.
|
|
543
667
|
3. No section appears **only** in `System.Description`, which the Bug form does not display.
|
|
544
668
|
|
|
545
|
-
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.
|
|
546
670
|
|
|
547
|
-
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.
|
|
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`.
|
|
548
672
|
|
|
549
|
-
If a check fails the write didn't take — fix it with `
|
|
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.
|
|
550
674
|
|
|
551
675
|
After creation, report:
|
|
552
676
|
|
|
@@ -572,13 +696,15 @@ Next steps:
|
|
|
572
696
|
/implement AB#{id} — start working on it
|
|
573
697
|
```
|
|
574
698
|
|
|
575
|
-
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:
|
|
576
700
|
|
|
577
701
|
```
|
|
578
702
|
Next steps:
|
|
579
|
-
/explain AB#{
|
|
580
|
-
/plan-backlog
|
|
581
|
-
/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
|
|
582
706
|
```
|
|
583
707
|
|
|
708
|
+
`/quote` is not offered for a Feature: its size is the sum of its children, which are already pointed.
|
|
709
|
+
|
|
584
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}
|
|
@@ -121,7 +124,8 @@ Rules for the draft:
|
|
|
121
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.
|
|
122
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.
|
|
123
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.
|
|
124
|
-
- **
|
|
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.
|
|
125
129
|
- **Prefix rule holds** — if the title changes, it keeps its `PREFIX - ` prefix from the project's CLAUDE.md table.
|
|
126
130
|
|
|
127
131
|
### If the item is a Feature — cascade to the children
|
|
@@ -132,7 +136,7 @@ This is the point of the command. After drafting the Feature's own changes, eval
|
|
|
132
136
|
|---------|---------|--------|
|
|
133
137
|
| **Unchanged** | Still correct under the new scope | Leave it entirely alone |
|
|
134
138
|
| **Update** | Still belongs, but its title / description / AC / points no longer match | Draft a field-level diff for it |
|
|
135
|
-
| **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 |
|
|
136
140
|
| **Retire** | The revised scope no longer includes this work | Propose `System.State` = `Removed`, or unlinking from the Feature — user picks |
|
|
137
141
|
| **Split** | The story now carries two independently shippable slices | Propose narrowing the existing story and adding a sibling |
|
|
138
142
|
|
|
@@ -232,8 +236,8 @@ Render every Markdown section to HTML first — Azure DevOps description and acc
|
|
|
232
236
|
Apply writes in this order, so a failure partway through leaves the most useful state behind:
|
|
233
237
|
|
|
234
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.
|
|
235
|
-
2. **Update existing children** (verdict `Update`) — one call per story, points
|
|
236
|
-
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.
|
|
237
241
|
4. **Re-order** any story whose only change is `Custom.Order` — one call each, touching that field alone.
|
|
238
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.**
|
|
239
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.`).
|
|
@@ -249,6 +253,7 @@ Updated AB#{id}: {title}
|
|
|
249
253
|
Type: {type}
|
|
250
254
|
Fields changed: {list}
|
|
251
255
|
Points: {n → m | unchanged}
|
|
256
|
+
Classification: {Investment Category · Impact} {(was … → now …) | (unchanged)}
|
|
252
257
|
State: {state} {(unchanged — Features are never moved) | (→ Dev Ready)}
|
|
253
258
|
URL: {work item URL}
|
|
254
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
|
|
|
@@ -143,6 +143,22 @@ These rules apply to **every** command or flow that creates or estimates work it
|
|
|
143
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.
|
|
144
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.
|
|
145
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
|
+
|
|
146
162
|
### Branching Strategy
|
|
147
163
|
|
|
148
164
|
#### Target Branch-to-Environment Mapping
|
|
@@ -379,9 +395,9 @@ All deployment and release operations are available as slash commands:
|
|
|
379
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) |
|
|
380
396
|
| `/plan-backlog` | `/plan-backlog [project]` | Sweep backlog for Dev Ready stories with points and no tasks → propose child tasks with hours |
|
|
381
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 |
|
|
382
|
-
| `/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 |
|
|
383
|
-
| `/quote` | `/quote AB#1234` | Estimate story points for one work item; on approval, sets
|
|
384
|
-
| `/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) 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 |
|
|
385
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 |
|
|
386
402
|
| `/cleanup-branches` | `/cleanup-branches` | Delete merged branches |
|
|
387
403
|
| `/close-orphan-tasks` | `/close-orphan-tasks [scope] [--dry-run]` | Close open Tasks whose parent is Ready to Deploy / Deployed / Closed |
|