# os-vault

Integrates the SecondBrain Obsidian vault (semantic/knowledge memory, ADR-012) and
per-project Graphify knowledge graphs into Claude sessions. Episodic memory is a
separate system (memsearch, ADR-015) — see `README.md` for the requirements/version
pins and `config.yaml` for vault path, model, and threshold knobs.

## Component map

- `skills/` — five skills: `query`, `write`, `reorganize`, `onboard-project`,
  `design-template`.
- `hooks/` — `session_start.py` (SessionStart), `session_context.py`
  (UserPromptSubmit), `post_tool_use_write.py` (PostToolUse), `session_end.py` +
  `memsearch_sync.py` + `vault_sync.py` (SessionEnd); shared `config.py`,
  `hook_io.py`, `session_state.py`. See "Hook wiring" below.
- `tests/` — golden-file harness (`harness.sh`, `golden/`, `inputs/`,
  `python-wrappers/`); own `tests/README.md`.
- `eval/` — write-behavior eval harness (scenarios + `scenarios-reserve/`,
  judge-rubric, results); eval discipline (reserves never read informally) per
  root `CLAUDE.md`.
- `invariants.md` — reversion-protection contract; read before changing frontmatter
  facets, hook fail-soft behavior, or sync timing.
- `config.yaml` — vault_path, graphify model, thresholds, env overrides.

## Hook wiring

os-vault's hooks are **not** wired via a plugin `hooks/hooks.json` — there isn't
one, and this is deliberate, not a defect. They're registered at user level in
`~/.claude/settings.json`, pointing at the repo source scripts directly:
`SessionStart` → `hooks/session_start.py`, `UserPromptSubmit` →
`hooks/session_context.py`, `PostToolUse` → `hooks/post_tool_use_write.py`,
`SessionEnd` → `hooks/session_end.py` + `hooks/memsearch_sync.py` +
`hooks/vault_sync.py`.

## Pointers

- Design: `docs/memory-system/02-system-design.md`. Decisions: ADR-011 (facets),
  ADR-012 (vault as semantic source of truth), ADR-015 (memsearch split).
- Status/build history: `docs/implementation-status/os-vault.md`.
