Files
jason.woltjeandClaude Opus 5.5 5dc0c7de74 agents: Sage row 70 round 1 packet (#1564, docs for mosaic on PATH)
Candidate 1126314bd522de838aad03689bed41f6b12a33c2d7f30b2eff1b38653f559ae0,
4 files on 48b893871. The first gate stopped at script-queue: the pre-A2
fixture check pinned the old header comment. The check now skips comment
lines (brief amended in 06e964026). Second gate: 24 suites, 0 failed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 12:56:04 -05:00

93 lines
4.7 KiB
Markdown

# Row 70 round 1 (#1564): docs for `mosaic` on PATH
Sage, 2026-10-15. Three doc files and one test. Reviewer: Filbert.
- Brief: `docs/plans/2026-10-11_mosaic-on-path-docs.md`, pinned at blob
d56345b76ffd (rev 1314; first pinned at f04bcaddb529, rev 1306). I updated it in 4c1b11d93 before building,
because rows 85 (#1579) and 130 (#1625) changed the facts after it was
written on 10-11. The update paragraph sits under "Problem"; "What
ships" now names the stack-copy wrapper and the human/queue split.
After the first gate I amended it again in 06e964026: the acceptance
list now allows this row to narrow the pre-A2 fixture check, and no
other test or source change.
- Base: 48b893871 (`base.txt`), which has rows 49 and 123 in it. The
patch is the same diff I first built on 4c1b11d93; it applies cleanly
on 48b893871 and no commit between them touches a manifest path.
- Candidate: `build.patch`, `candidate-manifest.sha256` (4 files),
manifest file sha256 `1126314bd522de838aad03689bed41f6b12a33c2d7f30b2eff1b38653f559ae0`.
The first build (3 files, `c8649f2e…`) failed the gate; see "Test change".
## What changed
| File | Change |
|------|--------|
| `scripts/mosaic` | header comment lines 10-11 replaced by seven comment lines; no code line moved or changed |
| `docs/TOOLS.md` | seat-launch paragraph: "Not the npm-global `mosaic` CLI; run by path." replaced; links "Stack copies" in the same file |
| `packages/seat/README.md` | "Commands" first paragraph replaced; links packages/cli/README.md "One pinned copy" |
| `packages/queue/tests/dispatch.test.mjs` | the pre-A2 fixture check skips comment lines; see "Test change" |
Each place now says:
1. `scripts/mosaic` is the repository wrapper, run by path from the checkout.
2. A host may put `mosaic` on PATH as a wrapper around a pinned copy's
`scripts/mosaic` (`scripts/stack-copy.sh wrapper`). The seat README also
names `mosaic-old` as the estate CLI it replaced on Jason's host.
3. On a pinned host the human commands go through `mosaic` on PATH. The
header also says `--tester`, and that the checkout exits 3 for them.
4. Queue commands stay on `scripts/mosaic queue` in the canonical
checkout, because a copy refuses them.
## Evidence for the claims
- Point 4: from the canonical checkout, a read-only
`bash ~/.local/share/mosaic-stack/copies/2f57e3c5…/scripts/mosaic queue show 70`
printed `queue: this queue code (…/copies/2f57e3c5…/packages/queue/src/store.mjs) is not under the canonical root /mnt/storage/src/mosaic-stack`
and exited 2. The refusal is `packages/queue/src/store.mjs:85`.
- Point 3: packages/cli/README.md "One pinned copy" (row 130 text) and
docs/TOOLS.md "Pinned stack update", which this row links rather than
restates.
- Point 2: docs/TOOLS.md "Stack copies" and `scripts/stack-copy.sh`
lines 67-71, which keep the lease line to `mosaic-old` and exec the
copy's `scripts/mosaic`.
- The two anchors resolve: `#stack-copies-scriptsstack-copysh` is the
slug of TOOLS.md "## Stack copies (`scripts/stack-copy.sh`)", and
`#one-pinned-copy-row-85-1579` is the anchor TOOLS.md already uses for
the CLI README section.
## Checks
- `bash -n scripts/mosaic` passes. `git diff --check` is clean. The added
lines have no em dash, curly quote or control character.
- Gate, second run on 48b893871: `gate-run.log` and `gate/`. 24 suites,
0 failed. 14 package suites passed 1611 tests (cli 195, seat 132,
bus 191). The 10 script suites passed, queue 156/0 with the test
change. No flake of #258, #261, #262 or #263 in either run.
## Test change
My first build claimed here that `dispatch.test.mjs` compares behaviour,
not header text. That was wrong. Its test "the pre-A2 fixture is the
script A2 changed" checks that every line of
`packages/queue/tests/fixtures/mosaic-pre-a2.sh` still appears, in order,
in `scripts/mosaic`. The fixture carries the two old header lines
("Not the npm-global `mosaic` CLI ... only reachable as scripts/mosaic"),
so the first gate stopped at script-queue with 155/1 (log kept as
`gate-r1-run.log`).
Keeping those lines isn't an option: "only reachable as scripts/mosaic" is
false on a pinned host, which is the point of this row. Editing the
fixture would make it no longer the pre-A2 script. So the check now
compares lines that don't start with `# `. The shebang (`#!`) stays in.
The pin protects what the script runs, and a header rewrite can't
change that.
Evidence, single file in the candidate tree: `dispatch.test.mjs` 4/0.
Three mutants on `scripts/mosaic`, each run against the pre-A2 test,
each fails it (fail 1): drop `set -euo pipefail`, drop the `REPO=` line,
drop the shebang.
## Out of scope
The Q81 script, packaging for other hosts, and the queue's canonical-root
refusal, as the brief says.