mirror of
https://github.com/kuhyx/diet-guard.git
synced 2026-11-10 19:27:14 +01:00
docs: drop NEXT_SESSION.md, both bugs fixed and verified on device
Some checks failed
file-length / file length <= 250 lines (push) Has been cancelled
pre-commit / pre-commit (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.12) (push) Has been cancelled
release-apk / release (APK) (push) Has been cancelled
Some checks failed
file-length / file length <= 250 lines (push) Has been cancelled
pre-commit / pre-commit (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.12) (push) Has been cancelled
release-apk / release (APK) (push) Has been cancelled
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QQpCiPaSbyRpwsLkH3dgsX
This commit is contained in:
parent
c897279c8b
commit
9bfc14684e
121
NEXT_SESSION.md
121
NEXT_SESSION.md
@ -1,121 +0,0 @@
|
||||
# Next session: fix the phone's catering prefill, add the one-tap button
|
||||
|
||||
Paste the prompt below into a fresh session. Delete this file once it's done.
|
||||
|
||||
---
|
||||
|
||||
## Prompt
|
||||
|
||||
Two bugs in the phone-side Kuchnia Wikinga import that shipped on 2026-08-23
|
||||
(commits `24be05b9c38`..`d9b3d57900f`). Read
|
||||
`docs/kuchnia-wikinga-phone.md` and `docs/kuchnia-wikinga.md` first.
|
||||
|
||||
State: `main` is clean and pushed. Phone (Pixel 6a, `23181JEGR08034`) has the
|
||||
build with both bugs installed. 1040 Python tests at 100% branch coverage,
|
||||
695 Dart tests — all green, which is exactly the problem: **both bugs pass the
|
||||
entire suite.**
|
||||
|
||||
### Bug 1 — a prefilled dish logs ~2.6x its real calories (data corruption, fix first)
|
||||
|
||||
Reproduced on the user's real phone on 2026-08-23:
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| bank record | `472.0 kcal`, `25.89 P`, `52.95 C`, `16.62 F`, `258.0 g` |
|
||||
| what got logged | `1217.8 kcal`, `66.8 P`, `136.6 C`, `42.9 F`, `258.0 g` |
|
||||
| ratio | `1217.8 / 472.0` = **2.58** = `258 g / 100` |
|
||||
|
||||
Entry: `Pieczona owsianka daktylowo-czekoladowa, sos gruszkowy, orzechy włoskie`
|
||||
at `2026-08-23T08:00:09+02:00`, `source: "kuchnia wikinga"`, slot 8.
|
||||
|
||||
**Root cause** (confirmed, don't re-derive): `fillControllersFromDish` in
|
||||
`app/lib/screens/log_meal_kuchnia_mixin.dart` sets `desc`, the four macros and
|
||||
`macros.grams` — but **never clears `macros.perGrams`**. `nutritionForPortion`
|
||||
(`app/lib/models/nutrition.dart:87`) does
|
||||
`referenceGrams = perGrams > 0 ? perGrams : ateGrams`, so a stale `100` left in
|
||||
the per-grams field from a previous food-bank pick makes it treat the dish's
|
||||
*per-portion* macros as *per-100 g* and rescale them by `258/100`.
|
||||
|
||||
The PC does not have this bug because `_gatelock_delivery.py:154` calls
|
||||
`self._clear_inputs()` before filling. The Dart mirror dropped that step.
|
||||
|
||||
Required:
|
||||
|
||||
- Clear **every** macro field (including `perGrams`) before filling, the same
|
||||
way the PC does. Prefer making `fillControllersFromDish` unable to leave a
|
||||
stale field rather than adding a `perGrams.clear()` line that the next field
|
||||
can forget again.
|
||||
- A test that would have caught it: pre-seed `perGrams` with `100`, prefill a
|
||||
dish, and assert the *computed* `Nutrition` equals the dish's own macros —
|
||||
not just that the text fields look right. The current
|
||||
`log_meal_kuchnia_mixin_test.dart` asserts controller **text** and passes
|
||||
with this bug present; that is why it shipped.
|
||||
- Check the same class of bug in the settings-button path and anywhere else a
|
||||
dish reaches the form.
|
||||
|
||||
**Also fix the already-corrupted entry.** One real log entry is wrong by
|
||||
~746 kcal on 2026-08-23. It is synced, so correcting it locally and letting the
|
||||
merge carry the fix is the right move — but confirm with the user before
|
||||
editing their food log, and do not hand-edit `food_log.json` while the app or
|
||||
a sync tick might write it.
|
||||
|
||||
### Bug 2 — the phone has no one-tap "add today's delivery" button
|
||||
|
||||
The PC's lock screen has a "🍱 Today's delivery" button that walks the whole
|
||||
delivery dish by dish (`_gatelock_delivery.py`). On the phone the queue exists
|
||||
and works (`KuchniaQueueService`, `LogMealKuchniaMixin`), but the **only** ways
|
||||
to trigger it are the log screen's `initState` and the Settings "Fetch today's
|
||||
delivery" button — there is no visible control on the log screen itself.
|
||||
|
||||
So when the user is standing in the kitchen, there is nothing to tap.
|
||||
|
||||
Required:
|
||||
|
||||
- A visible control on the log screen that loads today's delivery and prefills
|
||||
the first dish, matching the PC's affordance.
|
||||
- It must show the queue state — the PC's `"(N more to go)"`. The mixin already
|
||||
exposes `queueStatusLine` and `dishesStillQueued`.
|
||||
- Respect the guard split documented in `docs/kuchnia-wikinga.md`'s Triggers
|
||||
table: an **explicit** user tap goes and looks (unguarded, like the CLI and
|
||||
the settings button); the automatic `initState` load stays guarded by
|
||||
`KuchniaQueueService.refreshOnce`.
|
||||
- `app/lib/screens/log_meal_screen.dart` is at **exactly 249/250 lines**. The
|
||||
button will not fit there — put it in a widget of its own, as
|
||||
`settings_kuchnia.dart` does.
|
||||
|
||||
### Constraints
|
||||
|
||||
- 250 lines per file (`file-length` hook). `AGENTS.md` is at exactly 250.
|
||||
- 100% Python branch coverage; `flutter test` green.
|
||||
- `pre-commit run --files <changed>` before finishing. The repo bans `noqa`
|
||||
outright — there is a `no-noqa` hook, so a suppression is not an escape
|
||||
hatch.
|
||||
- Any new Python state path must patch `conftest._isolate_state` in the *same*
|
||||
edit, or the suite writes to live user data.
|
||||
- Never log a delivery unattended — a delivered meal is not an eaten meal.
|
||||
- Don't break the cross-language parity gate (`tests/fixtures/kuchnia_day.json`,
|
||||
asserted by both suites). If you change `dishFieldValues` or the banked
|
||||
record, regenerate with `scripts/build_kuchnia_fixture.py` and **re-read the
|
||||
diff** — the script blesses whatever Python currently does.
|
||||
|
||||
### Verify on the phone, not just in tests
|
||||
|
||||
Mobile is the primary platform. Deploy with
|
||||
`~/.claude/scripts/phone_deploy.sh ~/diet-guard/app --release`. Never uninstall
|
||||
or `pm clear`.
|
||||
|
||||
**The phone is the user's daily driver — do not leave the app mid-flow, and do
|
||||
not grab focus on their desktop.**
|
||||
|
||||
Verifying bug 1 needs an actual log: prefill a delivered dish, log it, and read
|
||||
the entry back out of `food_log.json` after a sync. The kcal must match the
|
||||
dish's own value, not a multiple of it. A green widget test is what let this
|
||||
ship in the first place.
|
||||
|
||||
### Done
|
||||
|
||||
- A dish prefilled from the delivery logs its own macros exactly, with a stale
|
||||
`perGrams` present, proven by reading the written entry back.
|
||||
- The corrupted 2026-08-23 owsianka entry reads 472 kcal.
|
||||
- One tap on the log screen loads the delivery and walks it dish by dish, with
|
||||
the remaining count visible — observed on the phone.
|
||||
@ -2,7 +2,7 @@ name: diet_guard_app
|
||||
description: "Companion phone app for diet_guard: log meals on the go."
|
||||
publish_to: 'none'
|
||||
|
||||
version: 1.0.68+1
|
||||
version: 1.0.69+1
|
||||
|
||||
environment:
|
||||
sdk: ^3.12.2
|
||||
|
||||
Loading…
Reference in New Issue
Block a user