Poshmark Growth Week

The Receipt Loop

Somu · Somasundaram Mahesh
7–8 October 2026 · Poshmark India Office · Chetpet
Wed and Thu · 10:30–11:50 IST
Day 1: Make agents trustworthy in our repos
Day 2: Orchestrate, don't prompt
Platform: base-mvvm-android-kt

A claim becomes a receipt.

A receipt becomes a rule.

A rule becomes a rail.

Four words

  • ClaimA message. "Done." A prompt assertion with no proof.
  • ReceiptCommand output, screenshot, logcat, a CI run.
  • RuleA test, a required check, an eval case.
  • RailA cloud agent opens a self-verifying pull request.

Trust is not a feeling. It is an artifact.

Their results, not our rate

  • Stripe1,300 merged pull requests a week. Minion-written, human-reviewed. Their number, February 2026. Self-reported.
  • PotetoAbout 2,000 pull requests a month. Her result, not our target.
  • Grok BotHundreds of pull requests a day. Their number, not ours. pstack is Lauren's quality practice, not a proven throughput cause.

An agent does not get to say done until it leaves a receipt.

The gap

Self-verification.

  • The gapThe weakest scored area. Autonomy stalls when an agent cannot prove its own change.
  • The diagnosisMost teams have skills. Few can prove a change works without a human.
  • The remedyNot more prompts. An executable verification loop.
  • RecordedNamed in the intro. Each team names its own gap.

Intent

One ticket. One command that can fail.

  • AGENTS.mdThe scope, and stop when green. Pull request #162 at e480eb2.
  • ./verifydoctor, test, or assemble. It exits 0 or 1.
  • The mapHome, detail, loading and error, theme. Pull request #159.

Acceptance is a command, not a paragraph.

Isolated execution

A ticket goes in. A sandbox comes up.

  • Issue #164Detail shows User #1. The cloud agent opens pull request #165.
  • The run./verify doctor, then ./verify test. CI 37320968461 green. 10 minutes 33 seconds.
  • The phoneVedha SHIP at 6c4e4be. The CI apk on Nothing Phone (3).
  • The launchA person starts it. The finish can be automatic.

Evidence

A cold launch is not proof.

  • The apkThe exact CI build of pull request #165. Commit 6c4e4be. The same SHA on the phone.
  • Cold start672 ms.
  • The pathHome, a tap, Todo Details. The screen shows User #1.
  • RecordedRolex, 19:43 IST. Nothing Phone (3), A024.

A driven path is. The receipt survives cleanup.

Review

The author is not the reviewer.

  • The candidatePull request #162 at e480eb2. Read-only. It writes one report.
  • The reportPull request #166. Vedha validated it as workshop evidence.
  • The limitIt cannot push, approve, relabel, or merge.
  • The badgesA green check is status, not a review.

Eval

An eval is not an app test.

  • The set12 cases. 6 real pull requests, 6 synthetic.
  • Replay12 of 12. GitHub run 37318641680. Commit e480eb2.
  • Live modelA separate gate. No CI key, so it does not run here.

Correct is not the same as good. Neither is the same as fresh.

Merge

A human decision, sized by blast radius.

  • LowNo shared contract. Easy to revert. Green verify, then review.
  • OwnedOne team's code. A receipt is attached. A code owner reviews.
  • Blast radiusShared library, schema, auth, or infra. Extra reviewer, required check, staged rollout.

RISK_TIERS.md and CODEOWNERS are in pull request #162. Branch protection on main is absent.

Correction

A failure becomes a rule.

  • The red checkPull request #163. Expected User #1. The test saw User 1.
  • The fix015efb5. The same check went green.

A fix that is not recorded is a fix you will make again.

Where it lives

Write it as low as it goes.

  1. Codebase
  2. Required check, lint, compiler
  3. Eval
  4. Rules and AGENTS.md
  5. Skill and verify command
  6. Style guide

Prompt memory does not survive. The repo does. Stock detekt runs. No custom lint rule yet.

Debt

No promise of zero debt.

  • PreventTypes, the compiler, stock detekt. Recorded in pull request #162.
  • ContainNo custom lint rule yet. That is the known gap.
  • MeasureDependabot pull requests 154, 155, 156, 158, and 161 sit open.

A path for every correction, and an owner. A gardener run does not exist yet.

The map

A map that rots is worse than no map.

  • The passPull request #167. Home, detail, loading and error, theme.
  • The phoneNothing Phone (3). ./verify test, 33 green. CI 37328150477.
  • The reviewVedha SHIP. Unmerged, so it is not on main.

Better memory makes the next intent cheaper.

Automation raises the ceiling.

Proof and review set the safe one.

Higher throughput with evidence. Not a bug-free guarantee.
100 agents without proof is slop. Poteto's 2,000 a month is her case, not our target.

The bar

An intern and Claude can navigate the repo.

  • A verify command exists
  • It drives one real user path
  • The evidence survives cleanup
  • A required check runs it
  • AGENTS.md says how to reach each feature

Leave with this

  • Day 1Every repo has a verify command and one green required check.
  • Day 2One workflow, an owner, and a gap to close.
  • The workflowWhich one will your pair own?
  • The ownerWho stewards it after Friday?
  • The gapWhat is the single thing still blocking?

Workflow

Coding

Trigger

Coding

Triggers: issue created, and status changed.

You are an issue triage automation for Linear.

My name is called Somu or Somasudnaram M or msomu and we will work only on the issues that are assigned for me.

You will work only on issues that are assigned to me and skip other issues.

If the issue is neither not assigned to me, or not a bug report nor a feature request, do nothing. Do not comment, do not create noise.

If the issue status is only in TODO and there are no blockers or dependency issues open only then you will pick it. If the issue is `in progress`, `in review` or `qa review` or `done` or in `backlog` you will not pick this up and you won't do anything about this.

You will examine the issue. Add an eyes emoji reaction.

When creating sub Linear tickets or opening PRs, always assign them to me on both Linear and Github.

In Linear, assign to: Somasundaram M

In GitHub/PRs, assign to: msomu

When opening PRs, include a line like “Resolves BUG-123” or “Fixes BUG-123” where BUG-123 is the Linear issue ID, so the PR gets properly linked to the issue.

Bug report

If it’s a bug report, investigate the bug and report your findings. This can be either refuting the bug or explaining the likely root cause.

Use sentry logs to assist, if applicable. Query posthog events if needed.

If it’s an easy fix, move the ticket to In Progress and work on it and open a PR and assign it to somu-agi.

When ever possible add a mastero test case and add it to the PR checks so that this bug is never regressed again.

Make sure the Linear issue stays assigned to Somasundaram M.

Feature request

If it’s a feature request, plan out the high-level approach and comment with the approach. And if needed create sub-issues with all the context on Linear and move them to Todo so the other agents can pick them independently and work on it with separate PRs.

If it’s an easy change, move the ticket to in progress and implement the change and open a PR.

For all featuers as much as possible add a mastero test case and add it to the PR checks so that this feature is developed and tested end to end from day one.

Always assign the PR (if created one) to somu-agi, never miss this step, else it is going to be tough for me to get it merged.

Make sure the Linear issue stays assigned to Somasundaram M.

If you create a PR and if you think no testing is needed and if you think it is complete ready without any regression only then on the Slack channel #pr-review post a message asking for review from @Aryan @Sanju else don't post anything.

Action

Coding

Tools: open a pull request, Linear, Sentry, PostHog, and Slack.

Workflow

Daily Sync

Trigger

Daily Sync

Trigger: custom schedule for Gather Priority and Update todos for today.

Check the last 2 meetings on fireflies there should be "Daily Sync" and "Eng/Product Sync" from these two meetings grab all the Action Items that are discussed by Somu/Somasundaram M and check the linear if these relavent tickets are already created and there or not.

If there is a linear ticket already there leave it. Only if they are not there go ahead and create a linear ticket for it in the Iris project with the context from the meeting and assign it to Somasundaram M and set the status as Triage and put it in the current cycle by default override if these are menetioned on the meetings. Make sure to add a tshirt size for the issues created.

For every new ticket you create, post a message to the Slack channel #iris-app-issue-enricher with the issue title, the Linear issue link, the t-shirt size, and a short excerpt of the meeting context you used to create it.

If there are any other things mentioned and we need to update them on Linear let's do that as well all related to Somasundaram M only. Don't touch or change any other tickets that are not assigned to Somasundaram M

Action

Daily Sync

Tools: Slack #iris-app-issue-enricher, Fireflies, and Linear.

Workflow

Naman <> Somu

Trigger

Naman <> Somu

Trigger: every Tuesday at 11:00 for Naman Somu 1:1.

Check the last meeting on fireflies there should be meeting called "Naman <> Somu 1-on-1" from this meeting grab all the Action Items that are discussed by Somu/Somasundaram M and check the linear if these relavent tickets are already created and there or not.

If there is a linear ticket already there leave it. Only if they are not there go ahead and create a linear ticket for it in the Iris project with the context from the meeting and assign it to Somasundaram M and set the status as Triage and put it in the current cycle by default override if these are menetioned on the meetings. Make sure to add a tshirt size for the issues created.

For every new ticket you create, post a message to the Slack channel #iris-app-issue-enricher with the issue title, the Linear issue link, the t-shirt size, and a short excerpt of the meeting context you used to create it.

If there are any other things mentioned and we need to update them on Linear let's do that as well all related to Somasundaram M only. Don't touch or change any other tickets that are not assigned to Somasundaram M

Action

Naman <> Somu

Tools: Slack #iris-app-issue-enricher, Fireflies, and Linear.

From this room

From This Room to the Internet

A suggestion becomes a pull request.

It is on the site only after I merge.

A model answers.

A harness finishes.

Gather the context.

Ask the model.

Use a tool.

Repeat.

Three harnesses

  • Claude CodeThe terminal. It reads the project and keeps going.
  • CodexYou give it a job, not a single question.
  • CursorThe editor. It can see the code and open a pull request.

Three cars. One kind of engine.

What people stack on top

  • pstackProve it. The agent runs a real check before it can say it is done.
  • SuperpowersPlan it. Ask, write a plan, write a failing test, then review.
  • gstackStaff it. Garry Tan's setup splits the job across roles.

One person, many workers

Not one chat. A window full of workers.

  • Grok BotA fleet. Their number, not ours.
  • Several at onceClaude Code, Codex, and Cursor, open together.
  • cmuxA pane lights up when an agent needs you.
  • GhosttyThe terminal under cmux.
  • Pi, at pi.devSmall on purpose. You extend it.

I close the laptop.

The work keeps going.

What you are about to see

Watch this become a pull request.

  • LiveWispr records the room.
  • LiveA summary after you stop, once the recording is past five minutes.
  • LiveOne ticket, dictated. Wispr types. It does not file it.
  • LiveA person assigns it to Cursor, or Tony starts the agent.
  • Liveverify-msomu, if someone runs it on the local server.

What stays held

The last step is mine.

  • Not liveWispr does not file the tickets.
  • RecordedA ticket does not start an agent by itself.
  • RecordedA GitHub green check. This repo has no workflows.
  • HoldThe merge. My tap.
  • RecordedAlready on the site. Not this room. Not yet.

You talk.

Wispr writes it down.

Wispr types.

It does not file the ticket.

Hand it over.

A pull request opens.

msomu.com

Tell me what is wrong with it.

Here is the pull request it just opened.

It waits for my tap.