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

adbharbor expose --via cloudflare. Paste URL + token.

three repos

Harbor serves. Receipt asks.


AdbHarbor

server
MCP, submit, expose

receipt

client
./verify here. MCP from the cloud

this deck

both loops
msomu.com/talks/receipt

03

Live

15 minutes. The sample is the talk.

demo · 15 minutes

Fifteen minutes. Files on disk.


  • 0:00 — read the first sentence of the README out loud
  • 1:00./verify doctor — JSON, not a paragraph
  • 3:00./verify test — XML + log under .receipt/proof/
  • 5:00 — assemble, screenshot --install --launch, increment, screenshot again
  • 8:00/create-receipt on github.com/msomu/base-mvvm-android-kt (Compose MVVM template)
  • 10:00 — stop. Clone it. Watch the agent prove the change.

what you should see

Counter 1. Not Counter 0.


cold start

--install --launch
always Counter 0

capture only

./verify screenshot
the frame that is actually up

If the PNG does not open as a PNG, ok is false. Size is not a check. Magic bytes are.

04

It has to port

a plugin that only works on its sample is a demo

in production

Two real apps.


ToonGen

toongen.app

  • verify-toongen
  • web + Android assemble
  • doctor ok

The Roaming King

theroamingking.com

  • board-game rental
  • live storefront
  • agents in the loop

Android screenshots on ToonGen are still unproven on a device. The CLI will not fake one.

daily

A maintain pass that never fails is untested


  • Cursor Automation — schedule /maintain-receipt
  • or a cloud agent, same prompt, once a day
  • re-drive the Feature Map, fix drift, one PR or “clean”
  • the first real pass must be able to go red
05

Monday

clone it. run verify. watch the agent prove the change.

homework

One repo. One harness.


  • Clone github.com/msomu/receipt
  • Cursor → Plugins → Add from GitHub → msomu/receipt
  • In your Android or KMP repo, run /create-receipt
  • Next task: /receipt. No .receipt/proof/, not done.
  • Tomorrow: /maintain-receipt

Leave a receipt


Somasundaram Mahesh
github.com/msomu/receipt
msomu.com/talks · @msomuin