v3.7.2 β Unified chat loop + SessionStore extraction
Internal refactor β no user-facing behavior change.
Changed
- Unified chat loop. The two near-identical native tool-calling loops (Claude and all OpenAI-compatible providers, ~180 lines each, ~90% shared) are now one `_run_native_chat` driver; only the provider-specific formats differ, via small per-kind seams. Shared machinery (`_build_system_prompt`, `_run_tool_calls`, `_maybe_lint_fix`) is defined once and reused by the Ollama loop too.
- Session persistence extracted from the `Kodiqa` God-class into a dedicated `SessionStore` (`session_store.py`); `Kodiqa` keeps thin wrappers, so behavior is unchanged. First step of splitting the God-class into focused units.
Tests
- Characterization tests for the chat-loop seams and `SessionStore` round-trips. 350 total; ruff + CI green.
kodiqa.py: 6251 β 5999 lines.