Spaces:
Running
Download eval/RESULTS.md from SooryaKi/ScamSentry: direct link, hf CLI and curl.
- Browser
- Download file 4.84 kB
-
https://huggingface.co/spaces/SooryaKi/ScamSentry/resolve/main/eval/RESULTS.md
- Command line
-
hf download hf://spaces/SooryaKi/ScamSentry/eval/RESULTS.md
-
curl -L -o RESULTS.md https://huggingface.co/spaces/SooryaKi/ScamSentry/resolve/main/eval/RESULTS.md
Golden Dataset Accuracy
Evaluated on a 62-row stratified sample (31 legitimate / 31 phishing) from
ealvaradob/phishing-dataset (texts config β real emails and SMS messages).
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| legitimate | 0.91 | 1.00 | 0.95 | 31 |
| phishing | 1.00 | 0.90 | 0.95 | 31 |
| accuracy | 0.95 | 62 |
Confusion matrix: predicted legit phish true legit [ 31 0 ] true phish [ 3 28 ]
Zero false positives β no legitimate message was misclassified as a scam. 3 false negatives, all sharing the same underlying pattern: classic character-obfuscation/keyword-filter-evasion spam (scrambled or letter-inserted words, one apparently corrupted/mis-encoded) rather than modern social-engineering phishing. None contained a coherent urgency/payment/brand-mismatch narrative for the Linguistic Agent to score, nor an extractable URL for the reputation signal to weigh in on. ScamSentry is designed to detect psychologically manipulative scam narratives β the dominant form of phishing/scam messaging today β rather than legacy keyword-filter-evasion spam; this is a reasonable, explicitly-stated scope boundary rather than a hidden defect.
Prompt Injection Resistance
Re-ran the full 15-case adversarial suite (eval/cases/injection_suite.json) on July 5
using eval/run_injection_suite.py. Result: 15/15 passed (100%), matching the
original Day 4 run exactly β the 3-layer defense is stable, not a one-time fluke.
| Category | Passed |
|---|---|
| Direct override | 5/5 |
| Fake authority | 3/3 |
| Role reassignment | 3/3 |
| Obfuscated (base64) | 2/2 |
| True-negative control | 2/2 |
Full per-case verdicts saved to eval/injection_suite_results.json.
Pass^k=3 Stability
TODO β 20 representative cases, 3 repeated runs each, checking verdict consistency.
- Stable across all 3 runs: N/20
- Notes on any instability observed: fill in
LLM-as-Judge (Report Agent clarity)
LLM-as-Judge (Report Agent clarity)
Scored the 7 Report Agent outputs with populated report_text in the golden
eval run, using gemini-2.5-flash as judge β deliberately a different model
from the pipeline's gemini-3.1-flash-lite, both because the pipeline
model's daily quota was exhausted this session and because using a distinct
judge model is standard practice to reduce self-preference bias. Reference
(VERDICT) and candidate (REPORT) block order was swapped on alternating
rows to control for position bias.
- Mean accuracy: 5.00/5
- Mean clarity: 5.00/5
- n = 7 (small sample β directional signal, not a headline claim)
The judge scores accuracy against a reconstructed verdict object
(risk_level, confidence, injection_attempt_detected) rather than the
full original Verdict schema β the golden-eval checkpoint format does not
capture the evidence list, so the judge can confirm risk-level/confidence
alignment but not full evidence-level grounding. Worth extending in a future
iteration by having run_golden_eval.py persist the evidence list too.
Known Limitations
- IPQS free-tier credits exhausted during the build week. URL-reputation
signals in this evaluation were derived from RDAP domain age and VirusTotal
only; IPQS's
risk_score/suspiciousfields returnedstatus: "degraded"throughout, exactly as the system's degraded-mode design intends β the verdict pipeline still produced confident, correct calls on the remaining two live signal sources. - Sample size constrained by Gemini free-tier daily quota.
gemini-3.1-flash-lite's 500-requests/day ceiling, combined with the ~6β7 Gemini calls required per full pipeline run, made a single-day 250-row evaluation infeasible. 62 rows were evaluated as of July 5; remaining rows in the extended batch are pending quota reset. - 3 false-negative phishing cases: - 3 false-negative phishing cases, all sharing the same underlying pattern: classic character-obfuscation/keyword-filter-evasion spam (scrambled or letter-inserted words, and in one case apparently corrupted/mis-encoded text) rather than modern social-engineering phishing. None contained a coherent urgency/payment/brand-mismatch narrative for the Linguistic Agent to score, nor an extractable URL for the reputation signal to weigh in on. ScamSentry is designed to detect psychologically manipulative scam narratives β the primary form of phishing/scam messaging today β rather than legacy keyword-filter-evasion spam, and this is a reasonable scope boundary to state explicitly rather than a defect to hide.
Reproduce these numbers: python eval/prepare_golden_sample.py β
python eval/run_golden_eval.py --input eval/golden_sample.csv β
python eval/score_golden_eval.py.