|Component:||PM (dl, en, up ...)|
I ended up finally solving this, but wanted to document it for others.
Drush runs fine from the command line, in a shell script triggered manually, but doesn't run from cron. And yeah, you've already done the basics like filling in the full path to the file. MADNESS!
Here's a great blog post I stumbled across looking for something only tangentially related: http://blog.spikesource.com/crontab.htm.
The trick is that even though crontab is running as your user, it doesn't use your user's environment variables like PATH, SHELL, etc. It does this solely to piss you off and make you waste lots of time.
So to figure out what the difference is, do this handy trick:
$ env > /tmp/myenv.log
* * * * * env > /tmp/crontabenv.log
Then diff the two, and start copy/pasting. In my case, I needed to copy over PATH to the top of crontab -e.
Hope this saves someone else some hair.