1c2faedd88
Follow-up to the salvaged #64010 (Kenmege) and #63870 (dombejar) commits, making one resolved compression.max_attempts cap govern ALL per-turn compression attempt sites: - conversation_loop: resolve max_compression_attempts ONCE at turn start (it was previously re-resolved inside the API-call loop) and route the pre-API pressure gate through it — that gate still hardcoded 'compression_attempts < 3' and logged 'attempt=%s/3'. - conversation_loop: the salvaged post-tool compaction gate now uses the resolved cap instead of a hardcoded 3. - turn_context: the preflight compaction loop was 'for _pass in range(3)'; it now sizes itself from the same resolved cap. - agent_init: harden the max_attempts parser — reject booleans (bool subclasses int; 'true' would coerce to 1), reject fractional floats instead of truncating them, keep accepting integral floats and numeric strings; anything else falls back to 3 (floor 1, ceiling 10 unchanged). - tests: replace #63870's inspect.getsource source-shape test with behavioral loop tests (post-tool compaction fires <= cap times per turn, shares its budget with the pre-API gate, resets between turns); add an e2e test proving a 4th preflight pass runs at config cap=6 while the unset default still stops at 3; extend the #64010 config tests with the bool/float parser semantics. Salvages #64010 by @Kenmege and #63870 by @dombejar.