2 months ago
cff7703Pass operation_id from mutation through publish/status/executor so terminal rows are never reopened via library+song guesswork. Publish multi-song operations as one commit: upload every song under the commit lock, freeze once, CAS once. Create one op per explicit re-publish. Bind song_ids + Pending + Dirty in a real control-DB SQLite transaction. Persist the change set in a library-DB remote_publish_outbox so startup can rebuild control-plane ops after a projection crash. Force Dirty for any outstanding publish ops. Fail closed on digest None and part cleanup without control DB. Persist recovery asset-upload failures with executor-class state.
Parent3e23596