| 1 | LIVE https://todo-swift.bfj.oncarlos.com 354c88a |
| 2 | |
| 3 | ## Checked |
| 4 | |
| 5 | - `make test`: 21 Swift Testing tests pass. |
| 6 | - Shared suite against `dist/app --listen 127.0.0.1:<port>`: 67 passed, |
| 7 | 3 skipped (the suite's own skips: blur and Escape need JavaScript, and |
| 8 | the screenshot is compared with JavaScript on only). |
| 9 | - `scripts/boot-check.sh dist/app-linux-arm64`: `/healthz` and |
| 10 | `/api/version` 200 (`354c88a`), clean exit on SIGTERM. |
| 11 | - `make deploy`: shipped and promoted `354c88a` to `edge`, and |
| 12 | `/api/version` on the live host reports it. |
| 13 | - Shared suite against `https://todo-swift.bfj.oncarlos.com`: 67 passed, |
| 14 | 3 skipped. |
| 15 | |
| 16 | ## Notes |
| 17 | |
| 18 | - Stack: Hummingbird 2 and SQLiteNIO (which compiles SQLite 3.54 in), |
| 19 | built with the Swift 6.2 Static Linux SDK. The arm64 binary is static, |
| 20 | stripped, and 22 MB. Turning off Hummingbird's `FullFoundation` trait |
| 21 | and importing only `FoundationEssentials` took it down from 66 MB. |
| 22 | - A cold `make build-arm64` takes a few minutes here; an incremental one |
| 23 | after `make bump` recompiles one file. |
| 24 | - Nothing in the contract needed a deviation. |
| 25 | |
| 26 | ## Review round |
| 27 | |
| 28 | Both findings are fixed in `static/app.js` (commit `354c88a`): |
| 29 | |
| 30 | 1. **Typing during an add.** The form is read and the new-todo input |
| 31 | cleared when the form is submitted, not when the answer arrives. A |
| 32 | second Enter while the first add is still pending is queued, not |
| 33 | dropped. Each edit is saved once, guarded per item, instead of |
| 34 | blocking the whole form. |
| 35 | 2. **Stale snapshots.** Actions go through one promise queue, so they |
| 36 | reach the server and come back in the order they were made, and the |
| 37 | last swap is always the newest state. |
| 38 | |
| 39 | Checked by hand in Chromium with Playwright, with the first response held |
| 40 | back 800 ms. Adding "first", then "second", then typing "third" left both |
| 41 | items saved and "third" still in the input. Toggling two items quickly |
| 42 | left both completed, with "0 items left". The shared suite passes |
| 43 | locally (67 passed, 3 skipped) and against the live host (67 passed, |
| 44 | 3 skipped). |
| 45 | |
| 46 | The first `make deploy` was refused with "too many uploads" (a |
| 47 | platform-side rate limit). My retry loop then shipped the same |
| 48 | `354c88a` build several more times, which was harmless. |
| 49 | |