Files
calcount/HANDOFF.md
T
Craig f8048da9c1 chore: gitignore QA artifacts, bake evidence/server-lifecycle rules into agents
- Untrack .playwright-cli/ and ignore it + *.png; route QA artifacts to /tmp
- be/fe-implementer: require git status + test output + live smoke test in
  every report; never trust a running server, restart fresh; say so if
  unfinished (fixes the false-success-report failure mode from session 1)
- qa: adversarial stance (distrust self-reports, confirm features exist via
  /openapi.json), restart both servers + reset dev DB before testing, write
  expected numbers into scenarios
- Add HANDOFF.md and RETROSPECTIVE.md as session docs
2026-07-26 15:18:56 +01:00

91 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CalCount — Session Handoff (2026-07-26)
Status snapshot for the next worker. Read `SPEC.md` and `IMPLEMENTATION_PLAN.md`
first; this file only records progress and session-specific notes.
## Where we are in the plan
**Milestone M1 (Manual calorie tracker) is COMPLETE.** Tickets 001005 all
implemented, QA-verified, and committed. The app is usable end-to-end for
manual food entry and daily logging.
| Ticket | Status | Commit |
|--------|--------|--------|
| 001 Foods CRUD + soft-delete | ✅ done, QA passed | `3f2c765` |
| 002 Targets CRUD (single-active invariant) | ✅ done, QA passed | `601c0d4` |
| 003 Daily log write path | ✅ done, QA passed | `87d7eca` |
| 004 Day summary endpoint | ✅ done, QA passed | `5372e8c` |
| 005 Frontend daily view | ✅ done, QA passed | `b69661c` |
| 006 OFF + barcode scan/search flows | ⬜ **next** | — |
| 007 Meals (from-log, unpack, recursion) | ⬜ pending | — |
| 008 Food library view + restore | ⬜ pending | — |
Test counts at HEAD: backend **104 passed** (`cd backend && uv run pytest`),
frontend vitest + `npm run build` green.
## What was done this session
- Reviewed codebase/spec/plan; confirmed only scaffold existed.
- Ran tickets 001005 through the agentic flow: `be-implementer` /
`fe-implementer` build, `qa` verifies independently (curl for backend-only
tickets, playwright-cli browser automation for frontend), orchestrator
commits between tickets.
- Backend now has: full foods CRUD with soft-delete + shared query helpers,
targets with transactional single-active invariant + historical lookup,
daily log CRUD with embedded food payloads, and `/api/log/summary` with all
nutrition math consolidated in `services/nutrition.py` (weight vs count
scaling; meals intentionally contribute 0 — marked TODO for TICKET-007).
- Frontend now has: dashboard with progress bar vs target, meal-slot grouping,
inline edit/delete, date navigation (UTC-safe `shiftDate` in
`lib/format.js`), manual Add Food form, search-and-log flow with live
preview, minimal target form, loading/error/empty states, mobile-first
layout. All HTTP via `lib/api.js`; shared state in `stores.svelte.js`;
Svelte 5 runes only.
## Process lessons (important for the next orchestrator)
1. **Implementer agents can falsely report success without writing code.**
This happened twice (TICKET-004 backend, first TICKET-005 frontend attempt).
Mitigations that worked:
- Every implementer task must require `git status --short` evidence and a
live smoke test (curl the endpoint / build + serve) in its report.
- QA must be explicitly told not to trust the implementer's report and to
verify the feature exists (e.g. check `/openapi.json` routes) before
testing.
2. QA (playwright) genuinely catches real bugs — it found broken date-nav
buttons and a stale-summary bug in TICKET-005; both were fixed and
re-verified before commit.
3. Backend servers go stale between tickets (old uvicorn missing new routes).
QA handles restarts, but expect it.
## Where to pick up: TICKET-006 (Milestone M2)
OFF normalization + barcode scan & search flows. Depends on 005 (done).
Read the TICKET-006 section of `IMPLEMENTATION_PLAN.md` — key points:
- Backend: OFF → foods normalization in exactly one module (kcal/kJ mapping,
User-Agent, timeouts); `GET /api/off/product/{barcode}`, `GET /api/off/search`,
`POST /api/off/refresh/{food_id}`; restore-on-rescan rule (§3.1); implement
`GET /api/foods/recent`; httpx mocked at the boundary in tests.
- Frontend: `BarcodeScanner.svelte` + `lib/scanner.js` (native
`BarcodeDetector` with lazy zxing-wasm fallback, ~35 fps decode loop,
camera teardown on destroy); scan flow per §4.1 with manual barcode
fallback; OFF fallback in search per §4.2; recent foods surfaced in UI.
- **Camera testing caveat (from the user):** a webcam exists but real scanner
verification (esp. the §8.4 phone checklist — Android Chrome, iOS Safari,
EAN-13/UPC-A) needs the user manually over Caddy HTTPS. Don't block the
ticket on camera QA: verify the manual-barcode fallback and OFF search
flows via playwright, and mark the phone checklist as pending user testing.
## Loose ends / chores
- `.playwright-cli/` artifacts are polluting the repo (some were even tracked
in git before this session). Recommend: `git rm -r --cached .playwright-cli`,
add it (and `*.png` QA screenshots) to `.gitignore`, commit.
- `README.md` has an uncommitted user edit ("Agentic dev" section) — left
untouched deliberately; commit or discard at the user's discretion.
- Dev DB (`backend/calcount.db`) contains QA test data ("QA Porridge", a
2000 kcal target). Reset by stopping uvicorn, deleting the file, restarting
(migrations recreate the schema on startup).
- Leftover background processes may be running (uvicorn :8000, vite :5173).