@chris1807/claude-kit 2.1.51 → 2.1.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/templates/commands/implement.md +33 -18
- package/templates/commands/plan-backlog.md +34 -17
- package/templates/commands/plan-sprint.md +36 -19
- package/templates/commands/quote-backlog.md +88 -12
- package/templates/commands/quote.md +12 -10
- package/templates/commands/rework.md +8 -6
- package/templates/infrastructure/CLAUDE-WORKFLOW.md +8 -5
package/README.md
CHANGED
|
@@ -649,7 +649,7 @@ Claude reviews for:
|
|
|
649
649
|
| `/status` | `/status release 24` | Check status of a release, pipeline, work item, or environment |
|
|
650
650
|
| `/plan-backlog` | `/plan-backlog [project]` | Sweep backlog for Dev Ready stories with points and no tasks → propose one child task with hours per story |
|
|
651
651
|
| `/plan-sprint` | `/plan-sprint [project]` | Sweep the current sprint for stories/bugs with no child tasks → propose one child task with hours per item |
|
|
652
|
-
| `/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) |
|
|
652
|
+
| `/quote-backlog` | `/quote-backlog [project]` | Sweep backlog for unpointed items ready to estimate — stories in `Design Approved`, bugs in `New` (bugs have no design states) → review completeness, check for duplicates, suggest rewrites, propose points + creator comments (10 at a time, approval-gated). Also audits the drop-out queue — tagged bugs and stories bounced to Design Review — for items whose creator answered but which nobody returned to the sweep |
|
|
653
653
|
| `/quote` | `/quote AB#1234` | Estimate a work item in story points (senior-calibrated Fibonacci rubric) |
|
|
654
654
|
| `/explain` | `/explain AB#1234` | Summarize and explain a work item in plain language |
|
|
655
655
|
| `/create-work-item` | `/create-work-item [description]` | Interactively draft and create a Feature, Bug, User Story, or Hot Fix — proposes story points (user must agree), creates pointed items in Dev Ready; on a Feature, also drafts its child stories with `Custom.Order` waves |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chris1807/claude-kit",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.53",
|
|
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": {
|
|
@@ -182,21 +182,35 @@ If **more than one** open Task exists, don't guess — list them and ask which o
|
|
|
182
182
|
|
|
183
183
|
This includes the case where child Tasks exist but every one of them is already closed — a closed Task is not somewhere to log new work.
|
|
184
184
|
|
|
185
|
-
|
|
185
|
+
The parent's Story Points give the **band**; the complexity of the work picks the number **inside** it (this mirrors `/plan-backlog` Step 5b — keep the two tables in sync). Never take the top of the band by default.
|
|
186
186
|
|
|
187
|
-
| Points |
|
|
188
|
-
|
|
189
|
-
| 1 |
|
|
190
|
-
| 2 |
|
|
191
|
-
| 3 |
|
|
192
|
-
| 5 |
|
|
193
|
-
| 8 |
|
|
194
|
-
| 13 | 48
|
|
195
|
-
| 21 | 75
|
|
187
|
+
| Points | Low | Medium | High | Band in days (a day = 6 hrs) |
|
|
188
|
+
|--------|-----|--------|------|------------------------------|
|
|
189
|
+
| 1 | 1 | 1.5 | 2 | under 2 hours |
|
|
190
|
+
| 2 | 2 | 2.5 | 3 | 2 hours to half a day |
|
|
191
|
+
| 3 | 3 | 6 | 12 | half a day to two days |
|
|
192
|
+
| 5 | 12 | 18 | 24 | two to four days |
|
|
193
|
+
| 8 | 24 | 30 | 36 | around a week |
|
|
194
|
+
| 13 | 36 | 48 | 60 | one to two weeks |
|
|
195
|
+
| 21 | 60 | 75 | 90 | two to three weeks |
|
|
196
196
|
|
|
197
|
-
|
|
197
|
+
The bands are **contiguous**: each starts where the one below it ends, so a 1-pointer never costs more than a 2-pointer's floor. A day is **6 productive hours**, a week is **5 days (30 hours)**.
|
|
198
198
|
|
|
199
|
-
|
|
199
|
+
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. Hours are rounded to the nearest half hour at 1–2 points and to a whole hour from 3 points up.
|
|
200
|
+
|
|
201
|
+
**Complexity is not size.** Points already carry the size — how much work there is. Complexity is how *hard* that work is: how many decisions are still open, how novel the shape is, how costly it is to get wrong. A large-but-boring story is high points at **low** complexity. Never default to the High column just because the points are high.
|
|
202
|
+
|
|
203
|
+
- **Low** — the shape is known before starting. One layer, or an existing pattern in the codebase to copy. AC is unambiguous. No new integration, no migration, no state or permission logic. Tests are mechanical.
|
|
204
|
+
- **Medium** — crosses layers, or touches an area with no exact precedent. A few real decisions, some edge cases to reason through, existing tests need reworking. This is the default when nothing pushes the item either way.
|
|
205
|
+
- **High** — novel design with nothing to copy; external or third-party contract; data migration or backfill; concurrency, state machines, permissions, money, or PII; ambiguous or self-contradicting AC; wide blast radius; behavior that is hard to verify.
|
|
206
|
+
|
|
207
|
+
Pick **one** band and hold a one-phrase reason for it — that phrase is shown with the proposal. When an item sits between two bands, take the **lower** one unless a High signal above is actually present.
|
|
208
|
+
|
|
209
|
+
Tags like `spike`, `research`, or `unknown-stack` are High-complexity signals on their own — use the High column for them rather than adding a separate percentage.
|
|
210
|
+
|
|
211
|
+
By Step 4 you have the approved Step 3 plan in hand — judge complexity from that plan, not from the points. A plan that is mostly "add a field, thread it through, follow the existing pattern" is Low even at 8 points; a plan with an open design question or a migration in it is High even at 3.
|
|
212
|
+
|
|
213
|
+
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 — judging size and complexity the same way. Say which basis you used.
|
|
200
214
|
|
|
201
215
|
Show the proposal and **wait for the user**:
|
|
202
216
|
|
|
@@ -205,9 +219,10 @@ AB#{id} has no open child Task — one is needed to log hours against.
|
|
|
205
219
|
|
|
206
220
|
| Task title | Hours |
|
|
207
221
|
|----------------------------------------------|-------|
|
|
208
|
-
| {PREFIX} - Implement: {short summary} |
|
|
222
|
+
| {PREFIX} - Implement: {short summary} | 18 |
|
|
209
223
|
|
|
210
|
-
Basis: {n} story points
|
|
224
|
+
Basis: {n} story points ({low}/{mid}/{high} band), {complexity} complexity — {one-phrase reason} → {n}h
|
|
225
|
+
(or: no points — estimated from the approved plan, {complexity} complexity)
|
|
211
226
|
|
|
212
227
|
Create it? (yes / edit / skip)
|
|
213
228
|
```
|
|
@@ -475,10 +490,10 @@ For each wave in ascending order:
|
|
|
475
490
|
```
|
|
476
491
|
Stories in this wave with no open child Task:
|
|
477
492
|
|
|
478
|
-
| Story | Task title | Hours | Basis
|
|
479
|
-
|
|
480
|
-
| AB#1235 | COM - Implement: export endpoint |
|
|
481
|
-
| AB#1236 | COM - Implement: export screen |
|
|
493
|
+
| Story | Task title | Hours | Basis |
|
|
494
|
+
|----------|-----------------------------------------|-------|------------------------|
|
|
495
|
+
| AB#1235 | COM - Implement: export endpoint | 3 | 3 pts, low cx |
|
|
496
|
+
| AB#1236 | COM - Implement: export screen | 18 | 5 pts, medium cx |
|
|
482
497
|
|
|
483
498
|
Create these? (yes / edit N / skip N / skip all)
|
|
484
499
|
```
|
|
@@ -93,7 +93,7 @@ Continue? (yes / cancel)
|
|
|
93
93
|
|
|
94
94
|
Only when **ultracode is on** (a system-reminder confirms it, or the user typed `ultracode`): the analysis in 5a–5c is independent per story, so pre-compute all proposals in parallel with the `Workflow` tool instead of analyzing one story at a time.
|
|
95
95
|
|
|
96
|
-
- Fan out **one agent per story** that does 5a–5c — re-read the story, map points →
|
|
96
|
+
- Fan out **one agent per story** that does 5a–5c — re-read the story, map points → band, judge complexity, pick within the band, draft the single task — and returns a structured proposal (story id, points, complexity, one-phrase complexity reason, band, and one `{title, hours}` task). Use a `schema` so each agent returns validated JSON, with `complexity` constrained to `low | medium | high`.
|
|
97
97
|
- Then run Step 5's loop **using the pre-computed proposals** — but keep 5d (approval) and 5e (creation) exactly as written: present each proposal, wait for `yes / edit / skip / cancel-all`, and create the task only after approval. **Never fan out the approval or the work-item creation** — those stay sequential and interactive.
|
|
98
98
|
|
|
99
99
|
If ultracode is off, ignore this and run Step 5 the normal sequential way. The output is identical either way; ultracode only makes the analysis faster for large backlogs.
|
|
@@ -106,45 +106,62 @@ For each remaining story, in order:
|
|
|
106
106
|
|
|
107
107
|
Fetch the work item again (Description and Acceptance Criteria fields) if not already cached. You need the AC text to write an accurate task title.
|
|
108
108
|
|
|
109
|
-
### 5b. Map Story Points →
|
|
109
|
+
### 5b. Map Story Points → hour band, then pick within it by complexity
|
|
110
110
|
|
|
111
|
-
> **Assume a senior developer working with Claude assistance is the implementer.** The hour
|
|
111
|
+
> **Assume a senior developer working with Claude assistance is the implementer.** The hour bands below already discount 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
112
|
>
|
|
113
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.
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
**Points give the band. Complexity picks the number inside it.** Never take the top of the band by default — that is what makes every estimate max out. Low complexity → the low end, medium → the middle, high → the high end.
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
|--------|-------------|-------|
|
|
119
|
-
| 1 | 3 hrs | trivial change |
|
|
120
|
-
| 2 | 6 hrs | small, one-layer change |
|
|
121
|
-
| 3 | 10 hrs | one feature slice, modest tests |
|
|
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 |
|
|
124
|
-
| 13 | 48 hrs | large feature — should probably be split |
|
|
125
|
-
| 21 | 75 hrs | very large — almost certainly split |
|
|
117
|
+
Bands (calibrated for a senior developer with Claude assistance, at ~6 productive hours per day):
|
|
126
118
|
|
|
127
|
-
|
|
119
|
+
| Points | Low | Medium | High | Band in days (a day = 6 hrs) |
|
|
120
|
+
|--------|-----|--------|------|------------------------------|
|
|
121
|
+
| 1 | 1 | 1.5 | 2 | under 2 hours |
|
|
122
|
+
| 2 | 2 | 2.5 | 3 | 2 hours to half a day |
|
|
123
|
+
| 3 | 3 | 6 | 12 | half a day to two days |
|
|
124
|
+
| 5 | 12 | 18 | 24 | two to four days |
|
|
125
|
+
| 8 | 24 | 30 | 36 | around a week |
|
|
126
|
+
| 13 | 36 | 48 | 60 | one to two weeks — likely needs splitting |
|
|
127
|
+
| 21 | 60 | 75 | 90 | two to three weeks — almost certainly split |
|
|
128
|
+
|
|
129
|
+
The bands are **contiguous**: each one starts where the one below it ends, so a 1-pointer never costs more than a 2-pointer's floor. A day is **6 productive hours** and a week is **5 days (30 hours)** — every row above is a whole number of days once you leave the 1–2 point rows.
|
|
130
|
+
|
|
131
|
+
If the points value isn't on the Fibonacci scale, round to the nearest row above. Hours are rounded to the nearest half hour at 1–2 points and to a whole hour from 3 points up.
|
|
132
|
+
|
|
133
|
+
**Complexity is not size.** Points already carry the size — how much work there is. Complexity is how *hard* that work is: how many decisions are still open, how novel the shape is, how costly it is to get wrong. A large-but-boring story is high points at **low** complexity. Never default to the High column just because the points are high.
|
|
134
|
+
|
|
135
|
+
- **Low** — the shape is known before starting. One layer, or an existing pattern in the codebase to copy. AC is unambiguous. No new integration, no migration, no state or permission logic. Tests are mechanical.
|
|
136
|
+
- **Medium** — crosses layers, or touches an area with no exact precedent. A few real decisions, some edge cases to reason through, existing tests need reworking. This is the default when nothing pushes the item either way.
|
|
137
|
+
- **High** — novel design with nothing to copy; external or third-party contract; data migration or backfill; concurrency, state machines, permissions, money, or PII; ambiguous or self-contradicting AC; wide blast radius; behavior that is hard to verify.
|
|
138
|
+
|
|
139
|
+
Pick **one** band and hold a one-phrase reason for it — that phrase is shown with the proposal. When an item sits between two bands, take the **lower** one unless a High signal above is actually present.
|
|
140
|
+
|
|
141
|
+
Tags like `spike`, `research`, or `unknown-stack` are High-complexity signals on their own — use the High column for them rather than adding a separate percentage.
|
|
128
142
|
|
|
129
143
|
### 5c. Draft the single task
|
|
130
144
|
|
|
131
145
|
Create **exactly one task** covering all the work for the story — implementation, tests, code review revisions, and UAT support are all rolled into it. Do not split the story into design/backend/frontend/test tasks.
|
|
132
146
|
|
|
133
147
|
- **Title**: `{Prefix} - Implement: {short summary of the story}` — use the same product prefix as the parent (e.g. `COM`, `PAY`, `CDA`), extracted from the parent's title.
|
|
134
|
-
- **Hours**: the
|
|
148
|
+
- **Hours**: the number picked in 5b — band from points, position in the band from complexity — rounded to a whole hour.
|
|
135
149
|
|
|
136
150
|
### 5d. Show the proposal
|
|
137
151
|
|
|
138
152
|
```
|
|
139
153
|
─────────────────────────────────────────────────────────────
|
|
140
|
-
AB#{id}: {title} ({points} pts → {budget} hrs)
|
|
154
|
+
AB#{id}: {title} ({points} pts, {complexity} complexity → {budget} hrs)
|
|
141
155
|
─────────────────────────────────────────────────────────────
|
|
142
156
|
|
|
143
157
|
Proposed child task:
|
|
144
158
|
|
|
145
159
|
| Task title | Hours |
|
|
146
160
|
|------------------------------------------------|-------|
|
|
147
|
-
| {Prefix} - Implement: payments CSV export |
|
|
161
|
+
| {Prefix} - Implement: payments CSV export | 18 |
|
|
162
|
+
|
|
163
|
+
Complexity: medium — crosses API and client, follows the existing export pattern
|
|
164
|
+
Band for 5 pts: 12 / 18 / 24 (two to four days)
|
|
148
165
|
|
|
149
166
|
Approve? (yes / edit / skip / cancel-all)
|
|
150
167
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Sweep the **current sprint** for user stories and bugs without child tasks and propose a single implementation task per item with an hour estimate. Usage: `/plan-sprint [project]`
|
|
2
2
|
|
|
3
|
-
This command finds every **User Story** and **Bug** in the current sprint of a chosen Azure DevOps project that **has no child tasks yet**, and — item by item — proposes **one child Task** with an hour estimate for the user to approve before any work items are created. Exactly one task per work item — never a multi-task breakdown.
|
|
3
|
+
This command finds every **User Story** and **Bug** in the current sprint of a chosen Azure DevOps project that **has no child tasks yet**, and — item by item — proposes **one child Task** with an hour estimate (points set the band, complexity sets where in the band it lands) for the user to approve before any work items are created. Exactly one task per work item — never a multi-task breakdown.
|
|
4
4
|
|
|
5
5
|
This is the sprint-planning counterpart of `/plan-backlog`. Use `/plan-backlog` to groom the unscheduled backlog; use `/plan-sprint` after items are pulled into the sprint to make sure each has its implementation task and hours.
|
|
6
6
|
|
|
@@ -110,7 +110,7 @@ Continue? (yes / cancel)
|
|
|
110
110
|
|
|
111
111
|
Only when **ultracode is on** (a system-reminder confirms it, or the user typed `ultracode`): the analysis in 6a–6c is independent per item, so pre-compute all proposals in parallel with the `Workflow` tool instead of analyzing one item at a time.
|
|
112
112
|
|
|
113
|
-
- Fan out **one agent per item** that does 6a–6c — re-read the item,
|
|
113
|
+
- Fan out **one agent per item** that does 6a–6c — re-read the item, map points → band, judge complexity, pick within the band, draft the single task — and returns a structured proposal (item id, points, complexity, one-phrase complexity reason, band, and one `{title, hours}` task). Use a `schema` so each agent returns validated JSON, with `complexity` constrained to `low | medium | high`.
|
|
114
114
|
- Then run Step 6's loop **using the pre-computed proposals** — but keep 6d (approval) and 6e (creation) exactly as written: present each proposal, wait for `yes / edit / skip / cancel-all`, and create the task only after approval. **Never fan out the approval or the work-item creation** — those stay sequential and interactive.
|
|
115
115
|
|
|
116
116
|
If ultracode is off, ignore this and run Step 6 the normal sequential way. The output is identical either way; ultracode only makes the analysis faster for large sprints.
|
|
@@ -125,50 +125,67 @@ 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 working with Claude assistance is the implementer.** The hour
|
|
128
|
+
> **Assume a senior developer working with Claude assistance is the implementer.** The hour bands below already discount 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
129
|
>
|
|
130
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.
|
|
131
131
|
|
|
132
|
-
**
|
|
132
|
+
**Points give the band. Complexity picks the number inside it.** Never take the top of the band by default — that is what makes every estimate max out. Low complexity → the low end, medium → the middle, high → the high end.
|
|
133
133
|
|
|
134
|
-
|
|
135
|
-
|--------|-------------|-------|
|
|
136
|
-
| 1 | 3 hrs | trivial change |
|
|
137
|
-
| 2 | 6 hrs | small, one-layer change |
|
|
138
|
-
| 3 | 10 hrs | one feature slice, modest tests |
|
|
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 |
|
|
141
|
-
| 13 | 48 hrs | large feature — should probably be split |
|
|
142
|
-
| 21 | 75 hrs | very large — almost certainly split |
|
|
134
|
+
**If the item has Story Points**, use these bands (calibrated for a senior developer with Claude assistance, at ~6 productive hours per day):
|
|
143
135
|
|
|
144
|
-
|
|
136
|
+
| Points | Low | Medium | High | Band in days (a day = 6 hrs) |
|
|
137
|
+
|--------|-----|--------|------|------------------------------|
|
|
138
|
+
| 1 | 1 | 1.5 | 2 | under 2 hours |
|
|
139
|
+
| 2 | 2 | 2.5 | 3 | 2 hours to half a day |
|
|
140
|
+
| 3 | 3 | 6 | 12 | half a day to two days |
|
|
141
|
+
| 5 | 12 | 18 | 24 | two to four days |
|
|
142
|
+
| 8 | 24 | 30 | 36 | around a week |
|
|
143
|
+
| 13 | 36 | 48 | 60 | one to two weeks — likely needs splitting |
|
|
144
|
+
| 21 | 60 | 75 | 90 | two to three weeks — almost certainly split |
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
The bands are **contiguous**: each one starts where the one below it ends, so a 1-pointer never costs more than a 2-pointer's floor. A day is **6 productive hours** and a week is **5 days (30 hours)** — every row above is a whole number of days once you leave the 1–2 point rows.
|
|
147
|
+
|
|
148
|
+
If the points value isn't on the Fibonacci scale, round to the nearest row above. Hours are rounded to the nearest half hour at 1–2 points and to a whole hour from 3 points up.
|
|
149
|
+
|
|
150
|
+
**Complexity is not size.** Points already carry the size — how much work there is. Complexity is how *hard* that work is: how many decisions are still open, how novel the shape is, how costly it is to get wrong. A large-but-boring story is high points at **low** complexity. Never default to the High column just because the points are high.
|
|
151
|
+
|
|
152
|
+
- **Low** — the shape is known before starting. One layer, or an existing pattern in the codebase to copy. AC is unambiguous. No new integration, no migration, no state or permission logic. Tests are mechanical.
|
|
153
|
+
- **Medium** — crosses layers, or touches an area with no exact precedent. A few real decisions, some edge cases to reason through, existing tests need reworking. This is the default when nothing pushes the item either way.
|
|
154
|
+
- **High** — novel design with nothing to copy; external or third-party contract; data migration or backfill; concurrency, state machines, permissions, money, or PII; ambiguous or self-contradicting AC; wide blast radius; behavior that is hard to verify.
|
|
155
|
+
|
|
156
|
+
Pick **one** band and hold a one-phrase reason for it — that phrase is shown with the proposal. When an item sits between two bands, take the **lower** one unless a High signal above is actually present.
|
|
157
|
+
|
|
158
|
+
Tags like `spike`, `research`, or `unknown-stack` are High-complexity signals on their own — use the High column for them rather than adding a separate percentage.
|
|
159
|
+
|
|
160
|
+
**If the item has no Story Points**, judge both axes from the description, acceptance criteria, and repro steps: which row the *size* of the work most resembles, then which column its *complexity* falls in. 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.
|
|
147
161
|
|
|
148
162
|
### 6c. Draft the single task
|
|
149
163
|
|
|
150
164
|
Create **exactly one task** covering all the work for the item — implementation, tests, code review revisions, and UAT support are all rolled into it. Do not split the item into design/backend/frontend/test tasks.
|
|
151
165
|
|
|
152
166
|
- **Title**: `{Prefix} - Implement: {short summary of the item}` — use the same product prefix as the parent (e.g. `COM`, `PAY`, `CDA`), extracted from the parent's title. For Bugs, `{Prefix} - Fix: {short summary}` reads better.
|
|
153
|
-
- **Hours**: the
|
|
167
|
+
- **Hours**: the number picked in 6b — band from points, position in the band from complexity — rounded to a whole hour.
|
|
154
168
|
|
|
155
169
|
### 6d. Show the proposal
|
|
156
170
|
|
|
157
171
|
```
|
|
158
172
|
─────────────────────────────────────────────────────────────
|
|
159
|
-
AB#{id}: {title} ({points} pts → {budget} hrs)
|
|
173
|
+
AB#{id}: {title} ({points} pts, {complexity} complexity → {budget} hrs)
|
|
160
174
|
─────────────────────────────────────────────────────────────
|
|
161
175
|
|
|
162
176
|
Proposed child task:
|
|
163
177
|
|
|
164
178
|
| Task title | Hours |
|
|
165
179
|
|------------------------------------------------|-------|
|
|
166
|
-
| {Prefix} - Implement: payments CSV export |
|
|
180
|
+
| {Prefix} - Implement: payments CSV export | 18 |
|
|
181
|
+
|
|
182
|
+
Complexity: medium — crosses API and client, follows the existing export pattern
|
|
183
|
+
Band for 5 pts: 12 / 18 / 24 (two to four days)
|
|
167
184
|
|
|
168
185
|
Approve? (yes / edit / skip / cancel-all)
|
|
169
186
|
```
|
|
170
187
|
|
|
171
|
-
For unpointed items, the header line reads `(no points — estimated from description → {budget} hrs)`.
|
|
188
|
+
For unpointed items, the header line reads `(no points — estimated from description, {complexity} complexity → {budget} hrs)`.
|
|
172
189
|
|
|
173
190
|
**Wait for the user.**
|
|
174
191
|
|
|
@@ -28,6 +28,8 @@ For each qualifying item:
|
|
|
28
28
|
- 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
29
|
- 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
30
|
|
|
31
|
+
Both drop-out mechanisms are **one-way and never expire** — only a human undoing them returns an item to the sweep. **Step 2b** therefore audits the drop-out queue on every run and reports items whose creator has answered but which nobody returned, so answered work can't sit invisible forever. That audit is read-only: it never clears a tag and never moves a story.
|
|
32
|
+
|
|
31
33
|
Treat `$ARGUMENTS` as an optional project name (e.g. `/quote-backlog CSI Development`). If provided, skip the project prompt in Step 1.
|
|
32
34
|
|
|
33
35
|
## `--help`
|
|
@@ -40,6 +42,8 @@ If `$ARGUMENTS` contains `--help` or `-h`, print everything between the two rule
|
|
|
40
42
|
|
|
41
43
|
Reviews each item for completeness and duplicate work, proposes points, and drafts feedback for the item's creator. Max 10 items per run, in backlog-rank order.
|
|
42
44
|
|
|
45
|
+
Every run also audits the drop-out queue — bugs tagged `needs-info` and stories bounced to `Design Review` — and reports any whose creator has since answered but which nobody returned to the sweep. Neither mechanism expires on its own, so those items are otherwise invisible forever.
|
|
46
|
+
|
|
43
47
|
Nothing is written to Azure DevOps until you approve the batch — every option below is a fully reversible choice.
|
|
44
48
|
|
|
45
49
|
| You type | What happens |
|
|
@@ -108,7 +112,7 @@ ORDER BY [Microsoft.VSTS.Common.StackRank] ASC
|
|
|
108
112
|
|
|
109
113
|
> **The state predicate is per-type on purpose — do not collapse it.** `[System.WorkItemType] IN ('User Story', 'Bug') AND [System.State] = 'Design Approved'` is the tempting one-liner and it is **silently wrong**: `Bug` has no `Design Approved` state, so that form returns User Stories only and never surfaces a single bug. It produces no error, just a short result set.
|
|
110
114
|
>
|
|
111
|
-
> The `[System.Tags] NOT CONTAINS 'needs-info'` clause excludes bugs that a previous run sent back to their creator (Step 5.3). Removing the tag re-queues the bug.
|
|
115
|
+
> The `[System.Tags] NOT CONTAINS 'needs-info'` clause excludes bugs that a previous run sent back to their creator (Step 5.3). Removing the tag re-queues the bug — and **removing it is the only thing that does**, which is why Step 2b exists. Nothing expires the tag, so a creator who supplies the missing information and forgets to untag makes the bug invisible to every future sweep.
|
|
112
116
|
>
|
|
113
117
|
> The `[System.IterationPath] = '{project}'` clause restricts results to the **root** iteration — items not yet placed in a sprint. If a project uses a different convention (e.g. an explicit "Backlog" iteration), ask the user to confirm before proceeding.
|
|
114
118
|
>
|
|
@@ -129,6 +133,70 @@ Nothing to quote on the backlog of {project}.
|
|
|
129
133
|
|
|
130
134
|
and stop. **If the user expected items to be there**, confirm the state names with `get_type` before concluding the backlog is clean — an empty result is what a wrong state name looks like.
|
|
131
135
|
|
|
136
|
+
## Step 2b: Audit the drop-out queue for stale items
|
|
137
|
+
|
|
138
|
+
Both drop-out mechanisms from Step 5 are **one-way and have no expiry**: a bug leaves the sweep via the `needs-info` tag, a story leaves via `Design Review`, and the *only* thing that brings either back is a human undoing it. If a creator supplies the missing information but leaves the tag on — or answers in a comment without touching the field, or adds the missing AC without moving the story forward — the item goes invisible to every future sweep, permanently.
|
|
139
|
+
|
|
140
|
+
That is silent starvation, and it is the most likely way this command loses work, because **the failure is indistinguishable from a clean backlog.** Both halves need auditing; fixing only the bug side leaves the same hole open for stories.
|
|
141
|
+
|
|
142
|
+
Run this **regardless of what Step 2 returned** — including when Step 2 returned zero items, which is exactly when starvation is easiest to miss:
|
|
143
|
+
|
|
144
|
+
```sql
|
|
145
|
+
SELECT [System.Id], [System.Title], [System.WorkItemType],
|
|
146
|
+
[System.ChangedDate], [System.ChangedBy], [System.CommentCount]
|
|
147
|
+
FROM WorkItems
|
|
148
|
+
WHERE [System.TeamProject] = '{project}'
|
|
149
|
+
AND [System.Tags] CONTAINS 'needs-info'
|
|
150
|
+
ORDER BY [System.ChangedDate] DESC
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Then two passes — cheap first, precise only where the cheap pass raises a flag:
|
|
154
|
+
|
|
155
|
+
1. **Cheap filter (one batch call).** Fetch `System.ChangedBy` / `System.ChangedDate` for the tagged ids. If an item's most recent change is still the person who applied the tag, nobody has responded — leave it alone.
|
|
156
|
+
2. **Precise check, only for the remainder.** Call `mcp__azure-devops__wit_work_item` (`action: list_revisions`), find the revision where `needs-info` **first appeared**, then scan every **later** revision for one authored by somebody other than the tagger that changed `System.Title`, `Microsoft.VSTS.TCM.ReproSteps`, `System.Description`, `Microsoft.VSTS.Common.AcceptanceCriteria`, or raised `System.CommentCount`. Any such revision means the creator answered and the tag is stale.
|
|
157
|
+
|
|
158
|
+
**Three traps in that check:**
|
|
159
|
+
|
|
160
|
+
- **Bot revisions are noise.** A process automation (an AI work-item reviewer, a quality-score bot) bumps a revision after nearly every human write, so the *latest* revision author is frequently a bot even when a human just acted. Never conclude from the latest author alone — scan the whole range after the tag revision.
|
|
161
|
+
- **A comment counts as a response.** A creator who answers in a comment without editing the field has still supplied the information. Treat a `System.CommentCount` increase after the tag revision as creator activity.
|
|
162
|
+
- **The fix and the untag often land in one revision.** A tidy creator corrects the field *and* drops the tag in a single save, which is the healthy path and needs no report. Only a live tag with later activity behind it is stale.
|
|
163
|
+
|
|
164
|
+
### The story side of the same hole
|
|
165
|
+
|
|
166
|
+
Stories bounced to `Design Review` starve identically, but they **cannot be swept wholesale** — unlike the `needs-info` tag, `Design Review` is a legitimate working state, and most stories sitting in it arrived through the normal design process and are exactly where they belong. Auditing every story in `Design Review` would bury the real signal in noise.
|
|
167
|
+
|
|
168
|
+
Narrow it to the ones *this command* bounced:
|
|
169
|
+
|
|
170
|
+
```sql
|
|
171
|
+
SELECT [System.Id], [System.Title], [System.ChangedDate], [System.ChangedBy]
|
|
172
|
+
FROM WorkItems
|
|
173
|
+
WHERE [System.TeamProject] = '{project}'
|
|
174
|
+
AND [System.WorkItemType] = 'User Story'
|
|
175
|
+
AND [System.State] = 'Design Review'
|
|
176
|
+
AND [Microsoft.VSTS.Scheduling.StoryPoints] = ''
|
|
177
|
+
ORDER BY [System.ChangedDate] DESC
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Then keep only those that reached `Design Review` **from `Design Approved`** (a bounce, not forward design progress) and carry a quote-sweep comment. `System.Reason` on the bouncing revision reads `Moved out of state Design Approved` — check the revision history rather than the current `System.Reason`, which reflects whatever happened last. A story that has had creator activity since that bounce is stale, on the same test as the bug side.
|
|
181
|
+
|
|
182
|
+
If a project's stories routinely round-trip `Design Approved → Design Review` for reasons unrelated to estimating, say so and skip this half rather than reporting noise — the bug-side audit still stands on its own.
|
|
183
|
+
|
|
184
|
+
### Reporting
|
|
185
|
+
|
|
186
|
+
Report stale items **above** the batch, and do not quote them in this run:
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
⚑ Stale drop-outs — answered since they left the sweep, still excluded:
|
|
190
|
+
AB#6440 (Bug) — Mackenzie Luke edited Repro Steps 2026-09-02, needs-info still on
|
|
191
|
+
AB#6443 (Bug) — Mackenzie Luke commented 2026-09-01, needs-info still on
|
|
192
|
+
AB#6461 (Story) — Donna Chen added AC 2026-09-02, still in Design Review
|
|
193
|
+
|
|
194
|
+
Re-quote one with /quote AB#{id}, or return it to the sweep: drop the bug's
|
|
195
|
+
tag / move the story back to Design Approved.
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Never undo the drop-out yourself** — don't clear the tag, don't move the story forward. Both are the creator's signal that the item is ready, and asserting it for them claims knowledge you don't have; the creator may have answered one gap while another remains. Surfacing it is the whole job — a drop-out nobody reverses is work nobody sees. If nothing is stale, say so in one line (`✓ drop-out queue clean — {n} tagged bugs, {m} bounced stories, none updated since`) and move on.
|
|
199
|
+
|
|
132
200
|
## Step 3: Analyze Each Item (max 10)
|
|
133
201
|
|
|
134
202
|
For each item in the batch, do all of 3a–3e before presenting anything. Collect results; **do not write to Azure DevOps during this step.**
|
|
@@ -188,15 +256,17 @@ Use the **modified Fibonacci scale**: `1, 2, 3, 5, 8, 13, 21`. Anything larger t
|
|
|
188
256
|
|
|
189
257
|
**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.
|
|
190
258
|
|
|
191
|
-
| Points | Looks like |
|
|
192
|
-
|
|
193
|
-
| **1** | Trivial change — copy tweak, single config value, one-line fix |
|
|
194
|
-
| **2** | Small, well-understood change in one file or one layer |
|
|
195
|
-
| **3** | A couple of files / one feature slice, some new tests |
|
|
196
|
-
| **5** | Crosses layers, or a new component/endpoint following existing patterns |
|
|
197
|
-
| **8** | Multi-area change with real new logic, migrations, or non-trivial edge cases |
|
|
198
|
-
| **13** | Large feature, several moving parts — likely benefits from being split |
|
|
199
|
-
| **21** | Very large / high uncertainty — should almost certainly be split |
|
|
259
|
+
| Points | Effort (a day = 6 hrs) | Looks like |
|
|
260
|
+
|--------|----------------------|-----------|
|
|
261
|
+
| **1** | under 2 hours | Trivial change — copy tweak, single config value, one-line fix |
|
|
262
|
+
| **2** | 2 hours to half a day | Small, well-understood change in one file or one layer |
|
|
263
|
+
| **3** | half a day to two days | A couple of files / one feature slice, some new tests |
|
|
264
|
+
| **5** | two to four days | Crosses layers, or a new component/endpoint following existing patterns |
|
|
265
|
+
| **8** | around a week | Multi-area change with real new logic, migrations, or non-trivial edge cases |
|
|
266
|
+
| **13** | one to two weeks | Large feature, several moving parts — likely benefits from being split |
|
|
267
|
+
| **21** | two to three weeks | Very large / high uncertainty — should almost certainly be split |
|
|
268
|
+
|
|
269
|
+
The **effort column is a sanity check on the number, not the way to pick it** — a point value that implies four days for something a senior finishes before lunch is wrong regardless of how the description reads. A day is **6 productive hours**; a week is 5 days (30 hours). `/plan-backlog` Step 5b turns the point value back into a Task hour band, so these two scales have to agree.
|
|
200
270
|
|
|
201
271
|
Fold in what 3d found — code reconnaissance that shrinks or grows the work changes the number. For items classified **Blocking gaps** or **appears already implemented**, propose **no points** — the comment is the deliverable for those.
|
|
202
272
|
|
|
@@ -229,7 +299,7 @@ If 3b–3d surfaced anything — gaps, a duplicate, a suggested approach change
|
|
|
229
299
|
|
|
230
300
|
{Closing line: what's needed to make it estimable — and say plainly what just happened to the item, matched to its type:
|
|
231
301
|
- User Story going back: "Moving this back to Design Review until that's answered — ping me and I'll re-quote it."
|
|
232
|
-
- Bug being tagged: "Tagging this needs-info so it's out of the estimating sweep — a Bug has no Design Review state to move it to. Remove the tag
|
|
302
|
+
- Bug being tagged: "Tagging this needs-info so it's out of the estimating sweep — a Bug has no Design Review state to move it to. **Remove the tag** once there are repro steps and the next sweep picks it up automatically. Replying here alone leaves the tag on and the sweep still skips it — I'll catch it in the stale-tag audit, but dropping the tag is the reliable route."
|
|
233
303
|
- Either type, pointed: "Estimated at {n} points assuming {assumption} — correct me if that's wrong."}
|
|
234
304
|
```
|
|
235
305
|
|
|
@@ -338,6 +408,7 @@ Items analyzed: {n} (of {total} qualifying — {remaining} left for the next
|
|
|
338
408
|
✓ Rewrites: {n_rewrites_applied} applied, {n_rewrites_suggested} suggested in comments
|
|
339
409
|
⚑ Info missing: {n_info_missing} items sent back to the creator (AC on stories, repro steps on bugs)
|
|
340
410
|
⏭ Skipped: {n_skipped} left exactly as they were — will reappear next sweep ({reasons})
|
|
411
|
+
⚑ Stale drop-outs: {n_stale} answered since leaving the sweep — still excluded ({n_stale_bugs} tagged bugs, {n_stale_stories} bounced stories)
|
|
341
412
|
|
|
342
413
|
Pointed items:
|
|
343
414
|
- AB#4611: 5 pts
|
|
@@ -356,9 +427,14 @@ Left exactly as they were:
|
|
|
356
427
|
- AB#4623: too large to point — split proposal in the comment (Design Approved)
|
|
357
428
|
- AB#4625: you skipped it (New)
|
|
358
429
|
|
|
430
|
+
Stale drop-outs (answered since leaving the sweep — invisible until returned):
|
|
431
|
+
- AB#4630 (Bug): creator edited Repro Steps 2026-09-02, needs-info still on
|
|
432
|
+
- AB#4631 (Bug): creator commented 2026-09-01, needs-info still on
|
|
433
|
+
- AB#4632 (Story): creator added AC 2026-09-02, still in Design Review
|
|
434
|
+
|
|
359
435
|
Next steps:
|
|
360
436
|
/quote-backlog {project} — process the next 10 qualifying items
|
|
361
437
|
/quote AB#{id} — re-estimate a single item after the creator responds
|
|
362
438
|
```
|
|
363
439
|
|
|
364
|
-
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.
|
|
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.
|
|
@@ -41,15 +41,17 @@ These are what dominate an estimate at 8 points and above. If a big number is dr
|
|
|
41
41
|
|
|
42
42
|
Rough sizing rubric (calibrated for a senior developer, assisted by Claude, working in a codebase they know):
|
|
43
43
|
|
|
44
|
-
| Points | Looks like |
|
|
45
|
-
|
|
46
|
-
| **1** | Trivial change — copy tweak, single config value, one-line fix. No new tests needed. |
|
|
47
|
-
| **2** | Small, well-understood change in one file or one layer. Existing patterns cover it. |
|
|
48
|
-
| **3** | Touches a couple of files / one feature slice. Some new tests. No architectural questions. |
|
|
49
|
-
| **5** | Crosses layers (e.g. API + UI), or introduces a new component/endpoint following existing patterns. Real test coverage needed. |
|
|
50
|
-
| **8** | Multi-area change with meaningful new logic, migrations, or non-trivial edge cases. Unknowns a senior can resolve but that still take real wall-time. |
|
|
51
|
-
| **13** | Large feature, several moving parts, or significant unknowns even for a senior. Likely benefits from being split. |
|
|
52
|
-
| **21** | Very large / high uncertainty. Should almost certainly be split into multiple stories. |
|
|
44
|
+
| Points | Effort (a day = 6 hrs) | How much is known | Looks like |
|
|
45
|
+
|--------|----------------------|-------------------|-----------|
|
|
46
|
+
| **1** | under 2 hours | everything | Trivial change — copy tweak, single config value, one-line fix. No new tests needed. |
|
|
47
|
+
| **2** | 2 hours to half a day | almost everything | Small, well-understood change in one file or one layer. Existing patterns cover it. |
|
|
48
|
+
| **3** | half a day to two days | most of it | Touches a couple of files / one feature slice. Some new tests. No architectural questions. |
|
|
49
|
+
| **5** | two to four days | some open questions | Crosses layers (e.g. API + UI), or introduces a new component/endpoint following existing patterns. Real test coverage needed. |
|
|
50
|
+
| **8** | around a week | little — real unknowns | Multi-area change with meaningful new logic, migrations, or non-trivial edge cases. Unknowns a senior can resolve but that still take real wall-time. |
|
|
51
|
+
| **13** | one to two weeks | not much | Large feature, several moving parts, or significant unknowns even for a senior. Likely benefits from being split. |
|
|
52
|
+
| **21** | two to three weeks | almost nothing | Very large / high uncertainty. Should almost certainly be split into multiple stories. |
|
|
53
|
+
|
|
54
|
+
The **effort column is a sanity check on the number, not the way to pick it** — a point value that implies four days for something a senior finishes before lunch is wrong regardless of how the description reads. A day is **6 productive hours**; a week is 5 days (30 hours). `/plan-backlog` Step 5b turns the point value back into a Task hour band, so these two scales have to agree.
|
|
53
55
|
|
|
54
56
|
Adjust upward for: unclear acceptance criteria, missing UX, data migrations, cross-team coordination, security/compliance review, or anything tagged `spike`/`research`.
|
|
55
57
|
|
|
@@ -142,7 +144,7 @@ In the CSI Development process template, `Bug` and `Hot Fix` have **no design st
|
|
|
142
144
|
|
|
143
145
|
### 5b. Bug / Hot Fix → `needs-info` tag
|
|
144
146
|
|
|
145
|
-
> *"I can't size this until {what's missing} — and a Bug has no design state to send it back to. Want me to tag AB#{id} `needs-info` so it drops out of the next `/quote-backlog` sweep? Removing the tag re-queues it."*
|
|
147
|
+
> *"I can't size this until {what's missing} — and a Bug has no design state to send it back to. Want me to tag AB#{id} `needs-info` so it drops out of the next `/quote-backlog` sweep? Removing the tag is what re-queues it — a reply alone leaves it excluded, though `/quote-backlog`'s stale-tag audit will surface it."*
|
|
146
148
|
|
|
147
149
|
**Wait for the user.** Only update the work item if they say yes. Then add the tag with `mcp__azure-devops__wit_update_work_item`. Rules:
|
|
148
150
|
|
|
@@ -162,19 +162,21 @@ Every rework round gets its own Task work item, parented under the original User
|
|
|
162
162
|
|
|
163
163
|
### Suggest hours
|
|
164
164
|
|
|
165
|
-
Estimate the rework effort from the approved plan.
|
|
165
|
+
Estimate the rework effort from the approved plan. The rows below are **scope** — how much there is to change. Where you land between two adjacent rows is **complexity** — how settled the change is:
|
|
166
|
+
|
|
167
|
+
A day is **6 productive hours**; a week is 5 days (30 hours).
|
|
166
168
|
|
|
167
169
|
| Hours | Looks like |
|
|
168
170
|
|-------|-----------|
|
|
169
171
|
| **0.5** | Trivial — copy tweak, single config value, one-line fix. No new tests. |
|
|
170
172
|
| **1** | One file, well-understood change. Maybe one new/updated test. |
|
|
171
173
|
| **2** | 2–3 files, one layer, follows existing patterns. Some new tests. |
|
|
172
|
-
| **
|
|
173
|
-
| **
|
|
174
|
-
| **
|
|
175
|
-
| **
|
|
174
|
+
| **3** | Half a day — multiple files across layers, or new logic in one area. Real test coverage. |
|
|
175
|
+
| **6** | A full day — meaningful new logic, several files, edge cases. |
|
|
176
|
+
| **12** | Two days — significant rework, multiple unknowns to resolve. |
|
|
177
|
+
| **18+** | Three days or more — flag that this rework probably should have been a fresh story. |
|
|
176
178
|
|
|
177
|
-
|
|
179
|
+
Take the **lower** of two adjacent rows for low-complexity rework — mechanical fixes, pure config, a pattern already used elsewhere in the file. Take the **higher** for high-complexity rework — ambiguous feedback, missing UX, data migrations, or regression risk in unrelated areas. Don't reach for the top of the ladder just because the round touches several files.
|
|
178
180
|
|
|
179
181
|
### Prompt the user
|
|
180
182
|
|
|
@@ -111,14 +111,17 @@ These rules apply to **every** command or flow that creates or estimates work it
|
|
|
111
111
|
|
|
112
112
|
1. **Every work item Claude creates gets a proposed story point estimate** — User Stories and Bugs are never created unpointed by default. Estimates use the modified Fibonacci scale (`1, 2, 3, 5, 8, 13, 21`), calibrated for a **senior developer working with Claude assistance** — no ramp-up padding; pad only for what seniority + Claude can't shortcut (novel work, missing AC, cross-team coordination, external dependencies).
|
|
113
113
|
2. **The user must agree before points are written.** Claude proposes the number with a one-line rationale; the user confirms, adjusts (their number wins), or skips. Points are never set silently.
|
|
114
|
-
3. **
|
|
115
|
-
4. **
|
|
114
|
+
3. **Task hours come from complexity, not from the top of the points band.** Story points give a Task an hour *band* (low / medium / high). Which end of that band the estimate lands on is decided by the complexity of the work, judged separately from its size: low complexity → the low end, medium → the middle, high → the high end. Points already carry size, so a big-but-routine story is a high-points, low-complexity Task and gets low-end hours. The bands are contiguous and anchored to a **6-hour day** (1 pt = under 2 hrs, 2 pts = up to half a day, 3 pts = half a day to 2 days, 5 pts = 2–4 days, 8 pts = about a week, and up) — a 1-pointer can never cost more than a 2-pointer's floor. Every hour proposal states the band and the complexity call that picked within it. See `/plan-backlog` Step 5b for the table and the complexity rubric.
|
|
115
|
+
4. **Setting points moves the item to Dev Ready.** Any time story points are written to a **User Story**, **Bug**, or **Hot Fix**, `System.State` is set to `Dev Ready` in the same update. Never for Features or Tasks (a Feature's state is never touched; Tasks carry hour estimates, not points), and never backward — an item already past Dev Ready keeps its state, with a note.
|
|
116
|
+
5. **An item that can't be quoted drops out of the estimating queue — by a mechanism that depends on its type.** When `/quote` or `/quote-backlog` can't produce a number because information is missing — no acceptance criteria (or, on a bug, no repro steps), contradictory description, unbounded scope, or a possible duplicate the creator has to confirm — the item drops out of the sweep along with the feedback comment, so the next run isn't re-analyzing items still waiting on their creator:
|
|
116
117
|
- **User Story** → moves from `Design Approved` back to `Design Review`. Only from `Design Approved`; an item at `Dev Ready` or anything `Active` or later keeps its state.
|
|
117
118
|
- **Bug / Hot Fix** → gets a **`needs-info` tag**, state left at `New`. **These types have no design states** in the CSI Development template — no `Design Review` and no `Design Approved` — so there is no earlier state to send them back to. Append to `System.Tags`; never overwrite the field. Removing the tag re-queues the bug.
|
|
118
119
|
- **Feature / Task** → neither; report the gap and stop.
|
|
119
120
|
|
|
120
121
|
An item that merely **needs to be split** keeps its state and gets no tag — the work is understood, nothing is missing.
|
|
121
|
-
|
|
122
|
+
|
|
123
|
+
**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.
|
|
124
|
+
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: `User Story` has `New → Dev Ready → In Design → Design Review → Design Approved → Active → …`; `Bug` and `Hot Fix` have `New → Dev Ready → Active → …`.
|
|
122
125
|
|
|
123
126
|
### Branching Strategy
|
|
124
127
|
|
|
@@ -240,7 +243,7 @@ Running `/implement` on a **Feature** implements its child User Stories in **wav
|
|
|
240
243
|
|
|
241
244
|
**Work item states:** `/implement` moves the work item to `Active` when implementation starts — for a single work item (User Story, Bug, Hot Fix) right after the branch is created; for a Feature, each child story goes `Active` as its wave begins. When the PR is created, each implemented child **User Story** moves to `Code Review` — the **Feature's state is never changed**. The Feature is a parent container; it advances only as its child stories are verified/closed. Only child **Tasks** are ever closed — never the stories or the Feature.
|
|
242
245
|
|
|
243
|
-
**Hours live on the Task.** `/implement` will not implement a story that has no open child Task: if there isn't one, it proposes a title and an hour estimate (from the story's points, same mapping `/plan-backlog` uses) and creates it once the user agrees — exactly one per story, inheriting the parent's assignee, area, and iteration. When the PR is created, that Task is closed with the hours worked logged to `CompletedWork` and `RemainingWork` zeroed. Closing happens at **PR creation**, not at merge, so hours are recorded while they're still known. Never enable Azure DevOps's "Complete associated work items" when merging — it transitions the parent too.
|
|
246
|
+
**Hours live on the Task.** `/implement` will not implement a story that has no open child Task: if there isn't one, it proposes a title and an hour estimate (from the story's points, same mapping `/plan-backlog` uses — points set the hour band, complexity picks where in the band it lands) and creates it once the user agrees — exactly one per story, inheriting the parent's assignee, area, and iteration. When the PR is created, that Task is closed with the hours worked logged to `CompletedWork` and `RemainingWork` zeroed. Closing happens at **PR creation**, not at merge, so hours are recorded while they're still known. Never enable Azure DevOps's "Complete associated work items" when merging — it transitions the parent too.
|
|
244
247
|
|
|
245
248
|
#### Slash Commands Reference
|
|
246
249
|
|
|
@@ -261,7 +264,7 @@ All deployment and release operations are available as slash commands:
|
|
|
261
264
|
| `/status` | `/status release 24` | Check release, pipeline, or work item status |
|
|
262
265
|
| `/plan-backlog` | `/plan-backlog [project]` | Sweep backlog for Dev Ready stories with points and no tasks → propose child tasks with hours |
|
|
263
266
|
| `/plan-sprint` | `/plan-sprint [project]` | Sweep the current sprint for stories/bugs with no child tasks → propose one child task with hours per item |
|
|
264
|
-
| `/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 |
|
|
267
|
+
| `/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 |
|
|
265
268
|
| `/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`** |
|
|
266
269
|
| `/create-work-item` | `/create-work-item [description]` | Interactively draft and create a Feature, Bug, User Story, or Hot Fix — proposes story points (user must agree) and creates pointed items in Dev Ready; on a Feature, also drafts its child stories with `Custom.Order` waves |
|
|
267
270
|
| `/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 |
|