yams/docs/architecture/runtime-paths.md

28 lines
2.2 KiB
Markdown

# Runtime path authority
YAMS resolves process paths once through `yams::config::resolve_runtime_paths()` and passes the resulting `ResolvedRuntimePaths` snapshot to daemon, client, CLI, MCP, and service code.
## Precedence
| Path | Precedence (highest first) |
|---|---|
| Config file | explicit `--config`/typed override, existing `YAMS_CONFIG_PATH` compatibility override, `YAMS_CONFIG`, platform config default |
| Data directory | explicit `--data-dir`/typed override, TOML `core.data_dir`, compatible `[daemon]` data keys, `YAMS_DATA_DIR` or legacy `YAMS_STORAGE`, platform data default |
| Runtime directory | explicit typed override, `XDG_RUNTIME_DIR`/Windows runtime default, per-user temporary fallback |
| Daemon socket | explicit `--socket`/typed override, `YAMS_DAEMON_SOCKET` or compatibility `YAMS_DAEMON_SOCKET_PATH`, TOML `daemon.socket_path`, platform socket default |
| PID file | explicit `--pid-file`/typed override, TOML `daemon.pid_file`, platform PID default |
Every resolved field records its `RuntimePathSource` and source name. The snapshot also carries diagnostics for inactive lower-precedence conflicts.
## Alias conflicts
Compatibility aliases remain supported. `YAMS_CONFIG_PATH` is a legacy test/daemon override: it is used only when it names an existing file, then `YAMS_CONFIG` remains the canonical environment path. Equal path aliases are accepted. Unequal aliases fail closed when they would decide the effective path:
- `YAMS_DATA_DIR` versus `YAMS_STORAGE`
- `YAMS_DAEMON_SOCKET` versus `YAMS_DAEMON_SOCKET_PATH`
An explicit or configured data directory safely disambiguates conflicting data aliases; YAMS uses the higher-precedence value and emits a warning. An explicit socket similarly disambiguates socket aliases. This prevents daemon and client processes from silently selecting different corpora or sockets while preserving existing isolated fixtures that export equal aliases.
## Platform defaults
Unix follows XDG config/data/runtime homes and then `HOME`; daemon socket and PID fallbacks retain per-user `/tmp` behavior, while root retains `/var/run`. Windows uses `APPDATA`, `LOCALAPPDATA`, and `USERPROFILE` fallbacks. Callers should not reconstruct these branches locally.