Palate

The Instrument Room

Nobody timed the recipe

“Total time: 45 minutes.” That reads like a measurement. It is not one, and you can prove it without timing a single recipe — just look at which numbers appear.

In 343 recipes collected from publishers, 77% of stated total times are a multiple of five. If the last digit carried real information you would expect 20%.

2026-07-26T20:57:08.583311 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 0 15 30 45 60 75 90 105 120 stated total time (minutes) 0 5 10 15 20 25 30 35 40 recipes 39 recipes say “15 minutes” a multiple of five every other minute Nobody timed the recipe Stated total time in 343 recipes collected from publishers, at one-minute resolution. 77% land on a multiple of five — 3.9× what you would see if the last digit meant anything. 59% of them sit on just ten different values. Recipes collected from outside publishers; project-authored recipes excluded · piece10_round_numbers.py
Stated total time at one-minute resolution. A measured quantity would make a smooth hill. This is a comb.

The shape of an estimate

This pattern has a name. Demographers call it digit heaping, and they see it wherever people report a number they did not measure — age, income, how many cigarettes a day. The teeth are where human attention rounds.

times land onobservedexpected if measuredratio
a multiple of 577.3%20.0%3.9×
a multiple of 1035.6%10.0%3.6×
a multiple of 1533.5%6.7%5.0×
a multiple of 3014.0%3.3%4.2×
a multiple of 603.8%1.7%2.3×

There are 89 distinct stated times in the sample, and 59% of all recipes sit on just ten of them. The most common are the ones you would guess:

stated timerecipes
15 minutes39
25 minutes29
40 minutes28
30 minutes25
35 minutes23
45 minutes17
50 minutes16
27 minutes9

None of this makes the times useless — an estimate from someone who has cooked the dish is worth having. It means the precision is decorative. A recipe claiming 40 minutes and one claiming 45 are not telling you about a five-minute difference; they are telling you “about three quarters of an hour” in two different moods.

Honest limitations

  • This is scoped to recipes collected from outside publishers — the project-authored portion of the corpus is excluded, because those times were generated to a schema rather than written by a person, and blending the two would measure our pipeline instead of recipe writing. The exclusion is recorded in the results file.
  • n = 343, which is a real sample but not a large one. The effect is big enough that sampling noise is not a plausible explanation, but a different collection of publishers could shift the exact share.
  • Times over ten hours are excluded as cures and ferments rather than cook times.
  • The uniform baseline assumes a last digit with no structure. Real cook times are not uniform — but no plausible distribution of actual durations produces teeth this regular at exactly the multiples of five.

Reproduce this

Deterministic, offline, no model calls. Every number on this page is read from the script’s results file — the page cannot state a number the script didn’t produce.

python analysis/instrument_room/scripts/piece10_round_numbers.py
python analysis/instrument_room/scripts/piece10_figures.py

Input: prototype/web/src/data/sample_corpus_v17.json (read-only). Every number on this page is in analysis/instrument_room/results/piece10_round_numbers.json.