Palate

The Instrument Room

Where does the flavor actually come from?

Pick up a plate of paella. By weight it is rice, chicken, beans, water. The rosemary in it — the thing you smell from the doorway — is 0.06% of the dish’s mass. This piece is about that gap: the distance between where a dish’s mass is and where its flavor signal is, measured across every dish in Palate’s corpus.

The arithmetic is the engine’s own aggregation weight — log1p(grams) × (potency + 1)^1.5 — applied to 27,229 linked ingredient lines across 2,343 dishes (0.7% of lines were unlinked or massless and skipped; 1,665 of 1,729 distinct ingredient names link exactly). An ingredient’s signal share is its weight over the dish’s total; its mass share is grams over grams.

2026-07-26T11:49:46.852027 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 0.1% 1% 10% 100% share of the dish's mass (log scale) 0.1% 1% 10% 100% share of the dish's flavor signal (log scale) signal share = mass share rosemary (35×) saffron (26×) cayenne (30×) thyme (23×) shrimp paste (39×) white rice spaghetti water tortillas aromatics — median across their recipes (× = leverage) bulk carriers — median across their recipes A dish's flavor does not come from where its mass is Every linked ingredient line in 2,343 dishes (27,229 points): its share of the dish's mass against its share of the flavor signal — weight = log1p(grams) × (potency+1)^1.5, the engine's own aggregation weight. Above the line: punching over its mass. In the median dish, ingredients under 5% of mass each carry 49% of the signal. Palate corpus (2,345 dishes; ~40% project-authored) · piece2_attribution.py · composition model, not perception — see the piece's limits
Every linked ingredient line in the corpus: share of the dish's mass against share of its flavor signal, both log-scaled. The diagonal is 'contributes exactly its weight.' Aromatics live far above it; rice, plain pasta and water far below.

Three dishes, opened up

Spaghetti carbonara. The richness is 37% pancetta, 34% egg yolk, 20% pecorino. The spaghetti — 44% of the mass — contributes 0%.

Spaghetti Carbonara — richness 6.8/10
ingredientshare of richnessshare of mass
pancetta37%22.0%
yolk34%12.9%
pecorino romano cheese20%7.3%
eggs9%12.9%

French onion soup. The umami is 43% beef broth and 38% gruyère. The onions the dish is named for: 4%, from 36% of the mass. (What caramelization does to those onions is real, and is exactly what a composition model undersells — see the limits.)

French Onion Soup (Soupe à l'oignon) — umami 9.2/10
ingredientshare of umamishare of mass
beef broth43%37.6%
gruyere38%12.5%
dry white wine10%6.3%
fresh yellow onions4%36.0%
season salt2%0.08%
unsalted butter2%1.4%

Paella Valenciana. The aromatic channel is 52% garlic and 40% rosemary — rosemary being 0.06% of the dish by mass. A 600-fold mismatch between where the weight is and where the smell is.

Paella Valenciana — aromatics 1.2/10
ingredientshare of aromaticsshare of mass
garlic52%0.38%
rosemary40%0.06%
sweet paprika9%0.15%

The corpus-wide picture

Measured as the median across all recipes each appears in: cayenne punches 30× over its mass share (n=183 recipes), rosemary 35× (n=36), thyme 23× (n=132), saffron 26× (n=25), shrimp paste 39× (n=19). At the other end, white rice returns about 0.1× its mass share in signal (n=68) and water — 19% of a typical dish it appears in — carries essentially nothing (n=325).

Aggregated: in the median dish, the ingredients that are each under 5% of the mass together carry 49% of the flavor signal (interquartile range 33%–60%, n=2,343 dishes). Half of what a dish is, by this model, comes from things you could hold in one cupped hand. None of this will shock a cook — nobody seasons by the pound. What the measurement adds is how big the effect is, and which ingredients live furthest from the diagonal.

The most leveraged aromatics (salt rows omitted — salt behaves the same way but is its own story). Only ingredients appearing in ≥15 recipes.
ingredientleverage (signal ÷ mass)median mass sharen recipes
shrimp paste39×0.26%19
cayenne36×0.10%27
rosemary35×0.11%36
cayenne pepper30×0.11%183
marjoram29×0.08%15
saffron26×0.08%25
cardamom25×0.22%19
thyme23×0.06%132
nutmeg20×0.07%58
dark sesame oil20×0.32%124
pepper19×0.08%65
coriander19×0.09%107

Honest limitations

  • This is a composition model, not a perception model. Real flavor perception runs on concentration ÷ odor threshold (the odour-activity-value framework of Grosch and colleagues), not gram share with a potency correction. A mass-weighted model systematically under-weights high-impact aromatics — saffron’s true perceptual leverage is likely higher than shown, not lower. Treat the leverage numbers as floors on the phenomenon.
  • The potency term is a hand-labeled partial correction, not a measurement. No human palate has ever validated one of these vectors against tasting the dish — the attribution is exact arithmetic on the engine’s model; the model itself is the untested part.
  • Cooking transforms contributions. Caramelized onions give more than raw-onion labels suggest; volatiles cook off; fat carries flavor it doesn’t own. The attribution here is computed on raw composition.
  • ~40% of the corpus is project-authored (934 of 2,345 dishes), 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/piece2_attribution.py
python analysis/instrument_room/scripts/piece2_figures.py

Inputs: prototype/web/src/data/sample_corpus_v17.json + data/recipe_corpus/ingredient_vectors_v2.json (read-only). Every number on this page is in analysis/instrument_room/results/piece2_attribution.json.