- Cache key now uses a subgroup-level rules hash, so different indicator
subsets of the same section share one cache entry (previously fragmented
per subset, forcing a redundant LLM call per indicator).
- Partial cache hit -> query the LLM only for the missing indicators and
merge, instead of re-sending the whole set.
- Stable system-prompt prefix (expected_keys moved out of it) so provider
prefix caching applies to the large section_text across subset calls.
- Fix latent bugs: put() now appends genuinely-new records (superset growth),
records are Decimal->float before write (cache was silently never
persisting), and Pydantic metadata fields are excluded from the cache.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>