6.3 KiB
Row 268 build notes (Gizmoduck)
Case 2 C2-01c, playground levels. Gitea #1773, Vikunja 464. Brief: docs/plans/2026-10-20_case2-rows.md,
"C2-01c playground levels: universe-level prefixes and draft universes" (blob a6ac627c8). The ruling is
agents/gosalyn/work/case2/DESIGN.md "Ruling after r11: playgrounds at three levels" (:49-88 at
db1e7732a), and it wins where the two differ. Reviewer Webby, gate owner Sage. Branch gizmoduck/row268
from refactor db1e7732a. Line numbers are on this branch unless a commit is named.
mapping.mjs
kind(:71). An entry with akindkey must say"hybrid"or"draft". Before, a plain universe withkindrefused as an unknown key, andkind: "draft"did the same.- A draft (:73-86) refuses
bookswith its own message before the key check, so the cause reads plainly. It takeskind,nameandplayground, needs one prefix or more, and comes back as{ kind: 'draft', name, books: [], playground }, frozen with the rest. - The prefix level check moved out of the per-entry loop to :127-140, after every entry is read,
because it needs every entry's books. It runs after the book-holds-book, prefix-holds-prefix and
listed-twice checks, so an overlap still reports as before. For each prefix and each book folder:
- equal to any book folder:
library-mapping-invalid(brief, What ships, "or equal to a book folder"); - inside or holding another entry's book:
library-playground-other-universe, and the message says which, with the book and its entry; - holding its own entry's book:
library-mapping-invalid. A prefix inside its own book is book level, and one that touches no book is universe level. A draft has no books, so its prefixes are either outside every book or refused as another entry's.
- equal to any book folder:
sources(:117-120) now refuses any entry with akind, so a draft can't be a source either. The message changed from "not a non-hybrid universe" to "not a plain universe". mapping.test.mjs:61 ondb1e7732apinned the old words, and that line moves with it.library-playground-outside-bookis gone from packages and docs/case2.
scope.mjs
classify (:12-24) now runs two passes. The first finds a prefix in any entry, and the file is
playground with that entry's id and book set to the entry's book folder that holds the prefix, or
null. The second finds a book folder, and the file is canon. place (:26-32) works out type and
folder from the first folder under the prefix or the book, as before. The validator keeps prefixes
from overlapping, so the first pass finds at most one.
Readers on this base
- reader.mjs:182 and :194 spread
classify's answer into each file record, so a universe-level or draft file carriesbook: null. Nothing in the reader readsbook. - reader.mjs:206-209. R5 fires for a canon file linking into any playground. R6 fires when the target's universe differs and isn't a source. A draft can't be a source, so a link into one gives R5 and R6. A link into the file's own universe-level prefix gives R5 only. No code change was needed. The new test covers both.
- survey.mjs:66 and mirror.mjs:246 read only
scope. mirror.mjs:251 callsreadLibraryand checks onlypath. - No other package calls this
classifyor readsuniverses(git grep over packages/*/src). - C2-05a (row 216) and C2-06 (row 217) have no candidate branch on origin at the time of writing. I check again before in-review.
Tests
- mapping.test.mjs: the old outside-book test splits into the other-universe refusals (inside another
entry's book, holding one, a draft prefix inside a book), the mapping-invalid ones (equal to a book,
own or another's, and holding its own), universe level in a plain universe and in a hybrid with
books: [], and the draft shape (frozen withbooks: [], withbooks, with none or empty prefixes, an extra key, and five badkindvalues). The overlap test gains a cross-entry hold and a cross-entry duplicate. The hybrid test gains a draft source. The caller-suppliedfailtest now usesSecond World/Playground/and sees the new code, sinceElsewhere/is valid now. - scope.test.mjs, new: one case per level (book, universe in a plain universe, universe in a hybrid,
draft),
.canvasunder each new prefix staying unmapped, prefixes first inside a book that holds a prefix, and the reader case for R5 and R6, withbook: nullon the read records. - business.test.mjs:
Elsewhere/Playground/now loads, andSecond World/Playground/refuses withlibrary-playground-other-universethroughvalidateBusinessDocument.
Docs
- packages/library/README.md: the universe keys, a line on the three levels, the refusal table and the Scope section.
- docs/case2/SETUP-SHEET.md "Your playground": one line per level and the draft entry.
- docs/case2/SURVEY-RUN.md:114: the new code and message.
Hash pins
git grep -E '[0-9a-f]{64}' over packages/*/tests finds no pin on any changed file.
Runs
- r2
ecd9b35ebondcd8d4dda, Sage's CLEAR sage-2449, one pass with the first red stopping it (run-268-c.sh), 2026-10-22 04:40:22Z to 04:42:17Z, 115 s. M1, M2 and M3 all killed (scope.test 2 of 3 failed, mapping.test 2 of 11, mapping.test 1 of 11), and each file's sha256 matched after the restore. Brief files 14/14, library 83/83, business 209/209. test-auth 15, test-conductor 17, test-config 31, test-discord 78, test-extension-package 18, test-foundation 44, test-land-work 86, test-queue 28 plus 156 node, test-release 14, test-task 91, with 0 failures. Node skipped 0. The scripts skipped three cases: test-queue's verify and render check (not the canonical root) and test-task's live provider cases twice (row 244). Neither test-task skip is a dead-Docker skip. - r3
aca53c4f0on0fa7bf421, after row 191 landed. The cherry-pick of r2 has range-diff=and stable patch-id 2942acc8e6e2b0171b96ebbf033ab5c08c0f0eac. Rerun on CLEAR sage-2461, 04:50:29Z to 04:50:38Z: brief files 14/14, library 83/83 (survey.test on 191's scripts/mosaic), business 209/209, 0 skipped. Webby approved r3 as a carry (webby-0112). - r4
c27207f6eonce6a96ad6, after row 205 landed (sage-2466: 205's gate went first). Cherry-pick of r3 with range-diff=and the same patch-id. Rerun on CLEAR sage-2480, 05:04:50Z to 05:04:58Z: brief files 14/14, library 83/83, business 209/209, 0 skipped. - Every sweep found the worktree clean and no node process in it or in its temp dir.