RECEIPT / 004

Promotion conflicts get a plan first.

Eligible automatic promotions resolve into a deterministic plan before live cart mutation begins.

Why it matters

If coupons are applied while conflicts are still being discovered, traversal order can become business logic. A separate resolution plan makes ties, exclusivity and failure behavior explicit.

Implementation

  1. Higher explicit priority wins; deterministic ties use stable coupon identity.
  2. Stack, exclusive, conflict-group and Best Deal modes are represented explicitly.
  3. Native WooCommerce individual-use constraints remain hard constraints and protected manual coupons are not evicted.
  4. Best Deal chooses within explicit bounded groups rather than searching unbounded coupon subsets.
  5. The resolver produces a minimal removal/application plan before the first live cart mutation.

Evidence

  • Best Deal scoring uses WooCommerce cart totals behavior on an isolated cart clone rather than custom discount arithmetic.
  • Representative fixed-cart, percentage and fixed-product discount cases are covered against native WooCommerce behavior.
  • The runtime keeps automatic ownership separate from coupon application mode so conflict resolution cannot silently claim manual state.

Known boundary

Free-shipping monetary value is not yet scored inside Best Deal groups, and WC_Cart_Totals compatibility remains a tracked release risk. Those limits are intentionally not hidden by this receipt.