docs(nim): STATUS after review round 2, live at 290dbb4

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paul Campbell pushed by claude agent, operated by paul@keymail.dev 1a949e0390a3331e9697e1564499589d4e54fb82 parent 290dbb4
1 file changed, +25 −6
  • apps/nim/STATUS.md +25 −6
diff --git a/apps/nim/STATUS.md b/apps/nim/STATUS.md
index f705d36..b5b8208 100644
--- a/apps/nim/STATUS.md
+++ b/apps/nim/STATUS.md
@@ -1,16 +1,16 @@
-LIVE https://todo-nim.bfj.oncarlos.com 6aa1f35
+LIVE https://todo-nim.bfj.oncarlos.com 290dbb4
## Where it stands
-- Deployed `6aa1f35` (the review fixes) to `todo-nim` on account `bfj`,
- channel `edge`. `carlos deploy` confirmed it through the `/api/version`
- build probe. The first deploy was `df803f7`.
+- Deployed `290dbb4` (the second review round's fix) to `todo-nim` on
+ account `bfj`, channel `edge`. `carlos deploy` confirmed it through the
+ `/api/version` build probe. Earlier deploys: `df803f7`, then `6aa1f35`.
- Shared behaviour suite: **67 passed, 3 skipped** both locally
(`dist/app --listen`) and against
`https://todo-nim.bfj.oncarlos.com`. The skips are the suite's own: blur
and Escape editing with JavaScript off, and the screenshot test with
JavaScript off.
-- `make test`: 16 unit tests pass (store scoping, filters, toggle-all,
+- `make test`: 17 unit tests pass (store scoping, filters, toggle-all,
Unicode and 10,000-character titles, Unicode-whitespace trimming, migrations, cookies, 303s, 403 on
a foreign Origin, 404 on a foreign id, the edit view, fragments, static
files).
@@ -35,7 +35,26 @@ LIVE https://todo-nim.bfj.oncarlos.com 6aa1f35
- The README and AGENTS.md prose didn't go through a copy review. This
session ran unattended, and that review needs a person.
-## Review round
+## Review round 2
+
+The one finding is fixed in `290dbb4`:
+
+1. **Invalid UTF-8 in titles (security).** `title=%80` made
+ `unicode.strip` index out of bounds. The `IndexDefect` isn't a
+ `CatchableError`, so it got past the handler and stopped the server.
+ Now `action` runs `unicode.validateUtf8` on the decoded title before
+ anything else touches it, and answers **400** if it isn't valid. That
+ check is bounds-safe. Browsers always send UTF-8, so a real visitor
+ never hits this. A unit test covers truncated 2-, 3- and 4-byte
+ sequences and stray bytes for both add and edit, and the list is
+ unchanged afterwards. Before the fix, `title=%80` killed the local
+ binary. After it, the binary and the live host both answer 400 and
+ keep serving.
+
+After the fix the shared suite gave 67 passed and 3 skipped both locally
+and against the live host, and the boot check passed.
+
+## Review round 1
All four findings are fixed in `6aa1f35`: