After looking at this for a few minutes, I still don't understand what it is. Where's the anti-spam system? I thought there would be a write-up outlining the anti-junk algorithm.
The anti-spam system is that the user has to pay to send you the message. If you ask for $50 per message, and the message is spam, you'll flag the message as "spam" which means you get the $50 and the spammer doesn't get their refund. At high enough cost spammers can't reach you.
If you're powerful and get 100 emails a day for things that take up your time, you don't want to read 95 of them, but do want those 5 that matter to still be sent to you, by people who are confident enough that their email is important.
It's not a joke. rePOWCHA stops bots. If a bot automates sending the amount to get by the CAPTCHA, the bot won't be able to afford paying this amount at scale, because when you notice that the bot abused your service you'll flag it as "abuse" and won't refund the bot's deposit. Past some threshold of $x per CAPTCHA, bots can't afford to bypass them.
The reason spam is everywhere is that the cost of sending spam is low. The solution proposed by rePOWCHA is to increase the cost. It's a form of proof-of-work.
You do it in the .fsproj. I wish Microsoft would add a warning to explain that, instead of just saying the modules can't be found. Really confused me for a good few hours.
That works right up until it doesn't. For example, if you have two interacting places where the compiler has guessed what to do, maybe the compiler resolves the interaction in the wrong way. It's the same problem that arises if you don't commit after merging into a Git repository (which, by the way, is possible but takes explicit opt-in): it keeps on working fine up until two previous merges conflict with each other.
I much prefer Rust's approach, which is to fail out but also make it extremely easy to apply the fix the compiler has guessed.
1. The compiler doesn't usually exactly know the right thing to do. E.g. in this case presumably the error should be something like "You need to order the files so that each file doesn't depend on anything further down the list." The compiler doesn't know what that order should be (maybe in this case it could figure it out, but the point is more general than just this instance).
2. Sometimes the compiler might be able to figure out what you meant but you still did it wrong. If you accept wrong code then pretty soon people will start thinking that it is right, and then you have to support it forever. This is closely related to the thoroughly disproven "Robustness Principle", which actually leads to systems that are really not robust. HTML parsing is a good example (though mostly fixed today).