cron_runs entered/exited were identical because settleRun rewrote stateEnteredAt and actualAt to the finish instant.
Co-authored-by: Cursor <cursoragent@cursor.com>
Extend jobs with lifecycle projection and history policies so listeners can poll state at scale without breaking existing cron_* flows.
Co-authored-by: Cursor <cursoragent@cursor.com>