# The seam only pays if the change moves along it

"Extend by adding, not editing" describes the outcome. The decision is which axis to open, and you
make it before you know what the interviewer will change.

The corpus records how that bet turned out 60 times, once per curveball, every one of them with
`"measured": true`. In
`corpus/lru-cache/curveballs/01-least-frequently-used/budget.json` a whole new eviction policy landed
for `reference_diff: 0` — one new file, and not a line of an old one. A new coin in
`corpus/vending-machine/curveballs/01-a-new-coin` is 0 as well, and so is the rolling appender in
`corpus/logger/curveballs/03-rolling-appender`.

Then `corpus/middleware-router/curveballs/02-method-aware-routing` measures **47**, and
`corpus/trip-state-machine/curveballs/03-no-show-timeout` measures **28**. Both of those designs have
real seams. The requirement moved along a dimension their signatures never carried: a method ahead of
a path, a rule that depends on a third input.

A seam is not insurance. It is a bet with a direction.

`contrast/` measures the same pair twice, with `measureChange()` from `server/lib/diff.mjs`. Tiered
pricing, the requirement from `corpus/parking-lot/curveballs/02-tiered-pricing`, costs **22** lines in
`contrast/a/ParkingLot.java` and **2** in `contrast/b/` — the same 2 the corpus records for its own
reference. Then an overnight flat rate, which needs the entry time, costs **14** in `a/` and **27** in
`b/`. The seam made that change worse than having none. Reproduce both with
`node lessons/C2/contrast/measure.mjs`.

Open a seam when you can name the second implementation and write the one signature both satisfy.
Naming the dimension is not enough.
