Twenty evidence-backed rules that turn the empty suggestion slot into a delivered product without a single token spent. Suggestion selection is a versioned rule table returning an opaque key; a model, if used at all, only phrases it.
This mirrors classify_band_state exactly — the evaluator knows the rule shape, never what a key means — and it buys four things a model cannot:
It also makes the eventual AI layer cheaper and safer: the model receives a selected key plus the contributing dish and writes one sentence, instead of reasoning over a meal history and deciding what matters. Fewer tokens, less personal data in the prompt, a bounded output space.
Every competitor's coaching layer is a black box that talks at you. Noom's is a lesson treadmill with emotional-trigger analysis and a documented reputation problem. MyFitnessPal's is a chatbot. Apple's will be an AI coach with the platform's data advantage. emealia cannot win on coaching breadth and should stop trying.
What it can win on is coaching restraint — and restraint is only credible if you can show what you will and will not say. A published rule library does exactly that. It is:
Everything below is computable from data emealia already stores. No new schema, no new consent.
| Source | Available signal |
|---|---|
daily_summaries × user_targets | Per-nutrient day ranges against the ideal zone; band states; the day level |
| Contributions | Per-meal share of each nutrient — the newest and richest signal in the set |
meals | Timestamps, meal type, the merged ingredient list (text, amount, dominating flag), portion size |
meal_memory | Confirmed repeat dishes in the user's own words, with confirmation counts |
| Logging pattern | Which days have logs, how many, first-meal time spread |
daily_context_tags · activity_context | Mood, hunger, energy, rough activity — modifiers only, never triggers |
| Profile | Goals list and free text, cooking level, nutrition-knowledge level, dietary preferences, locale |
| # | Rule |
|---|---|
| 1 | Additive or substitutive, never subtractive. No tip may contain less, avoid, cut, reduce or stop. Where the honest advice is reduction — sodium, sweet drinks — it must be reframed as an addition or a one-for-one swap, never as removal. |
| 2 | Forward-looking. The tip is about tomorrow or the next meal, never a verdict on today. |
| 3 | Anchored in something real from their own data — a dish they ate, a pattern they have. Never generic. |
| 4 | No medical claim. No disease, no deficiency, no diagnosis, no supplement recommendation. Any nutrient whose honest advice is medical is excluded from the library entirely. |
| 5 | Never triggered by absence. Not logging is not a signal. Silence is the default. |
| 6 | Never a comparison — not to other users, not to a past self, not to a "should". |
| 7 | One per day maximum, not before 10:00, hard cutoff 23:00, minimum three logging days all-time. No deficit-shaped tip for the same nutrient two days running. |
| 8 | If number-hiding is on, the copy contains no numbers. |
Twenty rules. Each is a key, a firing condition computable from stored data, draft copy in emealia's register, and the evidence that justifies it existing at all.
| Key | Fires when | Tip (EN draft) | Evidence |
|---|---|---|---|
fibre_legume |
Fibre below zone on ≥3 of the last 7 logged days and no legume in those days' ingredients | "Lentils, beans or chickpeas are about the easiest fibre there is — a handful in tomorrow's lunch carries a surprising amount of the day." | Fibre 25–29 g/d associated with 15–30% lower all-cause and CV mortality (Reynolds et al. 2019, Lancet); legume dose–response meta-analysis |
fibre_wholegrain |
Carbs at or above zone and fibre below zone, ≥3 of 7 days | "Same bread, wholegrain version. It's the smallest swap on this list and one of the best studied." | Per 90 g/d whole grain: ~17% lower all-cause mortality (Aune et al. 2016, BMJ) |
plant_diversity_nudge |
Distinct plant ingredients over a rolling 7 days < 20 | "You've had 14 different plants this week. Herbs, seeds and spices all count — a couple more kinds is one of the better-evidenced small moves." | Plant-type diversity predicted microbiome diversity more strongly than diet label (American Gut Project, McDonald et al. 2018) |
plant_diversity_praise |
≥30 distinct plants in 7 days | "Thirty different plants this week. That's the number the research keeps landing on — nothing to change." | as above |
produce_volume |
Fibre, vitamin C and potassium all below zone on ≥3 of 7 days | "Risk keeps dropping up to about 800 g of fruit and veg a day — roughly five good handfuls. You're building toward it." | Dose–response to 800 g/d for CVD, cancer and all-cause mortality (Aune et al. 2017, Int J Epidemiol) |
| Key | Fires when | Tip (EN draft) | Evidence |
|---|---|---|---|
protein_breakfast |
Protein below zone and breakfast's protein contribution < 15% on ≥3 days | "Most of your protein arrives later in the day. A bit of it at breakfast tends to make the morning steadier." | Even distribution → ~25% greater 24-h muscle protein synthesis vs. evening-skewed (Mamerow et al., J Nutr) |
protein_spread |
Protein within zone but one meal contributes > 50% across the week | "Nearly all your protein comes from one meal. Spreading it out is less about the total and more about not depending on one dish." | as above |
| Key | Fires when | Tip (EN draft) | Evidence |
|---|---|---|---|
nuts_handful |
No nuts or seeds in 7 days and magnesium or vitamin E below zone | "A small handful of nuts is about the densest easy win in nutrition." | Per 28 g/d: CHD RR 0.71, CVD 0.79, all-cause mortality 0.78 (Aune et al. 2016, BMC Medicine) |
fermented_add |
No fermented item (yoghurt, kefir, kimchi, sauerkraut, kombucha, miso, tempeh) in 7 days | "Yoghurt, kefir, sauerkraut — one fermented thing a day is a surprisingly well-studied habit." | 17-week RCT: increased microbiota diversity, 19 inflammatory markers down (Wastyk et al. 2021, Cell) |
iron_vitc_pairing |
Iron below zone and the day's top iron contributors are plant-dominant and vitamin C low in the same meals | "Iron from plants goes in better with something sour alongside — lemon over the lentils, peppers in the salad." | EFSA-authorised claim; meta-analysis ~+5.9 percentage points absorption |
calcium_add |
Calcium below zone on ≥4 of 7 days | "Dairy, fortified plant drinks, tofu, kale — and in Germany, some mineral waters carry more calcium than you'd expect." | DGE / USDA reference intakes; locale-aware DE variant |
omega3_add |
Omega-3 below zone and no oily fish, walnuts, flax or rapeseed oil in 7 days | "Oily fish, walnuts or a spoon of rapeseed oil — any one of them moves this a long way." | DGE / USDA guideline consensus on n-3 intake |
| Key | Fires when | Tip (EN draft) | Evidence |
|---|---|---|---|
sweet_drink_swap |
Sweetened drinks appear as ingredients on ≥3 days/week | "Trading one sweet drink for water is the single most-studied swap in nutrition. Just one — the rest can stay." | Substitution analyses: water for SSB → lower weight, lower obesity and T2D incidence |
salt_herbs |
Sodium above zone on ≥4 of 7 days | "Herbs, lemon and pepper do a lot of what salt does at the table. Worth keeping them within reach." | WHO / DGE sodium consensus, reframed additively per rule 1 |
| Key | Fires when | Tip (EN draft) | Evidence |
|---|---|---|---|
post_meal_walk |
Activity context habitually low and the day's energy band is not above zone | "Ten minutes of walking after a meal does more than it sounds like — and it's the nicest ten minutes of the day." | Postprandial walking attenuates glucose response more than pre-meal or delayed activity (systematic review + meta-analysis, 2022) |
meal_regularity |
First-meal time varies by > 4 h across the week | "Your first meal has landed anywhere between 7 and 1 this week. Regular timing tends to make the rest of the day easier." | Consistency, not precision, is the strongest predictor across trials |
| Key | Fires when | Tip (EN draft) | Note |
|---|---|---|---|
repeat_dish_anchor |
A meal_memory dish with ≥3 confirmations is a top contributor for a nutrient |
"The lentil soup is quietly doing most of the work for your fibre. Nothing needs to change." | The contribution pipeline at its simplest — praise anchored to a real dish, structurally incapable of shaming because it praises something that happened |
contribution_concentration |
One dish > 60% of a nutrient across the week | "Almost all your protein comes from one dish. Nothing wrong with that — just worth having a second option." | Resilience framing, never a correction |
light_days_care |
Energy band below zone on ≥3 consecutive days | "The last few days have been on the light side. Something a bit more substantial tomorrow would be kind to you." | Wellbeing-critical. Needs counsel sign-off and must never escalate — if it fires twice, it goes silent. |
first_steps |
< 3 logging days all-time | "Small start: just describe one meal tomorrow. That's the whole task." | Adherence literature — the smallest viable ask |
| Excluded | Why |
|---|---|
| Vitamin D | Almost every user will read below zone, and the honest advice — sunlight, possibly supplementation, possibly a blood test — is medical. Excluded from the library entirely; a neutral one-line explainer sits in All-details instead. |
| Any tip triggered by weight or weight stagnation | Absence and plateaus are ambiguous signals, and acting on them reinstates weight as the success criterion. |
| Any tip naming a mood → food correlation | The most guilt-prone surface in the entire category. Mood modulates tone and ambition only, never content. |
| Anything phrased as compensation | post_meal_walk in particular must never fire after a large meal or an above-zone energy band — that is the "work it off" mechanic wearing a health claim. |
Modifiers never fire a tip. They shape the one that fires.
| Modifier | Condition | Effect |
|---|---|---|
low_energy_week | Tired or low-mood tags on ≥2 of the last 3 logged days | Reduce the ambition of whichever tip fires and warm the register. Never mentioned in the copy — the user is not told the app noticed they were tired. |
coaching_level | Derived from nutrition-knowledge level plus logging history | Selects the copy variant: beginner tips name one concrete action; dialled-in tips may name the nutrient. |
This is the connection worth making explicitly, because it is what makes the coaching layer both cheap and differentiated.
The contribution ranking is the reasoning a coaching model would otherwise have to derive from raw meal history. Feeding a model the top contributors plus the shortfall nutrient — instead of a bounded meal log — means fewer tokens, less personal data in the prompt, and a more specific tip. A tip anchored to a named contributor ("the lentil soup carried most of your fibre today; a similar bowl tomorrow would do the same") is additive, derived rather than invented, and structurally incapable of shaming, because it praises something that happened.
| Stage | What happens | Cost |
|---|---|---|
| 1 · Eligibility | Energy threshold, time gates, frequency guards — already built and tested | free |
| 2 · Signal | Contributions, band states, ingredient history, logging pattern | free |
| 3 · Selection | The versioned rule table above returns one opaque key plus the anchoring dish | free |
| 4 · Phrasing | Either the static EN/DE copy, or — optionally — one model call bounded to rephrasing a known key around a known dish | near-zero |
| 5 · Delivery | Story 4.5: persistence, the suggestion slot on Today, focus-nutrient history | Not built |
Ship the rule library before the AI coaching epic, as story 4.5's payload. Twenty deterministic rules cost nothing to run, cannot hallucinate, are auditable under AI Act Art. 50, and close the one KPI that is currently unmeasurable. The AI layer then becomes a phrasing job rather than a reasoning job — smaller, safer and cheaper than it would have been built the other way round.