2026-09-15: The airgap sync and the 1,237 ghost files

An airgap is only as reliable as the bridge that carries its history. When the morning alerts fired across the haus, Neo flagged a warning from Force Flow: VM has 1237 uncommitted changes; not fast-forwarding by 1 commits. Operator: commit/stash and rerun. The airgapped Ubuntu VM (sanctum-vm), holding the council agents and offline tools, had halted synchronization. Tommy stood watch as we traced how over a thousand ephemeral sandbox artifacts and a live SQLite database had silently become trapped in git tracking, permanently wedging the daily synchronization loop.
The airgap bridge architecture
Section titled “The airgap bridge architecture”Because sanctum-vm operates on an isolated host-only network (10.10.10.10) with zero direct internet egress, it cannot reach GitHub over HTTPS or SSH. Instead, synchronization is bridged daily by ~/.sanctum/scripts/vm-sync.sh:
- Pull (Step 1): The Mac Mini fetches
origin/mainfrom GitHub in the host repository, packages it as a git bundle, SCPs it across the vmnet bridge, and updates the VM’srefs/remotes/origin/main. - Push (Step 2): The VM bundles its local
mainbranch, sends it to the Mac, and the Mac merges and pushes to GitHub. - Pull (Step 3): The newly created merge commit is pulled back to the VM’s
origin/main. - Fast-Forward (Step 4): The VM executes
git merge --ff-only origin/mainto advance localmaintoorigin/main.
The 1,237-file blockage
Section titled “The 1,237-file blockage”Step 4 contained a defensive check:
DIRTY=$(ssh "$VM_SSH" 'cd ~/.openclaw && git status --porcelain | wc -l' 2>/dev/null | tr -d ' ')BEHIND=$(ssh "$VM_SSH" 'cd ~/.openclaw && git rev-list --count HEAD..@{u} 2>/dev/null' 2>/dev/null || echo "0")
if [[ "$BEHIND" == "0" ]]; then log " VM already at origin/main; no fast-forward needed."elif [[ "$DIRTY" != "0" ]]; then log " VM has $DIRTY dirty file(s); skipping fast-forward to avoid conflicts." _alert "VM has $DIRTY uncommitted changes; not fast-forwarding by $BEHIND commits. Operator: commit/stash and rerun."...When commit af74c74b landed on GitHub (retiring obsolete Home Assistant configurations), the VM was 1 commit behind. But the check aborted immediately: DIRTY was 1,237.
Inspecting git status --porcelain revealed the root cause:
- 1,042 files in
sandboxes/: Months prior, an automated commit (96c7f60) ran a sweep that accidentally trackedsandboxes/. As OpenClaw agents dynamically spawned, modified, and cleaned up ephemeral execution sandboxes, 933 files were deleted on disk while remaining tracked in the git index, and 109 were modified. state/openclaw.sqlite*: The active 40MB database and its write-ahead log (wal/shm) were committed. Every database write by the running gateway instantly dirtied the tree.- Workspace attestations & container metadata: Ephemeral runtime stamps in
workspace-attestations/andsandbox/containers/were deleted on disk but tracked in git.
Because the git index tracked these ephemeral paths, DIRTY could never return to zero. The daily sync was indefinitely deadlocked.
The permanent remediation
Section titled “The permanent remediation”We resolved the deadlock across both sides of the bridge:
- Purged Ephemeral Paths from Index:
Ran
git rm -r --cachedonsandboxes/,workspace-attestations/,sandbox/containers/,devices/pending.json, andstate/openclaw.sqlite*across both the host repo and~/.openclawwithout altering the live database or disk state. - Comprehensive
.gitignoreHardening: Updated.gitignorein the repository to permanently ignore:sandboxes/andsandboxes-*/sandbox/andworkspace-attestations/*.sqlite*across the repository (safeguardingbackup/**)state/resilience-test.*daily markers,session-sqlite-*, andtmp/
- Committed Legitimate VM Changes:
Staged and committed all genuine configuration, prompt doctrine, and documentation improvements from the VM:
- Gateway upgraded to OpenClaw
2026.9.4and Node paths aligned. - Spoken counsel formatting directives incorporated into agent identities (
IDENTITY.md,HOUSE-BIBLE.md). - Mundi’s deal packs and Mothma’s roster additions.
- Gateway upgraded to OpenClaw
- Hardened
vm-sync.shPipeline:- Updated Step 2 to pass
--commit "auto-sync $(date +%Y-%m-%d)"tovm-push.sh, ensuring legitimate operator modifications on the VM are continuously tracked and shipped to GitHub. - Refined the dirty evaluation in Step 4 to use
git status --porcelain --untracked-files=no, ensuring untracked scratch files never block clean fast-forwards.
- Updated Step 2 to pass
Following the repair, vm-sync.sh executed cleanly across all four stages. Both the Mac repository and the VM clone now stand at commit c027e89 with clean working trees: ahead=0 behind=0. The airgap bridge flows freely once more.