List, prune, and delete operations now use a lightweight in-memory cache
of snapshot metadata (everything except graphData). Only get_full_record()
and update_meta() hit disk after warm-up, keeping sidebar loads and
auto-capture prune cycles fast.
Key changes:
- snapshot_storage.py: cache layer (_cache, _cache_warmed, _extract_meta,
_ensure_cached), new get_full_record() and update_meta() functions,
all existing functions updated to use cache
- snapshot_routes.py: new /get and /update-meta endpoints
- snapshot_manager.js: db_getFullRecord() and db_updateMeta() helpers,
lazy graphData fetch in restore/swap/diff/preview/tooltip, label/notes/
lock use update_meta instead of full put to preserve graphData on disk
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>