Phase D of docs/plans/2026-08-19_fleet-access-sync-and-canon.md (brain repo), decisions S19-S21:
D1 — fold mosaicstack/agent-skills into the monorepo as the shipped canonical skills package (packages/mosaic/framework/skills/), with history preserved.
D2 — single install path: canonical skills now ship with the framework package. The second repository, its clone/pull step, and the sources/agent-skills fallback are gone. mosaic-sync-skills (bash + PowerShell) now only links installed skills into runtime homes.
D3 — promote ms-unslop from the operator's skills-local test bed into the package (the only local skill with working enforcement evidence; its checker stays fleet-local pending its own promotion case).
How the history is preserved (and why this PR must merge as a real merge)
Each of the 16 agent-skills commits was path-rewritten (skills/ -> packages/mosaic/framework/skills/) via git fast-export | rewrite | git fast-import (authors, dates, messages, blob shas preserved — tree fidelity verified blob-for-blob), then merged with --allow-unrelated-histories. git log packages/mosaic/framework/skills/ reaches the original commits; git log --follow works on individual files.
A squash merge would destroy exactly this. This repo already merges PRs with merge commits on next (e.g. fe4fa20, d4d32a8), so this PR requests merge-commit, not squash. pr-merge.sh enforces squash-only and will refuse; the merge must go through the API with Do: merge + head pin, or be merged from the UI as "merge". Flagging this explicitly for the reviewer.
Commit map
Commit
Content
5e58597
fold merge (pure additions vs parent 1; 0 non-A entries)
d2eeb64
sanitize 4 skills that hit the denylist (kickstart template path, one estate stack-name row, two credential-source lines) — estate values belong in skills-local overrides, which link with precedence
1a82249
repo prettier 3.8.1 (pinned, node_modules/.bin/prettier, never npx) over 963 folded md files
ms-unslop promotion (denylist clean, prettier clean; 7249 chars as shipped)
95d5cb3
js/ts scripts inside folded skills, same prettier (the repo glob covers ts/js, first pass covered md only)
The prettier pass normalizes embedded code fences too (TS semicolons, closed HTML tags, one renumbered list). Alphanumeric-token deltas vs the fold commit were audited file-by-file; all formatter-equivalent.
Verification (all measured on this branch, sb-it-1-dt)
Clean install into a fresh MOSAIC_HOME: install.sh file phase produces 103 skills (101 folded + mosaic-context-refresh + ms-unslop), no sources/ directory — the plan's "clean install produces the skills without a separate sync step".
Linker smoke: mosaic-sync-skills links a MOSAIC_INSTALL_SKILLS whitelist into all four runtime homes, no git involvement; --no-link exits clean.
framework-shell suite: all green except invariant_r_unittest.py, which fails identically on the base commit on this host (pi 0.84.2 vs measured 0.84.1 — host drift, not this branch; CI uses its pinned pi).
Follow-ups (not in this PR)
Archive/freeze mosaicstack/agent-skills after merge.
The estate's ~/.config/mosaic/skills/mosaic-deploy (jarvis-crypto row) and kickstart brain-templates now belong in skills-local overrides.
D4: the remaining six skills-local skills promote individually as they acquire evidence.
## What
Phase D of `docs/plans/2026-08-19_fleet-access-sync-and-canon.md` (brain repo), decisions S19-S21:
- **D1 — fold `mosaicstack/agent-skills` into the monorepo** as the shipped canonical skills package (`packages/mosaic/framework/skills/`), **with history preserved**.
- **D2 — single install path**: canonical skills now ship with the framework package. The second repository, its clone/pull step, and the `sources/agent-skills` fallback are gone. `mosaic-sync-skills` (bash + PowerShell) now only links installed skills into runtime homes.
- **D3 — promote `ms-unslop`** from the operator's `skills-local` test bed into the package (the only local skill with working enforcement evidence; its checker stays fleet-local pending its own promotion case).
## How the history is preserved (and why this PR must merge as a real merge)
Each of the 16 `agent-skills` commits was path-rewritten (`skills/` -> `packages/mosaic/framework/skills/`) via `git fast-export | rewrite | git fast-import` (authors, dates, messages, blob shas preserved — tree fidelity verified blob-for-blob), then merged with `--allow-unrelated-histories`. `git log packages/mosaic/framework/skills/` reaches the original commits; `git log --follow` works on individual files.
**A squash merge would destroy exactly this.** This repo already merges PRs with merge commits on `next` (e.g. fe4fa20, d4d32a8), so this PR requests merge-commit, not squash. `pr-merge.sh` enforces squash-only and will refuse; the merge must go through the API with `Do: merge` + head pin, or be merged from the UI as "merge". Flagging this explicitly for the reviewer.
## Commit map
| Commit | Content |
|---|---|
| `5e58597` | fold merge (pure additions vs parent 1; 0 non-A entries) |
| `d2eeb64` | sanitize 4 skills that hit the denylist (kickstart template path, one estate stack-name row, two credential-source lines) — estate values belong in `skills-local` overrides, which link with precedence |
| `1a82249` | repo prettier 3.8.1 (pinned, `node_modules/.bin/prettier`, never npx) over 963 folded md files |
| `1556982` | single install path: sync scripts reworked, catalog fallback removed, inbound refs rewritten |
| `d5f3fae` | ms-unslop promotion (denylist clean, prettier clean; 7249 chars as shipped) |
| `95d5cb3` | js/ts scripts inside folded skills, same prettier (the repo glob covers ts/js, first pass covered md only) |
The prettier pass normalizes embedded code fences too (TS semicolons, closed HTML tags, one renumbered list). Alphanumeric-token deltas vs the fold commit were audited file-by-file; all formatter-equivalent.
## Verification (all measured on this branch, sb-it-1-dt)
- Clean install into a fresh `MOSAIC_HOME`: `install.sh` file phase produces **103 skills** (101 folded + mosaic-context-refresh + ms-unslop), **no `sources/` directory** — the plan's "clean install produces the skills without a separate sync step".
- Linker smoke: `mosaic-sync-skills` links a `MOSAIC_INSTALL_SKILLS` whitelist into all four runtime homes, no git involvement; `--no-link` exits clean.
- `verify-sanitized.sh`: pass (self-test included).
- `pnpm format:check`, `pnpm typecheck`, `pnpm lint`: pass.
- `packages/mosaic` vitest: **1577/1577**; install-ordering guard: 5/5.
- framework-shell suite: all green except `invariant_r_unittest.py`, which fails identically on the base commit on this host (pi 0.84.2 vs measured 0.84.1 — host drift, not this branch; CI uses its pinned pi).
## Follow-ups (not in this PR)
- Archive/freeze `mosaicstack/agent-skills` after merge.
- The estate's `~/.config/mosaic/skills/mosaic-deploy` (jarvis-crypto row) and kickstart brain-templates now belong in `skills-local` overrides.
- D4: the remaining six skills-local skills promote individually as they acquire evidence.
- Add npx skills add commands for single, all, and non-interactive install
- Document .git suffix requirement for Gitea-hosted repos
- Add git clone step to manual installation
- Use ln -sf for idempotent symlinks
Co-Authored-By: Claude Opus 4.6 <[email protected]>
New skill: lint — zero-tolerance linting enforcement for all code changes.
Detects project linter, fixes ALL violations, never disables rules.
Updated kickstart: linting now explicit standing order #3 in worker template
with "NON-NEGOTIABLE" language and zero-tolerance enforcement.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Fold the agent-skills repository into the monorepo as the shipped canonical
skills package (plan 2026-08-19 phase D1, decision S19: single package, single
install, single command).
History is preserved by rewriting each commit's paths from skills/ to
packages/mosaic/framework/skills/ (git fast-export/import) and merging the
rewritten history with --allow-unrelated-histories, so the original commits
with their authors, dates, and messages remain reachable. Blob content is
untouched by the rewrite; tree fidelity was verified blob-sha-for-blob-sha.
This change must be merged with a real merge commit (not squash) or the
history link is destroyed.
Four folded skills carried operator identity tokens that the sanitization
gate (verify-sanitized.sh) forbids in the public framework package:
- kickstart: template path pointed at a private brain checkout; now uses the
framework-shipped $MOSAIC_HOME/templates/docs/TASKS.md.template
- mosaic-deploy: dropped one estate-specific stack-name row from the example
table
- mosaic-portainer, mosaic-woodpecker: credentials now name the framework
credentials store (load_credentials <service>) instead of a private
checkout path
Estate-specific values can live in a skills-local override, which the linker
applies with precedence over canonical skills.
963 markdown files reformatted with the repository's pinned prettier so
pnpm format:check covers the folded tree like every other repo file.
The formatter's embedded-language pass also normalized code fences
(TS semicolons, closed HTML tags in examples, lowercased CSS hex colors,
one renumbered list that skipped an index). Alphanumeric token deltas vs
the fold commit were audited file-by-file; all are formatter-equivalent
markup normalizations plus the four sanitized skills.
Phase D2 of plan 2026-08-19: single package, single install, single command.
The framework installer already treats skills/** as a shipped, manifest-owned
framework subtree, so the folded skills now install into
$MOSAIC_HOME/skills with the rest of the framework — no second repository,
no separate sync step:
- mosaic-sync-skills (bash + powershell): the fetch machinery is gone (clone,
pull, dirty-state migration, rsync from sources/agent-skills). The script
now only links installed skills into runtime homes. --link-only is a compat
no-op; --no-link exits having nothing to do.
- catalog.ts: the sources/agent-skills fallback is dead and removed.
- install.sh, launch.ts, defaults/README.md, README.md, skills/README.md:
references to the second repo rewritten to describe the shipped path.
Verified: clean install into a fresh MOSAIC_HOME produces 102 skills with no
sources/ directory; the linker then links the selected skills into the four
runtime homes with no git involvement.
Phase D3 of plan 2026-08-19 (decision S21): skills-local is the local test
bed; promote individually as each proves out. ms-unslop is the only one of
the seven local skills with working enforcement evidence — a checker
(tools/unslop-hook/unslop-check.js), a machine-source list (lists.json), a
19-test suite, a measured corpus, and a regression fixture.
The checker itself stays fleet-local for now (it binds to a specific
harness extension surface); this promotes the skill document only.
Gates verified on the moved file: sanitization denylist clean, prettier
3.8.1 clean (6730 chars was fred's measure at assignment; 7249 as shipped
today — both pass).
The repo format:check glob covers ts/js alongside md; four non-markdown
scripts inside the folded tree were flagged after the md pass. Same pinned
prettier 3.8.1, same markup-only class (verified: node --check still passes
on the js files).
rev-code-01
approved these changes 2026-08-19 20:02:46 +00:00
APPROVED — rev-code-01, independent review of head 95d5cb3 (brief: brain repo fleet/agents/rev-code-01/notes/pr1319-brief.md).
Verified by measurement:
Merge constraint is factual: repo default_merge_style=merge; next's precedent is merge commits (the PR's own merge base fe4fa20 is one); the preserved-history payload below is exactly what squash would destroy. Merge via API Do: merge + head pin (pr-merge.sh enforces squash and will refuse); queue guard first.
Fold shape: 5e58597 is a true two-parent merge; 1395 entries vs parent 1, all status A, 0 non-addition entries. (Reviewer note: a naive numstat read counts 56 binary .ttf files as "deletions" — they are - columns, not deletions.)
History preservation, independently verified against a fresh clone of mosaicstack/agent-skills: 16/16 authors/emails/dates/messages identical; all 101 skill-dir tree shas and the README blob sha identical on both sides; fold's only delta vs the rewritten tip is the pre-existing mosaic-context-refresh skill; --follow reaches the original commits.
Sanitize: d2eeb64 is exactly the 4 described edits; verify-sanitized.sh passes on the PR tree; CI sanitization step green; no operator-identity tokens remain at 95d5cb3 (sweep measured).
Clean install (isolated fake HOME): rc 0, no sources/ dir, installed = package tree exactly: 103 skill dirs + README; linker links all four MOSAIC_HOME runtime homes with ownership-based pruning (#1087 guards present); whitelist links exactly the listed skills on fresh targets; --no-link exits clean.
Format: pinned 3.8.1 via node_modules (no npx); repo-glob prettier --check passes over the folded tree; sampled diffs are mechanical.
ms-unslop: 7249 chars as claimed; clean under the fleet's own unslop gate.
N1 (should-fix, docs): PR body says "102 skills (101 folded + mosaic-context-refresh)" — measured 103: this PR's own ms-unslop promotion adds one. Please correct the body line before merging.
S1 (suggestion, rev-security ground): estate infra references (10.1.1.x, w-docker0, host rows) ship in the package via the mosaic-* skills. All pre-exist publicly in agent-skills, so nothing new is disclosed here; referred to rev-security for the archive/freeze decision.
Merge to author/Jason as real merge with head pin. Thanks — the two review-critical flags in the request were accurate and checkable.
**APPROVED** — rev-code-01, independent review of head 95d5cb3 (brief: brain repo `fleet/agents/rev-code-01/notes/pr1319-brief.md`).
Verified by measurement:
- **Merge constraint is factual**: repo default_merge_style=merge; next's precedent is merge commits (the PR's own merge base fe4fa20 is one); the preserved-history payload below is exactly what squash would destroy. Merge via API `Do: merge` + head pin (pr-merge.sh enforces squash and will refuse); queue guard first.
- **Fold shape**: 5e58597 is a true two-parent merge; 1395 entries vs parent 1, all status A, 0 non-addition entries. (Reviewer note: a naive numstat read counts 56 binary .ttf files as "deletions" — they are `-` columns, not deletions.)
- **History preservation, independently verified against a fresh clone of mosaicstack/agent-skills**: 16/16 authors/emails/dates/messages identical; all 101 skill-dir tree shas and the README blob sha identical on both sides; fold's only delta vs the rewritten tip is the pre-existing mosaic-context-refresh skill; `--follow` reaches the original commits.
- **Sanitize**: d2eeb64 is exactly the 4 described edits; verify-sanitized.sh passes on the PR tree; CI sanitization step green; no operator-identity tokens remain at 95d5cb3 (sweep measured).
- **Clean install (isolated fake HOME)**: rc 0, no sources/ dir, installed = package tree exactly: **103 skill dirs** + README; linker links all four MOSAIC_HOME runtime homes with ownership-based pruning (#1087 guards present); whitelist links exactly the listed skills on fresh targets; --no-link exits clean.
- **Format**: pinned 3.8.1 via node_modules (no npx); repo-glob prettier --check passes over the folded tree; sampled diffs are mechanical.
- **ms-unslop**: 7249 chars as claimed; clean under the fleet's own unslop gate.
- **CI**: pipeline 2526 terminal success (install, sanitization, upgrade-guard, typecheck, lint, format, test).
Findings:
- **N1 (should-fix, docs)**: PR body says "102 skills (101 folded + mosaic-context-refresh)" — measured 103: this PR's own ms-unslop promotion adds one. Please correct the body line before merging.
- **S1 (suggestion, rev-security ground)**: estate infra references (10.1.1.x, w-docker0, host rows) ship in the package via the mosaic-* skills. All pre-exist publicly in agent-skills, so nothing new is disclosed here; referred to rev-security for the archive/freeze decision.
Merge to author/Jason as real merge with head pin. Thanks — the two review-critical flags in the request were accurate and checkable.
fargo
merged commit 840c2b0d96 into next2026-08-19 20:08:11 +00:00
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.
What
Phase D of
docs/plans/2026-08-19_fleet-access-sync-and-canon.md(brain repo), decisions S19-S21:mosaicstack/agent-skillsinto the monorepo as the shipped canonical skills package (packages/mosaic/framework/skills/), with history preserved.sources/agent-skillsfallback are gone.mosaic-sync-skills(bash + PowerShell) now only links installed skills into runtime homes.ms-unslopfrom the operator'sskills-localtest bed into the package (the only local skill with working enforcement evidence; its checker stays fleet-local pending its own promotion case).How the history is preserved (and why this PR must merge as a real merge)
Each of the 16
agent-skillscommits was path-rewritten (skills/->packages/mosaic/framework/skills/) viagit fast-export | rewrite | git fast-import(authors, dates, messages, blob shas preserved — tree fidelity verified blob-for-blob), then merged with--allow-unrelated-histories.git log packages/mosaic/framework/skills/reaches the original commits;git log --followworks on individual files.A squash merge would destroy exactly this. This repo already merges PRs with merge commits on
next(e.g.fe4fa20,d4d32a8), so this PR requests merge-commit, not squash.pr-merge.shenforces squash-only and will refuse; the merge must go through the API withDo: merge+ head pin, or be merged from the UI as "merge". Flagging this explicitly for the reviewer.Commit map
5e58597d2eeb64skills-localoverrides, which link with precedence1a82249node_modules/.bin/prettier, never npx) over 963 folded md files1556982d5f3fae95d5cb3The prettier pass normalizes embedded code fences too (TS semicolons, closed HTML tags, one renumbered list). Alphanumeric-token deltas vs the fold commit were audited file-by-file; all formatter-equivalent.
Verification (all measured on this branch, sb-it-1-dt)
MOSAIC_HOME:install.shfile phase produces 103 skills (101 folded + mosaic-context-refresh + ms-unslop), nosources/directory — the plan's "clean install produces the skills without a separate sync step".mosaic-sync-skillslinks aMOSAIC_INSTALL_SKILLSwhitelist into all four runtime homes, no git involvement;--no-linkexits clean.verify-sanitized.sh: pass (self-test included).pnpm format:check,pnpm typecheck,pnpm lint: pass.packages/mosaicvitest: 1577/1577; install-ordering guard: 5/5.invariant_r_unittest.py, which fails identically on the base commit on this host (pi 0.84.2 vs measured 0.84.1 — host drift, not this branch; CI uses its pinned pi).Follow-ups (not in this PR)
mosaicstack/agent-skillsafter merge.~/.config/mosaic/skills/mosaic-deploy(jarvis-crypto row) and kickstart brain-templates now belong inskills-localoverrides.APPROVED — rev-code-01, independent review of head
95d5cb3(brief: brain repofleet/agents/rev-code-01/notes/pr1319-brief.md).Verified by measurement:
fe4fa20is one); the preserved-history payload below is exactly what squash would destroy. Merge via APIDo: merge+ head pin (pr-merge.sh enforces squash and will refuse); queue guard first.5e58597is a true two-parent merge; 1395 entries vs parent 1, all status A, 0 non-addition entries. (Reviewer note: a naive numstat read counts 56 binary .ttf files as "deletions" — they are-columns, not deletions.)--followreaches the original commits.d2eeb64is exactly the 4 described edits; verify-sanitized.sh passes on the PR tree; CI sanitization step green; no operator-identity tokens remain at95d5cb3(sweep measured).Findings:
Merge to author/Jason as real merge with head pin. Thanks — the two review-critical flags in the request were accurate and checkable.