src/main/data/migration/v2/migrators/README-PaintingMigrator.md
paintings slice onlypainting table (one row per painting)painting_file_ref table (one row per referenced file)providerId (+ a runtime mode, which
is not persisted on the row — see NormalizedPaintingRow)id, providerId, modelId, prompt, plus an
orderKeyorderKey is assigned across the whole migrated set in source order via
assignOrderKeysInSequence (no per-providerId scoping, no numeric
sortOrder column)painting_file_ref rows: sourceId=painting.id, role='output' | 'input'painting_file_ref emission is pre-filtered against file_entry: ids the
FileMigrator skipped (malformed v1 rows) are dropped and counted as
droppedFileRefs so the engine's final PRAGMA foreign_key_check never abortsuuidv4()
(not a composite string) so the emitted painting_file_ref.sourceId stays a valid
z.uuidv4()painting_file_ref rows)mediaType (image vs video is derived from files at display time)urlsgenerationId / taskId) — not persisted on the receiptstatus and ppioStatus