How a wine & food pairing is scored
The vinistory method — sensory, documented, explainable
1Profile both sides
A wine's axes derive from its grape blend and style; every dish is profiled on fat, salt, umami, acidity, sweetness and chilli heat.
Sancerre — the wine
Goat cheese (crottin) — the dish
2Score the interactions
Alliances
- Acidity cuts fat
- Sweetness tames chilli heat
- Tannin binds rich protein
- Body matches body
- Intensity meets intensity
- Shared aroma families (tie-break)
Clashes
- Tannin × chilli heat veto
- Tannin × raw brine veto
- Dish sweeter than the wine veto
- High alcohol × heat
- Heavy wine, delicate dish
- Bare umami hardens tannin
A fatal clash vetoes the pairing outright — no amount of bonuses can lift it past 25/100.
Aroma matching is perceptual (18 families) and deliberately light: structure carries the verdict, aromas break ties.
3Weigh, sum, explain
Each rule's contribution is weighted and the total squashed to 0–100 — every point traceable to a sentence.
Sancerre × crottin classic pairing
« Wine and dish are matched in weight, so neither overpowers the other. »
Sensory paradigm, not molecules: structural interactions after Harrington's wine-food framework; aroma affinity is perceptual (Eschevins et al., aroma families). Molecular compound-sharing is deliberately excluded — critical reviews find it weakly predictive of real pairings.
ML re-weights, it never invents rules: a logistic head learns the rule weights from labelled pairings and ships only if it beats the hand-tuned weights (AUC) while keeping the classics ranked. Unknown dishes resolve lazily — embedding nearest-neighbour, then LLM decomposition onto the same axes, cached so the dish base grows itself.
88 grape sensory profiles · 110 wine styles derived from the encyclopedia's blends · 389 hand-profiled dishes · curated classic pairings + expert labels for training · evaluated against the SommBench benchmark (1,000 pairs) and 43,000 WineSensed crowd pairing mentions.
The hand-set labels
The engine's fixed points: pairings set by hand from the documented canon, never overridden by the model. Rule weights are calibrated against them — a change that misranks one of these never ships.
Foie gras, brioche × Sauternes classic
The canonical liquoreux pairing: botrytis sweetness against the unctuous liver.
Fresh goat cheese (crottin) × Sancerre classic
Loire crottin + Sancerre — acidity to acidity, textbook.
Jamón ibérico × Sherry classic
Fino with ibérico — Andalusia's own table.
Raw oysters × Muscadet classic
Saline shellfish with a lean, high-acid, unoaked white.
Rib steak, bordelaise sauce × Médoc Red classic
The archetypal left-bank match: tannin and fat, local to local.
Choucroute garnie × Mosel Riesling works
Riesling with choucroute — the Alsatian table's own logic (Mosel stands in for Alsace).
Fresh goat cheese (crottin) × Champagne works
A taut Blanc de Blancs works, but Sancerre's precision is generally better.
Peking duck × Red Burgundy works
Pinot's red fruit and silk against lacquered duck — a sommelier standard.
Raw oysters × Chablis works
Steely Chardonnay echoes the oyster's mineral salinity.
Thai green chicken curry × Mosel Riesling works
Off-dry residual sugar tames the chilli; aromatics match the lemongrass.
Thai green chicken curry × Vouvray works
Off-dry Chenin — acidity + stone-fruit depth carry the coconut and heat.
Thai green chicken curry × Alsace Gewurztraminer works
Lychee/rose aromatics meet the lemongrass; off-dryness tames the chilli.
Raw oysters × Médoc Red avoid
Tannin against raw briny oysters turns sharply metallic.
Rib steak, bordelaise sauce × Sauternes avoid
A dessert-sweet wine is cloying on a savoury rib steak.
Thai green chicken curry × Médoc Red avoid
Tannin × chilli heat = harsh and metallic — a documented clash.