- Reviewer now sends all pages to the review VLM alongside extracted JSON.
- XML builder deduplicates account.tax records by rate.
- XML builder raises on confidence below min_confidence_threshold.
- Adds fractional tax-rate support with stable external IDs.
- Adds expected_invoice.xml fixture, reviewer tests, and XML regression tests.
- Replaces duplicated _load_prompt() helpers with shared load_prompt().
- Classifier raises cleanly when no renderable pages exist.
- scanned_print, handwritten, and mixed_unknown branches now force
response_format=OcrResponse and parse via client.parse_json().
- Adds branch tests for multi-page OCR and corrected invoice handling.
- Adds abstract aclose() and shared load_prompt() helper to BaseVLMClient.
- OllamaClient now logs latency, tokens, and prompt hash per call.
- Retries cover HTTP 429 and 5xx in addition to network/timeout errors.
- Cache key now includes response_format and max_tokens.
- Warns when JSON schema generation falls back to plain 'json' format.
- Adds FakeVLMClient.aclose() and cache unit tests.
- Adds OcrResponse Pydantic schema for OCR branch JSON output.
- Validates invoice_date and due_date as strict ISO 8601 calendar dates.
- Adds field descriptions to InvoiceLineItem for clearer VLM prompts.
- Expands schema tests for dates, decimal coercion, negatives, and line_items_sum().
Adds the uv lockfile generated from pyproject.toml and updates
tool.mypy.python_version to 3.12 so third-party stubs parse cleanly
while keeping runtime compatibility at Python 3.11.