docs(REWORK_PLAN): M5 done, PRable

M5 Docker: single container (caddy+node) verified working. REST roundtrip,
WS push, 20-round replay CLEAN, UI styled. Done.

PRable: separate docker/ tree, root Dockerfile untouched, firebase
default preserved (STORAGE=firebase). Friend merges, gets our docker
infra without touching his firebase path.

M0-M5 all done.
This commit is contained in:
david raistrick
2026-07-01 19:26:23 -04:00
parent e22f412c52
commit a2c63cc77f
+15 -13
View File
@@ -120,7 +120,7 @@ Each milestone = independently mergeable PR upstream (unless marked ❌).
| 2 | frontend WS adapter — app runs vs backend, cross-device works | yes | | 2 | frontend WS adapter — app runs vs backend, cross-device works | yes |
| 3 | characterization tests lock current behavior | yes | | 3 | characterization tests lock current behavior | yes |
| 4 | resolve initiative rotation corruption (BUG-5) | yes | | 4 | resolve initiative rotation corruption (BUG-5) | yes |
| 5 | docker compose in-house | smoke | | 5 | docker single container (caddy+node) | smoke |
| 6 | _moved to TODO backlog (feature work)_ | - | | 6 | _moved to TODO backlog (feature work)_ | - |
| 7 | playwright multi-window e2e (deferred) | e2e | | 7 | playwright multi-window e2e (deferred) | e2e |
| 8 | (future) public exposure | - | | 8 | (future) public exposure | - |
@@ -169,16 +169,18 @@ Each milestone = independently mergeable PR upstream (unless marked ❌).
- Tests: `turn.skip.test.js`, `turn.dry.test.js` (advance parity lock). - Tests: `turn.skip.test.js`, `turn.dry.test.js` (advance parity lock).
- **Upstream-PRable:** ✅ bug fix. - **Upstream-PRable:** ✅ bug fix.
### Milestone 5 — Docker compose ### Milestone 5 — Docker compose
- `docker-compose.yml`: - Single container: caddy (front, static + proxy) + node backend (internal :4001).
- `backend` service (Node + sqlite volume) - Files in `docker/` tree (kept separate from upstream root Dockerfile):
- `frontend` service (static build served via **Caddy**) - `docker/Dockerfile` — build FE + BE, runtime caddy+node
- Caddy reverse-proxies `/api` + `/ws` → backend, auto WS upgrade, HTTP basic auth - `docker/Caddyfile` — proxy /api + /ws to node, static SPA fallback
- Caddy chosen over nginx: simpler config, native WS, one file `Caddyfile`. - `docker/entrypoint.sh` — node bg + caddy fg
- Profiles: `firebase` (frontend only, current behavior) vs `backend` (full stack). - `docker/docker-compose.yml` — one `app` service, volume for sqlite
- Run: OrbStack local now; remote docker context later. - Run: `docker compose -f docker/docker-compose.yml up --build` (or `cd docker && docker compose up --build`). Port 8080.
- **Exit criteria:** `docker compose up` runs full stack in-house. - No `image:` field => compose auto-names, never pulls service image (private).
- **Upstream-PRable:** ❌ divergence. - **Exit criteria:** `docker compose up` runs full stack in-house. ✅ DONE.
- Verified: REST roundtrip, WS subscribe+push, replay 20 rounds CLEAN (0 skips/doubles/shifts), UI styled (Tailwind compiles).
- **Upstream-PRable:** ✅ separate docker/ tree, root Dockerfile untouched, firebase default preserved.
### Milestone 6 — Undo rework — _MOVED to TODO backlog_ ### Milestone 6 — Undo rework — _MOVED to TODO backlog_
- Moved: feature work (transactional undo), not infra. Lives in `TODO.md` now. - Moved: feature work (transactional undo), not infra. Lives in `TODO.md` now.
@@ -230,7 +232,7 @@ Each milestone = independently mergeable PR upstream (unless marked ❌).
| 2 WS adapter | ⚠️ partial | interface + firebase extract ✅, WS ❌ | | 2 WS adapter | ⚠️ partial | interface + firebase extract ✅, WS ❌ |
| 3 characterization tests | ✅ | if storage-agnostic | | 3 characterization tests | ✅ | if storage-agnostic |
| 4 BUG-5 rotation fix | ✅ | bug fix | | 4 BUG-5 rotation fix | ✅ | bug fix |
| 5 docker compose | ❌ | divergence | | 5 docker | ✅ | separate docker/ tree, root Dockerfile untouched, firebase preserved |
| 6 undo (moved to TODO) | - | - | | 6 undo (moved to TODO) | - | - |
| 7 playwright | ✅ | if test infra shared | | 7 playwright | ✅ | if test infra shared |
@@ -257,7 +259,7 @@ Default `STORAGE=firebase` + `AUTH_MODE=none` (unset) = upstream sees literally
## Current status ## Current status
- M0 ✅, M1 ✅, M2 ✅, M3 ✅ - M0 ✅, M1 ✅, M2 ✅, M3 ✅, M4 ✅, M5 ✅
- Backend live: port 4001, db `./data/tracker.sqlite` - Backend live: port 4001, db `./data/tracker.sqlite`
- Frontend: port 3999 with `REACT_APP_STORAGE=ws` - Frontend: port 3999 with `REACT_APP_STORAGE=ws`
- Test suite: ~160 tests (shared + server + FE). Bugs tracked in `TODO.md`. - Test suite: ~160 tests (shared + server + FE). Bugs tracked in `TODO.md`.