Results
Compare MailWeft with standard models on email from 2025.
Every number on this page comes from a file in the repository. The B3 numbers are for the training run this site uses, unless a row says otherwise, and come from the frozen run before the rule fix below. The final 2026 test set has not been scored yet.
Test set
The test set is 1,132 emails from 2025: 1,066 phishing emails (233 from the Nazario corpus, 833 from Phishing Pot) and 66 legitimate emails from the team’s inbox, from senders not used to fit B3. See Datasets.
None of these emails trained a model, but the test set is not untouched. The 66 inbox emails helped choose between two versions of B3, and the Nazario 2025 emails were scored in an earlier run. About a quarter of Phishing Pot is commercial spam rather than phishing, and it is counted as phishing here.
Whole system
All checks as they run on this site: rules, B3, scam memory and the LLM judge on unsure or rule-flagged emails. The memory could not see the email being checked or anything dated after it.
| Phishing caught | Unsure | Safe | |
|---|---|---|---|
| All phishing (1,066) | 758 (71%) | 46 | 262 |
| Nazario 2025 (233) | 138 (59%) | 2 | 93 |
| Phishing Pot 2025 (833) | 620 (74%) | 44 | 169 |
| Phishing that passes DMARC (365) | 135 (37%) | 2 | 228 |
| Inbox, legitimate (66) | 2 flagged | 0 | 64 |
B3 alone caught 475 of these. The judge added 171, the scam memory 58 and the rules 54. Both inbox false alarms came from the rule for a reply with no reply headers.
One rule was fixed after a first run on this test set, where it flagged 14 of the 66 inbox emails: it had treated words like “mail” in mail.example.com as a look-alike of “gmail”. Because the fix was found on these emails, the rule numbers are somewhat optimistic. The 2026 final test set is the clean test. Details are in output/pipeline/results.md.
Against standard models
Each model flags the emails above an alert line. The line is set so that the model flags at most 1% of a separate set of legitimate mail kept aside for this.
| Model | Phishing caught | Inbox flagged | ROC AUC |
|---|---|---|---|
| MailWeft B3, this site’s run | 684 of 1,066 (64%) | 3 of 66 | 0.948 |
| MailWeft B3, two other runs | 598 and 568 (56%, 53%) | 2 of 66 each | 0.934, 0.923 |
| Naive Bayes | 572 of 1,066 (54%) | 0 of 66 | 0.947 |
| Random forest | 489 of 1,066 (46%) | 1 of 66 | 0.936 |
| Gradient boosting | 434 of 1,066 (41%) | 1 of 66 | 0.943 |
| Linear SVM | 342 of 1,066 (32%) | 0 of 66 | 0.957 |
| Logistic regression | 302 of 1,066 (28%) | 0 of 66 | 0.921 |
| B2 text model alone, this site’s run | 282 of 1,066 (26%) | 2 of 66 | 0.845 |
ROC AUC measures how well a model ranks phishing above legitimate mail at every line at once; 1 is perfect. The linear SVM ranks best, and B3 catches the most at a low false-alarm line. One of B3’s three runs (53%) is slightly below naive Bayes.
The standard models read word frequencies (TF-IDF) plus B3’s header and link features. They are fit on the same 5,372 emails as B3. B3 also contains B2, which was trained on about 15,000 more emails.
By source
The pooled number hides a split. B3 does much better on Phishing Pot, and B2 alone does better on Nazario.
| Model, this site’s run | Nazario 2025 | Phishing Pot 2025 |
|---|---|---|
| B3 | 96 of 233 (41%) | 588 of 833 (71%) |
| B2 alone | 176 of 233 (76%) | 106 of 833 (13%) |
Both at the alert line above.
Lines on this site
The site uses two stricter lines on the B3 score, set on 276 legitimate inbox emails kept aside.
| Line | Score | Phishing at or above | Of which Nazario | Inbox at or above |
|---|---|---|---|---|
| Phishing (flags 1% of the kept-aside inbox mail) | 0.97 | 466 of 1,066 (44%) | 60 of 233 | 0 of 66 |
| Safe below (flags 5%) | 0.83 | 763 of 1,066 (72%) | 119 of 233 | 4 of 66 |
An email between the two lines is unsure, and the LLM judge runs on it.
Service notifications
Text models often flag ordinary notifications, such as a password reset, because they look like phishing. B2 was trained on pairs of the same notification with and without an inserted scam.
| Pooled over three training runs | Without the pairs | B2 |
|---|---|---|
| Benign notifications from an unseen provider, flagged | 313 of 828 (37.8%) | 14 of 828 (1.7%) |
| Notifications with a scam inserted, caught | 432 of 720 (60.0%) | 407 of 720 (56.5%) |
The pairs cut false alarms on notifications, but B2 did not get better at catching scams inside notifications, and it caught about 5% fewer Phishing Pot emails.
Scam memory
The memory was tested in date order: each of 3,491 Phishing Pot emails from 2024–25 searched only the emails stored before it. The table counts the 1,934 that the language model labelled phishing; the rest are spam, scams and malware. Each kind of match is counted on its own.
| Match | Phishing matched | Held-out inbox matched |
|---|---|---|
| Scam link or phone number | 572 of 1,934 | 10 of 895 |
| Near copy of the text | 536 of 1,934 | 6 of 895 |
Reply threads
These threads were written by a language model, 40 of each kind. The judge ran without the scam memory and without scrubbing, unlike on this site.
| Thread | Header checks | LLM judge |
|---|---|---|
Fake reply (Re: with no reply headers) | 40 of 40 | 40 of 40 |
| Look-alike participant | 40 of 40 | 40 of 40 |
| Account takeover (genuine headers) | 0 of 40 | 33 of 40 |
| Genuine reply, wrongly flagged | 0 of 40 | 2 of 40, and 2 unsure |
Weak spots
- Phishing sent from a domain the attacker owns passes SPF, DKIM and DMARC, the checks that prove where an email came from. B3 alone catches 19 of 365 such emails (5%) at the site’s phishing line; all checks together catch 135 (37%).
- Features that only say which collection an email came from rank emails with ROC AUC 0.82. Part of B3’s gain may come from such differences between the collections, not from phishing itself.
- The 66 inbox emails are automated mail only. False alarms on personal mail are not measured.
- All thread tests are model-written. No real hijacked thread has been tested.
- Timings with the real model on the site’s server are not measured yet.