@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chris1807/claude-kit",
3
- "version": "2.3.4",
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 (`![alt](url)`)
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 9. Leave per-story detail to the stories.}
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 9}
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 are pointed in Step 9. Go to Step 5.
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
- **Scope items:** {count} — offered as child stories after creation
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 User Stories. **The Summary is the exception:** it gets no code spans and no identifiers (Step 3), only an optional bolded outcome.
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` (action `create`) with:
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
- - **title**: the approved title (with prefix)
465
- - **fields**: a JSON Patch document setting:
466
- - `System.Description` — the rendered HTML description (with embedded mockup `<img>` and any user-supplied images). On a **Bug** this is the labelled duplicate of the composed body, not the description alone
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`, and `Success Criteria`, 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.
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
- ### Move to Dev Ready (pointed items only)
586
+ ### Call the create API (Feature — three phases)
486
587
 
487
- If story points were agreed in Step 4, set `System.State` to `Dev Ready` via `mcp__azure-devops__wit_work_item_write` (action `update`) **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`.
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
- **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.
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
- ## Step 9: Offer Child User Stories (Features only)
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
- Skip this step for Bugs and User Stories.
594
+ **If Phase 1 fails, stop — create nothing else.** Creating the Feature first is precisely what makes this failure harmless.
494
595
 
495
- A Feature is a container — `/implement AB#{id}` on a Feature implements its **child User Stories in `Custom.Order` waves**, so a Feature with no children can't be worked. After the Feature is created, ask:
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
- Draft child user stories for this feature now? (yes / no — I'll add them later)
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
- **Wait for the user.** On `no`, skip to Step 10 and point them at `/plan-backlog` for later.
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
- On `yes`:
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
- 1. Turn each bullet from the Feature's **Scope** section into a candidate User Story using the User Story draft shape from Step 3: 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. Keep each one independently shippable; if a bullet is really two stories, split it.
506
- 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.
507
- 3. Propose story points for each using the Step 4 rubric.
508
- 4. Present the whole set for approval at once:
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
- | # | Order | Proposed Title | Points | Summary |
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
- The Summary column is the story's plain-English Summary, the same text that will open its description.
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
- **Wait for the user.** Revise and re-present until approved. Do not create anything before approval.
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
- If a story fails to create or link, report which ones succeeded and which didn't — don't roll back the Feature.
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 10: Confirm
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 — description, steps, expected, actual, acceptance criteria — each under its own heading.
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. Check each child story created in Step 9 too.
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 `wit_work_item_write` (action `update`) before reporting success. Don't report a created item you haven't read back.
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#{id} — re-read the feature in plain language
580
- /plan-backlog — propose child Tasks for the Dev Ready stories
581
- /implement AB#{id} — implement the child stories in Custom.Order waves
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
- - **Never point a Feature** and never change a Feature's `System.State`.
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 and `Custom.Order` 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.
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 as a child of the parent with `mcp__azure-devops__wit_work_item_write` (action `add_child`) (or fall back to `wit_work_item_link_write` (action `link`) with link type `System.LinkTypes.Hierarchy-Forward` from parent → 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. **Drafts a comment for the item's creator** when issues are found.
19
- 6. **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.
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`. 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.
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 three described in Step 5 — **Step 2b's audit is read-only**, and it never clears a tag on the creator's behalf.
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 `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.
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 the points 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`** |
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 |