30c783589c
Three provably-safe optimizations for O(n)-per-iteration history walks: 1. sanitize_tool_call_arguments: optional identity-keyed cursor (strong refs to the exact validated message objects) skips re-json.loads-ing already-validated history each loop iteration. Any list rewrite (compression, repair, undo, steer) breaks the identity prefix match and forces re-scan from the divergence point. Wired via a per-agent cursor dict in conversation_loop. 2. estimate_messages_tokens_rough: per-message memo keyed on a deep identity fingerprint (strings pinned by strong reference so id() aliasing is impossible; scalars by value; dicts/lists structurally with key order). Equal fingerprints imply identical str(shadow) bytes, hence identical estimates. Unfingerprintable shapes fall through to direct compute. Bounded FIFO cache (4096 entries). 3. _flush_messages_to_session_db_unlocked: bounded scan that skips the identity-matched prefix of the previous successful flush's snapshot. Snapshot only taken on full success; cleared on exception. Compression rewrites use fresh copies, breaking identity and forcing full re-scan. Parity proven in tests/agent/test_cursor_optimizations_parity.py: 500-message synthetic histories with tool calls, malformed args, unicode, element-wise old==new across 3 iterations incl. simulated compression. Measured (median of 5): sanitize 0.097ms->0.011ms, tokens 1.145ms->0.853ms, persist-scan 179.5us->10.0us at 500 messages.