Summary
Running /sync-gbrain (incremental) deleted my entire working directory. The code-index stage (gbrain sync --strategy code) removed the source's local_path — which was my actual repo working tree, not a managed clone.
/Users/.../tt-flutter-app → gone (not in Trash, no APFS snapshot)
Environment
- gstack: v1.55.1.0 (auto-upgraded from v1.55.0.0 at the start of the same
/sync-gbrain run)
- gbrain:
gbrain0.42.8.0
- engine: pglite (local-stdio MCP mode)
- macOS (Darwin 25.1.0, APFS), zsh
The source that got wiped
{
"id": "gstack-code-app-3556c6de-e0c7ab",
"local_path": "/Users/.../tt-flutter-app",
"federated": true,
"page_count": 8018,
"last_sync_at": null
}
It was registered (by an earlier /setup-gbrain / /sync-gbrain --full) pointing local_path directly at the live repo working tree. Note last_sync_at: null.
What happened (from ~/.gstack/.gbrain-sync-state.json)
code ran=true ok=false "gbrain sync --strategy code --source gstack-code-app-3556c6de-e0c7ab exited 1" (status: failed, source_path = the repo)
memory ran=true ok=true "gbrain import: 3 imported, 128 unchanged"
brain-sync ran=true ok=false "gstack-brain-sync exited undefined"
The orchestrator surfaced code … ERR exited 1 but did not warn that the source tree had been removed. The very next shell command failed with Working directory ... was deleted; shell cwd recovered. The directory and its .git were gone.
Top of the code-stage output also showed:
Embedding model "openai:text-embedding-3-large" requires OPENAI_API_KEY.
so the code stage was already in a failing/degraded path when whatever destructive step ran.
Impact
- Working tree +
.git destroyed. Two unpushed local commits lost (recovered manually from the session transcript + remote).
- The CLAUDE.md guidance even warns "URL-managed sources can auto-reclone" — but this source had no
--url, just a path. A path-registered source should never delete its local_path.
Expected
gbrain sync --strategy code must treat local_path as read-only. It should index, never rm/reclone over a user's working tree.
- If a reclone is ever attempted, require an explicit opt-in AND refuse when the path is a git working tree with uncommitted changes or unpushed commits.
- On code-stage failure, abort before any destructive filesystem op and report loudly.
Repro (suspected)
- Register a federated code source with
local_path = a live git repo (no --url).
- Have the configured embedding model require an API key that isn't set (forces the code stage to error).
- Run
/sync-gbrain. Code stage exits 1; the local_path tree is removed.
Summary
Running
/sync-gbrain(incremental) deleted my entire working directory. The code-index stage (gbrain sync --strategy code) removed the source'slocal_path— which was my actual repo working tree, not a managed clone.Environment
/sync-gbrainrun)gbrain0.42.8.0The source that got wiped
{ "id": "gstack-code-app-3556c6de-e0c7ab", "local_path": "/Users/.../tt-flutter-app", "federated": true, "page_count": 8018, "last_sync_at": null }It was registered (by an earlier
/setup-gbrain//sync-gbrain --full) pointinglocal_pathdirectly at the live repo working tree. Notelast_sync_at: null.What happened (from
~/.gstack/.gbrain-sync-state.json)The orchestrator surfaced
code … ERR exited 1but did not warn that the source tree had been removed. The very next shell command failed withWorking directory ... was deleted; shell cwd recovered. The directory and its.gitwere gone.Top of the code-stage output also showed:
so the code stage was already in a failing/degraded path when whatever destructive step ran.
Impact
.gitdestroyed. Two unpushed local commits lost (recovered manually from the session transcript + remote).--url, just a path. A path-registered source should never delete itslocal_path.Expected
gbrain sync --strategy codemust treatlocal_pathas read-only. It should index, neverrm/reclone over a user's working tree.Repro (suspected)
local_path= a live git repo (no--url)./sync-gbrain. Code stage exits 1; thelocal_pathtree is removed.