v1.41.0 ·
A criterion that names its test
The problem
Acceptance criteria are free prose with an ID. Some are testable, some are wishes, and review tells them apart by reading. Bugfix requirements say what to fix but not what to leave alone, so a regression next to the fix goes unchecked.
How it could be solved
Three decisions, each about not making the rule more expensive than the problem.
The first was whether to enforce the shape. A check that rejects any criterion not written as "WHEN …, THE SYSTEM SHALL …" would catch vague wishes. It would also reject "the page loads in under two seconds", which is a perfectly good criterion that is not a behaviour. So the shape is taught by the requirements step and never checked. Every criterion still needs a test, which was already true, and that is what gives the shape its teeth.
The second was where a bug fix lists what must not change. The bug's reproduction file was the obvious home, but the check that pairs criteria with tests reads only the requirements file. A "must not change" line in the reproduction file would have been advice nobody checks. In the requirements file, numbered like any other criterion, it gets a test or the phase does not finish.
The third was how to know the new criteria would not vanish. The parser that finds criteria accepts anything after the number and colon, so nothing should break. Rather than trust that, the tests feed it every shape in every bullet style, plus this change's own requirements file, which was written in the new shapes before the tests existed. Then the parser was broken on purpose, and every one of those tests failed.
How AIDLC solves it
Acceptance criteria now have a fixed sentence shape. When a criterion describes a behaviour, the requirements step writes it as one of four sentences: "WHEN the user presses Save, THE SYSTEM SHALL write the draft to disk", or the same with WHILE, IF … THEN, or WHERE. Each one says what to set up and what to check, so the test for it is already half written. A criterion that is not a behaviour, like a page-load budget or a docs change, stays a plain sentence, and nothing rejects it.
Bug fixes now say what must not change. A bugfix's requirements have three parts: what happens today, what the fix makes happen, and what works next to the fix and must keep working. Every line in the last two parts is a numbered criterion, so the existing check that every criterion has a test now covers the neighbours of a fix too. The testing step says how to test each shape, and that a "must not change" test passes both before and after the fix.
No new check was added. Every criterion written before this release still reads the same.