| name | estate-sync |
| description | Use when fleet machines have stale/diverged skills or config ("update didn't reach the other computer"), when setting up a new machine, or when the estate-sync log shows CONFLICT/FAIL. Owns the automatic two-way propagation of the skills-library hub (~/.claude) across all machines. |
estate-sync — every machine pulls and pushes the hub automatically
The skills-library repo (~/.claude, allowlist-gitignored: only skills/, CLAUDE.md,
AGENTS.md, bootstrap.sh sync — settings/projects/secrets never leave a machine) is the
estate's update bus. A 15-minute agent on every machine keeps it flowing both ways:
pull --rebase from main, then a safe selective push of local changes (symlinks never
staged — they carry machine-absolute paths, [[feedback-skills-library-symlink-commits]]).
Trunk-based: main only; a repo sitting on a feature branch is fetched but never touched.
Install (once per machine)
- macOS:
zsh ~/.claude/skills/estate-sync/scripts/install-launchagent.sh
→ LaunchAgent com.unite.estate-sync, every 15 min + at load.
- Windows:
powershell -ExecutionPolicy Bypass -File %USERPROFILE%\.claude\skills\estate-sync\scripts\install-task.ps1
→ Task Scheduler job "Unite Estate Sync", every 15 min.
- New machine bootstrap: clone
CleanExpo/skills-library to ~/.claude (or run its
bootstrap.sh), authenticate gh, then install the agent.
- Completion criterion:
~/.claude/logs/estate-sync.log shows an ok: in sync
line within 15 minutes of install.
Health check / troubleshooting
tail -5 ~/.claude/logs/estate-sync.log — expect ok: in sync lines every ~15 min.
HEALTH: tracked deletion(s) present → a tracked path is missing locally. The cycle
exits non-zero before staging or pushing and does not emit ok: in sync; restore the
path or deliberately commit its removal after review.
CONFLICT line → the machine has local commits that no longer rebase: reconcile by
hand (git status, resolve, git rebase --continue), then the next cycle resumes.
The agent never force-pushes and never resolves conflicts itself.
skip: on branch <x> → a session is mid-work on a feature branch; normal. If it
persists for days, the branch was abandoned — merge or reset it to main.
- Nothing in the log → the agent isn't installed/loaded on this machine; run install.
- Network layer: machines need not reach each other — sync rides GitHub. Tailscale is
for direct machine-to-machine work (
tailscale status); a peer shown offline for
months is a stale node to remove in the admin console (founder action).
- Completion criterion: the same commit SHA at
git -C ~/.claude log -1 main on
every online machine within one cycle.
Boundaries
The agent only ever touches ~/.claude on main. It never force-pushes, never deletes
remote branches, never resolves conflicts autonomously, and never syncs untracked paths
(the allowlist gitignore is the contract). Product repos are NOT its business — they
ship via PRs and merge lanes.