emealia uses a model for language and forbids it arithmetic. The numbers come from a curated database of official national food-composition data. This page keeps only what proves that architecture is right, not merely different: two named German findings, one measured error rate, and the reason a chat interface was rejected.
| Stage | What happens | Who decides |
|---|---|---|
| Parse | Free text becomes a structured list — food, preparation, amount. The prompt: “Do not return nutrient values, ranges, confidence levels.” | Model, language only |
| Resolve | Each item is matched against the curated reference tier — five usable official sources today (FDC, BLS, CIQUAL, CNF, Swiss; four more are licence-gated and not yet live). | Database |
| Estimate — misses only | Foods the database does not know go back to the model, which returns per-100 g min/max ranges for every nutrient (estimate_ingredient_nutrition). This call sees only the food identity — never the user, the amount, the meal, or the sentence. The result is written to a quarantine table, never into reference data, and shown to the user marked as an AI estimate pending human research. | Model — numbers |
| Promote | A human researches a quarantined candidate and promotes it into ingredient_reference. Promotion is terminal and never overwrites the frozen candidate composition, so re-running it is a safe no-op. | Human |
| Compose | Per-100g ranges × grams, summed, with a ±10% honesty floor applied in code and preserved through aggregation. | Code |
Stiftung Warentest tested ChatGPT, Copilot and Gemini generating nutrition plans. Copilot proposed roughly 1,390 kcal/day — a four-to-seven-year-old’s requirement — for an adult, with inadequate calcium. Gemini undershot by 500 kcal on average. This is what happens when a model supplies the number: the “AI alone” failure mode on best of both worlds.
Ernährungs Umschau (2017) compared consumer nutrition-app values against the Bundeslebensmittelschlüssel, Germany’s own official reference — the same family five of emealia’s adapters draw from — and found individual nutrients deviating by more than 50%. This is what happens when a database exists but nothing checks the app against it: the “database alone” failure mode.
emealia’s architecture answers both, differently: where the food is in the database, the numbers come from the same reference family Ernährungs Umschau used as ground truth and the model never supplies a value. Where it is not, the model does estimate the composition — and that case is labelled as an AI estimate to the user, quarantined out of reference data, and queued for human research. So the Warentest failure mode is not eliminated; it is bounded and disclosed, which is a weaker but honest claim. Whether any competitor makes both claims is unchecked — the negative-existence claims in this document set have a poor record (see claims), so it is stated here only as what emealia’s architecture does, not as a comparison.
The obvious cheap alternative is a chat window. Rejected for a measurable reason: writing a good instruction is a skill, and most people don’t have it. Jakob Nielsen’s articulation barrier, drawn from OECD literacy data, estimates 10–20% of adults write well enough to drive a prompt-only interface, and recommends hybrid interfaces pairing prose with structure — which is emealia’s shape, arrived at independently. An untuned LLM estimating nutrition from text alone has a mean absolute error of 652 kcal per meal — roughly a third of a day. Forbidding the model arithmetic is the direct fix.
Constrained decoding guarantees a response parses; it does not guarantee it is true. emealia has already paid for the gap once: a token limit set too low truncated a structurally valid response before its final field, so every meal failed and retried at real cost. The schema was never violated; the answer was still wrong. What actually carries the truth claim is downstream of the schema — values from a database, check constraints, the range floor, a coverage harness — never the fact that the JSON parsed.
emealia has no accuracy figure of its own. The G2 calibration gate — 30 real meals, correction rate below 40% — is still open. Everything above is an argument that the architecture is built the way the evidence says it should be, which is a genuinely strong and genuinely different claim from “emealia is accurate.” The distinction must survive into any public copy.
release/epic-29: ingredient_db_estimator.py, ingredient_range.py, nutrients.py, parse_ingredients.md, and the source adapters in integrations/ingredient_sources/.