The parent link is ON DELETE SET NULL, so a parent's sub-channels survived its deletion and turned up as top-level channels nobody had created. The delete handler now removes the whole tree in one transaction, collects attachments from every channel in it, clears runtime state and notifies each room, and writes an audit entry per sub-channel. The client asks a second time when sub-channels exist, lists them, and suggests moving any worth keeping to another channel or promoting them to top level first. A server test covers the cascade and leaves an unrelated channel untouched.