You’re right - an artifact rollback is not a rollback if the last migration already dropped something the previous code still reads. I treat the rollback job as incomplete until it has been run against the same schema contract the old revision needs. Expand-contract is the path that makes that possible: add, dual-write, switch reads, drop only after the old path is gone. I’ll add that as the fifth Monday check: does the last migration still let yesterday’s artifact run, or did it break the previous schema? Thanks for writing this. It’s the failure mode I see after people already built the rollback job and assumed the image was the whole problem.
