I like that you kept the stage history as its own record instead of just overwriting a status column. One thing worth thinking about as this grows: policies protect who can touch the history, but nothing stops an admin (or a stray seeder) from editing or deleting rows and quietly corrupting the pipeline reports. I've started making history tables append-only at the DB level, a check or trigger that rejects updates and deletes, so the audit trail survives even admin mistakes. Cheap to add now, painful to retrofit once the reports are trusted.