Thin Slice First
Gets one complete path working end to end — real click to real result — before anything gets widened.
When to reach for it
At the start of any feature with more than one layer: a screen that calls something that stores something. The moment before an agent starts building all three in parallel.
What changes
- The agent picks one concrete case — one input, one screen, one result — and writes it down before any code exists.
- You get something runnable early: a path you can click through yourself, even while every other case is missing.
- The layers get connected before they get filled in, so integration problems appear on the first day instead of the last.
- Anything outside the slice fails loudly — a thrown error or an obvious placeholder — never a silent no-op that looks like it works.
- Widening happens one case at a time against something already running, instead of a first run where nothing works and nobody knows which layer is at fault.
Pairs with
- Borrow the ShapeStarts new code from the closest existing file in your repo instead of from a blank page.
- Copy the NeighboursMakes new code look like the code already around it, instead of like whatever the agent prefers.
- Error Path FirstWrites what happens when it fails before writing what happens when it works.
Thin Slice First
Build one path all the way through before building any part of it properly.
1. Choose the slice
Pick the most ordinary case the feature exists for and write it as a sentence with real values: "A signed-in user types 'invoice' into the search box and sees the three matching documents."
Two rules for choosing: it must cross every layer the feature touches, and it must be something a person would genuinely do on their first visit.
2. Write down what the slice excludes
One list, one line each: other kinds of input, error states, empty results, permissions, paging, small screens, anything slow enough to need a spinner. This list is not the backlog. It is the honesty.
3. Connect the layers before filling them in
Build the whole path shallow. Real calls between layers, real data shapes, real routing. Inside each layer, the least that makes this one case work: a fixed query, no sorting, three results from a constant if that is faster today.
Then run it end to end and click it yourself.
4. Make the excluded cases loud
Anything outside the slice throws or renders an obvious placeholder. Never return an empty list, a null, or a quiet success for a case you have not built. A stub that looks like it works is worse than no stub, because it will be believed.
5. Widen one case at a time
Take the next item off the exclusion list, build it, run the whole path again. The path stays working after every step, and every step is small enough to undo.
Rules
- Do not finish a layer before connecting it to the next one. A perfect interface with no caller is unverified code.
- Do not pick an unusual case as the slice because it is more interesting. The boring case is the one everything else sits on.
- Do not fake the seam between layers. Fake the data if you must, never the call — the call is the part you are trying to prove.
- Do not start widening before the first path runs. If it does not run, the slice is not done, no matter how much of it is written.