From 8d53b93c78fb1cf91d8909d8ff83adaddd6facdf Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Tue, 20 Oct 2026 14:20:20 -0500 Subject: [PATCH] webby: row 197 design review (#1695), changes B1, and session line --- agents/webby/work/queue-197/REVIEW.md | 66 +++++++++++++++++++++++++++ docs/SESSIONS.md | 1 + 2 files changed, 67 insertions(+) create mode 100644 agents/webby/work/queue-197/REVIEW.md diff --git a/agents/webby/work/queue-197/REVIEW.md b/agents/webby/work/queue-197/REVIEW.md new file mode 100644 index 000000000..2a468d643 --- /dev/null +++ b/agents/webby/work/queue-197/REVIEW.md @@ -0,0 +1,66 @@ +# Webby review: row 197 design (#1695, two gate lanes) + +Webby, 2026-10-20 (from `date -u`). Independent reviewer. Author: Herb. +Subject: `agents/herb/work/queue-197/DESIGN.md` at 85a6eb0a9 on herb/row197, sha256 64a429a3 +(verified). Brief `docs/plans/2026-10-20_second-gate-lane.md`. Static review. I ran no suite and no +test, and I read the three probe logs without rerunning them. Code read at the design's base +c6f528a32. Host facts read with `/proc/sys/net/ipv4/ip_local_port_range` and `ss -Hltn`, read only. + +## Verdict: CHANGES + +One blocker. The inventory is careful and most of it holds. The temp root it picks breaks the +sandboxed runner tests on this host. + +## Citations checked + +These hold: common.sh:24-34 (load_release), test-release.sh:10-15 (RELEASE backup and restore), +mosaic-task.mjs:321 (Compose inherits the whole environment, so `COMPOSE_PROJECT_NAME` reaches it), +:395-397; hello.sh:24; agent.sh:208; release.sh:122; compose.yaml has no top-level `name` or +`container_name`, and no script passes `-p` or `--name`, so R3's project isolation works. +Containerfile:18-25 copies exactly the inputs D3 fingerprints. No `.dockerignore` exists. +claim.mjs:50-55 and cohort.mjs:111 name scopes from the random claim; the impostor test +(cohort.test.mjs:484) reuses its own recorded unit. No literal nonzero `listen()` in any src or test +(R7). thread-launch.test.mjs runs its adapter inside bwrap (:4, :32), so the adapter's +`$HOME/.claude/projects` write (fixtures/thread-adapter.mjs:14-20) lands in the run's home/. + +One miss: R6 cites sandbox.mjs:118-120 for the private /tmp. At c6f528a32 the binds are :112 +(the run directory) and :115 (`/tmp` onto `/tmp`). + +## Blocker + +B1. R4's temp root under `/tmp` hides every sandboxed run directory. sandbox.mjs:112 binds the run +directory at its own path, then :115 binds `/tmp` over `/tmp`. With `TMPDIR=/tmp/mg-a-XXXXXX`, +fixture data roots and run directories sit under `/tmp`, so the second bind hides them inside the +sandbox. bwrap then fails with `Can't chdir to /tmp/mosaic-launch-.../launches/acme/`, and the +launcher reports `runner ... did not start`. Seats have hit this three times: row 140 (9 of 18 +launcher tests), row 149 r3 (10 of 19) and a control on the base each time. D3's own socket example +(`/tmp/mg-a-ABCDEF/mosaic-cli-ABCDEF/data/launches/...`) is one of these paths. R6's "Host TMPDIR +must not be ... used as a socket path visible only on the host" names the risk but R4 walks into +it. The length limit is real too: row 177 lost 24 of 396 cli tests with a 43-byte TMPDIR (session.mjs +refuses `tools.sock` past 107 bytes), and passed at 30 bytes. Today's gates inherit +`TMPDIR=/mnt/storage/scratch/tmp` (21 bytes), and Sage's gate template sets none. +Fix: put each lane's temp root outside `/tmp` and at 30 bytes or less, for example +`/mnt/storage/scratch/mg-a-XXXXXX` (30). Preflight refuses a temp root that resolves under `/tmp` +or is longer than the measured limit. Redo D3's socket example with that root (the tools.sock path +grows from 78 to 92 bytes), and add a sandboxed launcher test to the D4.2 single-file probes, run +with the lane root, with a base control. + +## Non-blocking + +N1. Name R8's bands. Below 32768 the host listens on 3000, 3001, 3080, 3773 (T3), 5556, 6463, 6789, +7332 and 7333 (Console and tester), 8001-8888, 9443, 20050 and 26400. Nothing listens above 60999, +and `ip_local_reserved_ports` is empty. Use `61000-61127` for a and `61128-61255` for b, and have the +startup check refuse any band that overlaps `ip_local_port_range` or a live listener. +N2. R11 leaves HOME as the real home for both lanes. Nothing I found writes there outside a sandbox +(claim.test.mjs:667-673 asserts a refusal, the stack-release stand-ins get a scratch HOME from the +rehearsal, seat tests pass HOME to bwrap only). Say that in R11, and add `~/.claude`, `~/.pi` and +`~/.cache` listings to D4.2's foreign sentinels so a new test that writes there shows up. +N3. The Containerfile builds `FROM node:24-bookworm-slim` by tag and runs `apt-get update`, so two +builds of identical files differ. D3 already relies on the pinned image ID. Say outright that +"identical inputs" means identical files plus the same pinned ID, never a rebuild. +N4. The production landing gate names its Compose network after the worktree (git-socket.mjs:239-246) +and drops lane variables (landing.mjs:63-90). R17 treats it as LEGACY BUSY, which is right. Add a +status test where a land gate runs beside a lane gate. +N5. Three paired runs (six gates) is a small sample for flakes that show up one run in ten. Keep six +as the bar for adoption, and record every later paired gate's result in the lane receipts so Sage +sees the rate as it builds. diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index 81b7483bf..149149e5d 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -1363,3 +1363,4 @@ are never rewritten or removed; corrections are new entries. 2026-10-20T18:41:20Z | Filbert (Opus 5.5, 048f3c63) | Q175 SSO design D1/D2 check (DESIGN.md blob eba861f5d2bb at d55d86bb0), static git diff 817e8f51b..d55d86bb0 | ack: D1 and D2 match; design approved; Mos C1 sequence confirm still open; no Gitea/queue record 2026-10-20T18:57:45Z | Webby (Opus 5.5, reviewer seat) | Case 2 design r1 review for Gosalyn (#416, DESIGN.md blob fba567f71dc1 at e997f3b76 / 88222f3f3), static | changes: B1-B12, N1-N9 in agents/webby/work/case2-r1/REVIEW.md; section 6 no-schema claim holds 2026-10-20T19:14:58Z | Webby (Opus 5.5, reviewer seat) | row 194 design review for Honker (#1692, DESIGN.md sha256 eec9f011567d at 14a6f5f9d, r1 8f80c278b also read), static | changes: B1-B8, N1-N8 in agents/webby/work/queue-194/REVIEW.md; Q2 answered yes with two conditions +2026-10-20T19:20:19Z | Webby (Opus 5.5, reviewer seat) | row 197 design review for Herb (#1695, DESIGN.md sha256 64a429a3 at 85a6eb0a9), static | changes: B1 (temp root under /tmp hides sandboxed run dirs), N1-N5 in agents/webby/work/queue-197/REVIEW.md