Half a kilo you could count but not spill
Our stocktake accepted 2.5kg and stored 2.5kg. Waste and transfers ran the same number through a whole-number conversion — so half a kilo could be refused, and 1.5kg could be accepted, take one kilo off the shelf, and record that it had.
Kitchens do not work in whole numbers. Half a tray gets dropped. A third of a tub goes to the other counter for service. Nine hundred grams of a kilo bag is what is left after a busy Saturday.
Our stock file knows this. It opens by declaring it, with a small helper that reads a quantity exactly as it was typed, and a comment saying why: truncating half a kilo produces a variance nobody can explain three weeks later.
That helper was used in one place out of three. The stocktake used it. The two routes that actually move stock — waste and transfers — both ran the number through a conversion that stops at the decimal point.
Four things happen, and the fourth is the problem
Count 2.5kg into a stocktake and you get 2.5kg. The rule works where it was applied.
Try to waste 0.5kg and it is refused: half a kilo becomes zero, and zero is "this movement would not change anything". Try to transfer 0.5kg to another kitchen and you are told to enter a quantity. Both are annoying, both are visible, and a chef works around them by typing 1 and knowing it is wrong.
Now waste 1.5kg. This one does not refuse. It reports success, takes one kilo off the shelf, and writes a stock movement saying one kilo. There is no error, no warning, and nothing anywhere recording that half a kilo was involved. The half kilo is simply gone, and it will surface weeks later as a gap between what the system thinks is on the shelf and what is on the shelf.
A refusal is a nuisance. A silent success with a plausible number is a variance investigation.
The evidence was in our own data
We nearly wrote that this had never mattered in practice. Then we looked.
Across live venues, roughly half of all stock levels are fractional — because selling makes them so. A recipe deducts 0.15kg of flour per portion and the remainder is whatever it is; fractions appear in the shelf levels whether anybody types one or not.
Manual adjustments tell the opposite story. Ninety-five of them, and not one contains a fraction. Ninety-five whole numbers in a business whose shelves are half-numbers is not a coincidence about how people work. It is what a whole-number conversion guarantees.
What those rows cannot tell us is how many were truncations. A 1.5 that was stored as 1 looks exactly like somebody who meant 1. So the count is evidence of the gap, not a number of losses, and we are not going to claim otherwise.
Fixed, and pinned
All three routes now read a quantity the same way. Half a kilo can be wasted, half a kilo can be moved between kitchens and arrives as half a kilo, the two halves of a transfer cancel exactly, and the refusals that should stay refusals — a zero movement, taking more off a shelf than is on it, transferring a site to itself — all still refuse.
The thing we care most about is the last check: a test now reads the file and fails if any route that moves stock reaches for the whole-number conversion again. The rule was written down in that file from the start. Writing it down was not enough.