Skip to content

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:

  1. 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.
  2. Actif ≠ Passif. The statement is UNRECONCILED: total Actif differs from total Passif by more than max(1,000,000 XAF, 0.5 % of total assets) (see DossierAnalyticsService). 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 ​

  1. 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.
  2. 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.
  3. 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").
  4. 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.
  5. Citation review. Confirm every figure quoted in the memo or committee pack still resolves to a document + page (ExtractedCell.SourceCitationId / contradiction Citation rows). Empty citations are a review blocker.
  6. 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) ​

StepBehaviour
OCR persistPage-level Citation rows cite_{docId}_p{n} (+ optional first-word bbox)
SYSCOHADA extractLine match against ExtractedPage.WordsJson → cite_{docId}_p{page}_{lineCode} and ExtractedCell.SourceCitationId when matched; null when unmatched
Contradiction alertsHydrated from SoR Citation rows (page, filename, bbox); missing boxes are null, never {0,0,0,0}
UIRatio cockpit / tables / radar open the citation; highlight skipped if bbox unusable

API reference ​

LayerPathPermission
BFF (browser/UI)POST /api/locus/deals/{id}/cells/{cellId}/overridefinancial:override
SoRPOST /api/deals/{id}/cells/{cellId}/overridefinancial: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.

Source of trust for Locus. If this conflicts with code, code + IMPLEMENTATION_TRACKER.md win.