## Summary
- make Anthropic content-block user text honor compress_user_messages
- keep cache_control text blocks protected even when user-message
compression is enabled
- add regression coverage for user text blocks, default protection, and
cache_control protection
## Why
The string-message path already compresses role=user content when
compress_user_messages=True, but the Anthropic content-block path always
fell through to the unknown-role protection branch for role=user. In
proxy mode this produced router:noop for large user text blocks even
with HEADROOM_COMPRESS_USER_MESSAGES=1 and
HEADROOM_FORCE_KOMPRESS_ALL=1.
## Tests
- python -m pytest tests/test_content_router_user_blocks.py
tests/test_compression_safety_rails.py tests/test_force_kompress_all.py
-q
Note: running tests/test_agent_savings.py locally still hits an
unrelated Rust binding mismatch: SmartCrusherConfig.__new__() got an
unexpected keyword argument 'lossless_only'.
Co-authored-by: Julien Guarino <julien.guarino@fashiondata.io>