Palate

The Instrument Room

A well-stocked pantry is not a sufficient one

Two questions a cook can actually ask a recipe corpus. First: if I stock the most common ingredients, how much of the cookbook opens up? Second: when a recipe calls for cumin, how much cumin is that, really?

The answers are on opposite ends of satisfying. The first is a wall. The second is the most useful table we have made.

2026-07-26T20:51:34.445518 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 0 100 200 300 400 500 size of your pantry — the N most common ingredients in the corpus 0 20 40 60 80 100 percent ingredient mentions you'd recognise recipes you're within three items of recipes you can actually cook, start to finish Own the 50 most common ingredients: 51% of every ingredient line in the corpus — and 1 of 2,345 recipes you can finish. A well-stocked pantry is not a sufficient one 1,729 distinct ingredients across 2,345 recipes. Stocking the most common ones covers what you recognise almost at once, and what you can finish almost not at all. To complete half the corpus you would need 637 of them in the cupboard. Palate corpus, 2,345 recipes (~40% written for the project) · piece9_pantry_and_dosage.py · exact name matching, so variants count separately
Rank all 1,729 ingredients by how many recipes name them, then stock the top N. What you recognise rises immediately; what you can finish barely moves.

The pantry paradox

Own the 50 most common ingredients and you hold 51% of every ingredient line in the corpus — and can cook 1 of 2,345 recipes start to finish. Stretch to 200 and you hold 77% of the lines and 8.8% of the recipes.

pantry sizeof all ingredient linesrecipes you can finishwithin 3 items
2034%0 (0.0%)7%
5051%1 (0.0%)17%
10065%17 (0.7%)45%
20077%207 (8.8%)72%
30083%436 (18.6%)83%
50090%889 (37.9%)93%

To complete half the corpus you would need 637 ingredients in the cupboard. The gap between “I recognise everything in this recipe” and “I can cook it tonight” is the entire experience of owning a cookbook, and it is a long way from closing. The column worth watching is the last one: being within three items is where a shopping trip turns into dinner.

How much is a lot?

Every recipe in the corpus that uses an ingredient, expressed as grams per kilogram of finished dish, so a big pot and a small one are comparable. 28 ingredients clear the 15-recipe floor.

2026-07-26T20:51:34.791417 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 0.25 g 1 g 5 g 25 g 100 g grams per kilogram of finished dish (log scale) dried leaf oregano thyme rosemary red chili flakes cayenne pepper black pepper cinnamon turmeric smoked paprika salt cumin sesame oil garlic chili powder dijon mustard ginger apple cider vinegar tomato paste rice wine vinegar fish sauce soy sauce olive oil lemon juice vegetable oil unsalted butter sugar butter honey n=166 n=132 n=35 n=149 n=183 n=703 n=193 n=132 n=162 n=1271 n=351 n=49 n=1373 n=76 n=51 n=312 n=57 n=168 n=122 n=133 n=202 n=562 n=246 n=511 n=294 n=312 n=217 n=86 median recipe the middle 80% (p10–p90) How much is a lot? Every recipe in the corpus that uses each ingredient, as grams per kilogram of finished dish. A teaspoon of dried oregano in a 2 kg pot is about 1 g/kg. Read the bar, not just the dot: some of these have a dose, and some just have a role. Palate corpus, 2,345 recipes (~40% written for the project) · piece9_pantry_and_dosage.py · exact-name matching; every row n ≥ 15
The dot is the median recipe; the bar spans the middle 80%. Log scale — the range across these ingredients is more than a hundredfold.

The column to read is the spread — the p90 divided by the p10. Black pepper and garlic sit near 4×: there is a right amount and cooks broadly agree on it. Sugar is 50× and vegetable oil 30×, because those are not doses — they are roles. A seasoning in one dish and the medium in another.

Grams per kilogram of finished dish. Sorted by median. Every row is at least 15 recipes.
ingredientp10medianp90spreadn
dried leaf oregano0.260.582.268.6×166
thyme0.320.621.705.4×132
rosemary0.401.033.809.4×35
red chili flakes0.471.052.435.2×149
cayenne pepper0.441.0611.8527.0×183
black pepper0.581.162.324.0×703
cinnamon0.601.484.988.4×193
turmeric1.131.973.813.4×132
smoked paprika1.382.4410.617.7×162
salt1.322.596.124.6×1271
cumin1.212.806.425.3×351
sesame oil1.393.9820.1114.5×49
garlic2.514.9810.164.0×1373
chili powder1.665.5813.147.9×76
dijon mustard1.707.4121.9012.9×51
ginger3.237.8013.944.3×312
apple cider vinegar3.769.8647.3612.6×57
tomato paste5.3610.2624.314.5×168
rice wine vinegar4.0910.6424.536.0×122
fish sauce7.6316.9332.124.2×133
soy sauce6.2117.2742.696.9×202
olive oil7.6218.4752.596.9×562
lemon juice6.4819.2757.368.9×246
vegetable oil7.3719.42223.0430.3×511
unsalted butter8.6920.7860.256.9×294
sugar2.4624.73122.1449.6×312
butter12.3328.9489.527.3×217
honey7.1229.3796.5713.6×86

Honest limitations

  • Ingredient names are matched exactly, so variants count separately — “butter” and “unsalted butter” are two rows, and the pantry curve treats them as two things to own. That makes the pantry numbers a touch pessimistic and the dosage rows cleaner; both effects are real and neither is hidden.
  • Grams come from the engine’s unit conversion. A recipe saying “1 onion” becomes 110 g by a standard piece weight, not by weighing. For dosage medians across hundreds of recipes this is fine; for any single recipe it is an estimate.
  • The dosage denominator is total ingredient mass, not the weight of what reaches the plate — water that boils off is still in it. Treat the numbers as comparable to each other rather than as absolute concentrations.
  • ~40% of the corpus is project-authored, which may use more regular quantities than recipes in the wild.

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/piece9_pantry_and_dosage.py
python analysis/instrument_room/scripts/piece9_figures.py

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