docs(spinel): STATUS — review fixes live at 6692def

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paul Campbell pushed by claude agent, operated by paul@keymail.dev e34488221c915569d6ceb321c2a2116154694aa4 parent 5798862
1 file changed, +31 −5
  • apps/spinel/STATUS.md +31 −5
diff --git a/apps/spinel/STATUS.md b/apps/spinel/STATUS.md
index f4eabe6..7dd8f21 100644
--- a/apps/spinel/STATUS.md
+++ b/apps/spinel/STATUS.md
@@ -1,4 +1,4 @@
-LIVE https://todo-spinel.bfj.oncarlos.com c4b39d6
+LIVE https://todo-spinel.bfj.oncarlos.com 6692def
## Where it stands
@@ -6,8 +6,9 @@ LIVE https://todo-spinel.bfj.oncarlos.com c4b39d6
JS-only edit tests with JS off, and the screenshot test with JS off).
It passes locally too, against the x86-64 build and against the arm64
binary under qemu, both with `SPINEL_GC_STRESS=1`.
-- `make test` (test/run.sh, 72 curl checks of the contract, run plain and
- again under GC stress) passes.
+- `make test` (test/run.sh, 86 checks of the contract over curl and raw
+ sockets, run plain and again under GC stress) passes, against the x86-64
+ build and against the arm64 binary under qemu.
- `scripts/boot-check.sh dist/app-linux-arm64` passes.
- `dist/app-linux-arm64` is a static aarch64 ELF, 8.8 MB, no shared
libraries.
@@ -34,5 +35,30 @@ LIVE https://todo-spinel.bfj.oncarlos.com c4b39d6
links OpenSSL, and the static link needs `libssl.a`; it also pulls in
`-lz -lzstd`).
- **One worker.** tep's server here is a single blocking process that
- closes each connection after its response, with a 5-second read
- timeout so an idle connection can't hold it.
+ closes each connection after its response. Each request has a 10-second
+ deadline for the whole exchange, so a slow or idle client can't hold it.
+
+## Review findings (all four fixed, deployed as 6692def)
+
+1. **Per-read timeout.** Replaced by one 10-second deadline per request:
+ before every read and write, the socket timeouts are set to the time
+ left. A test trickles one byte a second and is cut off within 12 s.
+2. **Bodies capped at 64 KiB.** tep's C shim now reads bodies whole, up to
+ 256 KiB, into a growing buffer. Above that the answer is 413. A body
+ short of its `Content-Length`, carrying a NUL, or sent chunked gets 400
+ before any handler runs, so nothing changes. tep's SQLite column
+ buffer grew from 64 KiB to 256 KiB to match. A 10,000-emoji title
+ (about 120 KB encoded) round-trips locally and on the live host.
+3. **Unissued cookies accepted.** A new `visitors` table records every
+ token the server issues. A cookie that isn't in it gets a fresh random
+ token. A migration backfills the tokens of lists that already existed,
+ so current visitors keep their lists (checked against a database at the
+ old schema).
+4. **`--listen` on any address.** The binary now accepts only loopback
+ (`127.0.0.0/8`, `::1`, `localhost`) and exits with status 2 for any
+ other address, a missing port, or neither `--socket` nor `--listen`.
+ tep's every-interface fallback is gone.
+
+## Review findings not fixed
+
+None.