At this point I just want to make it clear that I don't want to be argumentative, but rather just find out whether you don't understand me or I don't understand you :)

Just for clarification, when I talk about servers I am referring to "my own hand coded server that I run" -- like what you would need for this kind of game before Game Center existed. I refer to dealing with Game Center as "serverless" simply because your code can't run on Game Center, so for the purposes of this discussion its as if both clients are talking directly to eachother since Game Center serves simply as a dumb pipe.

1. That being said, a main point of my last post was that its very simple for either party to lie about this initial state (either intentionally or unintentionally as we'll see in a second). Its as simple as changing the dictionary AFTER the game starts (its slightly more complex if the dictionary is being checked EVERY move, but not much more complex). I want to also specifically note again that this could actually easily have happen accidentally:

Lets say I updated from the App Store mid game, and now you have all sorts of weird edge cases as we are once again in the situation where one person has more words in their dictionary than the other. If you simply did one check in the beginning, the game is now once again "unfair". If you are doing a check every turn, the situation is still not ideal. Does it just drop the game assuming the worst? Or do you instead "freeze" the game indefinitely until both parties have updated? Perhaps it continues using the "old dictionary" for that ONE game -- requiring potentially storing multiple "versioned" dictionaries until they're done being used? Then you have the weird effect that you could have sworn you just successfully used that word in another game you just started but its not working here, huh. None of these is particularly satisfactory or fun to code.

So yes, you can always detect a mismatch, but what's interesting is how you then proceed. In other words, determining WHY there is a mismatch. Again, if you are willing to simply terminate abruptly regardless as soon as the game detects a disagreement that's fine, but in my opinion that is not a good user experience (this is what I meant before about preventing cheating vs. detecting cheating). A world where everything goes through a server gatekeeper simply does not have this issue, as there is only ever one dictionary -- the app wouldn't even need to include a dictionary itself. There is simply never a scenario where one client successfully sends bad data to the other client (short of someone hacking your server of course).

2. I meant here only that letterpress could today start using Game Center's rankings without providing its own server (the same way Fruit Ninja does for example). Of course I think this is bad for the same reasons I think not going through your own server for each move is bad, I just wanted to point out that since letterpress seems determined to go "serverless", and rankings are a feature people have requested, these "cheating" issues could be compounded by having rankings, that is all.

To sum up my point: With client to client communication there can necessarily always be disagreement (which you seem to agree with). One side can always say "this is good" while the other says "no its not". Since at this point you are stuck, not knowing who caused the disagreement, the end result is not "user friendly" (and again arguably ALLOWING this to happen in the first place is not user friendly -- I think everyone would prefer a world where you simply can't send bad data). To provide a good user experience I think it is better to avoid this possibility completely. With client->server->client communication, the clients will never disagree. The "thinking" takes place ONCE on the server, so the message is known to be sane by the time it gets to the opposing client. Whenever there are just two parties talking to eachother you can never know who is telling the truth. Again, in a world where you "don't care" about the results that is fine: by that I mean if you are willing to terminate the game and establish "no result" the second there are any shenanigans started then I am in complete agreement with you that you need no server. This however doesn't mean no cheating, it just means BAIL on detection of cheating. However, if you want to establish who won (in other words say "congrats" or "sorry you lose"), whether it be as simple as just showing the correct dialog to both users or more importantly if you ever wish to record it publicly (such as in a ranking system) -- then it is necessary to have an actual resolution, which can only be reliably done if the actions are going through an external gatekeeper:

SERVER MODEL: client1 sends word to server -> server checks word -> server sends word to client2 (even if I send bad words maliciously they will never get past the server, at the end of the game the winner can be recorded)
CLIENT MODEL: client1 sends word to client2 (since at any point in the middle I can send a bad word -- whether it be because I'm malicious or because my app got updated or WHATEVER -- the clients can be placed in a conflicting state)