Wow... thanks for that! Thought I'd have to resort to google searches just to get some idea the WTH I'm supposed to do!

Hm... was about to report that my test subject didn't like a 1.0.4 compile of a blink sketch (just the plain 'ol arduino blink, but pin 1 instead of 13), but as I was writing this it changed it's mind. Thankfully I had Oakterm still open, and caught an interesting message. I'll paste the log below. btw, the only reason I'm programming from safe mode is for consistency... because of the offline/offline cycles 1.0.4 doesn't like to program in 'normal mode' for me... but 1.0.1 is fine.
# I had the Oak in config mode, but started OakTerm after starting the Oak. Programming a 1.0.1 blink sketch
[18:08:45] Event: spark/flash/status - started
[18:09:05] Event: spark/status - offline
[18:09:05] Event: spark/flash/status - failed
[18:09:11] Event: spark/status - online
[18:10:27] Event: spark/status - offline
#Oak is happily blinking (user programmed, not triple). I may have switched the power on and off getting the second online message, just to check it was behaving.
# Loading on a 1.0.4 version of the blink sketch. As you can see it didn't go well after programming.
[18:10:41] Config Mode
[18:10:43] Event: spark/flash/status - started
[18:11:06] Event: spark/status - offline
[18:11:06] Event: spark/flash/status - failed
[18:11:12] Event: spark/status - online
[18:11:22] Event: spark/status - offline
[18:11:23] Event: spark/status - online
[18:11:33] Event: spark/status - offline
[18:11:35] Event: spark/status - online
# That's enough of this... power cycle
[18:11:42] Event: spark/status - online
[18:11:52] Event: spark/status - offline
[18:11:54] Event: spark/status - online
[18:12:04] Event: spark/status - offline
[18:12:06] Event: spark/status - online
[18:12:15] Event: spark/status - offline
[18:12:17] Event: spark/status - online
[18:12:26] Event: spark/status - offline
[18:12:27] Event: spark/status - online
[18:12:29] Event: spark/status/safe-mode - {"f":[],"v":{},"p":82,"m":[{"s":1040368,"l":"m","vc":30,"vv":30,"f":"s","n":"1","v":6,"d":[]},{"s":1040368,"l":"m","vc":30,"vv":30,"u":"0","f":"u","n":"1","v":1,"d":[{"f":"s","n":"1","v":9,"_":""}]}]}
[18:12:28] Event: spark/status/safe-mode - {"f":[],"v":{},"p":82,"m":[{"s":1040368,"l":"m","vc":30,"vv":30,"f":"s","n":"1","v":6,"d":[]},{"s":1040368,"l":"m","vc":30,"vv":30,"u":"0","f":"u","n":"1","v":1,"d":[{"f":"s","n":"1","v":9,"_":""}]}]}
#hm... just noticed it was blinking (user programmed, not triple) as I was writing the forum reply... WTH? Lets see what another power cycle does
[18:13:41] Event: spark/status - online
[18:13:51] Event: spark/status - offline
[18:13:52] Event: spark/status - online
[18:14:02] Event: spark/status - offline
[18:14:03] Event: spark/status - online
[18:14:18] Event: spark/status/safe-mode - {"f":[],"v":{},"p":82,"m":[{"s":1040368,"l":"m","vc":30,"vv":30,"f":"s","n":"1","v":6,"d":[]},{"s":1040368,"l":"m","vc":30,"vv":30,"u":"0","f":"u","n":"1","v":1,"d":[{"f":"s","n":"1","v":9,"_":""}]}]}
[18:14:04] Event: spark/status/safe-mode - {"f":[],"v":{},"p":82,"m":[{"s":1040368,"l":"m","vc":30,"vv":30,"f":"s","n":"1","v":6,"d":[]},{"s":1040368,"l":"m","vc":30,"vv":30,"u":"0","f":"u","n":"1","v":1,"d":[{"f":"s","n":"1","v":9,"_":""}]}]}
#this is just nuts... is this indicating the error is on particles end? Regardless, the oak is happily blinking again (user programmed, not triple)
EDIT1: I just programmed
the MQTT sketch again with 1.0.4, and left it for longer, and it still kept endlessly offline and online-ing for a good four minutes, and then kicked out a spark/status/safe-mode and then started running the sketch.
[18:23:15] Event: spark/flash/status - started
[18:23:35] Event: spark/status - offline
[18:23:35] Event: spark/flash/status - failed
[18:23:41] Event: spark/status - online
[18:23:51] Event: spark/status - offline
[18:23:52] Event: spark/status - online
[18:24:02] Event: spark/status - offline
[18:24:04] Event: spark/status - online
[18:24:15] Event: spark/status - offline
[18:24:17] Event: spark/status - online
[18:24:27] Event: spark/status - offline
[18:24:28] Event: spark/status - online
[18:24:38] Event: spark/status - offline
[18:24:39] Event: spark/status - online
[18:24:49] Event: spark/status - offline
[18:24:50] Event: spark/status - online
[18:25:00] Event: spark/status - offline
[18:25:02] Event: spark/status - online
[18:25:12] Event: spark/status - offline
[18:25:14] Event: spark/status - online
[18:25:22] Event: spark/status - offline
[18:25:24] Event: spark/status - online
[18:25:34] Event: spark/status - offline
[18:25:35] Event: spark/status - online
[18:25:45] Event: spark/status - offline
[18:25:46] Event: spark/status - online
[18:25:54] Event: spark/status - offline
[18:25:56] Event: spark/status - online
[18:26:05] Event: spark/status - offline
[18:26:07] Event: spark/status - online
[18:26:16] Event: spark/status - offline
[18:26:18] Event: spark/status - online
[18:26:28] Event: spark/status - offline
[18:26:29] Event: spark/status - online
[18:26:38] Event: spark/status - offline
[18:26:41] Event: spark/status - online
[18:26:51] Event: spark/status - offline
[18:26:52] Event: spark/status - online
[18:27:02] Event: spark/status - offline
[18:27:03] Event: spark/status - online
[18:27:12] Event: spark/status - offline
[18:27:14] Event: spark/status - online
[18:27:26] Event: spark/status - offline
[18:27:27] Event: spark/status - online
[18:27:32] Event: spark/status/safe-mode - {"f":[],"v":{},"p":82,"m":[{"s":1040368,"l":"m","vc":30,"vv":30,"f":"s","n":"1","v":6,"d":[]},{"s":1040368,"l":"m","vc":30,"vv":30,"u":"0","f":"u","n":"1","v":1,"d":[{"f":"s","n":"1","v":9,"_":""}]}]}
[18:27:29] Event: spark/status/safe-mode - {"f":[],"v":{},"p":82,"m":[{"s":1040368,"l":"m","vc":30,"vv":30,"f":"s","n":"1","v":6,"d":[]},{"s":1040368,"l":"m","vc":30,"vv":30,"u":"0","f":"u","n":"1","v":1,"d":[{"f":"s","n":"1","v":9,"_":""}]}]}EDIT2: And just to show it isn't just a temperamental Oak, I have subjected another one to the same abuse and it didn't like it either! I noticed this time (since I was staring at it waiting for it to behave that it would periodically do the programmed blink, but the timing was way off. i.e. one second on, 10 seconds off). I assume (I know, not a good idea!) that the other one was doing the same but I just didn't see it. It got fed up with this one after nearly 10 minutes of cycling, power cycled it and no change after two minutes - still cycling.
#lets try the blink on a different oak, with 1.0.1
[18:33:24] Device change: Oak4
[18:33:19] Event: spark/flash/status - started
[18:33:47] Event: spark/status - offline
[18:33:47] Event: spark/flash/status - failed
[18:33:58] Event: spark/status - online
[18:34:54] Event: spark/status - online
#user programmed blink, now lets try 1.0.4...
[18:35:06] Config Mode
[18:36:40] Event: spark/flash/status - started
[18:37:02] Event: spark/status - offline
[18:37:02] Event: spark/flash/status - failed
[18:37:08] Event: spark/status - online
[18:37:17] Event: spark/status - offline
[18:37:22] Event: spark/status - online
[18:37:32] Event: spark/status - offline
[18:37:33] Event: spark/status - online
[18:37:42] Event: spark/status - offline
[18:37:44] Event: spark/status - online
[18:37:53] Event: spark/status - offline
[18:37:55] Event: spark/status - online
[18:38:03] Event: spark/status - offline
[18:38:05] Event: spark/status - online
[18:38:14] Event: spark/status - offline
[18:38:18] Event: spark/status - online
[18:38:27] Event: spark/status - offline
[18:38:31] Event: spark/status - online
[18:38:40] Event: spark/status - offline
[18:38:44] Event: spark/status - online
[18:38:53] Event: spark/status - offline
[18:38:57] Event: spark/status - online
[18:39:06] Event: spark/status - offline
[18:39:10] Event: spark/status - online
[18:39:19] Event: spark/status - offline
[18:39:22] Event: spark/status - online
[18:39:32] Event: spark/status - offline
[18:39:35] Event: spark/status - online
[18:39:45] Event: spark/status - offline
[18:39:49] Event: spark/status - online
[18:39:59] Event: spark/status - offline
[18:40:03] Event: spark/status - online
[18:40:13] Event: spark/status - offline
[18:40:16] Event: spark/status - online
[18:40:26] Event: spark/status - offline
[18:40:29] Event: spark/status - online
[18:40:39] Event: spark/status - offline
[18:40:42] Event: spark/status - online
[18:40:52] Event: spark/status - offline
[18:40:55] Event: spark/status - online
[18:41:05] Event: spark/status - offline
[18:41:08] Event: spark/status - online
[18:41:18] Event: spark/status - offline
[18:41:21] Event: spark/status - online
[18:41:32] Event: spark/status - offline
[18:41:35] Event: spark/status - online
[18:41:45] Event: spark/status - offline
[18:41:48] Event: spark/status - online
[18:41:57] Event: spark/status - offline
[18:42:00] Event: spark/status - online
[18:42:11] Event: spark/status - offline
[18:42:14] Event: spark/status - online
[18:42:24] Event: spark/status - offline
[18:42:27] Event: spark/status - online
[18:42:37] Event: spark/status - offline
[18:42:40] Event: spark/status - online
[18:42:49] Event: spark/status - offline
[18:42:52] Event: spark/status - online
[18:43:01] Event: spark/status - offline
[18:43:04] Event: spark/status - online
[18:43:14] Event: spark/status - offline
[18:43:17] Event: spark/status - online
[18:43:27] Event: spark/status - offline
[18:43:30] Event: spark/status - online
[18:43:39] Event: spark/status - offline
[18:43:43] Event: spark/status - online
#that's enough of this... what about a power cycle?
[18:43:54] Event: spark/status - online
[18:44:04] Event: spark/status - offline
[18:44:06] Event: spark/status - online
[18:44:16] Event: spark/status - offline
[18:44:18] Event: spark/status - online
[18:44:30] Event: spark/status - online
[18:44:38] Event: spark/status - offline
[18:44:40] Event: spark/status - online
[18:44:49] Event: spark/status - offline
[18:44:51] Event: spark/status - online
[18:45:00] Event: spark/status - offline
[18:45:03] Event: spark/status - online
[18:45:13] Event: spark/status - offline
[18:45:16] Event: spark/status - online
[18:45:26] Event: spark/status - offline
[18:45:29] Event: spark/status - online
[18:45:40] Event: spark/status - offline
[18:45:43] Event: spark/status - online
[18:45:52] Event: spark/status - offline
[18:45:56] Event: spark/status - online
[18:46:04] Event: spark/status - offline
Next up, bisections... but that will probably have to be a job for tomorrow. I'll shut up for now!

EDIT3: I know I said I'd shut up... but this is important... one of the oaks started offlining and onlining even in safe mode, and wouldn't co-operate... so I oak-restored it and it made no difference at all once it had done the update and been configured - it went config mode, no user rom found and back to it's old tricks. I did a serial upload, and it kept doing it, and then finally triggered a 'spark/status/safe-mode' event again before starting the user sketch properly. I'm chalking this up to a fault on the sparkfun servers for now, as this is on the 1.0.1 config that was working perfectly fine until just now.