Soft delete — sets visible=false and removes product↔category links. Child categories keep their parentCategoryId (dangling parent) until re-parented by a later upsert; deletion is never rejected because of children, so bulk re-syncs stay simple.