Ok I still don't know why but I can get a pretty good view of it happening by watching the particle event stream (using curl).
I see this when I flash it and it doesn't do anything:
event: spark/flash/status
data: {"data":"started ","ttl":"60","published_at":"2016-02-21T16:59:47.330Z","coreid":"..."}
And this when I flash it and it does work:
event: spark/flash/status
data: {"data":"success ","ttl":"60","published_at":"2016-02-21T17:01:15.168Z","coreid":"..."}
event: spark/status
data: {"data":"offline","ttl":"60","published_at":"2016-02-21T17:01:16.207Z","coreid":"..."}
event: spark/status
data: {"data":"online","ttl":"60","published_at":"2016-02-21T17:01:24.414Z","coreid":"..."}
I wonder if I flash it and then manually boot it, would it work every time?