It shows the message when I delete a cart item, but not when I add a cart item. Same thing for the debug log. It appears when I delete an item, but not when I add it.
I have the same problem even with uc_cart_item_update and uc_cart_item_presave

I think this is because Entity API automatically provides those events, but Ubercart doesn't fully implement Entity API when creating and updating cart items. This should probably be fixed in Ubercart, and/or an option added to Entity API hooks to say "don't create event triggers".

This is a rudimentary fix but it works. I think the code need to be polished but it works for all uc_cart_item events and no change in functionality... I don't know if the following line should be removed:

Why is my patch marked "postponed"? Most of the time this is because the branch you're testing against hasn't passed tests. Follow the "branch" link on the qa.drupal.org page explaining that your patch is postponed and you'll see the status of branch testing. Usually some work is required on the branch (and tests won't succeed without new commits).

I had thought that's what Cart Item - 'After updating an existing cart item' would do.
But now wonder if that's just a trigger for when an item which is already in the cart is added again. Is that right?

If so is there a way to trigger an event for updating the cart?
I'm guessing it would be in uc_cart_view_form_submit in uc_cart.module (line 718 ish)
By adding hook_rules__event_info and rules_invoke_event but I am perplexed why the other Cart Item events aren't in uc_cart.rules.inc

The current code largely bypasses the EntityAPIController, which means that these events sometimes don't get invoked. The patch for the issue above runs everything through the controller, so maybe that technique would help.

Looking at uc_cart_module, there are all sorts of db_update(), db_insert(), db_delete() and db_query() calls on the {uc_cart_products} table. Direct database manipulation bypasses the Entity API and does not invoke Rules events. Ideally, they would all be replaced by calls to entity_load(), entity_save(), and entity_delete(), possibly in wrapper functions. That would ensure that all the rules get invoked properly by way of EntityAPIController. The patch in #12 does take care of some of this, but not all.

Of the remaining three, two are in uc_cart_cron(), to discover abandoned cart IDs. These cart IDs are then passed to uc_cart_empty() which uses entity_delete_multiple(). We could switch to EntityFieldQuery() to discover the cart IDs but I don't see any benefit in doing so.

The other is in uc_cart_login_update() where anonymous and authenticated carts are merged. This is arguable, although I guess as the insert/update half of the merge operation will fire the entity hooks, I guess the delete half should do the same. It looks like we could just switch to uc_cart_empty() here instead of deleting the cart items directly.