webby: Case 2 playground ruling and v1 briefs reviews (mos-1233), both changes, and session line

This commit is contained in:
jason.woltje committed 2026-10-21 17:30:52 -05:00
1 parent 2f488b4ea7
commit 35130c26bb
3 files changed
+143

No files matched your search

@@ -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.
@@ -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": "<source path or source/type>"}`.
- 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.
+1
View File
@@ -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