Tabular review cells get version history and a multi-model comparison panel
Three commits turn tabular-review cells from overwrite-only into a versioned artefact that records which model and prompt produced each result. A history modal lets you compare prior outputs side by side - and run the same cell against a different model without leaving the UI.
ce6e9c2 adds migration 001_tabular_cell_versions.sql. Four new columns on tabular_cells - model, system_prompt, column_prompt, updated_at - capture what produced the current value. A new tabular_cell_versions table archives prior state before each overwrite, with the same four provenance fields plus content, status, and citations. The generate endpoint gains a document_ids parameter to force-rerun a subset of rows, surfaced as a "Run selected (N)" header button. GET /tabular-review/:id/cells/:cellId/versions returns the history.
Existing cells aren't backfilled - model and system_prompt will be null until the next overwrite. The migration is additive-only, so deploying without a backfill is safe; just expect gaps in history for older cells.
c2471472 adds CellHistoryModal.tsx (~210 LOC), opened from a history icon on each cell. The modal has a three-column layout: a version list on the left (showing model name and timestamp for each archived entry plus the current state), and two panels on the right showing the selected version's summary and the system/column prompts that produced it.
1f3d4cb makes the modal actionable. A row of "Run on..." pills - one per model in the MODELS registry (Claude, Gemini, Grok at the time of writing) - calls /regenerate-cell with an explicit model override in the request body. The backend change is two lines: read model from the request, fall back to tabular_model if absent. Each run archives the current cell first, so clicking through multiple models builds a history you can compare without losing prior results.
Spotted something wrong? Or know the PR text has fresher detail than the writeup above?