Refinement is the most under-invested ritual in agile teams. Stories arrive at sprint planning oversized, ambiguous, or strategically disconnected, and the team spends planning meetings doing what should have happened the week before. This skill is the refinement playbook: grade stories against INVEST, split them vertically (so each slice ships value end-to-end), and keep a working Definition of Ready and Definition of Done that prevent half-baked work from entering or leaving a sprint.
The skill includes a Python scorer (refinement_scorer.py) that grades each story in a JSON backlog against the six INVEST criteria and outputs a readiness score (0-6) per story. Stories scoring 5-6 are READY; 3-4 are REFINE (targeted refinement); below 3 are SEND_TO_DISCOVERY.
This complements wwas/ (Why-What-Acceptance format) and job-stories/ (JTBD format). Either format produces stories; this skill grades them and gets them sprint-ready.
When NOT to use: pure technical task lists with no user-facing outcome (use a simpler checklist); ad-hoc bug triage (different lifecycle); unscoped work (send to discovery/ first).
Before grading the backlog, settle the inputs below. When one is missing or vague and would change the result, ask about it; when it wouldn't, use a sensible default and say which one you used.
Ask about the two or three inputs that matter most for this request, not the whole list. If the user wants a result straight away, produce it and state your assumptions at the top.
python scripts/refinement_scorer.py --input backlog.json --format markdown # grade a backlog
python scripts/refinement_scorer.py --demo --format markdown # inspect demo + output
Triage by score: 5-6 promote to Refined, 3-4 discuss and fix the failing criteria, 0-2 send back to discovery.
Use this splitting technique when a story or epic is new territory — a new integration, data
flow or feature type — where the biggest risk is whether the layers connect at all. Plain
vertical slicing makes each slice cross every layer; tracer-bullet slicing also fixes the
order: the first slice is the thinnest path through every layer, and each later slice widens
it. Full guide with example and red flags: references/invest-and-splitting-guide.md, Part 7.
Skip it for well-trodden work (split by the Lawrence patterns directly), for wide mechanical
renames (split as expand, migrate, contract), and for pure unknowns (spike first).
Mistake: ACs read "POST /searches returns 201" and "SearchPanel component renders".
Why it happens: Engineers often write the ACs while thinking through the build.
Instead: Write each AC as an outcome a user, QA or designer can observe, such as "the search appears in the Saved list within 1 second". If an AC mentions an API, endpoint, component, table or status code, rewrite it.
Mistake: Planning admits a story that scored 4/6 because "we have capacity, we'll figure out the metric during the sprint".
Why it happens: An under-full sprint looks like wasted capacity.
Instead: Hold the DoR at planning. A story below 5/6 goes back to refinement with an owner and a date for the missing piece. Count admitted stories that failed the DoR each sprint; the target is zero.
Mistake: A story sits on the candidate list for three sessions with notes like "need to understand integration".
Why it happens: Discussing the story feels like progress, so nobody names the missing information as a discovery gap.
Instead: Keep a session counter on each candidate. At session 3 without promotion, route it to discovery/identify-assumptions/ with an owner for the assumption test, then re-enter it or kill it.
Mistake: The "thin" first slice of a new feature carries validation, error states, settings and three input types.
Why it happens: The first slice feels like the foundation, so everything gets put in it.
Instead: Strip slice 1 to the happy path through every layer and move each extra dimension into its own widening slice.
Nine more, each with a bad and a good example: references/red-flags.md.
Load the reference that matches the task — keep this file lean and pull detail on demand:
refinement_scorer.py reference (flags, input JSON, scoring rubric), troubleshooting, and success criteria. Read when running a refinement session or wiring the scorer.| File | Purpose |
|---|---|
scripts/refinement_scorer.py | INVEST scorer: 0-6 per story with a READY (5-6) / REFINE (3-4) / SEND_TO_DISCOVERY (0-2) verdict |
references/refinement-playbook.md | Session workflow, DoR/DoD templates, scorer reference |
references/invest-and-splitting-guide.md | INVEST, Lawrence patterns, SPIDR, tracer-bullet slicing |
references/red-flags.md | Refinement failures with bad and good examples |
assets/refinement_checklist.md | DoR and DoD checklists plus a session agenda |
In Scope: INVEST grading of individual stories; vertical splitting (9 Lawrence patterns + SPIDR); tracer-bullet slicing with blocking links; DoR/DoD templates and enforcement; refinement session structure and cadence; the Python scorer.
Out of Scope: authoring stories from scratch (wwas/, job-stories/); prioritization/sequencing (prioritization-frameworks/); sprint planning/capacity/velocity (../scrum-master/); discovery and problem framing (discovery/); estimation techniques (agile-coach/).
Caveats: INVEST is a heuristic — a 6/6 story can still be the wrong story (pair with prioritization-frameworks/ and discovery/identify-assumptions/). DoR/DoD must be team-authored to be enforced. The scorer grades structural form, not strategic substance.
| Integration | Direction | Description |
|---|---|---|
execution/wwas/ | Receives from | WWAS-format stories enter refinement to be graded and split |
execution/job-stories/ | Receives from | Job stories enter refinement to be graded and split |
execution/prioritization-frameworks/ | Pairs with | Prioritization sets the sequence; refinement makes the top N executable |
discovery/identify-assumptions/ | Sends to | Stories scoring 0-2 are sent back for assumption mapping |
discovery/brainstorm-experiments/ | Sends to | Stories with unvalidated assumptions become experiment candidates |
../scrum-master/ | Feeds into | Refined stories feed sprint planning; refinement quality drives velocity stability |
execution/status-update-generator/ | Indirect | DoD compliance feeds the "what's done this week" section of status updates |
../jira-expert/ | Pairs with | Refined stories become Jira tickets with structured fields and DoR/DoD checklists |