OCR Review workbench

Status: [x] landed as post-U3 deepen-in-place (not a new wave track; does not block U2 / 0.9).

Lifecycle: scan → independent OCR evidence → LLM merged draft → human-reviewed transcription.

Evidence hierarchy

Object

Role

Scan

Source of truth

Raw OCR attempts (attempt_kind=vision)

Independent evidence

Merged draft (attempt_kind=composite internally)

LLM reconciliation of those attempts — not a vote

Transcription (edited_text / effective text)

Human-reviewed canonical page text

User-facing name is Merged draft. JSON keeps composite.

Consensus (agreement %, disagreement count, n/n) uses raw attempts only. The editor is the resolution target. Composite may appear as “Merged draft recommends…” plus composite departure when it invents a reading no source has.

A composite is current iff its source_attempt_ids equal the latest succeeded vision attempt per model identity. Otherwise it is stale, retained, and not the live draft. Multipass regenerates when a current merged draft is missing.

Reviewed means the current effective transcription was reviewed (reviewed_text_fingerprint + reviewed_evidence_fingerprint). New OCR evidence, active-attempt change, merged-draft regen, or effective-text change → needs_attention. Save stays on the page; Save + Mark reviewed is atomic (persist buffer, then fingerprints, then status, then auto-advance).

Reading / Library / Detect still use the shared page viewer. Only Workflow → Review is the workbench.

Layout (Review page)

Two-pane: scan (left) and lane switcher (right) so only one review lane body runs. Typical pass: Transcription → Date → Tags → OCR → Cleanup → Other (no scrolling past the image for date or tags). Selected lane is session-scoped, so prev/next, jump, thumbnails, Skip, and Save + Mark reviewed stay on Date (or Tags, …) instead of resetting to Transcription.

Lane

Purpose

Transcription

Editor, current-disagreement excerpt, OCR evidence strip, disagreement navigation, Save / Save + Mark reviewed / Skip / Undo

Date

Manual date entry, approve/ignore suggestions (✓ / ✓✓ / ✕), regression confirm; label shows Date ⚠ when a suggestion is pending

Tags

Page tag assignment (catalog + ad-hoc); 💾 Save tags

OCR

Per-notebook OCR settings (below), Re-run OCR (vision model; this page / all pages / not reviewed), rank and merge this page / all comparable pages (all-pages behind confirm)

Cleanup

Visual declutter (scanner beds, white gutters, corner wedges) on this page or all pages in the notebook; does not re-run OCR

Other

Notebook cover, delete page

Nav bar ✓ date remains for quick approve without opening the Date lane.

Reading / Library / Detect use the shared page viewer and Compare in Review (deep-link) when multiple OCR attempts exist — they are not a second Prefer/Promote GUI.

OCR settings (OCR lane)

Per-notebook controls (also in Transcribe Advanced and the Transcribe multipass row):

  • When setting a notebook default — prefer mode for Prefer / auto-composite: notebook default = current text (default), notebook default only (stats / fine-tune), or notebook default + current with edit gate when Transcription has an edit overlay.

  • Seed transcription from merged draft after multipass — when on (default), a succeeded merged draft becomes active after multipass and seeds the Transcription buffer; when off, the draft remains evidence-only until you Prefer/Promote or edit.

User guide: runtime/ocr.md.

Non-goals (this slice)

Bounding boxes, per-span durable human provenance, calibrated OCR confidence, rebuilding composite as geometric merge.

Contracts

page-result.md · ocr-multipass.md · project-on-disk.md