Dishwasher drains with drain line detached, but not into the drain line itself
Turns out it was the air gap. I didn't realize that the drain water always went through the air gap and was the only path to the sink drain - I thought it was a failsafe in case the main path was clogged.
Thanks to some helpful YouTube videos I figured out that the air gap was in the middle of the drain path and when I popped the cap off, lo and behold - pieces of star anise jammed in the top of the inner DW drain hose.
What I didn't know was that removing the blockage in the middle of a cycle would result in water shooting out like Old Faithful. Some lessons don't come cheap!
Running a new cycle now and everything seems to be draining like a charm.
If you're having dishwasher drain issues, check your air gap! Might be an easy fix.