Three receipts per batch were failing with JSONDecodeError (e.g.
"Expecting ':' delimiter: line 1 column 90") because activeblue-chat
(llama3.2-vision) occasionally outputs near-JSON with trailing commas,
single-quoted strings, or unquoted keys.
Two-layer fix:
1. Add format='json' to the Ollama chat call — Ollama JSON mode forces
syntactically valid output at the sampler level, eliminating most
structural errors.
2. Add _repair_json() fallback that runs on any remaining JSONDecodeError:
strips trailing commas, converts single→double quotes, and quotes
unquoted keys. If repair succeeds, the result is re-serialised as
canonical JSON before being returned.
Also re-serialise with json.dumps() on success so the fast path in
_parse_receipt_text always receives clean, canonical JSON regardless of
whitespace or key ordering in the model's original output.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>