What's new
Session-start precache
The daemon now writes the recall payload to a cache file once per REM-loop completion. The SessionStart hook reads this file when fresh (< 24 h), avoiding a JSON-RPC call into core that would block on the exclusive store lock during DREAMING. On cache miss the hook falls through to the live CLI path — same fail-safe behavior as before.
Compose/emit split
assemble_session_start refactored into an emit-free _compose_session_start_payload helper plus a thin wrapper that adds the session_started event. Public API and return type unchanged.
Tests
4 new regression tests: precache writer, cache-hit, cache-miss-absent, cache-miss-stale.