Schema (applied via migration imagen_series_init):
- imagen.series parent table (prompt + params + count CHECK 1..10 + selected_image_id)
- imagen.jobs += series_id (FK) + series_idx
- imagen.images += series_id (FK)
- Owner-scoped RLS on series (SELECT/INSERT/UPDATE) + grants
- Partial indexes WHERE series_id IS NOT NULL on both child tables
Worker pipeline:
- worker.Job += SeriesID, populated from imagen.jobs.series_id via the
claim query.
- cloud.SyncRequest += SeriesID; insertRow writes series_id when non-empty,
omits the key when empty so solo runs leave the column NULL.
- maybeCloudSync threads seriesID from job.SeriesID through to the cloud
sink. generate.go (CLI) always passes "" — solo path unchanged.
Tests:
- worker: SeriesID propagates from Job to fakePipeline.lastJob unchanged,
solo job keeps it empty.
- cloud: SyncRequest.SeriesID lands as row.series_id in the POST body;
empty SeriesID omits the key entirely.
Refs ImaGen#9.