Each working tree publishes exactly one ref on the team's remote: refs/synchrobuilder/v1/<handle>/<device>/<seat>. The handle is a short name matched from your git email through the committed team file (ADR-002); the device id is a random 8-hex value made once per machine and stored locally, never the hostname; the seat identifies one working tree, so two agents in two worktrees of the same clone are two participants rather than one. Refs published before seats existed have two segments and are still read. The tip of that ref is always a parentless snapshot commit whose tree holds only that writer's files: presence, claims, board entries, contract alerts, messages, handoffs and a small manifest that readers check against the ref name.
There are no merges, ever. The writer builds each snapshot with git plumbing (hash-object, mktree, commit-tree) and pushes with --force-with-lease, never bare --force. It never reads anyone else's state before writing, so nothing a teammate pushes can stop you publishing. Every commit message starts with [skip ci]. A custom ref namespace stays out of branch lists, and the design expects it to sit outside branch rulesets. GitHub's reference API documentation accepts any name that starts with refs/ and has two slashes. GitHub accepts the namespace: a hosted check on 2026-09-18 passed 11 of 11, including the ref staying out of git branch -a and triggering no workflow run. GitLab, Bitbucket and Azure DevOps have not been tested, and a repository-wide ruleset refusing the state ref has not been tried.
The fallback ladder: if a host rejects the custom namespace, the plugin falls back to branches under refs/heads/synchrobuilder/v1/ in fast-forward append mode, with [skip ci] and -o ci.skip on every push. If that is rejected too, it goes read-only (fetch only) or local-only and records the server's reason so the digest can say why publishing is blocked. The branch-mode fallback was exercised against GitHub; a provider actually rejecting the namespace has not been observed, because no provider did.
All git work happens in a hidden bare repository under ~/.synchrobuilder/remotes/<sha256 of the normalized remote URL>/state.git, run by a detached Node worker. Your own .git is never written to, and your branches and working tree are never touched. The worker fetches every 45 seconds plus up to 15 seconds of jitter, and pushes only when your state changed or 60 seconds passed. Important events (a claim, a release, a message, a board change, a handoff, a closed session) trigger a sync tick within about a second. Credentials come from your global git configuration only; git is spawned as an argument list with no shell and with per-call timeouts.
Hooks never run git and never open a socket. They find the checkout by reading .git/config and the gitdir and commondir files, then read snapshot.json from the plugin's own state directory under ~/.synchrobuilder. Every hook runs inside one try/catch; on any error it writes one line to a local log, prints nothing and exits 0. It never exits 2, so it can never block you.
What the hooks tell Claude depends on how fresh the snapshot is. Under 5 minutes old: full policy. Between 5 and 15 minutes: an ask collision setting degrades to warn. Over 15 minutes: warn only, with an "as of HH:MMZ" stamp. Over 24 hours: only the session digest mentions that sync is stale. Stale data never blocks and never asks.
Verified: two developers over a real bare remote, in tests/e2e/multiplayer.test.mjs, on ubuntu, macOS and Windows in CI. It drives the real CLI, hooks and worker through presence, a collision warning, a message, a handoff and an offline period, then asserts that a claim made while the remote was away arrives once it is back and that neither repository was written to: no worktree change, no local branch, nothing under .git. Against real GitHub, a hosted check on 2026-09-18 passed 11 of 11: the push is accepted, --force-with-lease replaces the writer's own ref, the ref stays out of git branch -a while showing in ls-remote, a second clone round-trips the JSON, main is untouched, the branch-mode fallback publishes, and no Actions run is triggered. Not verified: GitLab, Bitbucket and Azure DevOps; branch protection rules refusing the state ref; recovery from a deliberately poisoned ref or a mirror push that deletes the namespace, neither of which has a test yet.