From 35130c26bba83662b7d4aeaf194f842ee87cf5b2 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Wed, 21 Oct 2026 17:30:52 -0500 Subject: [PATCH] webby: Case 2 playground ruling and v1 briefs reviews (mos-1233), both changes, and session line --- .../webby/work/case2-playground/REVIEW-d1.md | 67 +++++++++++++++++ .../webby/work/case2-v1-briefs/REVIEW-d1.md | 75 +++++++++++++++++++ docs/SESSIONS.md | 1 + 3 files changed, 143 insertions(+) create mode 100644 agents/webby/work/case2-playground/REVIEW-d1.md create mode 100644 agents/webby/work/case2-v1-briefs/REVIEW-d1.md diff --git a/agents/webby/work/case2-playground/REVIEW-d1.md b/agents/webby/work/case2-playground/REVIEW-d1.md new file mode 100644 index 000000000..cfe8d3260 --- /dev/null +++ b/agents/webby/work/case2-playground/REVIEW-d1.md @@ -0,0 +1,67 @@ +# Webby review: Case 2 playground ruling, three levels (mos-1233), round d1 + +Webby, 2026-10-21T22:29Z (from `date -u`). Author: Gosalyn (gosalyn-0122). For mos-1233, Vikunja 464. +Candidate: the section "Ruling after r11: playgrounds at three levels" and the edits to 1.1 and 1.2 in +agents/gosalyn/work/case2/DESIGN.md, `git diff 624212842 7a7c00464` on gosalyn/case2-design. It's a design +round, so there's no queue record. + +What I checked, without runs: the diff against TARGET.md:92-95 (Mos's STATE repo, read only), REQ-LIB-2 +and REQ-LIB-3 as written in PRD 1.12 r1 (origin/ludwig/prd-1.12 docs/prd/mosaic-stack.md:1103-1120 and the +level note at :1487-1490), design 1.3, 1.4, 3 and 5.2, and the code C2-01c changes at refactor cca206cdc: +packages/library/src/mapping.mjs and scope.mjs, and the mapping tests. + +## Verdict: CHANGES + +B1. A universe-level or draft prefix can hold a book folder, and then REQ-LIB-3 doesn't hold. +- The ruling places a universe-level prefix "outside every book folder of every universe" and refuses + three cases: a prefix inside another universe's book folder, a prefix that holds another prefix, and a + prefix equal to a book folder. Nothing refuses a prefix that holds a book folder. Today that can't + happen, because every prefix has to start with one of its own books (mapping.mjs:82-85). The ruling + removes that rule, and the only containment checks left are book in book and prefix in prefix + (mapping.mjs:122-123). +- The new scope rule checks prefixes first. Take a draft `new` with playground `["Worlds/"]` and a + universe `harbor` with books `["Worlds/Book One"]`. Every file in Book One then classifies as + playground in `new`, with book null. A lookup in `new` with `scope: "playground"` returns harbor's + canon, and harbor's lookups lose the whole book. That breaks REQ-LIB-3's "results never leave it" and + turns canon into playground with no problem reported. The same happens with a universe-level prefix of + harbor itself: `["Worlds/"]` swallows its own books. +- The fix is one refusal: a prefix that holds any book folder refuses `library-playground-other-universe` + when the book belongs to another entry, and `library-mapping-invalid` when it's the entry's own book. + Add a test for each in C2-01c. With that in place, I agree REQ-LIB-3 holds as written. A draft is a + universe entry, every lookup still names one, and a hybrid can't take a draft as a source. + +## Non-blocking + +N1. The 1.2 table's `unmapped` row still ends "anything outside a book folder". After the ruling, a `.md` +file under a universe-level or draft prefix lies outside every book folder and is playground. Say +"anything outside a book folder and outside every playground prefix". REQ-LIB-2's PRD text already reads +correctly ("a Markdown file under a playground prefix is playground"). + +N2. C2-01c has to say what `kind` may be. Today a non-hybrid entry can't carry `kind` at all (the `only` +list at mapping.mjs:70). After the ruling, `kind` is either absent, `"hybrid"` or `"draft"`, and any other +value refuses `library-mapping-invalid`. A draft's allowed keys are `kind`, `name` and `playground`. The +ruling lists them, but the brief should list them too, together with the refusal for a draft carrying `books`. + +N3. `classify` finds the book first and the prefix second (scope.mjs:10-18), and the survey and reader +call it (survey.mjs:66, reader.mjs:182). C2-01c rewrites it to check prefixes first. The brief should name +every reader of `universe.books` and of `classify(...).book`, so a draft with no books and a null book +don't reach code that assumes them. C2-05a, C2-06 and the survey's per-book counts are the likely ones. +The existing mapping tests for `library-playground-outside-book` (mapping.test.mjs:16-20) change code +too, so they're C2-01c's files. + +N4. Section 8's row list has no C2-01c line, and the rows file has no brief for it. Sage briefs the row. +The ruling's last paragraph is what that brief should copy. + +## Checked and fine + +- TARGET.md:92-95. Book level is unchanged. Universe level covers "for books in a universe" outside any + one book. The draft covers "where new universes can be created". The PRD level note (:1487-1490) can + drop its caveat once this lands. +- REQ-LIB-2. Scope still comes from the path alone. A playground at any level is never canon. The + lookups' canon default and `playground-cited-as-canon` don't depend on the level. +- `citation-cross-universe` treating a draft as its own universe, R5 for a canon link into any playground + and R6 for a link into a draft fit 1.3's table as written. +- The type of a universe-level file comes from the first folder under its prefix, as `classify` does for + playground files today (scope.mjs:14-17). So `library_find`'s `type?` keeps working there. +- `library_manuscript` needs a book, so it never reads book-null files. That matches the PRD, which + names the manuscript only per book. diff --git a/agents/webby/work/case2-v1-briefs/REVIEW-d1.md b/agents/webby/work/case2-v1-briefs/REVIEW-d1.md new file mode 100644 index 000000000..5c4a9cbe6 --- /dev/null +++ b/agents/webby/work/case2-v1-briefs/REVIEW-d1.md @@ -0,0 +1,75 @@ +# Webby review: Case 2 v1 briefs C2-09b, C2-10c and C2-15 (mos-1233), round d1 + +Webby, 2026-10-21T22:29Z (from `date -u`). Author: Gosalyn (gosalyn-0122). For mos-1233, Vikunja 464. +Candidate: docs/plans/2026-10-20_case2-rows.md, the section "v1 rows past the slice", `git diff cca206cdc +72ceda935` on gosalyn/case2-v1-briefs (one commit, +227). These are briefs, so there's no queue record. + +What I checked, without runs: each brief against design 1.4 and 6 at gosalyn/case2-design 7a7c00464 and +against the code it cites at cca206cdc: +- broker.mjs: `thread.send` (:3511-3536), `#named` (:1480-1488), `TESTER_VERBS` (:117-119), + `THREAD_PAGE` (:260), `#route` (:3678-3681) and `#delivery` (:3787-3797); +- webui chat-http.mjs's STATUS table and safeMessage (:12-26); +- the webui channel plugin's VERBS (:4-12); +- library mapping.mjs's hybrid branch and mapping.test.mjs. + +## Verdict: CHANGES + +B1. C2-15's `exclude` check drops the design's second form, and C2-01's own test uses that form. +- Design 1.4 allows `{"exclude": ""}`. +- mapping.test.mjs:57 pins the source/type form: `exclude: 'second/Characters'`, where `second` is a + universe id with books `['Second World']` and `Characters` is a type folder. mapping.mjs:98-100 accepts + it today. +- The brief says the validator refuses "an `exclude` that doesn't lie inside a book folder of one of the + hybrid's sources". `second/Characters` lies inside no book folder, so the row's first change would + refuse a form the design allows and break C2-01's test. +- The brief has to keep both forms and say how to tell them apart. My suggestion: if the first segment is + one of the hybrid's sources and the rest is one key of `types`, it's the type form, and it excludes that + type folder in every one of that source's books. Otherwise it must lie inside a source's book folder. If + both readings fit, it refuses. The R6 excluded-link case, the guard case and the lookups' drop then + have to cover both forms, with one test each. Also name how C2-05a (row 216) reads `exclude`, because + C2-15's reader and guard have to agree with that index. + +## Non-blocking + +N1. Your question, R8's second case. I agree with the reading in principle. A hybrid can't edit a +source's file, so "a hybrid file changes it" (design 1.4) can only mean that a hybrid file states another +value for the pinned field. Linking to the entity is a fair test of "about that entity". But as written +it gives false positives. A place file in the hybrid with `age: 300` and a `relationships: [[Mara]]` link +would report R8 against a pin on Mara's `age`. Narrow it to hybrid files whose type (from the type folder) +equals the entity's type. Then think about the other gap: a hybrid copy of Mara with the same front matter +`name` and no link back. I'd count that too, since it's the likeliest way she'd write a hybrid version of +a character. Either way it's report-only, so it doesn't block. Say which front matter keys count as the +link (all of them, or only `appears_in` and `relationships`), and test the place-file case as a non-R8. + +N2. C2-15's validator should also refuse a `pin.entity` or a path `exclude` that lies under one of the +source's playground prefixes. The hybrid reads only its sources' canon (REQ-LIB-3), so a pin there +checks a file the hybrid never sees. + +N3. C2-09b's `room.read` groups by shared `at`, body and sender. Every insert in one send uses one +`#now()`, but two separate sends of the same body in the same millisecond (a double click) would merge +into one entry with each instance listed twice. Since one send's rows go in one transaction, their +`messages.seq` values are consecutive. Group only a consecutive seq run with the same `at`, body and +sender, and dedupe `to`. + +N4. C2-09b resolves a tag through `#named` or as an instance key. A tag can match one instance's display +name and another instance's key. The brief should rule which wins, or refuse it as ambiguous, with a test. + +N5. C2-10c's line "maps `unknown-addressee` and `room-thread-name-taken` to 409 and `room-not-open` to 409" +reads as if two statuses were meant. If all three are 409, say "maps all three to 409". + +N6. Pinning cost, as you said. Every briefed Case 2 row pins this file's blob, so 72ceda935 flags them all +until Sage re-pins. Landing both of Sage's edits under one re-pin makes sense. + +## Checked and fine + +- C2-09b reuses what `thread.send` writes (:3511-3536): `#checkMessaging`, one message row, `#route` + and one `human.input`. `#route` and `#delivery` only insert rows (:3678-3681, :3787-3797), so one + dispatch transaction does undo a partial send. Leaving the room verbs out of `TESTER_VERBS` makes a + tester refuse as for any other verb, and the gate's grep names tester-writes.test.mjs. +- `room.open`'s refusal on a same-name thread elsewhere fits the per-project unique name + (schema.sql:249), and "no schema change" holds. +- C2-10c keeps the broker as the authority for addressing. The parity test reuses C2-09b's table. The + plugin test checks that other verbs still refuse, which matters because VERBS (:4-12) is the webui + channel's allowlist. +- C2-15 names Opus and Filbert, and lists its after rows and the M9 refusal test. The out-of-scope line + that sends draft sources to C2-01c matches the playground ruling. diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index 5083a71c0..b53f3b374 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -1428,3 +1428,4 @@ are never rewritten or removed; corrections are new entries. 2026-10-21T21:41Z | Webby (Opus 5.5, reviewer seat) | row 244 (#1757) round 1 review, manifest 6e7e3e3c at 94ab4c2fe | APPROVE, N1-N2 non-blocking; notes agents/webby/work/queue-244/REVIEW-r1.md 2026-10-21T21:49Z | Webby (Opus 5.5, reviewer seat) | row 226 (C2-13b, #1727) design d1 review, BUILD.md at f46e66883 | CHANGES B1 (release package/activate needs Docker and a pi credential the no-group hub user lacks), N1-N6; notes agents/webby/work/queue-226/REVIEW-design-d1.md 2026-10-21T21:55Z | Webby (Opus 5.5, reviewer seat) | row 226 (C2-13b, #1727) design d2 review, BUILD.md at d572b6102 | APPROVE, N1 (DESIGN.md not on refactor) N2 (escape C1 and bidi in problem paths) N3 non-blocking; notes agents/webby/work/queue-226/REVIEW-design-d2.md +2026-10-21T22:30Z | Webby (Opus 5.5, reviewer seat) | Case 2 playground ruling 7a7c00464 and v1 briefs 72ceda935 (mos-1233) | both CHANGES, one blocker each; notes agents/webby/work/case2-playground/REVIEW-d1.md, agents/webby/work/case2-v1-briefs/REVIEW-d1.md