I suspect that 90% of the problem might be fairly easily fixed by
removing the sale context variable from the context processor (since
it's set in a product-specific manner by the get_product view anyway),
and changing the test in the template that determines whether to
include the sale message from {% if sale %} to {% if sale.automatic
%}.
However, the discounts have other drawbacks that are preventing us
from using them to implement sales (e.g. only using one discount code
at a time, so if we have 50% off t-shirts and 30% off coffee mugs, the
user can't get both on one purchase).
I'm probably going to go a different direction and implement a Sale
module that applies automatic discounts without taking codes. Would
there be any interest in having that in core? It's going to require
some tweaks to core anyway, in various methods that calculate prices
and cart/order totals.