@chris1807/claude-kit 2.1.48 → 2.1.50

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.1.48",
3
+ "version": "2.1.50",
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": {
@@ -195,6 +195,8 @@ For a **Bug**, **User Story**, or **Hot Fix**, every work item this command crea
195
195
 
196
196
  Estimate using the same rubric as `/quote`: the **modified Fibonacci scale** (`1, 2, 3, 5, 8, 13, 21`), calibrated for a **senior developer working with Claude assistance** in a codebase they know. Don't pad for ramp-up, routine architectural decisions, or stack familiarity — only for things a senior cannot shortcut: genuinely novel work, unresolved open questions, cross-team coordination, external dependencies. If the work looks larger than 21 points, recommend splitting the item instead of proposing a number.
197
197
 
198
+ Repetition and boilerplate are assisted work — price them near the bottom of the range and size the item by its hardest distinct problem, not by how many files it touches. The full assisted / not-assisted breakdown lives in `/quote` Step 2; that file is the authority if the two ever drift.
199
+
198
200
  Present the estimate:
199
201
 
200
202
  ```
@@ -320,9 +322,27 @@ A description that is one long paragraph of plain prose is not acceptable — ev
320
322
  - **Key terms, values, and outcomes** in each sentence are wrapped in `**bold**` (renders as `<strong>...</strong>`). Bold the noun phrase that carries the claim, not the whole sentence.
321
323
  - **Code identifiers** — method names, class names, field names, file paths, route paths, JSON keys, env vars, commit hashes, IDs, literal values like `true` / `null` / numeric thresholds — are wrapped in `` `code spans` `` (renders as `<code>...</code>`).
322
324
  - **Lists** are used instead of comma-separated prose whenever the draft contains 2+ parallel items (steps, files, references, acceptance criteria).
323
- - **Section headings** (`### Description`, `### Acceptance Criteria`, etc.) are kept — they become `<h3>` and structure the rendered output.
325
+ - **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).
326
+
327
+ Apply this pass to every section (Description, Acceptance Criteria, Steps to Reproduce, Expected/Actual Behavior, Environment/Scope, Open Questions). Apply it equally to Bugs, Hot Fixes, and User Stories.
328
+
329
+ ### Split the draft into fields — acceptance criteria never go in the description
330
+
331
+ The Step 3 draft is **one document for the user to read**, not the shape of one field. Before rendering, split it section by section and route each section to its own Azure DevOps field:
332
+
333
+ | Draft section | Goes to | Notes |
334
+ |---|---|---|
335
+ | `### Description` | `System.Description` | Plus the mockup `<img>`, user-supplied images, `Production Impact` (Hot Fix), `Out of Scope`, and `Open Questions` |
336
+ | `### Acceptance Criteria` | `Microsoft.VSTS.Common.AcceptanceCriteria` | **Never** also in the description |
337
+ | `### Steps to Reproduce` | `Microsoft.VSTS.TCM.ReproSteps` (Bug / Hot Fix) | Falls back to the description only if the type doesn't expose the field |
338
+ | `### Expected Behavior`, `### Actual Behavior` | `Microsoft.VSTS.TCM.ReproSteps` | Rendered beneath the repro steps |
339
+ | `### Out of Scope`, `### Environment / Scope`, `### Open Questions` | `System.Description` | These keep their `<h3>` headings — they have no field of their own |
324
340
 
325
- Apply this pass to every section (Description, Acceptance Criteria, Steps to Reproduce, Expected/Actual Behavior, Environment/Scope, Open Questions). Apply it equally to Bugs and User Stories.
341
+ **The rendered `System.Description` must not contain an "Acceptance Criteria" heading or its criteria** — not as `<h3>`, not as `<strong>`, not as a bolded line, not "for readability", not "so it reads as a complete document". Azure DevOps renders the AC field as its own section on the work item form, so a copy in the description gives the reader two lists that drift apart while leaving the real field empty. It also breaks estimation: an empty AC field is exactly what `/quote`, `/quote-backlog`, and `/plan-backlog` read to decide an item can't be sized, so criteria in the wrong field make a fully-specified story look unestimable and bounce it back to its creator.
342
+
343
+ **Drop the section's own heading when it becomes a field.** `Microsoft.VSTS.Common.AcceptanceCriteria` holds the criteria list alone — an `<ol>` or `<ul>`, not `<h3>Acceptance Criteria</h3>` followed by the list. Same for `ReproSteps`. The field label is already on the form.
344
+
345
+ **Always write the AC field explicitly — never leave the placeholder.** Some process templates seed a new item's `Microsoft.VSTS.Common.AcceptanceCriteria` with tip text like `💡 Tip: Add "@serena rewrite" to Description for AI suggestions Define acceptance criteria: - [ ] - [ ] - [ ]`. That is a **placeholder, not content**, and it reads as non-empty to every downstream sweep — an item carrying it looks like it has acceptance criteria when it has none. Include the field in the create call for every Bug, Hot Fix, and User Story; writing it is what clears the placeholder.
326
346
 
327
347
  ### Call the create API
328
348
 
@@ -333,7 +353,7 @@ Call `mcp__azure-devops__wit_create_work_item` with:
333
353
  - **title**: the approved title (with prefix)
334
354
  - **fields**: a JSON Patch document setting:
335
355
  - `System.Description` — the rendered HTML description (with embedded mockup `<img>` and any user-supplied images)
336
- - `Microsoft.VSTS.Common.AcceptanceCriteria` — the rendered HTML acceptance criteria block
356
+ - `Microsoft.VSTS.Common.AcceptanceCriteria` — the rendered criteria list and **only** the criteria (no `<h3>Acceptance Criteria</h3>` wrapper, and no copy of it in `System.Description`). Always include this field for a Bug, Hot Fix, or User Story — writing it is what clears the process template's placeholder tip
337
357
  - `Microsoft.VSTS.Scheduling.StoryPoints` — the points agreed in Step 4 (omit entirely if the user skipped, and **always** for a Feature)
338
358
  - For Features:
339
359
  - Render `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.
@@ -392,6 +412,13 @@ If a story fails to create or link, report which ones succeeded and which didn't
392
412
 
393
413
  ## Step 10: Confirm
394
414
 
415
+ **Read the item back first.** Fetch it with `mcp__azure-devops__wit_work_item` (`action: get`, fields `System.Description` and `Microsoft.VSTS.Common.AcceptanceCriteria`) and check two things:
416
+
417
+ 1. The criteria are in `Microsoft.VSTS.Common.AcceptanceCriteria` — not the placeholder tip, not empty.
418
+ 2. `System.Description` contains no "Acceptance Criteria" heading and none of the criteria.
419
+
420
+ If either check fails the write didn't take — fix it with `wit_update_work_item` before reporting success. Don't report a created item you haven't read back.
421
+
395
422
  After creation, report:
396
423
 
397
424
  ```
@@ -402,6 +429,7 @@ Created AB#{id}: {title}
402
429
  State: {Dev Ready | New}
403
430
  URL: {work item URL}
404
431
  Mockup attached: {yes / no}
432
+ Acceptance criteria: {n} criteria in the AC field (verified — none in the description)
405
433
  Open questions: {count}
406
434
  {Features only:}
407
435
  Child stories: {n created | none — add them later with /plan-backlog}
@@ -44,6 +44,11 @@ Present what exists today, so the user is editing against reality and not memory
44
44
  {end for Bugs}
45
45
  ```
46
46
 
47
+ **Two things read as "this item has acceptance criteria" when it doesn't.** Check for both before showing the item, and say plainly which one you found:
48
+
49
+ - **The field holds the process template's placeholder** — tip text like `💡 Tip: Add "@serena rewrite" to Description for AI suggestions Define acceptance criteria: - [ ] - [ ] - [ ]`. Treat that as **empty** and display it as `(none — placeholder text only)`.
50
+ - **The criteria are in `System.Description`** under an "Acceptance Criteria" heading, with the real field empty or placeholder-filled. This is the misfiled case. Display the criteria where they actually live, flag it, and offer the repair described in Step 7 — moving them costs the user nothing and unblocks estimation.
51
+
47
52
  For a **Feature**, append the current wave layout:
48
53
 
49
54
  ```
@@ -195,6 +200,15 @@ Default the comment question to **yes** for any item past `New`, and **no** for
195
200
 
196
201
  Render every Markdown section to HTML first — Azure DevOps description and acceptance criteria fields do not render Markdown. Use the conversion table and the **emphasis and code spans** rules from `/create-work-item` Step 8: bold the noun phrase carrying each claim, wrap identifiers in `<code>`, use lists for 2+ parallel items, keep `### Headings` as `<h3>`. Preserve existing `<img>` tags exactly.
197
202
 
203
+ **Route each section to its own field**, per the field-routing table in `/create-work-item` Step 8. The rule that matters most here: **acceptance criteria go in `Microsoft.VSTS.Common.AcceptanceCriteria`, never in `System.Description`.** When you rewrite AC, write the criteria list alone into that field — no `<h3>Acceptance Criteria</h3>` wrapper — and make sure the description you write back carries no copy of them. Editing an item is the moment this gets silently undone: it is easy to render the whole reviewed document into the description and leave the AC field as it was.
204
+
205
+ **Repair misfiled criteria when you find them.** If Step 2 found the criteria living in the description (or the AC field holding only placeholder tip text), fix it as part of this edit even when the user didn't ask — it is the same content, moved to the field Azure DevOps and every kit sweep actually read:
206
+
207
+ - Write the criteria into `Microsoft.VSTS.Common.AcceptanceCriteria`, overwriting the placeholder.
208
+ - Strip the "Acceptance Criteria" heading and its list out of `System.Description` in the same call, so the two fields don't both hold a copy.
209
+ - Say so in the change set and in the Step 8 confirmation: `Acceptance criteria: moved from Description → AC field (3 criteria)`. Never move criteria silently; the user needs to see that the description shrank.
210
+ - This is a **move, not a rewrite** — the criteria text is unchanged unless the user separately approved a reword.
211
+
198
212
  Apply writes in this order, so a failure partway through leaves the most useful state behind:
199
213
 
200
214
  1. **Update the parent item** — one `mcp__azure-devops__wit_update_work_item` call with every changed field. Never include `System.State` for a Feature.
@@ -194,9 +194,9 @@ Propose the hours from the parent's Story Points (this mirrors `/plan-backlog` S
194
194
  | 13 | 48 hrs |
195
195
  | 21 | 75 hrs |
196
196
 
197
- Calibrated for a **senior developer** at ~6 productive hours per day — the discount is already in the numbers, so don't apply a second one. Round non-Fibonacci point values up to the nearest row. Add 20–30% for `spike` / `research` / `unknown-stack` tags.
197
+ Calibrated for a **senior developer working with Claude assistance** at ~6 productive hours per day — both discounts are already in the numbers, so don't apply a second one. Boilerplate, tests for specified behavior, and mechanical refactors are assisted work; the hours that remain are the human ones (novel decisions, verification, review, UAT). Round non-Fibonacci point values up to the nearest row. Add 20–30% for `spike` / `research` / `unknown-stack` tags.
198
198
 
199
- If the work item has **no Story Points**, estimate the hours from the plan just approved in Step 3 — files to create and modify, plus the unit tests listed — using the same senior calibration. Say which basis you used.
199
+ If the work item has **no Story Points**, estimate the hours from the plan just approved in Step 3 — files to create and modify, plus the unit tests listed — using the same senior-with-Claude calibration. Say which basis you used.
200
200
 
201
201
  Show the proposal and **wait for the user**:
202
202
 
@@ -108,21 +108,23 @@ Fetch the work item again (Description and Acceptance Criteria fields) if not al
108
108
 
109
109
  ### 5b. Map Story Points → total hour budget
110
110
 
111
- > **Assume a senior developer is the implementer.** The hour budget below already discounts for senior-level speed — no ramp-up time, no time spent learning the stack, routine cross-layer work is fast. Do not add a separate "experience" discount on top of these numbers.
111
+ > **Assume a senior developer working with Claude assistance is the implementer.** The hour budget below already discounts for both — no ramp-up time, no time spent learning the stack, routine cross-layer work is fast, and boilerplate/tests/mechanical refactors are assisted. Do not add a separate "experience" or "Claude" discount on top of these numbers.
112
+ >
113
+ > The hours that survive the assist are the human ones: understanding the requirement, the genuinely novel decisions, verification, review turnaround, and UAT. If a budget looks large only because the story touches many files, it's too large.
112
114
 
113
- Use this mapping (calibrated for a senior developer at ~6 productive hours per day):
115
+ Use this mapping (calibrated for a senior developer with Claude assistance, at ~6 productive hours per day):
114
116
 
115
117
  | Points | Hour budget | Notes |
116
118
  |--------|-------------|-------|
117
119
  | 1 | 3 hrs | trivial change |
118
120
  | 2 | 6 hrs | small, one-layer change |
119
121
  | 3 | 10 hrs | one feature slice, modest tests |
120
- | 5 | 16 hrs | cross-layer or new component (routine for a senior) |
121
- | 8 | 28 hrs | multi-area, real unknowns even for a senior |
122
+ | 5 | 16 hrs | cross-layer or new component (routine for an assisted senior) |
123
+ | 8 | 28 hrs | multi-area, real unknowns the assist doesn’t remove |
122
124
  | 13 | 48 hrs | large feature — should probably be split |
123
125
  | 21 | 75 hrs | very large — almost certainly split |
124
126
 
125
- If the points value isn't on the Fibonacci scale, round to the nearest entry above. If the story has tags like `spike`, `research`, or `unknown-stack`, add 20–30% on top — those are the cases where seniority doesn't help.
127
+ If the points value isn't on the Fibonacci scale, round to the nearest entry above. If the story has tags like `spike`, `research`, or `unknown-stack`, add 20–30% on top — those are the cases where neither seniority nor the assist helps.
126
128
 
127
129
  ### 5c. Draft the single task
128
130
 
@@ -125,21 +125,23 @@ Fetch the work item again (Description and Acceptance Criteria fields — Repro
125
125
 
126
126
  ### 6b. Derive the hour budget
127
127
 
128
- > **Assume a senior developer is the implementer.** The hour budget below already discounts for senior-level speed — no ramp-up time, no time spent learning the stack, routine cross-layer work is fast. Do not add a separate "experience" discount on top of these numbers.
128
+ > **Assume a senior developer working with Claude assistance is the implementer.** The hour budget below already discounts for both — no ramp-up time, no time spent learning the stack, routine cross-layer work is fast, and boilerplate/tests/mechanical refactors are assisted. Do not add a separate "experience" or "Claude" discount on top of these numbers.
129
+ >
130
+ > The hours that survive the assist are the human ones: understanding the requirement, the genuinely novel decisions, verification, review turnaround, and UAT. If a budget looks large only because the story touches many files, it's too large.
129
131
 
130
- **If the item has Story Points**, use this mapping (calibrated for a senior developer at ~6 productive hours per day):
132
+ **If the item has Story Points**, use this mapping (calibrated for a senior developer with Claude assistance, at ~6 productive hours per day):
131
133
 
132
134
  | Points | Hour budget | Notes |
133
135
  |--------|-------------|-------|
134
136
  | 1 | 3 hrs | trivial change |
135
137
  | 2 | 6 hrs | small, one-layer change |
136
138
  | 3 | 10 hrs | one feature slice, modest tests |
137
- | 5 | 16 hrs | cross-layer or new component (routine for a senior) |
138
- | 8 | 28 hrs | multi-area, real unknowns even for a senior |
139
+ | 5 | 16 hrs | cross-layer or new component (routine for an assisted senior) |
140
+ | 8 | 28 hrs | multi-area, real unknowns the assist doesn’t remove |
139
141
  | 13 | 48 hrs | large feature — should probably be split |
140
142
  | 21 | 75 hrs | very large — almost certainly split |
141
143
 
142
- If the points value isn't on the Fibonacci scale, round to the nearest entry above. If the item has tags like `spike`, `research`, or `unknown-stack`, add 20–30% on top — those are the cases where seniority doesn't help.
144
+ If the points value isn't on the Fibonacci scale, round to the nearest entry above. If the item has tags like `spike`, `research`, or `unknown-stack`, add 20–30% on top — those are the cases where neither seniority nor the assist helps.
143
145
 
144
146
  **If the item has no Story Points**, estimate the hours directly from the description, acceptance criteria, and repro steps — judge which row of the table the work most resembles and use that hour budget. Mark the proposal `(no points — estimated from description)` and suggest `/quote AB#{id}` in the final summary. Do **not** set Story Points on the item — that's the user's call.
145
147
 
@@ -145,7 +145,7 @@ Score the item against this checklist:
145
145
  |-------|---------------------------|
146
146
  | **Title prefix** | Follows the project's `PREFIX - Title` convention (e.g. `COM -`, `PAY -`) |
147
147
  | **Description** | States what is being built and why — not just a one-line restatement of the title |
148
- | **Acceptance criteria** | Present, testable, unambiguous. Each AC could become a UAT step. Record whether the field is **empty** or merely **weak** — that distinction decides whether AC can be rewritten (3g) or must go back to the creator (3f) |
148
+ | **Acceptance criteria** | Present, testable, unambiguous. Each AC could become a UAT step. Record whether the field is **empty** or merely **weak** — that distinction decides whether AC can be rewritten (3g) or must go back to the creator (3f). Two traps: the process template's **placeholder tip text** counts as **empty**, and criteria are sometimes **misfiled into `System.Description`** with the AC field left empty — check the description before declaring AC missing, and say where they actually are in the comment |
149
149
  | **Design artifacts** (User Story) | For UI work: a mockup, screenshot, or design link is attached or referenced (the story is Design Approved — the design should be findable) |
150
150
  | **Repro steps** (Bug) | The steps to reproduce, the expected result, and the actual result are all present. A bug swept at `New` has had no design pass, so this is the row that decides whether it's estimable — **a bug with no repro steps is a blocking gap** |
151
151
  | **Scope** | Small enough to point (would land at ≤ 21); no hidden second feature buried in the AC |
@@ -182,7 +182,11 @@ This is read-only reconnaissance. Skip it for non-technical items or when the co
182
182
 
183
183
  Use the **modified Fibonacci scale**: `1, 2, 3, 5, 8, 13, 21`. Anything larger than 21 is flagged as "needs to be split" rather than given a number.
184
184
 
185
- > **Assume a senior developer working with Claude assistance is the implementer.** Don't pad for ramp-up, routine architectural decisions, or familiarity with the stack — that's already priced into the rubric. Only pad for things a senior *cannot* shortcut: genuinely novel work, missing AC, cross-team coordination, or external dependencies. Do not apply a second seniority discount on top of the rubric.
185
+ > **Assume a senior developer working with Claude assistance is the implementer.** Don't pad for ramp-up, routine architectural decisions, or familiarity with the stack — that's already priced into the rubric. Only pad for things a senior *cannot* shortcut: genuinely novel work, missing AC, cross-team coordination, or external dependencies. Do not apply a second seniority discount, or a second Claude-assistance discount, on top of the rubric.
186
+
187
+ **Assisted work — price near the bottom of the range:** boilerplate and scaffolding, tests for already-specified behavior, mechanical refactors, applying a known pattern across many files, CRUD/forms/screens that mirror something already in the repo. Repetition is cheap — size the item by its hardest distinct problem, not by how many files it touches.
188
+
189
+ **Not assisted — never discount:** thin or missing AC, novel design with no precedent, third-party integrations, cross-team dependencies, production data migrations, security/compliance review, hand-verified infra or pipeline work, and human wall-time for review/UAT/deploy gates. These are what justify 8 points and above.
186
190
 
187
191
  | Points | Looks like |
188
192
  |--------|-----------|
@@ -316,7 +320,7 @@ Only for approved items, in batch order:
316
320
  4. **Post the comment** (items with an approved draft): add it with `mcp__azure-devops__wit_add_work_item_comment` (or the server's work-item comment tool). Use the mention syntax the server supports so the creator is notified; otherwise lead with their display name as drafted. For a story that just moved to Design Review, the comment must say so — the creator needs to know why it left their Design Approved column. For a bug that just got the `needs-info` tag, the comment must say that too, and say that removing the tag re-queues it.
317
321
  5. **Apply the rewrite** (only items the user marked `apply rewrite N`): update `System.Description` (and `System.Title` if the rewrite included one) via `wit_update_work_item`, and adjust the comment to say the rewrite was applied ("rewrote the description/AC per the above — please review") rather than suggesting it. Never apply a rewrite the user didn't explicitly mark.
318
322
 
319
- **Guard on `Microsoft.VSTS.Common.AcceptanceCriteria`:** write it only if the item's AC field was **non-empty** when fetched in 3a. Re-check the fetched value at write time — if it was blank, drop AC from the update payload and write the other fields. Blank means no criteria at all: empty string, whitespace, or an empty HTML shell like `<div></div>` or `<p><br></p>`.
323
+ **Guard on `Microsoft.VSTS.Common.AcceptanceCriteria`:** write it only if the item's AC field was **non-empty** when fetched in 3a. Re-check the fetched value at write time — if it was blank, drop AC from the update payload and write the other fields. Blank means no criteria at all: empty string, whitespace, an empty HTML shell like `<div></div>` or `<p><br></p>`, **or the process template's placeholder tip text** (`💡 Tip: Add "@serena rewrite" to Description for AI suggestions Define acceptance criteria: - [ ] - [ ] - [ ]`). The placeholder is the one that bites — it is a stored, non-empty field value that means the exact opposite of what its length suggests.
320
324
 
321
325
  If a write fails, report the failure and ask whether to continue with the remaining items or stop.
322
326
 
@@ -16,6 +16,29 @@ Use the **modified Fibonacci scale** for story points: `1, 2, 3, 5, 8, 13, 21`.
16
16
 
17
17
  > **Assume a senior developer working with Claude assistance is the implementer.** Don't pad for ramp-up, routine architectural decisions, or familiarity with the stack. A senior is expected to read the codebase, find existing patterns, and resolve ordinary unknowns without help — that effort is already priced into the rubric below. Only pad for things a senior *cannot* shortcut: genuinely novel work, missing AC, cross-team coordination, or external dependencies.
18
18
 
19
+ **Claude assistance is part of the baseline, so price these near the bottom of their range** — the rubric already assumes them, don't discount a second time:
20
+
21
+ - Boilerplate and scaffolding — DTOs, mappers, interfaces, request/response models, registrations.
22
+ - Writing tests for behavior that's already specified.
23
+ - Mechanical refactors, renames, and applying a known pattern across many files.
24
+ - CRUD endpoints, forms, tables, and screens that mirror something already in the repo.
25
+ - Migrations and scripts with an obvious shape.
26
+
27
+ **Volume of similar code is cheap.** A story whose size comes mostly from repetition — six more fields, four more columns, another slice of an existing pattern — should not earn points for its file count. Size it by the hardest distinct problem in it, not by how much typing it implies.
28
+
29
+ **Claude assistance does not compress these — never discount them:**
30
+
31
+ - Ambiguous, thin, or missing acceptance criteria (see the *not estimable* rule below).
32
+ - Genuinely novel design decisions with no precedent in the codebase.
33
+ - Third-party integrations, external APIs, and anything gated on another system's behavior.
34
+ - Cross-team coordination, sign-off, or a dependency on someone else's work landing first.
35
+ - Data migrations against production data, and anything needing a rollback plan.
36
+ - Security, compliance, or privacy review.
37
+ - Infrastructure, pipeline, and environment work that has to be verified by hand.
38
+ - Human wall-time: code review turnaround, UAT, and deploy gates.
39
+
40
+ These are what dominate an estimate at 8 points and above. If a big number is driven purely by code volume rather than by items on this list, the estimate is probably too high.
41
+
19
42
  Rough sizing rubric (calibrated for a senior developer, assisted by Claude, working in a codebase they know):
20
43
 
21
44
  | Points | Looks like |
@@ -30,7 +53,9 @@ Rough sizing rubric (calibrated for a senior developer, assisted by Claude, work
30
53
 
31
54
  Adjust upward for: unclear acceptance criteria, missing UX, data migrations, cross-team coordination, security/compliance review, or anything tagged `spike`/`research`.
32
55
 
33
- Adjust downward for: pure config changes, mechanical refactors with good test coverage, work that mirrors an existing implementation, or anything where the senior will recognize the pattern immediately.
56
+ Adjust downward for: pure config changes, mechanical refactors with good test coverage, work that mirrors an existing implementation, repetition of an established pattern, or anything where the senior will recognize the pattern immediately.
57
+
58
+ State the assist in the reasoning when it moved the number — e.g. "5 rather than 8: the three new endpoints follow `PaymentsController` exactly, so the volume is assisted work; the only real unknown is the reconciliation rule." That makes the estimate reviewable instead of asserted.
34
59
 
35
60
  If the item has child items, size each child as well and present the parent's total as the sum (rounded to the nearest Fibonacci number).
36
61