The Method Stack

How Elitez read 52,014 timesheets — no cloud AI, no per-vendor templates, running entirely on the local fleet.

← Overlays  ·  Work done  ·  Updated 5 Sep 2026

01The corpus, in numbers

Verified counts from the published shards.

52,014
timesheets read
11
public shards (ocr · ocr11)
221,459
rows extracted
3
vision models per page
0
rows sent to any cloud API
100%
on-fleet (Ollama)

On this shard alone: 4,533 sheets, 66,201 rows detected and boxed, 41,590 with a fully resolved date. Every row you see on the overlays pages is a real extraction, scored against the sheet it came from.

02The pipeline, end to end

Each sheet — a phone photo or a scanned PDF — passes through the same stack.

  1. Render & normalise. PDF pages rasterised at 150 dpi and scaled to ~2,000 px; photographs auto-rotated and deskewed (2,002 sheets deskewed, 329 re-oriented on this shard) so the grid is level before anything reads it.
  2. Three-model vision union. The page is read independently by three local vision models; their answers are reconciled field-by-field (see §3). No single model is trusted alone.
  3. Second-pass geometry. The vision models return values but no coordinates. A separate Tesseract + OpenCV pass finds the real table grid and pins each extracted row to its actual pixels (see §4).
  4. Compute & reconcile hours. Worked hours are recomputed from time-in / time-out / break with shift-aware logic, and cross-checked against the sheet's own stated total — disagreements are flagged, never silently overwritten.
  5. Classify & gate. A classifier confirms the page is actually a timesheet before its hours count — printed email threads and contracts are held out (see §5, learning of 4 Sep).
  6. Score & publish. Each row gets a confidence tier and a date-resolution status, then the whole corpus is published to the overlay galleries for row-by-row inspection.

03Why three models, not one

Any single vision model hallucinates on a bad photo — a smudged "3" becomes an "8", a blank cell gets a confident guess. Three models rarely make the same mistake. We read every page with all three and reconcile by first-non-null agreement keyed on the canonical date: a field is filled from the first model that read it, and a model's correct blank read is respected rather than overwritten by another's guess.

ModelRole in the union
qwen2.5vl:7bPrimary reader — strongest on structured grids and printed digits.
mistral-small3.2:24bHeavyweight arbiter — best on messy handwriting; slowest, so used when GPUs are free.
richardyoung/olmocr2:7b-q8Document-specialist — trained for scans; catches rows the others miss.

Accuracy metric — null-matched. We score only cells where a ground-truth value exists: a model is never penalised for leaving genuinely-blank cells blank. This is the honest denominator — it measures reading, not guessing.

04Where the boxes come from

The overlays are not decoration and they are not invented. Vision models return text with no coordinates, so a second pass — Tesseract word-boxes (TSV) plus OpenCV horizontal/vertical line detection — reconstructs the actual table grid, and each reconciled row is assigned to the grid band it physically occupies. A row we could extract but not locate is drawn as an inferred band and marked as such. Green = row extracted and date resolved; amber = extracted but the date could not be resolved from the sheet.

05What we learned — the last ten days

Every item here changed the pipeline. Most were paid for in wrong answers first.

06Principles we won't give back