An agent does not get to say done until it leaves a receipt
Somasundaram Mahesh
Kotlin Connect: Agents & Data · 2 Sep 2026 · 7:50 PM IST
who's talking?
Somasundaram Mahesh
Founding AI Engineer at AGI.INC
Formally Android engineer. Building mobile products for 8+ years.
Ships ToonGen, The Roaming King and many more with agents in the loop.
@msomuin on X · msomu.com · github.com/msomu/receipt
01
The agent said done
and I believed it
the new failure mode
It writes a paragraph about itself
what the agent reports
tests passed
screenshot looks good
logcat is clean
what is on disk
no XML
a PNG from last week
"ok": true hardcoded
this morning, on this plugin
Two lies. Same CLI. Two reviews.
screenshot always install -r + am start, then ok if any PNG existed
failed install could still exit 0
logcat always returned "ok": true
on a real app, verify test was just assemble
The CLI looked like infrastructure. It was a story.
Verification is infrastructure.
Lauren Tan · The Complete Guide to pstack Pt. 1 · 31 Aug 2026
02
receipt
tools first. markdown second.
what it is
A Cursor plugin. A local CLI. A Feature Map.
/create-receipt
once per repo writes the harness
/receipt
every task done = proof on disk
/maintain-receipt
daily re-drive the map
github.com/msomu/receipt · MIT · Android and Kotlin Multiplatform
the loop
Install is not the product
Install the plugin once
/create-receipt writes .cursor/skills/verify-<app>/ — real CLI + 3–5 feature files
/receipt on every bug, feature, or KMP test — no proof, not done
/maintain-receipt daily so the map stays true to the app
Next agent starts cold with an honest harness
done means files
.receipt/proof/<id>/
must exist
Gradle or bun output
JUnit XML, not a sentence
a PNG with PNG magic
logcat for the app pid
does not count
“tests look good”
any file that happens to be named .png
logcat ok with no process
assemble standing in for test
honest CLI
The commands that cannot flatter
cd sample
./verify doctor
./verify test
./verify assemble
./verify screenshot --install --launch # cold start
./verify screenshot # current frame only
./verify logcat # pidof the package
JSON. --dry-run. --help. AdbHarbor lease if present — never --force. Proof survives cleanup.
this Mac
Shell to the phone. No MCP.
Cursor on this Mac
--shell--> ./verify / adbharbor
--lease--> phone
Harbor owns :5037. Never raw adb.
cloud agent
The phone stays on the desk
Cursor Cloud
--https--> tunnel
--> harbor /mcp on this Mac
--lease--> same phone