webby: row 221 round 1 review, approve, and session line

This commit is contained in:
2026-10-21 05:37:27 -05:00
parent efd6c1f028
commit a0a00630ea
2 changed files with 77 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
# Webby review: row 221 (#1722), C2-20, round 1
Webby, 2026-10-21T10:36Z (from `date -u`). Author: Gosalyn. Request comment 30024 (revs 2806-2807,
sage-1939, posted by Sage as jarvis). Brief: docs/plans/2026-10-20_case2-rows.md "C2-20", blob
16847e94ae17. Rulings: sage-1836 (fence export, pairing by argument) and sage-1840 (yaml 2.9.0 exact,
no chown). Candidate: manifest digest 20f05e3a6ad51a3493849b6a911f62b00c33fdedb14dc898f6eeb525235ef1ad,
22 paths, on gosalyn/c2-20-r2 8f403d0d4. 48f044ccc is the code on 62ddc96cc, and 8f403d0d4 adds BUILD.md.
What I checked, without runs or a worktree:
- I took the manifest text from `queue show 221`. It hashes to the digest above, and each path's
sha256 from `git show 8f403d0d4:<path>` matches its line.
- 62ddc96cc..8f403d0d4 touches exactly the 22 manifest paths. `git patch-id --stable` of 48f044ccc
is eb094ae783e9, as BUILD.md says.
- Overlap: the refactor tip is 29ce1e360. 62ddc96cc..29ce1e360 changes none of the 22 paths.
- The script is 100755. The 16 fixture files and the rest are 100644.
- I read the whole script, test file, trace helper, fixture README, the bundle.mjs and package
diffs, and BUILD.md.
- No test pins a sha256 of bundle.mjs, package.json or package-lock.json. The lock already had
node_modules/yaml at 2.9.0 (package-lock.json:2192), so the pin moves nothing.
Gosalyn's singles on Sage's slot, 10:18:09-10:30:14Z, were 18 files 419/0 (BUILD.md). I ran nothing.
## Verdict: APPROVE
The script does what the brief and the two rulings ask.
- The fence has one copy. `personaTextFault` (bundle.mjs:193-197) holds the three rules readPersona
had, with the same reasons, and readPersona calls it (:231-232). Its messages are byte for byte the
old ones. The script imports it (case2-persona-import.mjs:31) and applies it at stage (:239-242),
before anything is written, and again at install on the staged bytes (:284-285). The tests take
8000 two-byte characters as passing, and they refuse 8001, `</persona-file>`, `## ` and `# `.
- The pairing follows sage-1836 (c). There are exactly two `--pair` arguments, a profile id from
hermes_cli/profiles.py:37, and an lstat'd directory that isn't a symlink. Each name is exactly Bean
or Chet, and the profiles and names differ (:85-101). The pairing line, with SOUL.md bytes and
sha256, prints before the fence check and before any write (:231-233). The test checks that it comes
before `staged:`. BUILD.md records that Hermes has no name field and how this answers DESIGN.md:1322.
- Reads. stage opens SOUL.md and config.yaml per profile, with O_NOFOLLOW and O_NONBLOCK and a size
cap (:105-122). The dry run opens only SOUL.md. The trace test hooks every fs open, read and list
through syncBuiltinESMExports, and has a positive control on both SOUL.md files. It allows only the
four expected paths, and it checks that the dry run never reads config.yaml. Memory, sessions,
skills, state.db, profile.yaml, auth.json and .env are never opened.
- Output. It prints the pairing, the per-channel prompt names and byte counts, the staged and
installed paths, and the two vars. assertNoText walks every fixture marker (at least 20) and the
prompt phrases over stage and install output. yaml's warnings are off (:168), and a parse failure
gives a fixed message.
- Files. The staging dir is a new 0700 directory or our own closed one, and every file is O_EXCL,
O_NOFOLLOW and 0600 (:183-214). install refuses a staged file that isn't the caller's or is open to
group or other. It checks each digest against the manifest, and it lstats both targets before it
writes either (:293-297). The target `<configDir>/personas/<business>/<instance>.md` is the path
readPersona opens (bundle.mjs:204, launcher.mjs:394). install runs as `<user>`, so the uid and mode
checks there hold too.
- The dry run prints `files N` and one count line per profile. The heading split (:59) uses the same
line terminators as the fence's `/m`. The word list has 69 tool names plus Hermes and Discord (71
entries), matched whole word in any case. The test counts three lines, rejects `memory_bank`,
`discords` and `Web searching`, and checks that no matched word is printed.
## Non-blocking
N1. Channel ids and platform keys from config.yaml print raw (:147, :237). A key holding a newline or
an escape sequence would reach Jason's terminal as is. It's her own config and the ids are numbers or
short names, so the risk is low. `JSON.stringify` on the key, or a refusal for keys outside
`[A-Za-z0-9_.-]`, would close it.
N2. The dry run reports lines and headings but not the 8000 character limit. A SOUL.md between 8001
characters and 32000 bytes gives normal counts on the dry run and then refuses at stage. Over 32000
bytes, the dry run refuses (:128), so the header's "A fence fault there is counted, not refused"
(:23) holds for headings only. Neither goes beyond the brief, and stage refuses before it writes. A
`characters N` field in the dry run line would warn Jason a step sooner.
N3. Morgana's agents/morgana/work/queue-213/mutants.py:48 (B3) matches the old readPersona line, which
this row replaces. A rerun of 213's mutant set on this base would fail to apply B3 until its pattern
names the new line at bundle.mjs:195. It's packet history, so nothing is needed unless someone reruns
the set.
N4. privateDir's lstat and mkdir (:184-188) aren't atomic. A directory created between the two
throws a raw EEXIST with a stack, not a Refusal. It fails closed either way.
+1
View File
@@ -1414,3 +1414,4 @@ are never rewritten or removed; corrections are new entries.
2026-10-21T09:32Z | Webby (Opus 5.5, reviewer seat) | row 231 C2-01b round 1 (88daaac50, manifest d4c4cf09) review | CHANGES B1 B2; notes agents/webby/work/queue-231/REVIEW-r1.md
2026-10-21T09:37Z | Webby (Opus 5.5, reviewer seat) | row 213 C2-08 round 4 (2b3e67e36 on c771a36f4, manifest 26d4d0ec) rebase and 234 grant recheck | APPROVE; notes agents/webby/work/queue-213/REVIEW-r4.md
2026-10-21T09:52Z | Webby (Opus 5.5, reviewer seat) | row 231 C2-01b round 2 (f37a65857, manifest 312c16fc) review | APPROVE; notes agents/webby/work/queue-231/REVIEW-r2.md
2026-10-21T10:37Z | Webby (Opus 5.5, reviewer seat) | row 221 C2-20 round 1 (8f403d0d4, manifest 20f05e3a) review | APPROVE; notes agents/webby/work/queue-221/REVIEW-r1.md