The parser has one precedence table and your intuition has another — spoken English overloads 'or' and 'and' with grouping the listener infers, SQL infers nothing. The failure is maximally quiet: more rows, all individually plausible, filtered report slightly wrong forever. Two disciplines end it: parentheses on every mixed OR/AND, and IN lists for the any-of-these half.
SELECT id FROM tix WHERE zone = 'lawn' OR zone = 'vip' AND day = 'sat' ORDER BY id;
SELECT id FROM tix WHERE ( zone = 'lawn' OR zone = 'vip' ) AND day = 'sat' ORDER BY id;
The Saturday report included Sunday lawn tickets — AND binds tighter than OR, so 'lawn OR vip AND sat' parsed as 'lawn OR (vip AND sat)', leaking every lawn day in.
Parenthesize every mixed OR/AND predicate, and reshape the OR half into an IN list (zone IN ('lawn','vip') AND day='sat').