Compliance by access path
| Access path | POSIX level | Notes |
|---|---|---|
| Direct filesystem | Full | Real files, atomic writes, mmap works |
| NFS mount | Near-full | Symlinks, open-unlink, stable handles |
| FUSE mount | Near-full | Remote client; no kernel mmap |
| WebDAV | Partial | MOVE/COPY/MKCOL; buffered writes |
| REST / S3 / MCP | N/A | HTTP or tool semantics |
What works on NFS and FUSE
| Semantic | NFS | FUSE |
|---|---|---|
| Atomic writes (tmp → fsync → rename) | Yes | Yes |
rename(2) | Yes | Yes |
| Symlinks | Yes | Yes |
| Open-then-delete (POSIX unlink) | Yes | — |
fsync | Yes | Yes |
| Directory rename | Yes | Yes |
readdir hides .git, .kiwi | Yes | Yes |
64 MB max file size (EFBIG) | Yes | Yes |
Concurrency and durability
Optimistic locking
Optimistic locking
If-Match / ETag on REST writes. Returns 409 on conflict.Serialized writes
Serialized writes
One mutex across all protocols. Concurrent writers are safely queued.
Single-instance guard
Single-instance guard
flock on .kiwi/server.lock. Released automatically on process exit (including SIGKILL).Git lock recovery
Git lock recovery
A background watcher cleans stale
index.lock every 10 seconds (60-second threshold). Also cleaned at startup.Line-ending integrity
Line-ending integrity
core.autocrlf=false and * -text in .gitattributes. ETags always match raw bytes.Intentionally limited
Symlinks
Symlinks work on NFS (realos.Symlink) and FUSE/REST (Content-Type: application/x-symlink). Targets escaping the knowledge root are rejected.
Related documentation
Alternate protocols
NFS, S3, WebDAV, FUSE setup.
Files as truth
Storage philosophy.