PRD 1.14: playground levels in REQ-LIB-2 (book, universe, draft) and the draft universe in REQ-LIB-3, from Gosalyn's approved ruling 51fdfb7e2 (webby-0089, mos-1233, mos-1241, Vikunja 464)

This commit is contained in:
jason.woltje committed 2026-10-21 17:45:38 -05:00
1 parent 5d2437f899
commit db1e7732aa
3 files changed
+78 -13

No files matched your search

+76 -11
View File
@@ -1,6 +1,6 @@
# PRD: Mosaic Stack
- Status: approved, version 1.13. Jason approved draft 0.4 unchanged as
- Status: approved, version 1.14. Jason approved draft 0.4 unchanged as
1.0 on 2026-10-05 (lead decision 61). They approved version 1.1, the
Organization requirements, in decision 03130d08-ddce-480d-a601-e59f64744fc3
on 2026-10-14. They approved version 1.2, the chief of staff, the
@@ -38,7 +38,19 @@
two stale lines. It takes the same path as 1.11 (mos-1229,
vikunja:19/462). Version 1.13 adds the session requirements from the
approved T1 item 7 design and replaces REQ-ROLE-2 and REQ-THREAD-2. It
takes the same path as 1.11 (mos-1231, vikunja:19/463).
takes the same path as 1.11 (mos-1231, vikunja:19/463). Version 1.14
adds the playground levels to REQ-LIB-2 and a draft universe to
REQ-LIB-3, from the approved playground ruling. It takes the same path
as 1.11 (mos-1233, mos-1238, mos-1241, vikunja:19/464).
- Version 1.14 source: Jason's Q176 lines TARGET.md:92 "Brainstorm ideas
in a "playground" where new universes can be created", :93 "Brainstorm
ideas in a "playground" for books in a universe" and :94 "This means
universe-level and book-level playgrounds must be provided". Mos asked
for a ruling (mos-1233). Mos ruled that the levels come in 1.14, after
1.13, once Webby approves the ruling (mos-1238 A, mos-1241). The text
is drafted from the playground ruling after r11 in the Case 2 design,
51fdfb7e2 on `gosalyn/case2-design`, approved by Webby in webby-0089
(7c00c8345 on `webby/reviews`).
- Version 1.13 source, Mos's ruling Q1 in mos-1231 on 2026-10-21: "T1
item 7 is v1." It quotes Jason's Q176 lines, TARGET.md:57 "Agents can
have multiple independent sessions within a given project (thread)",
@@ -1162,16 +1174,34 @@ library is the user's own writing repository.
`universe.book.{character,place,...}` reads as universe, book folder,
type folder. (Design 1.1 and M9. Q176 Case 2 "Data is stored in
little-endian organizational scheme".)
- **REQ-LIB-2.** Playgrounds are never confused with canon. A file's scope
comes from its path alone: a Markdown file under a playground prefix is
playground, any other Markdown file in a book folder is canon, and
everything else is unmapped and never returned. Lookups return canon
unless the caller asks for playground. An agent can't cite a playground
file as a fact, a finding or a correction. The Console shows each
cite's scope. (Design 1.2, 5.2 and 7.4. Q176 Case 2, the playground
items.)
- **REQ-LIB-2.** Playgrounds are never confused with canon. A playground
has one of three levels, set by where its prefix sits. A book-level
prefix lies inside one of its universe's book folders, and its files
have that universe and that book. A universe-level prefix lies outside
every book folder, and its files have the universe and no book. A
draft universe is where a new universe starts: a universe entry with a
name, one or more playground prefixes and no books. Every file under it
is playground, with no book. When the draft is real, the human edits
the organization file to make it a plain universe with books. The
mapping is refused when a prefix lies inside or holds another
universe's book folder, when a prefix equals or holds a book folder of
its own universe, when two prefixes overlap, when a draft has books or
no prefix, and when a hybrid names a draft as a source. A file's scope
comes from its path alone, prefixes first: a Markdown file under a
playground prefix at any level is playground, any other Markdown file
in a book folder is canon, and everything else is unmapped and never
returned. Lookups return canon unless the caller asks for playground.
An agent can't cite a playground file as a fact, a finding or a
correction. The Console shows each cite's scope. (Design 1.2, 5.2 and
7.4, and the playground ruling, 51fdfb7e2. Q176 Case 2, the playground
items, TARGET.md:92-94. Version 1.14: the levels and the draft.)
- **REQ-LIB-3.** Universes stay separate. Every lookup names one universe,
and its results never leave it. A crossover is a hybrid universe that
and its results never leave it. A draft universe (REQ-LIB-2) counts as
a universe here. It has no canon, so a lookup in a draft asks for
playground, and a citation from another universe into a draft is
cross-universe. A universe-level or draft file has no book: a lookup
that names a book leaves it out, and the manuscript lookup doesn't read
it. (Version 1.14.) A crossover is a hybrid universe that
only a human creates, by editing the organization file. It names two or
more source universes. Its lookups see its own files plus the sources'
canon, minus the exclusions the human sets. Code checks two kinds of
@@ -1613,6 +1643,41 @@ latest-by date and a hard target (Q176).
history (design D9).
- The build row is Sage's to file under Vikunja 463. This amendment
adds the requirements only.
- Version 1.14:
- The 1.13 text of REQ-LIB-2 was: "Playgrounds are never confused with
canon. A file's scope comes from its path alone: a Markdown file
under a playground prefix is playground, any other Markdown file in a
book folder is canon, and everything else is unmapped and never
returned. Lookups return canon unless the caller asks for playground.
An agent can't cite a playground file as a fact, a finding or a
correction. The Console shows each cite's scope. (Design 1.2, 5.2
and 7.4. Q176 Case 2, the playground items.)"
- REQ-LIB-3 gains the two sentences on a draft universe and a file
with no book. The rest of its text is unchanged.
- This settles the Version 1.12 note's item that "REQ-LIB-2 doesn't
name the level". That note is history and stays as written.
- The ruling's refusal codes: `library-playground-other-universe`
replaces `library-playground-outside-book`, for a prefix inside or
holding another entry's book folder. `library-mapping-invalid` covers
a prefix that holds its own entry's book folder, a draft with `books`
or no `playground` prefix, a draft with keys other than `kind`,
`name` and `playground`, and a `kind` other than absent, `"hybrid"`
or `"draft"`. A prefix equal to a book folder, a prefix listed twice
and a hybrid whose `sources` name a draft stay refused.
- Lookup details from the ruling: a lookup in a draft passes
`scope: "playground"`, since the canon default returns nothing there.
A universe-level file returns `book: null`. `library_manuscript`
needs a book. `citation-cross-universe` treats a draft as its own
universe. R5 covers a canon file that refers into any playground, and
R6 one that refers into a draft. `library_universe` on a draft
returns its kind, name and prefixes.
- The titles in `packages/tasks/requirements.json` don't change. The
REQ-LIB-2 title still holds at every level.
- The build is row C2-01c in `packages/library` (`mapping.mjs`,
`scope.mjs`), before C2-05a and C2-06 read `classify`, or in their
candidates if they have started. C2-12's setup sheet gets one line
per level (design section 8). Sage files it under Vikunja 464. This
amendment adds the requirements only.
## Risks and open questions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"prd": "docs/prd/mosaic-stack.md",
"version": "1.13",
"version": "1.14",
"requirements": [
{ "id": "REQ-ROLE-1", "title": "Each role is a reviewed roles/<name>.json: contract, authority map, credentials" },
{ "id": "REQ-ROLE-2", "title": "One holder per role instance, one per assistant session; the chief of staff may end a run, others need a decision" },
+1 -1
View File
@@ -21,7 +21,7 @@ test("the list holds the PRD's requirement ids, in its order, at its version", (
assert.equal(ids.length, 85);
assert.deepEqual(list.requirements.map((r) => r.id), ids);
assert.match(prd, new RegExp(`^- Status: approved, version ${list.version.replace('.', '\\.')}\\.`, 'm'));
assert.deepEqual([list.prd, list.version], ['docs/prd/mosaic-stack.md', '1.13']);
assert.deepEqual([list.prd, list.version], ['docs/prd/mosaic-stack.md', '1.14']);
});
test('the committed list loads frozen', () => {