Add session_events.boundary_start_position/boundary_end_position (message range a compaction replaces, in the session's own position coordinate) + boundary_message_id (the materialized summary). Parser computes the range as it walks records (start = prev boundary end + 1; end = message_position-1); writer applies position_offset. Add read helper get_effective_context(session, at_position): returns [summary] + post-boundary (what the model actually saw) vs the full composed prefix used for forks. Schema bump (v14->v15), re-ingest. Surfaces: MCP/CLI 'view=effective_context', pathology stale_context gets a precise replaced-range signal. Full design in agent report. Ref #2467.
Add session_events.boundary_start_position/boundary_end_position (message range a compaction replaces, in the session's own position coordinate) + boundary_message_id (the materialized summary). Parser computes the range as it walks records (start = prev boundary end + 1; end = message_position-1); writer applies position_offset. Add read helper get_effective_context(session, at_position): returns [summary] + post-boundary (what the model actually saw) vs the full composed prefix used for forks. Schema bump (v14->v15), re-ingest. Surfaces: MCP/CLI 'view=effective_context', pathology stale_context gets a precise replaced-range signal. Full design in agent report. Ref #2467.