A cascade is fine until one link in it hits a wall it did not know was there. Phase 5a is five such walls — five live, pre-existing bugs found while grounding the write path, all with the same shape: a lifecycle operation meets a NoAction foreign key that the code did not advertise, and either 500s or silently does the wrong thing.
Why fix them as their own phase, not a bug ticket: the delete/archive work (5c/5d) has to add assertions as one more block dependent — and it cannot do that cleanly on top of a cascade that already 500s. So 5a clears the ground first. It is also where archive-not-delete gets applied, not decided: the FK table already enforces it (a post pinned by its blocks can never be hard-deleted), so a briefly-added delete route was fully reverted — 5a just makes every path honor what the schema already says.