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
This commit is contained in:
Craig
2026-07-26 15:18:56 +01:00
parent b69661c997
commit f8048da9c1
11 changed files with 414 additions and 24 deletions
+90
View File
@@ -0,0 +1,90 @@
# 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).