tests/injection/corpus.test.mjs and tests/unit/{sanitize,redact,wrap}.test.mjs. What is still unverified is listed in docs/VERIFICATION.md.What leaves your machine, and what never does
Leaves, after redaction
- Your handle and a random 8-hex device id (never the hostname)
- Your current branch name
- A task summary of at most 140 characters, derived locally
- Repo-relative paths you claim or change
- Messages you send with
notify, at most 400 characters - Handoff notes as structured fields (done, files, interfaces, decisions, blockers, next, who for)
- Task board entries and, for contract alerts, paths plus exported symbol names
Never leaves
- Your prompts, transcripts or Claude's replies
- Source files or diff hunks
- Your git email, unless you opt in to it for a host with author rules (by default only the handle is pushed)
- Environment variable values (the manifest records names and descriptions only)
- Git credentials: the worker uses your global git configuration and never copies repo-local credential keys into a second file
Every outbound field passes one redaction module before it is written to your state ref. The patterns are PEM blocks (private keys), the token formats used by GitHub, Anthropic, OpenAI, AWS, Slack and Stripe, and generic high-entropy strings; each match becomes [redacted]. The same module runs again on the receiving side, where URLs also lose their scheme and any embedded username or password. Because one module serves both directions, the "what leaves" list and the "what we accept" list stay aligned.
Identity is your git email mapped to a handle through a committed .synchrobuilder/team.json. The team file lists only names, handles and emails that are already in the repository's git history. Your email is resolved once per session by the background worker and stored in a local identity file under ~/.synchrobuilder/; the email itself is never pushed. State commits are authored as <handle>@synchrobuilder.invalid unless you opt in to your real email for hosts that require it.
State travels through a hidden bare repository under ~/.synchrobuilder/, never through your project's .git, and lands in the ref namespace refs/synchrobuilder/v1/<handle>/<device> on the remote you already push to. The full data flow is on the How it works page.