# Integration Log Maintained by the lead. Contract: [contract.md](contract.md). ## Board | worker | branch | status | last handoff | open issues | |---|---|---|---|---| | add | worker/add | merged (1cb8132) | 95c3b13: POST /api/books + BookCreate validation, 17 tests | none | | query | worker/query | merged (66f15df) | 99f7b1f: GET /api/books (+filter), PATCH /api/books/{id}, GET /api/stats, 14 tests | none | | ui | worker/ui | merged (00ad7a2) | 1ec4a34: GET / + single page (add/filter/PATCH/stats/feedback), 12 tests | none (browser E2E verified) | | tests | worker/tests | merged (e1c42dc) | 3e01771: 44 contract tests, red on skeleton for the right reason (404 missing routes) | none | | deploy | worker/deploy | merged (8d051c6) | 080b660: uv pinned to 0.8.14; Dockerfile, .dockerignore, README (HF frontmatter), smoke.sh — smoke 8/8 on main's image | none | | ui-refresh | worker/ui-refresh | merged (2d79c60), deployed (HF af51a32) | 6c43565: Warm library redesign; test_ui 12→23 tests | follow-up: polish native controls in add form | | ui-polish | worker/ui-polish | merged (e4855f2), not yet deployed | 786bda5: status chips, custom controls, focus/hover/Adding… states, LH initials, canvas favicon; test_ui 23→34 | awaiting user OK to redeploy | ## Log - 2026-09-28 — lead: contract approved and written; runnable skeleton committed on main (`uv run pytest -q` → 1 passed). Merge order: tests → add → query → ui → deploy. - 2026-09-28 — lead: worker prompts written (`docs/worker-prompts/`); five worktrees created under `.claude/worktrees/` on `worker/` from main; all five workers launched in parallel. - 2026-09-28 — lead: tests handoff verified (1 file, black-box, 44 tests, all failing on missing routes). Merged to main as e1c42dc. **main is RED: 44 failed, 1 passed** — expected; goes green as add and query land. - 2026-09-28 — lead: add handoff verified (diff confined to BookCreate, BookStore.add, add.py, test_add.py; lock used). Merged as 1cb8132, clean merge. main: **21 failed, 41 passed** — remaining failures are all list/PATCH/stats (query) and GET / (ui). - 2026-09-28 — lead: deploy handoff reviewed. Good overall; sent back one fix: pin `ghcr.io/astral-sh/uv:latest` → `0.8.14` for reproducible HF builds. Merge held until last per merge order. - 2026-09-28 — lead: ui handoff reviewed and approved (3 owned files; textContent/DOM only, no innerHTML; contract error rule; failed PATCH reverts select; no external URLs). Held for merge after query. Open: end-to-end browser check once merged. - 2026-09-28 — lead: query handoff verified (3 owned areas; lock in all methods). Merged as 66f15df — `app/store.py` auto-merged cleanly with add's body (0 NotImplementedError left, 4 locked methods). main: **1 failed, 75 passed** (only GET /, owned by ui). - 2026-09-28 — lead: ui merged as 00ad7a2. main: **88 passed** — contract suite fully green. - 2026-09-28 — lead: deploy uv-pin fix verified (080b660); merged as 8d051c6. 88 passed. Image built from main; `scripts/smoke.sh` against the container: 8/8 PASS on a fresh store and again on a populated one. - 2026-09-28 — lead: browser E2E against the container (headless Chromium): add with trimming, HTML-in-title rendered as text (0 injected elements), client blank-title message, server 422 shown as "title: String should have at most 200 characters", PATCH + stats refresh, status filter. Only console error is the expected 422 resource log. **Next: HF Space deploy — awaiting user approval.** - 2026-09-28 — lead (user-approved): deployed to public HF Docker Space **https://huggingface.co/spaces/pardeep-singh/reading-list** (app: https://pardeep-singh-reading-list.hf.space). Uploaded `git archive main` at 730966e minus `.claude/` (HF commit 06b349d). Build → RUNNING. Live `scripts/smoke.sh`: 8/8 PASS, twice. Live browser E2E: add (trimmed), PATCH + stats refresh, filter — all OK. Space restarted afterwards to clear test data; live store verified empty (`total: 0`, `[]`). - 2026-09-28 — lead: user approved "Warm library" UI redesign (bounded; no API change). Contract UI section clarified (display labels are presentation-only; filter may be a radio tab group with counts from stats). Prompt `docs/worker-prompts/ui-refresh.md`; worker launched on `worker/ui-refresh`. Redeploy only after user reviews screenshots. - 2026-09-28 — lead: ui-refresh handoff verified (2 owned files; no HTML sinks, no URLs). Merged as 2d79c60. main: **99 passed**. Image smoke 8/8. Browser E2E: add (HTML-in-title rendered as text), client blank + server 422 messages, PATCH pill + stats, filter tabs via label click and arrow keys (with wrap), accessible radios "All 7 / To read 2 / …", no 360px overflow. Screenshots desktop/mobile × light/dark + empty state reviewed. Only console error is the expected 422. Redeploy pending user approval. - 2026-09-28 — lead: Playwright audit (user-requested). Live (old UI): 8/8 visible controls native. Redesign: 4 still native (add form inputs, #status select, button); pills/tabs custom. Real `color_scheme=dark` emulation confirms the dark theme. - 2026-09-28 — lead (user-approved): redeployed main ee5f908 → HF commit af51a32. Live smoke 8/8; Playwright on live (incl. HF iframe): h1 "My Reading List", no console errors light/dark/ 390px; add, targeted PATCH (pill + tiles 0/1/1), filter tabs + arrow keys OK. Space restarted, live store verified empty. Next (proposed): polish round for the remaining native controls. - 2026-09-28 — lead: user asked for a polished version. Bounded, presentation-only. Contract UI note: add-form status may be a radio group. Prompt `docs/worker-prompts/ui-polish.md` (status chips, no native appearance, focus ring, hover/active/"Adding…" states, article-aware initials, canvas-drawn favicon). Worker launched on `worker/ui-polish`. - 2026-09-28 — lead: ui-polish handoff verified (2 owned files; no HTML sinks/URLs). Merged as e4855f2. main: **110 passed**; image smoke 8/8. Playwright 18/18: 0 visible native-looking controls; keyboard Title→Author→chips + ArrowRight; "Adding…" disabled with stable width (112.6px); chip status saved; initials "LH"; form resets to To read; HTML-in-title as text; pill PATCH + tiles (tiles refresh just after toast — confirmed, not a bug); filter tabs; no overflow at 390px light/dark; no console errors; favicon = canvas PNG. Screenshots reviewed. Redeploy pending user approval.