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.
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.
| Epic | Area | Done | Todo | Other | State |
|---|---|---|---|---|---|
| 11 | Design system + tokens | 11/11 | 0 | 0 | Complete |
| 2 | Daily view — bands, all-details, contributions, weekly | 18/18 | 0 | 2 | Complete |
| 8 | Trial + payments | 6/6 | 0 | 0 | Complete |
| 17 | Weight tracking | 1/1 | 0 | 0 | Complete |
| 16 | Localisation EN + DE | 4/4 | 0 | 1 | Complete |
| 10 | Statistics | 1/1 | 0 | 0 | Complete |
| 1 | AI meal parsing + estimation pipeline | 30/34 | 3 | 5 | Near-complete |
| 18 | Extended meal input — portions, products, multi-meal | 12/14 | 0 | 0 | Near-complete |
| 5 | History, favourites, meal memory | 11/12 | 0 | 1 | Near-complete |
| 6 | Onboarding + anonymous session | 11/13 | 1 | 0 | Near-complete |
| 23 | Alpha core-flow readiness | 13/14 | 1 | 1 | Near-complete |
| 20 | Test phase + go-live | 12/14 | 2 | 0 | Near-complete |
| D | Defects | 14/18 | 0 | 0 | Near-complete |
| 12 | PWA, install, offline | 5/6 | 0 | 0 | Near-complete |
| 22 | Alpha testing | 5/6 | 1 | 0 | Near-complete |
| 3 | Meal detail | 5/7 | 0 | 0 | In progress |
| 0 | Foundation | 14/20 | 5 | 1 | Human deps |
| 14 | Security hardening | 10/13 | 3 | 0 | Launch-gating |
| 13 | GDPR + legal | 4/5 | 0 | 1 blocked | Blocked on H10 |
| 25 | Plan tracker tooling | 7/10 | 0 | 1 | In progress |
| 7 | Auth | 7/15 | 4 | 7 | Human deps + contradiction |
| 4 | Coaching + suggestions | 5/10 | 0 | 6 | Delivery unbuilt |
| 15 | Observability + release | 2/4 | 2 | 0 | Thin |
| 24 | E2E flow regression suite | 2/10 | 0 | 0 | Early |
| 9 | Reviews + statistics groundwork | 1/4 | 0 | 0 | Early |
| 21 | AI estimation optimisation | 1/8 | 7 | 0 | Early |
| 19 | Activity context (full) | — | — | — | Post-launch |
| 26 | Performance | — | — | — | Unscoped |
| 27 | Go-live test campaign | — | — | — | Unscoped |
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.
| # | Item | Type | Blocks |
|---|---|---|---|
| 1 | 3-design.md's copy standard | Copy | Was gating all acquisition spend |
| 2 | Medical / general-wellness disclaimer sign-off (H10) | Human — counsel | Launch. GDPR epic 13's last story. |
| 3 | G1 — band comprehension, 5 testers, ≥3/5 unaided, now including the contribution list | Human — founder | Was meant to gate the Today UI. Run it retroactively. |
| 4 | G2 — AI calibration, 30 real meals (15 DE / 15 US), correction rate <40% | Human — founder | Acquisition spend |
| 5 | Security hardening — 3 remaining stories | Build | Launch |
| 6 | Suggestion delivery (story 4.5) | Build | A named KPI and a kill condition. Not strictly launch-gating, but launching without it means launching blind on coaching. |
| 7 | EU AI Act Art. 50 disclosure placement | Build — small | Live obligation since 2 August 2026 |
| 8 | Observability completion — 2 remaining stories | Build | The AI-cost kill condition cannot fire without it |
| 9 | iubenda privacy policy + ToS · Impressum §5 DDG · Anthropic DPA + spend cap · Auth0 EU tenant | Human — founder | Launch |
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.
| Order | Item | Gate |
|---|---|---|
| 1 | AI estimation optimisation (epic 21) — 7 stories, directly tied to the cost kill condition | Post-launch, or earlier if cost trends badly |
| 2 | E2E flow regression suite (epic 24) — 8 remaining | Continuous |
| 3 | Reviews + every-other-day cadence (epic 9 / 4.6) — deferred, needs conceptual rethink before scheduling | After daily tips prove out |
| 4 | Full activity context (epic 19) — MET estimation, opt-in net view | Post-launch by decision |
| 5 | Performance (epic 26) and the go-live test campaign (epic 27) | Unscoped — scope them |
| 6 | emealia Plus — recipe generation, photo logging, advanced stats and export | Only once D7 ≥ 30%. Nothing about Plus is built before that gate clears. |
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.
| Date | Decision | Reasoning |
|---|---|---|
| 2026-07-27 | Multi-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-27 | Multi-meal: reject multi-selecting meal_type on one record | It 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-05 | No day-budget or contribution band on any meal screen | Depletion framing reads as "calories to spend down". Rule: bands describe a day, numbers describe a meal. |
| 2026-07-04 | Drop the nutrition_extensions JSONB tier | Rare 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-08 | Add total sugars and the fat subtypes (saturated, mono, poly, omega-3); exclude omega-6 | Omega-6 is over-consumed with no meaningful floor — a band for it would be a number without an action. |
| 2026-07-15 | Remove the 7-day tip category cooldown | Too blunt; the per-nutrient repeat guard does the job without silencing useful variety. |
| 2026-07-17 | Remove internal coaching-parameter interpretation | Cooking 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-01 | Widen the goal set — health goals become functionally, not just nominally, equal to weight goals | The 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-02 | Restructure the implementation plan into one canonical story layout | So a future importer can map every field without guessing. Lossless; the importer redesign is pending. |
| Not built | Reasoning |
|---|---|
| Adaptive energy targets from weight trend | Genuinely 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 bar | A 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 activity | The food-as-currency loop. A non-negotiable violation dressed as a feature. |
| Mood ↔ nutrient correlation | A 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 features | Medical-adjacent claim surface, conflicts with general-wellness positioning, and a market where capital wins. |
| A food database or barcode scanner | Non-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 embeddings | 40–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 fingerprinting | Proposed as trial anti-abuse; rejected on GDPR and consent grounds. Social auth plus the credit cap do the same job cleanly. |
| Trial-only model downgrade | Estimation 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 sync | Not 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 accounts | Low differentiation, high cost. |
Places where two documents still disagree. Each needs one decision, not more analysis.
| Contradiction | Needs |
|---|---|
| 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. |
Signals that would change the plan rather than the schedule. Full context in Market.
| Signal | Response |
|---|---|
| Apple Health+ ships a range-based or non-judgmental mode | Re-examine the frame's defensibility immediately — the one thing that would erase the moat |
| A mainstream tracker ships retrospective non-numeric contribution | Novelty 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 users | Stop acquisition, redesign the core loop |
| Recurring reviews mentioning obsession or anxiety | Reduce number visibility; re-audit contribution copy first |
| Yazio drops below ~€50/yr | The primary-market price argument weakens; lean harder on privacy and the frame |