Why do you think that the upgrade did not work?
dfx canister --network ic info o2kpe-tqaaa-aaaap-qb3ga-cai
Controllers: ecu3s-hiaaa-aaaaq-aacaq-cai
Module hash: 0xbaf9bcab2ebc2883f850b965af658e66725087933df012ebd35c03929c39efe3
This seems to match the hash in your upgrade proposal.
Instead of normal canister upgrade proposals, asset canister gets upgraded via Commit Batch proposal actually.
Right. The upgrade happens in async batches using an IC feature called deterministic time slicing. More details here: Deterministic Time Slicing
But this should be fully automatic, e.g., the end user wouldn’t observe much of a difference, maybe just that the upgrade process might take slightly longer, so if you have some scripts that validate it, you might need to poll with some reasonable timeout and offset.