Appearance
OCR human-override SOP (R2)
Status: October 2026 (updated with R4 citation grounding).
Applies to: analysts and reviewers preparing a dossier for credit committee.
OCR (Tesseract) and SYSCOHADA extraction ship without guaranteeing perfect table recovery on stamped or scanned gazettes and financial packs. Automatic extraction is therefore a draft; the analyst override is the control that makes a figure committee-grade.
Related: regulatory-data.md (platform statutes vs tenant deal-room PDFs), workspace-guide.md (Financials / Ratio cockpit / Contradiction radar).
When an override + citation review is mandatory
Before a dossier goes to committee, the analyst must review the affected cells and their source citations when either condition holds:
- Low OCR confidence. The extracted cell (or the page it came from) shows low OCR confidence. Policy threshold: below 0.85 average word confidence, or any cell the grid flags as low-confidence.
- Actif ≠ Passif. The statement is
UNRECONCILED: total Actif differs from total Passif by more thanmax(1,000,000 XAF, 0.5 % of total assets)(seeDossierAnalyticsService). AUDCIF 2017 Art. 17 requires the two totals to be equal at each closing date, so an unreconciled balance sheet is never accepted as-is.
If neither condition holds, spot-check at least the cells that drive the headline ratios (Net Debt, EBE, DSCR, ICR) and the covenant tests.
Procedure
- Open the source. From Financials, Ratio cockpit (Voir source), review grids, or Contradiction radar, open the document at the cited page. When a real OCR bounding box exists, the PDF viewer highlights it; when the box is missing or degenerate, use the page reference only — never invent coordinates.
- Decide the accepted value. Keep the reported value if it matches the page; otherwise enter the value read from the document, in the statement's unit and sign convention.
- Record the override. Submit the corrected value with a written justification (mandatory; the BFF requires at least 5 characters, e.g. "p.14 Total Passif: OCR read 1 245 6 as 1 245 600 — confirmed on stamped page").
- Re-check reconciliation. After overrides, confirm Actif = Passif is restored and ratios/covenants refreshed. If the gap persists, escalate to the senior reviewer: do not force a balance with an unexplained override.
- Citation review. Confirm every figure quoted in the memo or committee pack still resolves to a document + page (
ExtractedCell.SourceCitationId/ contradictionCitationrows). Empty citations are a review blocker. - Reviewer sign-off. A second person with credit-review rights confirms the override log (who, when, previous vs accepted value, reason) before the dossier moves to
COMMITTEE_REVIEW.
How citations are produced (R4)
| Step | Behaviour |
|---|---|
| OCR persist | Page-level Citation rows cite_{docId}_p{n} (+ optional first-word bbox) |
| SYSCOHADA extract | Line match against ExtractedPage.WordsJson → cite_{docId}_p{page}_{lineCode} and ExtractedCell.SourceCitationId when matched; null when unmatched |
| Contradiction alerts | Hydrated from SoR Citation rows (page, filename, bbox); missing boxes are null, never {0,0,0,0} |
| UI | Ratio cockpit / tables / radar open the citation; highlight skipped if bbox unusable |
API reference
| Layer | Path | Permission |
|---|---|---|
| BFF (browser/UI) | POST /api/locus/deals/{id}/cells/{cellId}/override | financial:override |
| SoR | POST /api/deals/{id}/cells/{cellId}/override | financial:override |
Request body:
json
{ "acceptedValue": 1245600, "reason": "p.14 Total Passif misread by OCR; confirmed on stamped page" }The call stores AcceptedValue, sets HasHumanOverride, and records OverrideReason, OverrideUser and OverrideTimestamp on the cell while keeping the original ReportedValue. An audit event CELL_OVERRIDE is written with the previous and accepted values. An empty reason is rejected (400).
Audit and escalation
- Every override is attributable and immutable in the audit trail; never edit values outside this path.
- Systematic misreads on a document class (same gazette format, same stamp) should be logged for the R2 spot-check (miss/misread rate over 5–10 real scans) so extract upgrades are driven by evidence.
- If a scan is unreadable, request a clean copy from the borrower rather than overriding from memory.