Screens recruiter mail for fraud, and says so when it can't tell. The third answer is the point.
Job seekers are worth targeting. Someone actively applying opens recruiter mail from senders they don't recognise, follows links to portals they've never used, and is primed to believe a good offer arrived unprompted. The scams are built for exactly that: a spoofed sender, a company that half exists, and a fee for equipment payable before the first pay cheque.
Filtering it looks like a spam problem, and it isn't. Spam filters are tuned against false negatives — let junk through and someone deletes it. Here the asymmetry runs the other way. A phishing email that slips past costs a bad afternoon. A real offer flagged as fraud during a job hunt costs the job.
So the expensive mistake isn't missing a scam. It's being confidently wrong about a real one.
| Before | After | |
|---|---|---|
| Judgement | Read it and guess | Seven signals combined into a band |
| Any one flag | Enough to condemn | Weighted; none is decisive alone |
| New companies | Young domain reads as fraud | Weighted low, trusted list overrides |
| Links | Clicked to check | Analysed, never opened |
| Deletion | Permanent | Trash only — the scope excludes delete |
| Outbound | Reply to check | Drafted for a human to send |
Refusing to let any single signal decide is what made the rest usable. A brand-new company with a three-week-old domain and no LinkedIn footprint is the exact profile of a real early-stage startup and the exact profile of a scam. Any rule sharp enough to catch the second condemns the first. Weighting each signal by how strongly it actually indicates fraud — a sender-domain mismatch heavily, a young domain barely — is what lets both through the same pipeline.
The tool polls Gmail while it's running, and on startup catches up on anything that arrived while the laptop was closed. Each new message is sorted into one of four buckets; only recruiter and interview mail continues. Promotional senders on a list go to Trash, recoverably.
What continues gets a cheap pass first: impersonated company names, display-name and Return-Path mismatch, urgency and financial bait in the wording. Blatant fraud is caught here without spending anything further. What survives is the interesting case — a polished scam reads clean — so those go to deep verification: the company's real domain checked against the sender, registration age, links expanded and inspected without ever being fetched, and a search for public complaints against the name.
Every signal contributes weighted points to a single score. The email gets a label and a note explaining which signals fired and which didn't, and every decision is written to a local history table. When the score genuinely doesn't resolve, the email is surfaced for a human with the evidence attached rather than being pushed into a band it doesn't belong in.
The expensive error is not the scam you miss. It's the real offer you kill.
The obvious build gives every email a verdict. Genuine or fraudulent, a clean binary, a confident label on every message. It demos beautifully — every input gets an answer, the tool always looks like it knows.
Making inconclusive a first-class outcome costs the demo and buys the thing the tool is actually for. When the signals don't resolve, the email is handed back with its evidence rather than pushed into a band, which means some share of mail still needs a human — the exact work the tool was supposed to remove. It is a strictly less impressive product.
It's also the only version that's safe to trust during a job hunt, because the alternative failure is silent. A missed scam announces itself eventually. A real offer scored as fraudulent gets a label, gets ignored, and nothing ever tells you it happened.
A labelled test set — fifty emails, half fraudulent — so the signal weights are scored rather than chosen. An MX lookup alongside the domain check, since a sending domain with no mail exchanger is a strong signal and cheap to test. Dropping the LinkedIn presence check unless it earns its place, because a signal that degrades silently is worse than no signal. [ Confirm before publishing ] A learned score once the history table holds enough labelled decisions to train on.