The model reads.
Arithmetic decides.
AI is good at reading messy text from forty different banks. It is not something you should trust with your money. So Alertproof splits the job in three.
Gemma reads the alert
Every bank words its alerts differently and changes them often. Gemma, an open-weight model, turns any alert into the same fields: credit or debit, amount, balance, account digits, reference, time.
Code checks what Gemma read
Every number must be written in the alert itself. So must the bank name and the credit/debit word. Anything Gemma made up is thrown away, and Gemma is asked once more, told what was wrong.
Your balance chain decides
Last balance + amount must equal the new balance, to the kobo. The account must be yours. The reference must be new. Only then: PAID.
Gemma once, then instant
Your alerts come from the same one or two banks, in the same layout every time. After Gemma reads an alert and every value passes grounding, Alertproof remembers the words that sit before each value, like Avail Bal: NGN. The next alert in that layout is read in under a millisecond, through the same grounding and chain. It only keeps a learned format if re-reading the alerts it learned from gives exactly what Gemma read. Anything that doesn’t fit goes back to Gemma.
The chain
Why a fake can’t pass
A fake-alert app lets a fraudster type any sender, amount and wording. To pass Alertproof, it would also need your exact balance after your last alert, which only you and your bank know.
should be ₦70,510.50
The rules
Every check, in plain words
| Check | Passes when | If it fails |
|---|---|---|
| Direction | It’s a credit, and the alert’s own words say so | NO RELEASE: money went out, not in |
| Account | The visible account digits match yours | NO RELEASE: paid to someone else |
| Replay | You’ve never received this alert or reference before, and it isn’t more than a day old | NO RELEASE: an old alert sent again |
| Balance | Last balance + amount = new balance, exactly | NO RELEASE, or CAN’T TELL if it’s a small shortfall like a bank charge |
| Format | It looks like your real alerts from this bank | A warning only. Banks do change formats. |
Tested, not promised
70 alerts. 10 formats. Real and fake.
We ran Gemma 3 4B on a laptop with no graphics card over SMS, push and email formats from GTBank, Access, Zenith, UBA, First Bank, OPay, Moniepoint and PalmPay. Every format got real credits, a debit, a fake with an invented balance, a fake with a round balance, an alert for someone else’s account, and an old alert sent again.
What we got wrong, and fixed
The first run released 4 fakes. All four were alerts for someone else’s account that also carried the trader’s exact balance, the worst case. Two were in formats that show only two account digits (Zenith’s 01**876**32, Access emails). Our grounding check demanded three, so the account check was skipped. We now accept two digits when they come straight after a mask, and only the digits the alert actually shows. Then we re-ran those formats: both fakes are now stopped, with no new false alarms.
The other two are a true limit. OPay and PalmPay notifications show no account at all. If such an alert also carries your exact balance to the kobo, nothing in it can tell it apart from a real one. In practice that means someone has already seen your latest alert, so keep your alerts private.
Full case-by-case results, including every value Gemma got wrong and the grounding check threw away: eval/EVAL.md.