

Source: Alphaguyasa/Mezgeb docs/media/screen-today.png, demo mode 
Source: Alphaguyasa/Mezgeb docs/media/screen-ledger.png, demo mode 
Source: Alphaguyasa/Mezgeb docs/media/screen-customers.png, demo mode 
Source: Alphaguyasa/Mezgeb docs/media/screen-reports.png, demo mode 
Source: Alphaguyasa/Mezgeb docs/media/screen-review.png, demo mode 
Source: Alphaguyasa/Mezgeb docs/media/screen-teach.png, demo mode
The problem
Small shops in Ethiopia take payment through mobile money and bank apps, and the confirmations arrive as notifications nobody reconciles against who owes the shop.
The approach
A notification listener captures payment notifications, because Google Play does not grant READ_SMS to finance apps. A JSON-defined rule engine parses them into a ledger. When no rule matches, the message goes to a review queue, and the shopkeeper teaches a new rule by highlighting the amount.
Results
- 375 unit tests on the Play flavor, 382 on the sideload flavor, 83 on the parser module.
- No INTERNET permission in either flavor, checked against the merged release manifest.
- Release APK is 3.07 MB.
What broke and what I learned
- The parser scores 100.00% on its holdout (23/23), and the README says plainly that this is worth less than it looks: all samples come from 3 senders and 13 message templates from one person's account.
- RECEIVE_SMS was carried for several sessions and then removed, because nothing used it. A restricted permission has to be justified, not kept just in case.
- Coverage is 36.1% instruction / 46.1% line, reported rather than gated.