emealia docs · internal 2026-08-06

Roadmap & decisions

Where the build actually is, what remains before launch, and the decision log — including the decisions to not build things, which are the ones most likely to be re-argued later.

Counted from the 29-epic implementation plan on 2026-08-06 · the plan is the single source of truth for what gets built

212/278
stories done — 76%
stories explicitly todo
37
deferred, proposed or removed by decision
5
launch blockers, four of them human

Epic completion

Read straight from the plan. "Other" covers stories that were deferred, proposed but unscheduled, removed by decision, or blocked on a human dependency — each of those is a recorded decision rather than an omission.

EpicAreaDoneTodoOtherState
11Design system + tokens11/1100Complete
2Daily view — bands, all-details, contributions, weekly18/1802Complete
8Trial + payments6/600Complete
17Weight tracking1/100Complete
16Localisation EN + DE4/401Complete
10Statistics1/100Complete
1AI meal parsing + estimation pipeline30/3435Near-complete
18Extended meal input — portions, products, multi-meal12/1400Near-complete
5History, favourites, meal memory11/1201Near-complete
6Onboarding + anonymous session11/1310Near-complete
23Alpha core-flow readiness13/1411Near-complete
20Test phase + go-live12/1420Near-complete
DDefects14/1800Near-complete
12PWA, install, offline5/600Near-complete
22Alpha testing5/610Near-complete
3Meal detail5/700In progress
0Foundation14/2051Human deps
14Security hardening10/1330Launch-gating
13GDPR + legal4/501 blockedBlocked on H10
25Plan tracker tooling7/1001In progress
7Auth7/1547Human deps + contradiction
4Coaching + suggestions5/1006Delivery unbuilt
15Observability + release2/420Thin
24E2E flow regression suite2/1000Early
9Reviews + statistics groundwork1/400Early
21AI estimation optimisation1/870Early
19Activity context (full)Post-launch
26PerformanceUnscoped
27Go-live test campaignUnscoped
A note on the plan itself

The plan was mechanically restructured on 2026-08-02 into one canonical story layout — a lossless layout change, verified line-for-line. A known consequence has not been fixed: dropping the order bracket from story headers means the plan-tracker importer's story regex currently matches zero stories (28 epics, 0 stories imported). This is a deliberate temporary state pending an importer redesign. Do not run the importer against the plan expecting a working result until that lands.

The critical path to launch

#ItemTypeBlocks
1Fix the trial mismatch on the public sitedone 2026-08-06. Remaining: the same correction in 3-design.md's copy standardCopyWas gating all acquisition spend
2Medical / general-wellness disclaimer sign-off (H10)Human — counselLaunch. GDPR epic 13's last story.
3G1 — band comprehension, 5 testers, ≥3/5 unaided, now including the contribution listHuman — founderWas meant to gate the Today UI. Run it retroactively.
4G2 — AI calibration, 30 real meals (15 DE / 15 US), correction rate <40%Human — founderAcquisition spend
5Security hardening — 3 remaining storiesBuildLaunch
6Suggestion delivery (story 4.5)BuildA named KPI and a kill condition. Not strictly launch-gating, but launching without it means launching blind on coaching.
7EU AI Act Art. 50 disclosure placementBuild — smallLive obligation since 2 August 2026
8Observability completion — 2 remaining storiesBuildThe AI-cost kill condition cannot fire without it
9iubenda privacy policy + ToS · Impressum §5 DDG · Anthropic DPA + spend cap · Auth0 EU tenantHuman — founderLaunch

Recommended next epic: suggestions, done the cheap way

Scope it as a rule table, not a coach

Story 4.5 is the highest-value unbuilt work in the product, and the deterministic tip library is its payload. Twenty evidence-backed rules cost nothing to run, cannot hallucinate, are auditable under AI Act Art. 50, and close the one KPI that is currently unobservable. Build the contribution → suggestion pipeline as the primary path: the model, if used at all, receives a selected key plus a named contributing dish and writes one sentence. Fewer tokens, less personal data in the prompt, a bounded output space — and a tip that praises something that happened is structurally incapable of shaming.

Post-launch order

OrderItemGate
1AI estimation optimisation (epic 21) — 7 stories, directly tied to the cost kill conditionPost-launch, or earlier if cost trends badly
2E2E flow regression suite (epic 24) — 8 remainingContinuous
3Reviews + every-other-day cadence (epic 9 / 4.6) — deferred, needs conceptual rethink before schedulingAfter daily tips prove out
4Full activity context (epic 19) — MET estimation, opt-in net viewPost-launch by decision
5Performance (epic 26) and the go-live test campaign (epic 27)Unscoped — scope them
6emealia Plus — recipe generation, photo logging, advanced stats and exportOnly once D7 ≥ 30%. Nothing about Plus is built before that gate clears.

Decision log

Decisions that shaped the product, with the reasoning preserved — because a decision without its reasoning gets reversed by the next person with a plausible argument.

Build decisions

DateDecisionReasoning
2026-07-27Multi-meal: adopt B2 — meal type is filled only from an explicit textual cue, never inferred from food content"Scrambled eggs → breakfast" is a guess dressed as intelligence. A wrong confident inference costs more trust than an honest other.
2026-07-27Multi-meal: reject multi-selecting meal_type on one recordIt tags a blob instead of un-blobbing it. The unit of a log and the unit of a meal must be allowed to differ.
2026-07-05No day-budget or contribution band on any meal screenDepletion framing reads as "calories to spend down". Rule: bands describe a day, numbers describe a meal.
2026-07-04Drop the nutrition_extensions JSONB tierRare regional extras (copper, manganese, chromium, molybdenum, fluoride) are unreliable to estimate from meal text and add no value even in All-details. One storage tier: columns only.
2026-07-08Add total sugars and the fat subtypes (saturated, mono, poly, omega-3); exclude omega-6Omega-6 is over-consumed with no meaningful floor — a band for it would be a number without an action.
2026-07-15Remove the 7-day tip category cooldownToo blunt; the per-nutrient repeat guard does the job without silencing useful variety.
2026-07-17Remove internal coaching-parameter interpretationCooking level and nutrition knowledge are explicit user inputs. Send them directly in the bounded AI context; an intermediate enum was a layer of invention with no purpose.
2026-07-01Widen the goal set — health goals become functionally, not just nominally, equal to weight goalsThe prototype already offered six goals while the backlog, briefing and target logic still knew only lose/hold/gain. "Healthier eating" existed as a label producing a calorie direction. Now: nine goals plus free text, no "maintain weight" option, stored as a plain list with energy direction derived at target calculation.
2026-08-02Restructure the implementation plan into one canonical story layoutSo a future importer can map every field without guessing. Lossless; the importer redesign is pending.

Decisions not to build

Not builtReasoning
Adaptive energy targets from weight trendGenuinely good and range-compatible in principle. But it requires consistent weighing, which conflicts with both the low-friction promise and the ED-safety posture. Recorded as a decision, not an omission — this is MacroFactor's USP and it will be proposed again.
A goal-weight progress barA number as a verdict with a failure state built in. The single clearest contradiction of non-negotiables #1, #2 and #6 that could plausibly be argued in on grounds of "everyone has it".
Earned calories from activityThe food-as-currency loop. A non-negotiable violation dressed as a feature.
Mood ↔ nutrient correlationA causal claim about your own weakness is harder to shrug off than a number. If it ever ships it must be behind explicit opt-in and phrased as an observation the user can reject, never as a finding.
GLP-1 featuresMedical-adjacent claim surface, conflicts with general-wellness positioning, and a market where capital wins.
A food database or barcode scannerNon-negotiable #4. Competing on database size is a race against 20 million crowdsourced entries with a documented 27% error rate — losing on their axis while abandoning our own.
Semantic caching via third-party embeddings40–60% variable-cost savings, rejected on privacy grounds — a second processor seeing meal text, against a single-DPA posture that is itself a purchase argument.
Device fingerprintingProposed as trial anti-abuse; rejected on GDPR and consent grounds. Social auth plus the credit cap do the same job cleanly.
Trial-only model downgradeEstimation error is 25–35% on mixed dishes on any model, so a cheaper trial model saves fractions of a cent while making the trial worse than the product being sold.
Apple Health / Health Connect syncNot a choice — native-only APIs with no web equivalent. Garmin, Fitbit, Withings, Strava and Polar are feasible over OAuth if ever wanted, and would refine the activity factor only.
Household / multi-eater accountsLow differentiation, high cost.

Open contradictions

Places where two documents still disagree. Each needs one decision, not more analysis.

ContradictionNeeds
Auth method. Strategy says social-only, no email/password (founder decision 2026-07-08). The design doc's login standard says "email + Google + Apple together".One decision, then correct the losing document. Social-only is the anti-abuse mechanism behind the soft paywall.
Trial description. The design doc's copy standard still references a "7-day-trial CTA". The product grants 30 credits; the public site was corrected 2026-08-06.Correct 3-design.md. The CTA subline itself ("All features, one plan, forever.") stays and is now used consistently on the site.
Colour palette. emealia-mgmt/3-design.md documents the forest-green palette the app replaced.Update the management doc to the shipped Deep Oceanic Slate values. This doc set is already corrected.
Contribution copy has no acceptance criteria. The implementation is right; nothing written down keeps it right.Write the ordering, labelling and "still estimating" rules into acceptance criteria governed by non-negotiables #1 and #6, and add the surface to G1.
Screen-reader parity on contributions. Sighted users see a bar; screen-reader users hear a precise percentage.An approximate register for the aria label — which is also the honest register for a ±25% estimate.

Watchlist

Signals that would change the plan rather than the schedule. Full context in Market.

SignalResponse
Apple Health+ ships a range-based or non-judgmental modeRe-examine the frame's defensibility immediately — the one thing that would erase the moat
A mainstream tracker ships retrospective non-numeric contributionNovelty window closes; shift emphasis to batch logging and the frame
Trial → paid below 5%Rework onboarding and value proposition before scaling anything
D7 below 20% after 200 usersStop acquisition, redesign the core loop
Recurring reviews mentioning obsession or anxietyReduce number visibility; re-audit contribution copy first
Yazio drops below ~€50/yrThe primary-market price argument weakens; lean harder on privacy and the frame