Inspiration
Where I live, in Lagos, most small businesses are paid by bank transfer. The customer sends a screenshot of the transfer as "proof of payment", usually over chat, and the seller releases the goods. Those screenshots pile up in phone galleries and backups, and almost nobody matches them to invoices afterwards. Unpaid invoices get missed, and a reused or misdirected screenshot is hard to spot by eye.
I build payment products, so I know the gap between "the customer showed me a receipt" and "the money is in my account". A NAS that already holds the phone backups, the invoices and the bank statement is the one place where all three can be checked against each other privately.
What it does
Payment Proof Reconciler answers one question: who has really paid?
The user names an invoice folder, a period and the account name customers should be paying. The Skill then:
- Reads the invoices and extracts number, customer, total and dates.
- Finds transfer-receipt screenshots in the photo library by their recognised text.
- Reads each proof and matches it to an invoice using fixed, written rules.
- Checks matched proofs against a bank statement, if one is supplied.
- Shows a ledger where every invoice has exactly one status: Confirmed, Proof on file, Proof not on statement, Part-paid, Overpaid, No proof found or Needs review.
It flags a reference that appears on two different images, a transfer paid to a different name, a transfer still marked pending, and a proof dated before its invoice. It reports what it observed and never calls a proof forged. Only a line on the bank statement can make an invoice Confirmed.
After the user approves, it saves the ledger and tags matched proofs, so the next run only reads new ones.
How I built it
The Skill is a Markdown-only Uliya Skill built with the official UGOS Skill Creation Tool (uliya-skill-kit 0.7.7, capability catalog 2.2.0). The parent workflow only delegates to four registered experts:
file-agentlists invoices and manages the tag used as run memorydocument-agentextracts invoice fields and answers questions about the statement, with citationsphoto-agentsearches the photo library by recognised text and reads each screenshotknowledge-agentsaves the ledger with a read-back check
The matching itself is deterministic and runs in the parent on the values the experts return, so the same inputs always give the same ledger. The rules, the report layout and the test plan live in linked reference files.
I used Claude as an AI assistant to research the rules and the capability catalog, draft the Markdown and run the static checker. The package passes the official checker with zero errors and zero warnings.
Challenges
- No scripts. Everything has to be expressed as delegation to experts, so the matching logic had to be written as plain rules precise enough to follow without code.
- No device yet. Round 1 has no NAS access, so nothing has run on real hardware. I designed around what the catalog documents and wrote down what still needs testing.
- Not overclaiming. A screenshot can be edited. The hard design decision was to treat every proof as a claim to verify, and to keep "Confirmed" for invoices backed by the bank statement.
- Unreadable data. Receipts vary by bank and app. The Skill records a missing field as "not readable" and says so in the ledger instead of guessing.
What I learned
How the Uliya model separates the orchestrating Skill from the experts that do the work, and how much of a Skill's quality comes from handling the unhappy paths: empty results, partial reads, cancelled steps and writes that wait for approval.
What's next
If selected as a Finalist, I will test on the iDX6011 Pro with an invented data set: a three-way match across six invoices, a repeat run after tagging, and an edge case with a reused reference, a wrong recipient and a pending transfer. The main things to confirm on the device are whether text search finds chat screenshots, whether text recognition accepts the paths the search returns, and how long forty proofs take.
Built With
- ai-agents
- markdown
- ocr
- ugos
- ugreen-ai-nas
- uliya