Results

Compare MailWeft with standard models on email from 2025.

View Markdown

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 caughtUnsureSafe
All phishing (1,066)758 (71%)46262
Nazario 2025 (233)138 (59%)293
Phishing Pot 2025 (833)620 (74%)44169
Phishing that passes DMARC (365)135 (37%)2228
Inbox, legitimate (66)2 flagged064

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.

ModelPhishing caughtInbox flaggedROC AUC
MailWeft B3, this site’s run684 of 1,066 (64%)3 of 660.948
MailWeft B3, two other runs598 and 568 (56%, 53%)2 of 66 each0.934, 0.923
Naive Bayes572 of 1,066 (54%)0 of 660.947
Random forest489 of 1,066 (46%)1 of 660.936
Gradient boosting434 of 1,066 (41%)1 of 660.943
Linear SVM342 of 1,066 (32%)0 of 660.957
Logistic regression302 of 1,066 (28%)0 of 660.921
B2 text model alone, this site’s run282 of 1,066 (26%)2 of 660.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 runNazario 2025Phishing Pot 2025
B396 of 233 (41%)588 of 833 (71%)
B2 alone176 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.

LineScorePhishing at or aboveOf which NazarioInbox at or above
Phishing (flags 1% of the kept-aside inbox mail)0.97466 of 1,066 (44%)60 of 2330 of 66
Safe below (flags 5%)0.83763 of 1,066 (72%)119 of 2334 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 runsWithout the pairsB2
Benign notifications from an unseen provider, flagged313 of 828 (37.8%)14 of 828 (1.7%)
Notifications with a scam inserted, caught432 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.

MatchPhishing matchedHeld-out inbox matched
Scam link or phone number572 of 1,93410 of 895
Near copy of the text536 of 1,9346 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.

ThreadHeader checksLLM judge
Fake reply (Re: with no reply headers)40 of 4040 of 40
Look-alike participant40 of 4040 of 40
Account takeover (genuine headers)0 of 4033 of 40
Genuine reply, wrongly flagged0 of 402 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.