Doc only, Sage's sage/row218 89ba79d94 (three commits squashed). Webby APPROVE round 1 (webby-0075,
rev 2848), round 2 (webby-0077, rev 2856) and round 3 (webby-0078, rev 2860). docs/case2/SETUP-SHEET.md
tells Melanie what the agents read, the playground, link and property forms, and what changes for
Bean and Chet, with M5's 1,200 character reply total (mos-1165). It goes to her only after C2-06
lands and on Jason's go (#419). docs/case2/SURVEY-RUN.md is design 10 step 7's run sheet: the
bare mirror as the source, a node check, output lines and refusals from survey.mjs. Claim sources
and rulings are in agents/sage/work/queue-218/BUILD.md. No test reads either doc path.
12 KiB
12 KiB
Row 218 draft notes: claims and sources
Drafts for docs/case2/SETUP-SHEET.md and docs/case2/SURVEY-RUN.md. Repo base: refactor at
947101d8a, which holds 29ce1e360 (row 231). "Design" means
git show 75fb3e10e:agents/gosalyn/work/case2/DESIGN.md, cited as D:<line>. "Brief" means
docs/plans/2026-10-20_case2-rows.md. Code paths are relative to the repo root. Nothing was run
except reads, greps and git merge-base --is-ancestor 29ce1e360 HEAD.
SETUP-SHEET.md
| Claim | Source |
|---|---|
| She keeps writing in Obsidian, obsidian-git pushes to git.mosaicstack.dev, nothing changes on her machine, nothing commits to her repo | D:939-940 (7.1) |
| Agents read what she pushed; a push reaches them in about a minute | D:1006-1007 (7.5); D:972-973 (60-second sync timer) |
Agents read .md notes inside book folders only |
D:457-461 (1.2); packages/library/src/scope.mjs:9-19 |
Not read: top-level notes, .canvas, .base, attachments, anything outside a book folder |
D:461 |
Other repos under ~/src are not read |
D:489 (1.3), D:494-497 (N4) |
| Agents can't write to her repo: canon, playground, anything | D:389 (D3); D:1008 |
Folder roles live in the projects entry of the business file, hand-edited, agents can't change it |
D:409-429, D:443-451 (1.1, M9) |
| Jason asks her to confirm the mapping first | D:431; D:1324-1328 (10 step 7) |
A folder named in playground is her playground |
Brief:22; D:434 |
| Each playground prefix sits inside one book folder | D:434-436; packages/library/src/mapping.mjs:77-80 |
One per book, e.g. <book>/playground/; until then everything mapped is canon |
D:438-439 |
| Agents search canon unless they ask for the playground | D:463 |
| Playground may back an idea or question, not a fact, finding or correction; refused before she sees it | D:858 (playground-cited-as-canon); D:378-382, D:835-839 (guard runs before store) |
| Only the folder decides; a tag or property can't change scope | D:388 (D2); D:440-441; scope.mjs:1 |
Graph colour group via Groups and a path: query, her own vault setting, changes nothing for agents |
Brief:23; D:941-943. Obsidian UI steps from the task prompt, not the design |
Path starts with the books repo folder because the vault is ~/src |
D:939 |
| N2: moving a note into a book folder makes it canon, agents may cite it as fact | D:944-945; D:259 |
| Rough drafts outside the playground are canon | Inference from D:460 (scope rule) |
N4: Obsidian resolves short links across ~/src, the reader sees one repo, the two can differ, the reader can't tell |
D:494-497; D:262-263 |
| A name only in another repo leads nowhere for agents | D:489 (R4); packages/library/src/links.mjs:61-87 |
| A full-path link resolves the same in both | D:497-498. Hub side: links.mjs:77-78 (vault-prefix step) |
| "New link format: Absolute path in vault" setting | Obsidian UI knowledge. Not in design or code. Reviewer may strike it |
appears_in and relationships links are read as links |
D:489-490; packages/library/src/reader.mjs:15, :153-162 |
Quoted flow list ["[[A]]", "[[B]]"] parses |
reader.mjs:81-96 (flow), :66-73 (quoted scalar), :159 |
| Block list with quoted items parses | reader.mjs:117-122, :66-73 |
Unquoted [[[A]], [[B]]] is R3 |
Brief:28-29; reader.mjs:87 (bracket inside a flow list stops parsing), :137 |
| R3 effect: whole front matter unread, note still indexed by path, name and body, listed as a problem | D:480; reader.mjs:103-105, :193; packages/library/README.md:69 |
| Problems show in Mosaic's status | D:473-474; D:999-1000 (7.4 status line) |
A value without [[ ]] is a name |
D:489-490; reader.mjs:159 |
| Bean and Chet keep names and personalities | D:660-661 (Q180) |
| Hermes: free text and story text. Mosaic: short cited items, a prose request gets a question or idea | D:778-781 (design 4) |
| Bean and Chet's item kinds: idea, question, finding, fact; web cites allowed | D:649 (companion); D:860 (citation-unfetched) |
| Limits 10 items, 5 ideas of 200, others 300 | D:819 (M5) |
| She or Jason can ask for lower limits | D:1329-1330 (10 step 8); D:831 |
| "No cited answer" notice | D:870-871, D:996-997 |
| One item can't mix two worlds | D:859 (citation-cross-universe) |
| She talks to them in the Console; Hermes keeps running until she moves over; stopping it is her choice | D:381-382; D:1331 |
| Five more helpers; she chooses the start set and can add one later | D:647-654; D:783-784; D:1327-1328 |
| What Jason will ask | D:1325-1327 (10 step 7) |
SURVEY-RUN.md
| Claim | Source |
|---|---|
Runs on <host> 10.1.1.54 under design 10 step 7, after step 4 |
D:1324; D:1266 (host) |
| Prints names and counts, never note text, property values, file names or link targets | packages/library/src/survey.mjs:1-6; README:118-125 |
| Sending to Melanie is Jason's call | Brief:36; D:1324-1328 |
Token slot library-gitea is step 4 |
D:1314-1316 |
Run as sudo -u mosaic -H from localadmin; mosaic has no login shell |
D:1195-1197; D:1281-1282 |
Copy at /srv/mosaic/.local/share/mosaic-stack/copies/<id>, <id> = commit in Jason's go |
D:1286-1292 (2c); docs/TOOLS.md:417; home /srv/mosaic per D:1314-1315 |
The copy carries packages/library/src |
scripts/stack-copy.sh:36 |
| Row 231 adds the control and bidi escapes | git log 29ce1e360; survey.mjs:78-82; README:121-122 |
<node dir> is the --node directory of step 2c; scripts/mosaic execs node from PATH |
D:1290-1291; scripts/mosaic:41 |
Dispatch: mosaic library survey goes to survey.mjs with survey <args> |
scripts/mosaic:37-41 (one shift leaves survey as argv[0]); survey.mjs:102-103 |
Command and flags: <repo> plus optional --mapping <file> once; anything starting with - refuses |
survey.mjs:16, :104-110 |
No fetch; reads HEAD |
survey.mjs:5-6, :27; reader.mjs:22-24 |
| Top folder only: ceiling is the path's parent | packages/project/src/git.mjs:12, :62 |
Owner must be mosaic: git gets no global config |
packages/seat/src/checkout.mjs:79-89 (GIT_CONFIG_GLOBAL=/dev/null, GIT_CONFIG_NOSYSTEM=1). The dubious-ownership refusal is git's own behaviour |
Bus mirror path <dataRoot>/projects/<business>/<project> |
Brief:300; packages/project/src/paths.mjs:34-40 |
| C2-04 and C2-03a not landed | grep of packages/*/src finds no library entry handling or refs/heads/served; docs/guides/host-run-sheet.md:269 says "not landed" |
Served ref refs/heads/served |
D:963 (7.2); Brief:676 |
| Token kept out of URL, config, argv, logs | D:955-956 (7.2) |
Mapping file is the entry alone; remote, branch required |
survey.mjs:114-116; mapping.mjs:38-47 |
| Output lines and fields | survey.mjs:83-97; data from :26-76 |
| Folder lines list folders that directly hold an entry, full path | survey.mjs:30-35 |
Key names: short identifiers print, others as (other key) |
survey.mjs:17-20, :47 |
unresolved equals the R4 count |
survey.mjs:72 |
| Scope counts cover all tree entries | survey.mjs:66 |
| Refusal exit codes 0, 2, 3, 4 | survey.mjs:99-124; README:127-129 |
| Mapping checked before repo | survey.mjs:112-121 |
stderr format library survey: <message> |
survey.mjs:101; problems.mjs:3-5 |
(project-git) suffix on git failures |
reader.mjs:18-20; paths.mjs:4-6 |
library-playground-outside-book message |
mapping.mjs:79-80 |
| 100-second git timeout | checkout.mjs:49, :52; git.mjs:68 |
Exit 127 when node is missing |
scripts/mosaic:18, :41 (bash exec failure). Not run |
| Other errors rethrow as a stack trace | survey.mjs:117, :123, :128-131 |
| Don't work around a refusal | AGENTS.md invariant 6 |
Code and design disagreements
- Design 1.1 shows the mapping nested in
"projects": {"books": {...}}(D:412-429). The survey's--mappingfile must be the inner entry alone (survey.mjs:114-116). The run sheet follows the code. - Design 1.3 calls
vaultPrefixpart of the mapping (D:418). The code makes it optional (mapping.mjs:48, README:30). Without it, a full vault path link, the N4 advice, resolves to nothing in the hub (links.mjs:73-87:rootfails,vault-prefixis skipped,shortestrefuses a/). The setup sheet's full-path advice holds only when Jason setsvaultPrefixto her books repo folder name. - The task prompt calls the unquoted form "refused". R3 is not a refusal. It is a reported problem, and the note stays indexed (D:473, D:480). The sheet says what happens instead.
Open questions
- Where
<repo>comes from on .54. The survey reads a local repo'sHEADand never fetches. The bus mirror needs C2-04 and C2-03a, neither landed. C2-03a movesrefs/heads/served, notHEAD, so the mirror'sHEADmay name no commit and the survey would refuse with exit 2. The sync also needs a checked mapping with at least one book (mapping.mjs:59,:70), and the mapping's values are meant to come from this survey (D:431). Sage needs to rule: a placeholder mapping for the first sync, aHEADthe sync sets, a--commitflag on the survey, or another source. - The brief says Obsidian's property editor writes
appears_in: ["[[A]]", "[[B]]"](Brief:28-29, webby-0041 N4). I didn't read webby-0041 or check Obsidian's output. Both the flow and the block quoted forms parse, so the sheet shows both and says only that the editor adds the quotes. - Whether
/srv/mosaic/.npm-global/bin/mosaicexists on .54. The run sheet uses the copy'sscripts/mosaicby full path to avoid depending on a wrapper.
Sage's rulings on the open questions (2026-10-21)
- Survey source: the bus's bare mirror after the first
library.sync, the only copy on the host (design 2.1). The C2-03a brief now requires the mirror'sHEADto be a symbolic ref torefs/heads/served, with a test (5c6f73ed7), so the survey reads the served commit with no ref flag. - Property list forms: the sheet shows both quoted forms, since both parse. Webby checks the claim that Obsidian's property editor writes the quoted form.
- The "New link format: Absolute path in vault" tip stays. It is an Obsidian setting, not a design claim, and Webby may strike it.
- The run sheet calls the copy's
scripts/mosaicby full path. That holds whether or not a wrapper is onPATH. vaultPrefix: the run sheet's step 4 tells Jason to set it, because the setup sheet's full-path link advice depends on it.
Round 2 (2026-10-21), from Webby's round 1 notes (webby-0075, rev 2848)
- N1, by Mos's ruling mos-1165 (fix before landing): SETUP-SHEET.md now gives the 1,200 character total of item text per reply (design M5, step 8). The word "Today" is gone. No code enforces these caps until C2-06 lands, so my ruling is that the sheet goes to Melanie only after C2-06 lands, and then only on Jason's go (#419). The wording stays as is, because by then it holds.
- N2: SURVEY-RUN.md says tab, newline, carriage return, backspace and form feed print as
\t,\n,\r,\band\f, and other control and bidi characters as\uXXXX(survey.mjs quote()). - N3: SURVEY-RUN.md has a refusal row for
library-commit:(reader.mjs listTree). survey.mjs turns every LibraryError into exit 2 with its message. - N4: SURVEY-RUN.md's new step 2 checks
command -v nodeunder the same sudo and PATH before the survey runs.
Round 3 (2026-10-21), from Webby's round 2 note N5 (webby-0077, rev 2856)
- N5: the library-commit row no longer says a moved
HEADcauses it. The survey readsHEADonce, and listTree raises library-commit only for an id that isn't 40 hex or an object that isn't a commit (reader.mjs:29, :31). In practice that means a SHA-256 repository, so a rerun doesn't help. The row now says "for example in a SHA-256 repository" and "Report to Sage".