# WebDAV Migration & Sync Pipeline Fix — 2026-07-16 ## Change: s3fs → WebDAV as Obsidian Vault Source **Problem:** The s3fs mount at `/opt/hermes/obsidian-vault/` (via Garage S3 `s3.nixg.ru`) was empty — only `.` and `..` in the directory, no actual files. sync_obsidian_to_wiki.py couldn't copy anything. C1 was blocked. **Diagnosis:** - `/etc/fstab` had s3fs entry pointing at `s3.nixg.ru` (Garage) - `mount | grep s3fs` showed the mount was active but directory contained 0 files - `/mnt/yandex-disk/` (Yandex Disk via davfs2 WebDAV) had a working `obsidian/mozg/` vault with 65 .md files **Fix:** Changed `OBSIDIAN_VAULT` from `/opt/hermes/obsidian-vault` to `/mnt/yandex-disk/obsidian/mozg/`. **First run:** 74 files copied in 44 seconds, 0 errors. ## Blocker 2: sync → ingest chain broken **Symptom:** The sync script finishes copying, then tries to call `wiki_continuous_ingest.py` with bare `python3` — crashes with `ModuleNotFoundError: No module named 'arq'`. **Root cause:** `sync_obsidian_to_wiki.py` line 162 does `os.system(f"python3 {ingest_script}")`. System python3 does NOT have `arq` (only installed in project `.venv/`). **Fix:** Changed to `/opt/hermes/memory-os/.venv/bin/python3 {ingest_script}`. ## Safety Guarantee The user explicitly asked for protection against Hermes deleting files in their Obsidian vault. Confirmed: - **Code-level:** sync_obsidian_to_wiki.py only reads source (via `os.walk()` + `copy2()`). All deletions (`unlink()`) target `WIKI_TARGET`, never `OBSIDIAN_VAULT`. This was true before the change and remains true after. - **Filesystem-level:** davfs2 mounts with `file_mode=600` — the user process itself can only write with explicit sudo. The sync script runs as user `estorozhenko`. - **Memory-level:** Added read-only guarantee to user profile. **Lesson:** When the user expresses concern about data safety, (1) show code evidence that it's already safe, (2) add explicit protection in memory/skill, (3) explain trade-offs (read-only mount vs full POSIX) so they can make informed decisions.