Skip to content

A story without a state

The story has a journey reference. The acceptance criteria are testable. Amigos signed it. The team shipped it. Three weeks later, the support pipeline is filled with the same complaint: it breaks the first time anything is unusual. The states section was skipped.

The artefact

Excerpt — Story, "Grader queue ordering by deadline", May 2026

Story: As a grader, I want the queue ordered by submission deadline so I can prioritise my time.

Journey: J2 — Opening the grader queue.

States to handle: (left blank)

Acceptance criteria:

  1. When a grader opens the queue, submissions are listed in ascending deadline order.
  2. Grader can re-order by clicking column headers.
  3. Default sort is by deadline.

Out of scope: Custom sort orders.

DoR:

  1. Story format ✅
  2. Journey reference J2 ✅
  3. ≥3 testable ACs ✅
  4. Figma frame ✅
  5. Copy ✅
  6. Observability ✅
  7. Dependencies ✅
  8. Sized 1.5 days ✅
  9. Tech feasibility ✅

Sign-off: PO ✅ · Developer ✅ · QA ✅

The story is structurally complete. The DoR is all green. Three signatures. It shipped on time.

Two weeks after launch, support tickets arrived in three shapes:

  1. "The queue is empty when I log in on Monday."
  2. "The queue spins forever and never loads."
  3. "My queue shows no deadlines for old submissions and they sort to the top."

The team's first response was we'll fix it in a follow-up story. Three follow-up stories shipped. Then a fourth (custom sort orders, which was supposed to be out-of-scope). Then a fifth. The original story's two days had cost two weeks.

What's wrong?

Stop. Find three things wrong before reading the diagnosis.

Diagnosis (open when ready)

1. The story has no person — but the DoR ticked story format

As a grader, I want…

Not a named person. A grader is a category. The corpus rule from Practice · Story writing · Step 1: always named, always with context. The DoR checklist's first box should have been ⚠ — the trio rubber-stamped it.

The cost: when the team had to choose between sorting empty queues (point-of-confusion for the grader) or alerting them (escalation for the on-call rotation), they had no anchor. Without the person in the story, the trio chose what was easiest for the system.

2. The states section was blank — but DoR ticked Copy

States to handle: (left blank)

The states section is the section the corpus has named most insistently as load-bearing. Every interactive moment has at least four states:

  • Empty — there is no data yet. What does the grader see at 06:00 on Monday when no submissions are in the queue?
  • Loading — the data is on its way. What does the grader see on a slow corporate VPN at 09:00 when the queue takes 11 seconds to load?
  • Success — the data has arrived and the activity continues.
  • Error — the data didn't arrive or arrived broken. What does the grader see when the deadline field is null for a submission imported from the legacy LMS?

The story's ACs only described the success state. The grader who logged in Monday morning to an empty queue, the grader on a slow network whose queue spun, and the grader who saw old submissions sort to the top — those were three states the team didn't think about until production showed them.

The DoR's Copy box was ticked because the success state's copy was defined. The trio agreed all copy was defined without checking which states the copy covered.

3. The negative scenario is implementation testing, not behaviour

Acceptance criteria:1. When a grader opens the queue, submissions are listed in ascending deadline order.2. Grader can re-order by clicking column headers.3. Default sort is by deadline.

There is no negative case. AC3 is not negative — it is restating AC1. A real negative AC for this story would be:

Given a submission with no deadline assigned (legacy import), when the grader opens the queue, then the submission appears in a clearly-marked "no deadline" group at the bottom of the queue, with a visible indicator, and the queue's primary sort still functions normally.

The trio held amigos for 25 minutes and produced three happy-path scenarios. They never asked where else does this break? — which is amigos's step 5. The story shipped without the anti-flows the team would have caught in 10 more minutes of amigos.

The fix

text
Story: Hebrew-grader queue ordered by deadline

As Gal, an exam grader at our customer's flagship campus, I
want the queue ordered by submission deadline so I can grade
the closest-due first without scanning column-by-column.

Journey: J2 — Opening the grader queue (06:00–09:00 Mon).

States to handle:
  - Empty:    Gal logs in Monday 06:00 before that week's
              submissions are released. Queue shows
              "No submissions due this week — next batch
              due 2026-06-21".
  - Loading:  Slow VPN. Queue takes >2 sec. Skeleton row
              for first three rows; no spinner.
  - Success:  Queue rendered, default sort by deadline asc.
  - Error:    Deadline field null (legacy import).
              Submission appears in "No deadline" group at
              the bottom of the queue, visually distinct.
  - Edge:     Same deadline for multiple submissions.
              Secondary sort by submission_id asc; stable.

Acceptance criteria:
  AC1 — Given >0 submissions with deadlines, when Gal opens
        the queue, then they sort ascending by deadline.

  AC2 — Given 0 submissions for the current week, when Gal
        opens the queue, then she sees the empty-state copy
        and the next-batch date.

  AC3 (negative) — Given a submission with null deadline,
        when Gal opens the queue, then the submission
        appears in a clearly-marked "No deadline" group
        at the bottom, and primary sort still functions.

  AC4 — Given queue load >2 sec, when Gal is waiting, then
        skeleton rows render for the first three rows
        instead of a spinner.

Out of scope (this story):
  - Custom sort orders [tracked in story J2-sort-custom].
  - Bulk re-sort across multiple courses.

DoR: all 9 ✅, with the states section filled.

The fix is at scope, not at QA. If the states section had been filled at story-writing, all three production complaints would have been caught at amigos. The cost saved is one and a half weeks.

Where this comes from in the chain

This failure traces to Scope (Level 3). The story missed states; the trio missed them at amigos; the system shipped them as defects. The structural fix is at Level 3 — the Definition of Ready checklist makes the states section gated.

The DoR was checked, but the trio checked it without reading it. The pattern: a checklist whose items are ticked without actual review degrades to a ritual. The corpus's mitigation: each DoR item has a because: link to the practice or canon — clicking through is what re-anchors the discipline.

See also

200apps · How We Work · NWIRE