Just developing my second idea at the end of my last post. It seems to me that in the Newcomb problem and in the counterfactual mugging, the completely trustworthy Omega lies to a greater or lesser extent.
This is immediately obvious in scenarios where Omega simulates you in order to predict your reaction. In the Newcomb problem, the simulated you is told "I have already made my decision...", which is not true at that point, and in the counterfactual mugging, whenever the coin comes up heads, the simulated you is told "the coin came up tails". And the arguments only go through because these lies are accepted by the simulated you as being true.
If Omega doesn't simulate you, but uses other methods to gauge your reactions, he isn't lying to you per se. But he is estimating your reaction in the hypothetical situation where you were fed untrue information that you believed to be true. And that you believed to be true, specifically because the source is Omega, and Omega is trustworthy.
Doesn't really change much to the arguments here, but it's a thought worth bearing in mind.
If you take a functional perspective, these are all equivalent:
f1 = 1+1, f2 = 2, f3 = 1+1+1-1
When you run, say, a Java Virtual Machine on various kinds of hardware, the fundamental chipset instructions it translates to may all be different, but the results are still equivalent.
When you upload your brain, you'd expect the hardware implementation to differ from your current wetware implementation - yet as long as the output is identical, as long as they are indistinguishable when put into black boxes, you probably wouldn't mind (cf. Turing tests).
Now, when you go for a perfect correspondence between two functions, by necessity their compressed representation of the relevant parts of the function (relevant for the output) has to be isomorphic.
The example you provided reduces to "def predictable(): return 42". These are the parts relevant to the output, "the components involved in that decision" (I should have stressed that more).
If you predict the output of predictable() perfectly, you are simulating the (compressed) components involved in that decision - or a functionally equivalent procedure - perfectly.