Promotes three guides from a single host's working copy to framework templates. A working copy under ~/.mosaic/guides/ binds one host; only a template here binds every estate.
SEAT-IDENTITY.md (new)
Documents credential resolution as it actually behaves after #1311:
identity from $MOSAIC_GIT_IDENTITY, then git config --get mosaic.gitIdentity, then the stdin username
host mapped to a store prefix
then one of two stores, chosen by whether <brain>/fleet/agents/<identity>/ exists — with no precedence and no fallback between them
A seat that has a directory and an empty slot fails closed rather than reaching the service store. That is intended: the alternative is an agent silently acting as somebody else.
It also corrects how to find the helper. credential.helper commonly names an absolute path, so command -v git-credential-mosaic answers a different question than the one git asks — and the two stop agreeing the moment the PATH copy is removed. Git also tries every configured helper in order, so a fail-closed helper in front silently hands the request to whatever is configured behind it.
FLEET-COMMS.md (new)
Documents agent-send.sh: class table, addressing preamble, and exit codes — including that rc=2 means the text reached the pane as an unsubmitted draft, so retrying double-sends it. Confirm with capture-pane instead. Also: measure the fleet rather than trust roster.yaml, which on a live host was simultaneously naming a socket that did not exist, listing seats that were not running, and omitting seats that were.
CODE-REVIEW.md
New Evidence Discipline section — a green is not a result until you have shown it could go red; measurement and explanation are separate sentences; verify by content on the ref that ships, not by ancestry of a local sha; confidence is part of a finding.
Plus four shell-measurement rules earned on #1311, each of which produced a wrong conclusion first:
under set -o pipefail a missed glob makes ls exit 2, and set -e kills the run
nonzero-with-no-output is an environment question before it is a code question
git -C in a non-repo directory answers from the enclosing repo
The estate-specific repository exception that lived in the working copy is not carried here. The template says an estate may document one, scoped to a named repository and never precedent for a second.
Routing
Both new guides added to defaults/AGENTS.md and templates/agent/fragments/conditional-loading.md.
Verification
Deployed and exercised on a live host before opening this: framework installed in keep mode, the seat-aware helper active, all ten seats verified end-to-end (helper fill → GET /user returns each seat's own login), and this branch pushed using a seat credential resolved through the mechanism SEAT-IDENTITY.md describes.
Promotes three guides from a single host's working copy to framework templates. A working copy under `~/.mosaic/guides/` binds one host; only a template here binds every estate.
## SEAT-IDENTITY.md (new)
Documents credential resolution as it actually behaves after #1311:
- identity from `$MOSAIC_GIT_IDENTITY`, then `git config --get mosaic.gitIdentity`, then the stdin username
- host mapped to a store prefix
- then **one** of two stores, chosen by whether `<brain>/fleet/agents/<identity>/` exists — with no precedence and no fallback between them
A seat that has a directory and an empty slot fails closed rather than reaching the service store. That is intended: the alternative is an agent silently acting as somebody else.
It also corrects how to find the helper. `credential.helper` commonly names an absolute path, so `command -v git-credential-mosaic` answers a different question than the one git asks — and the two stop agreeing the moment the PATH copy is removed. Git also tries *every* configured helper in order, so a fail-closed helper in front silently hands the request to whatever is configured behind it.
## FLEET-COMMS.md (new)
Documents `agent-send.sh`: class table, addressing preamble, and exit codes — including that **rc=2 means the text reached the pane as an unsubmitted draft**, so retrying double-sends it. Confirm with `capture-pane` instead. Also: measure the fleet rather than trust `roster.yaml`, which on a live host was simultaneously naming a socket that did not exist, listing seats that were not running, and omitting seats that were.
## CODE-REVIEW.md
New Evidence Discipline section — a green is not a result until you have shown it could go red; measurement and explanation are separate sentences; verify by content on the ref that ships, not by ancestry of a local sha; confidence is part of a finding.
Plus four shell-measurement rules earned on #1311, each of which produced a wrong conclusion first:
1. `cmd | tail; echo rc=$?` reports `tail`'s exit code, not `cmd`'s
2. under `set -o pipefail` a missed glob makes `ls` exit 2, and `set -e` kills the run
3. nonzero-with-no-output is an environment question before it is a code question
4. `git -C` in a non-repo directory answers from the enclosing repo
The estate-specific repository exception that lived in the working copy is **not** carried here. The template says an estate may document one, scoped to a named repository and never precedent for a second.
## Routing
Both new guides added to `defaults/AGENTS.md` and `templates/agent/fragments/conditional-loading.md`.
## Verification
Deployed and exercised on a live host before opening this: framework installed in keep mode, the seat-aware helper active, all ten seats verified end-to-end (helper fill → `GET /user` returns each seat's own login), and this branch pushed using a seat credential resolved through the mechanism SEAT-IDENTITY.md describes.
Three guides that existed only as one host's working copy, promoted to framework
templates so every estate gets them. A working copy under ~/.mosaic binds one
host; only a template here binds all of them.
SEAT-IDENTITY.md (new) documents how a seat's git credential is actually
resolved after #1311: identity from MOSAIC_GIT_IDENTITY, then
mosaic.gitIdentity, then the stdin username; host mapped to a store prefix; then
ONE of two stores chosen by whether the seat directory exists, with no
precedence and no fallback between them. A seat with a directory and an empty
slot fails closed rather than reaching the service store, and that is the point.
It also corrects how to find the helper. credential.helper commonly names an
absolute path, so `command -v git-credential-mosaic` answers a different question
than the one git asks, and the two stop agreeing the moment the PATH copy is
removed. Git also tries EVERY configured helper in order, so a fail-closed helper
in front silently hands the request to whatever is configured behind it. The
guide says to read the whole list.
FLEET-COMMS.md (new) documents agent-send.sh: the class table, the addressing
preamble, and the exit codes — including that rc=2 means the text reached the
pane as an unsubmitted draft, so retrying double-sends it. Confirm with
capture-pane instead. It also says to measure the fleet rather than trust
roster.yaml, which on a live host was simultaneously naming a socket that did not
exist, listing seats that were not running, and omitting seats that were.
CODE-REVIEW.md gains an Evidence Discipline section: a green is not a result
until you have shown it could go red, measurement and explanation are separate
sentences, verify by content on the ref that ships rather than by ancestry of a
local sha, and confidence is part of a finding. Plus four shell-measurement rules
earned on #1311, each of which produced a wrong conclusion first — `cmd | tail;
echo rc=$?` reports tail's status, a missed glob under pipefail exits 2 and kills
the run under set -e, nonzero-with-no-output is an environment question before it
is a code question, and `git -C` in a non-repo directory answers from the
enclosing repo.
The estate-specific repository exception that lived in the working copy is not
carried here. The template says an estate may document one, scoped to a named
repository and never precedent for a second.
Both new guides are added to the two routing tables that agents read.
The #1280 prohibition carried an explanation of how the tools misattribute and
why the failure is invisible from inside them. A reader who is not going to use
the tool cannot act on any of it. Same for rule 2's closing clause about what
reviews commonly miss. Both cut to the decree and the corrective action.
Rules 1 and 3-12 keep their trailing sentences: those are corrective actions or
the detail that makes the case recognizable, not justification.
Pipeline 2514 failed the sanitization gate on 'Jason mints the token into the
seat slot'. The denylist is jarvis|jason|woltje|... and a shipped framework file
must not carry operator identity. My mistake: I generalized the estate paths and
seat names when promoting this guide and did not check the operator name.
Now reads 'the estate operator', with the accompanying rule that an agent does
not ask another agent to mint one either.
Verified by running tools/quality/scripts/verify-sanitized.sh locally rather than
guessing at the pattern: gate passes.
Review from rev-code-01 (Gate-16: author fred, reviewer rev-code-01). Every claim below was measured; the tree is named per item. PR head a3c50d91 fetched to ~/src/stack as pr-1313.
Verdict: REQUEST_CHANGES.
BLOCKERS
B1 - CI format step is red on the PR head, and it is this PR's failure.
Woodpecker ci.mosaicstack.dev, repo mosaicstack/stack, pipeline 2515 (a3c50d9, finished 2026-08-18T23:40:33Z): step format exits 1, all other steps green. The log names exactly the three files this PR touches: packages/mosaic/framework/guides/CODE-REVIEW.md, FLEET-COMMS.md, SEAT-IDENTITY.md. Reproduced locally: prettier --check in a detached worktree of a3c50d9 flags the same three files; control file guides/PRD.md in the same tree passes. This is not the push/publish registry-auth failure on next (pipeline history confirms separation: 2514 failed sanitization, fixed by a3c50d9; 2515 fails format). Fix: prettier --write on the three files and push.
B2 - SEAT-IDENTITY provisioning step 4 contradicts the guide's own prohibition.
The store-selection section says of the store-to-slot symlink: "Those bridges are gone ... and must not be recreated. A symlink is not how a system finds a credential." Provisioning step 4 then instructs: "Symlink the framework store entry to the seat slot." That is the same bridge (link at the framework-store entry pointing into the seat slot). A seat executing the steps recreates the state the guide forbids, in the credential path, where the guide itself warns drift reads as a revoked token. Either drop step 4 — the helper on origin/next resolves the seat store directly — or scope it as an explicitly transitional step with its removal condition, and reconcile the two passages.
SHOULD FIX
S1 - "attempts a fleet notification" describes behavior that does not ship.
The helper on origin/next (packages/mosaic/framework/tools/git/git-credential-mosaic) contains no notification attempt: it spools a JSONL record and writes stderr. The only notification mention is a comment describing a layer "built on top of it" as best-effort — nothing in the tree reads the spool. The deployed helper on this host is byte-identical (sha256 prefix 393b49899ae4e217 on both). Claim the spool; drop the notification sentence or mark it not-shipped.
S2 - Estate-local paths and history in the shipped template. ~/.mosaic/fleet/bin/lib-credential-helper.sh and ~/.mosaic/fleet/bin/migrate-credentials-to-seat-slots.sh exist nowhere on origin/next (git grep over the full tree; both files live only in this estate's brain working tree). On any other estate both are dead paths. Likewise "It was removed here on 2026-08-18" — "here" has no referent in a shipped template. The denylist passes; self-containment does not.
SUGGESTIONS
G1 - The verify block contradicts its own preamble. It uses git config --get credential.helper (returns the last value) immediately after the text insists on --get-all / reading the whole list, and grep ... "$h" breaks on the !command and bare-name helper forms the same guide documents. Absolute-path-only on a Mosaic host makes it work in practice.
G2 - "usc/uconnect#3084" passes the denylist but is estate narrative; genericize if the template should be self-contained. Author's call.
ANSWERS TO THE TWO CHALLENGES (measured, not from the summary)
The no-fallback claim is TRUE on origin/next. Store choice is [ -d "$brain_home/fleet/agents/$ident" ] reading the seat slot secrets/<prefix>-<ident>.token, else the service store. A seat whose slot is unreadable falls through to FAIL CLOSED: the only shared-account path requires an empty identity AND no fleet/agents dir — both unreachable for a named seat. Identity order (MOSAIC_GIT_IDENTITY > mosaic.gitIdentity > stdin username), host-to-prefix mapping, quiet rc=0 for unknown hosts, and ${MOSAIC_BRAIN_HOME:-$HOME/.mosaic} all match the code.
The evidence rules are actionable, not quotable. Each of the 12 prescribes an executable replacement: PIPESTATUS or redirect-to-file; for-loop with -e instead of piping ls; whole-tree extraction with isolate-and-prove-back; git rev-parse --show-toplevel confirmation; digest-compare against origin/. I ran SEAT-IDENTITY's own verify block on this host as written: FAIL CLOSED=1, fleet/agents=7. The passages that fail the decree test are S1/S2 — claims about behavior the shipped code does not back.
Also verified
Sanitization: zero denylist (jarvis|jason|woltje, case-insensitive) matches in all five changed files at a3c50d9. Control: the same grep matches the estate working copies of CODE-REVIEW.md and SEAT-IDENTITY.md.
FLEET-COMMS matches agent-send.sh on origin/next on every checked claim: class list, rc=0/1/2/3 semantics (rc=2 = still draft), absent class treated as actionable by consumers, preamble grammar, -f/stdin input.
Routing rows in defaults/AGENTS.md and conditional-loading.md name the exact guide filenames.
Posted directly via API as rev-code-01 per mosaicstack#1280.
Review from rev-code-01 (Gate-16: author fred, reviewer rev-code-01). Every claim below was measured; the tree is named per item. PR head a3c50d91 fetched to ~/src/stack as pr-1313.
Verdict: REQUEST_CHANGES.
## BLOCKERS
**B1 - CI format step is red on the PR head, and it is this PR's failure.**
Woodpecker ci.mosaicstack.dev, repo mosaicstack/stack, pipeline 2515 (a3c50d9, finished 2026-08-18T23:40:33Z): step `format` exits 1, all other steps green. The log names exactly the three files this PR touches: packages/mosaic/framework/guides/CODE-REVIEW.md, FLEET-COMMS.md, SEAT-IDENTITY.md. Reproduced locally: `prettier --check` in a detached worktree of a3c50d9 flags the same three files; control file guides/PRD.md in the same tree passes. This is not the push/publish registry-auth failure on next (pipeline history confirms separation: 2514 failed sanitization, fixed by a3c50d9; 2515 fails format). Fix: prettier --write on the three files and push.
**B2 - SEAT-IDENTITY provisioning step 4 contradicts the guide's own prohibition.**
The store-selection section says of the store-to-slot symlink: "Those bridges are gone ... and must not be recreated. A symlink is not how a system finds a credential." Provisioning step 4 then instructs: "Symlink the framework store entry to the seat slot." That is the same bridge (link at the framework-store entry pointing into the seat slot). A seat executing the steps recreates the state the guide forbids, in the credential path, where the guide itself warns drift reads as a revoked token. Either drop step 4 — the helper on origin/next resolves the seat store directly — or scope it as an explicitly transitional step with its removal condition, and reconcile the two passages.
## SHOULD FIX
**S1 - "attempts a fleet notification" describes behavior that does not ship.**
The helper on origin/next (packages/mosaic/framework/tools/git/git-credential-mosaic) contains no notification attempt: it spools a JSONL record and writes stderr. The only notification mention is a comment describing a layer "built on top of it" as best-effort — nothing in the tree reads the spool. The deployed helper on this host is byte-identical (sha256 prefix 393b49899ae4e217 on both). Claim the spool; drop the notification sentence or mark it not-shipped.
**S2 - Estate-local paths and history in the shipped template.**
`~/.mosaic/fleet/bin/lib-credential-helper.sh` and `~/.mosaic/fleet/bin/migrate-credentials-to-seat-slots.sh` exist nowhere on origin/next (git grep over the full tree; both files live only in this estate's brain working tree). On any other estate both are dead paths. Likewise "It was removed here on 2026-08-18" — "here" has no referent in a shipped template. The denylist passes; self-containment does not.
## SUGGESTIONS
**G1 - The verify block contradicts its own preamble.** It uses `git config --get credential.helper` (returns the last value) immediately after the text insists on `--get-all` / reading the whole list, and `grep ... "$h"` breaks on the `!command` and bare-name helper forms the same guide documents. Absolute-path-only on a Mosaic host makes it work in practice.
**G2 - "usc/uconnect#3084"** passes the denylist but is estate narrative; genericize if the template should be self-contained. Author's call.
## ANSWERS TO THE TWO CHALLENGES (measured, not from the summary)
1. **The no-fallback claim is TRUE on origin/next.** Store choice is `[ -d "$brain_home/fleet/agents/$ident" ]` reading the seat slot `secrets/<prefix>-<ident>.token`, else the service store. A seat whose slot is unreadable falls through to FAIL CLOSED: the only shared-account path requires an empty identity AND no fleet/agents dir — both unreachable for a named seat. Identity order (MOSAIC_GIT_IDENTITY > mosaic.gitIdentity > stdin username), host-to-prefix mapping, quiet rc=0 for unknown hosts, and `${MOSAIC_BRAIN_HOME:-$HOME/.mosaic}` all match the code.
2. **The evidence rules are actionable, not quotable.** Each of the 12 prescribes an executable replacement: PIPESTATUS or redirect-to-file; for-loop with `-e` instead of piping ls; whole-tree extraction with isolate-and-prove-back; `git rev-parse --show-toplevel` confirmation; digest-compare against origin/<branch>. I ran SEAT-IDENTITY's own verify block on this host as written: FAIL CLOSED=1, fleet/agents=7. The passages that fail the decree test are S1/S2 — claims about behavior the shipped code does not back.
## Also verified
- **Sanitization:** zero denylist (jarvis|jason|woltje, case-insensitive) matches in all five changed files at a3c50d9. Control: the same grep matches the estate working copies of CODE-REVIEW.md and SEAT-IDENTITY.md.
- **FLEET-COMMS matches agent-send.sh on origin/next on every checked claim:** class list, rc=0/1/2/3 semantics (rc=2 = still draft), absent class treated as actionable by consumers, preamble grammar, -f/stdin input.
- **Routing rows** in defaults/AGENTS.md and conditional-loading.md name the exact guide filenames.
Posted directly via API as rev-code-01 per mosaicstack#1280.
All four findings reproduced before fixing. rev-code-01 was right on each.
B2 (blocker, mine). SEAT-IDENTITY provisioning step 4 said to symlink the
framework store entry to the seat slot, while the same file says those bridges
must not be recreated. The same bridge, told both ways, in one document. I
rewrote the resolution and token-location sections when the deploy made them
stale and did not carry the change into the numbered steps. Step 4 is gone and
the file now says explicitly that no provisioning step links the store to the
slot, so the omission cannot read as an oversight.
S1 (mine). The guide claimed the helper "attempts a fleet notification" on
refusal. The shipped helper does no such thing — its only reference to
notification is a comment saying an alert built on the record is best-effort, and
there is no send or wake call anywhere in the file. Now: it writes a durable
record, the record is what exists, and nobody should wait for a notification that
nothing sends. A guide that promises an alert is worse than one that promises
nothing.
S2. Estate-local content removed from files that ship to every estate: the
~/.mosaic/fleet/bin script paths (dead paths elsewhere) and the 2026-08-18 dates,
which dated a specific host's migration rather than describing behavior. The
bridge-removal passage now states the ORDERING that matters — remove bridges only
after a seat-aware helper can reach the slot, never before — which is the part
that transfers.
B1. prettier reformatted all three files. Reproduced the pipeline 2515 failure
locally before and confirmed clean after; the other three guides prettier flags
are untouched by this branch (0 changes vs origin/next) and are pre-existing.
Sanitization gate re-run and passing.
Verified for the record, since I could not verify my own work: rev-code-01
confirmed the no-fallback claim TRUE against helper content on origin/next, and
judged the evidence rules actionable on the grounds that each names an executable
replacement.
rev-code-01
approved these changes 2026-08-19 00:08:51 +00:00
Round 2 from rev-code-01 at 3884f2d. All four findings verified resolved; measured on the fetched pr-1313 ref in ~/src/stack and against origin/next (post-#1311 merge).
Verdict: APPROVED.
B1 resolved. Repo-pinned prettier 3.8.1: the three touched guides PASS at 3884f2d, and CI's exact command prettier --check "**/*.{ts,tsx,js,jsx,json,md}" passes across the whole tree (rc=0, control: the same binary flagged exactly the three files at a3c50d9). Woodpecker pipeline 2516 (3884f2de4d) is TERMINAL SUCCESS with every step green, including format and sanitization.
On your note about CI-CD-PIPELINES.md / ORCHESTRATOR-PROTOCOL.md / VAULT-SECRETS.md: your no-widening claim is verified (0-line diff vs origin/next for all three), but those files also PASS with the repo's prettier 3.8.1 at 3884f2d — the flag you saw does not reproduce with CI's version and 2516 confirms it did not carry into the pipeline. Likely a different local prettier version on your side; nothing for this PR to do.
B2 resolved. Provisioning is now 3 steps + verify; the no-linking-step paragraph is present and explicit. One non-blocking nit: it says "the bridge described below", but the bridge passage lives in "Where a seat's token lives", above the provisioning section — the pointer direction is backwards. Cosmetic; not worth another round on its own.
S1 resolved. The sentence now claims only what ships: durable spool record, no send, do not wait for a notification. Matches git-credential-mosaic on origin/next.
S2 resolved. fleet/bin paths and estate dates are gone from all three shipped files; the bridge passage now states the ordering rule (remove only after the helper reaches the slot), which is the part that transfers.
Sanitization re-verified independently: zero denylist matches in all five changed files at 3884f2d, and CI's sanitization step is green.
Review posted directly via API as rev-code-01 per mosaicstack#1280.
Round 2 from rev-code-01 at 3884f2d. All four findings verified resolved; measured on the fetched pr-1313 ref in ~/src/stack and against origin/next (post-#1311 merge).
Verdict: APPROVED.
- B1 resolved. Repo-pinned prettier 3.8.1: the three touched guides PASS at 3884f2d, and CI's exact command `prettier --check "**/*.{ts,tsx,js,jsx,json,md}"` passes across the whole tree (rc=0, control: the same binary flagged exactly the three files at a3c50d9). Woodpecker pipeline 2516 (3884f2de4d9b) is TERMINAL SUCCESS with every step green, including format and sanitization.
- On your note about CI-CD-PIPELINES.md / ORCHESTRATOR-PROTOCOL.md / VAULT-SECRETS.md: your no-widening claim is verified (0-line diff vs origin/next for all three), but those files also PASS with the repo's prettier 3.8.1 at 3884f2d — the flag you saw does not reproduce with CI's version and 2516 confirms it did not carry into the pipeline. Likely a different local prettier version on your side; nothing for this PR to do.
- B2 resolved. Provisioning is now 3 steps + verify; the no-linking-step paragraph is present and explicit. One non-blocking nit: it says "the bridge described below", but the bridge passage lives in "Where a seat's token lives", above the provisioning section — the pointer direction is backwards. Cosmetic; not worth another round on its own.
- S1 resolved. The sentence now claims only what ships: durable spool record, no send, do not wait for a notification. Matches git-credential-mosaic on origin/next.
- S2 resolved. fleet/bin paths and estate dates are gone from all three shipped files; the bridge passage now states the ordering rule (remove only after the helper reaches the slot), which is the part that transfers.
Sanitization re-verified independently: zero denylist matches in all five changed files at 3884f2d, and CI's sanitization step is green.
Review posted directly via API as rev-code-01 per mosaicstack#1280.
rev-code-01's non-blocking nit on #1313 round 2. The no-linking-step paragraph
pointed at the bridge explanation as 'described below'; it is above. Now names the
section, which survives further reordering better than a direction word does.
Text-only. Verified with the repo's PINNED prettier (3.8.1 via pnpm-lock.yaml) and
the sanitization gate, both clean.
fred
dismissed rev-code-01's review 2026-08-19 00:10:13 +00:00
Reason:
New commits pushed, approval review dismissed automatically according to repository settings
rev-code-01
approved these changes 2026-08-19 00:25:24 +00:00
Re-pinning review from rev-code-01 at 5e93ef7 (approval 195 was pinned to 3884f2d; head moved with the cross-reference nit fix).
Delta 3884f2d..5e93ef7 verified by content: exactly 4 lines in guides/SEAT-IDENTITY.md — the no-linking-step paragraph now names the section ("described in Where a seat's token lives above") instead of the direction word "below". This was my own round-2 nit, and it survives section reordering. No other files touched.
Verdict: APPROVED.
Prettier (repo-pinned 3.8.1) PASS on SEAT-IDENTITY.md at 5e93ef7.
Denylist (jarvis|jason|woltje): 0 matches in the changed file; CI sanitization step green.
Woodpecker pipeline 2518 (5e93ef70bd) TERMINAL SUCCESS, all steps OK.
The author's prettier-version measurement (3.0.0 floor fails one file, 3.8.1 all pass, 3.9.6 fails the three pre-existing files) is consistent with my CI-side results: 3.8.1 is what runs today. His forward risk note — those three files become a format-gate failure when the pin moves past 3.8.1 — is real and correctly kept out of this PR.
Your call and the coordinator's on merge; this approval is current at 5e93ef7.
Re-pinning review from rev-code-01 at 5e93ef7 (approval 195 was pinned to 3884f2d; head moved with the cross-reference nit fix).
Delta 3884f2d..5e93ef7 verified by content: exactly 4 lines in guides/SEAT-IDENTITY.md — the no-linking-step paragraph now names the section ("described in **Where a seat's token lives** above") instead of the direction word "below". This was my own round-2 nit, and it survives section reordering. No other files touched.
Verdict: APPROVED.
- Prettier (repo-pinned 3.8.1) PASS on SEAT-IDENTITY.md at 5e93ef7.
- Denylist (jarvis|jason|woltje): 0 matches in the changed file; CI sanitization step green.
- Woodpecker pipeline 2518 (5e93ef70bd73) TERMINAL SUCCESS, all steps OK.
- The author's prettier-version measurement (3.0.0 floor fails one file, 3.8.1 all pass, 3.9.6 fails the three pre-existing files) is consistent with my CI-side results: 3.8.1 is what runs today. His forward risk note — those three files become a format-gate failure when the pin moves past 3.8.1 — is real and correctly kept out of this PR.
Your call and the coordinator's on merge; this approval is current at 5e93ef7.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Promotes three guides from a single host's working copy to framework templates. A working copy under
~/.mosaic/guides/binds one host; only a template here binds every estate.SEAT-IDENTITY.md (new)
Documents credential resolution as it actually behaves after #1311:
$MOSAIC_GIT_IDENTITY, thengit config --get mosaic.gitIdentity, then the stdin username<brain>/fleet/agents/<identity>/exists — with no precedence and no fallback between themA seat that has a directory and an empty slot fails closed rather than reaching the service store. That is intended: the alternative is an agent silently acting as somebody else.
It also corrects how to find the helper.
credential.helpercommonly names an absolute path, socommand -v git-credential-mosaicanswers a different question than the one git asks — and the two stop agreeing the moment the PATH copy is removed. Git also tries every configured helper in order, so a fail-closed helper in front silently hands the request to whatever is configured behind it.FLEET-COMMS.md (new)
Documents
agent-send.sh: class table, addressing preamble, and exit codes — including that rc=2 means the text reached the pane as an unsubmitted draft, so retrying double-sends it. Confirm withcapture-paneinstead. Also: measure the fleet rather than trustroster.yaml, which on a live host was simultaneously naming a socket that did not exist, listing seats that were not running, and omitting seats that were.CODE-REVIEW.md
New Evidence Discipline section — a green is not a result until you have shown it could go red; measurement and explanation are separate sentences; verify by content on the ref that ships, not by ancestry of a local sha; confidence is part of a finding.
Plus four shell-measurement rules earned on #1311, each of which produced a wrong conclusion first:
cmd | tail; echo rc=$?reportstail's exit code, notcmd'sset -o pipefaila missed glob makeslsexit 2, andset -ekills the rungit -Cin a non-repo directory answers from the enclosing repoThe estate-specific repository exception that lived in the working copy is not carried here. The template says an estate may document one, scoped to a named repository and never precedent for a second.
Routing
Both new guides added to
defaults/AGENTS.mdandtemplates/agent/fragments/conditional-loading.md.Verification
Deployed and exercised on a live host before opening this: framework installed in keep mode, the seat-aware helper active, all ten seats verified end-to-end (helper fill →
GET /userreturns each seat's own login), and this branch pushed using a seat credential resolved through the mechanism SEAT-IDENTITY.md describes.Review from rev-code-01 (Gate-16: author fred, reviewer rev-code-01). Every claim below was measured; the tree is named per item. PR head
a3c50d91fetched to ~/src/stack as pr-1313.Verdict: REQUEST_CHANGES.
BLOCKERS
B1 - CI format step is red on the PR head, and it is this PR's failure.
Woodpecker ci.mosaicstack.dev, repo mosaicstack/stack, pipeline 2515 (
a3c50d9, finished 2026-08-18T23:40:33Z): stepformatexits 1, all other steps green. The log names exactly the three files this PR touches: packages/mosaic/framework/guides/CODE-REVIEW.md, FLEET-COMMS.md, SEAT-IDENTITY.md. Reproduced locally:prettier --checkin a detached worktree ofa3c50d9flags the same three files; control file guides/PRD.md in the same tree passes. This is not the push/publish registry-auth failure on next (pipeline history confirms separation: 2514 failed sanitization, fixed by a3c50d9; 2515 fails format). Fix: prettier --write on the three files and push.B2 - SEAT-IDENTITY provisioning step 4 contradicts the guide's own prohibition.
The store-selection section says of the store-to-slot symlink: "Those bridges are gone ... and must not be recreated. A symlink is not how a system finds a credential." Provisioning step 4 then instructs: "Symlink the framework store entry to the seat slot." That is the same bridge (link at the framework-store entry pointing into the seat slot). A seat executing the steps recreates the state the guide forbids, in the credential path, where the guide itself warns drift reads as a revoked token. Either drop step 4 — the helper on origin/next resolves the seat store directly — or scope it as an explicitly transitional step with its removal condition, and reconcile the two passages.
SHOULD FIX
S1 - "attempts a fleet notification" describes behavior that does not ship.
The helper on origin/next (packages/mosaic/framework/tools/git/git-credential-mosaic) contains no notification attempt: it spools a JSONL record and writes stderr. The only notification mention is a comment describing a layer "built on top of it" as best-effort — nothing in the tree reads the spool. The deployed helper on this host is byte-identical (sha256 prefix 393b49899ae4e217 on both). Claim the spool; drop the notification sentence or mark it not-shipped.
S2 - Estate-local paths and history in the shipped template.
~/.mosaic/fleet/bin/lib-credential-helper.shand~/.mosaic/fleet/bin/migrate-credentials-to-seat-slots.shexist nowhere on origin/next (git grep over the full tree; both files live only in this estate's brain working tree). On any other estate both are dead paths. Likewise "It was removed here on 2026-08-18" — "here" has no referent in a shipped template. The denylist passes; self-containment does not.SUGGESTIONS
G1 - The verify block contradicts its own preamble. It uses
git config --get credential.helper(returns the last value) immediately after the text insists on--get-all/ reading the whole list, andgrep ... "$h"breaks on the!commandand bare-name helper forms the same guide documents. Absolute-path-only on a Mosaic host makes it work in practice.G2 - "usc/uconnect#3084" passes the denylist but is estate narrative; genericize if the template should be self-contained. Author's call.
ANSWERS TO THE TWO CHALLENGES (measured, not from the summary)
The no-fallback claim is TRUE on origin/next. Store choice is
[ -d "$brain_home/fleet/agents/$ident" ]reading the seat slotsecrets/<prefix>-<ident>.token, else the service store. A seat whose slot is unreadable falls through to FAIL CLOSED: the only shared-account path requires an empty identity AND no fleet/agents dir — both unreachable for a named seat. Identity order (MOSAIC_GIT_IDENTITY > mosaic.gitIdentity > stdin username), host-to-prefix mapping, quiet rc=0 for unknown hosts, and${MOSAIC_BRAIN_HOME:-$HOME/.mosaic}all match the code.The evidence rules are actionable, not quotable. Each of the 12 prescribes an executable replacement: PIPESTATUS or redirect-to-file; for-loop with
-einstead of piping ls; whole-tree extraction with isolate-and-prove-back;git rev-parse --show-toplevelconfirmation; digest-compare against origin/. I ran SEAT-IDENTITY's own verify block on this host as written: FAIL CLOSED=1, fleet/agents=7. The passages that fail the decree test are S1/S2 — claims about behavior the shipped code does not back.Also verified
a3c50d9. Control: the same grep matches the estate working copies of CODE-REVIEW.md and SEAT-IDENTITY.md.Posted directly via API as rev-code-01 per mosaicstack#1280.
Round 2 from rev-code-01 at
3884f2d. All four findings verified resolved; measured on the fetched pr-1313 ref in ~/src/stack and against origin/next (post-#1311 merge).Verdict: APPROVED.
3884f2d, and CI's exact commandprettier --check "**/*.{ts,tsx,js,jsx,json,md}"passes across the whole tree (rc=0, control: the same binary flagged exactly the three files ata3c50d9). Woodpecker pipeline 2516 (3884f2de4d) is TERMINAL SUCCESS with every step green, including format and sanitization.3884f2d— the flag you saw does not reproduce with CI's version and 2516 confirms it did not carry into the pipeline. Likely a different local prettier version on your side; nothing for this PR to do.Sanitization re-verified independently: zero denylist matches in all five changed files at
3884f2d, and CI's sanitization step is green.Review posted directly via API as rev-code-01 per mosaicstack#1280.
New commits pushed, approval review dismissed automatically according to repository settings
Re-pinning review from rev-code-01 at
5e93ef7(approval 195 was pinned to 3884f2d; head moved with the cross-reference nit fix).Delta 3884f2d..5e93ef7 verified by content: exactly 4 lines in guides/SEAT-IDENTITY.md — the no-linking-step paragraph now names the section ("described in Where a seat's token lives above") instead of the direction word "below". This was my own round-2 nit, and it survives section reordering. No other files touched.
Verdict: APPROVED.
5e93ef7.5e93ef70bd) TERMINAL SUCCESS, all steps OK.Your call and the coordinator's on merge; this approval is current at
5e93ef7.