Three of the things I've built this year look unrelated: a revenue audit engine, a food recall system, a daily cricket puzzle. They are the same argument each time. A system that makes a judgement should be scored on the judgement rather than the result, should say out loud where its answer came from, and should decline to act when the data doesn't support it.
01 Sanchay, revenue audit · 02 Soteria, food recalls · 03 Pavilion, cricket puzzle
A statutory revenue audit an AI agent can run end to end, on books it cannot change.
An auditor signing off a manufacturer's revenue usually gets the sales register as a spreadsheet, tests a few dozen sales out of several thousand, and collects the paperwork by email. The spreadsheet is whatever the client exported and the sample is whatever the auditor picked, and neither can be checked afterwards. Sanchay builds the system of record behind those sales and audits that instead: every step of a sale is an event in an append-only, hash-chained double-entry ledger.
The audit reads the whole year rather than a sample of it. Sixteen detectors run over a frozen snapshot, among them Tarjan and Johnson cycle search for goods or money that come back to where they started, and Benford's law for amounts that look chosen. The samples still drawn for document testing come from a seed nobody chooses: the client is handed a commitment at upload, the seed is derived from a sealed secret and the snapshot hash, and the client can verify afterwards that the draw was not steered. A few requests ask for documents that should not exist, and supplying one is itself a finding.
The whole system is an MCP server, so an agent holding only an identity can run the business as a client employee or audit it as an auditor, with exactly the permissions of that identity. An auditor identity is stopped from writing business data four separate times: by the tool list, by a ledger handle whose type has no append function, by the database role, and by append-only triggers. The model is optional and never does the arithmetic. The full audit runs without one, and the assistant that answers in English, Hindi or Marathi withholds any sentence carrying a figure it cannot trace to a record.
OCaml Go Python MCP Johnson cycles Postgres React
Recall detection, lot-level containment and proof of action for online grocery.
A recall names lots, not products. Most stores can't tell which lot sits in which box, so they pull every unit, throw away stock that was never contaminated, and keep shipping orders already in flight. Soteria watches the FDA, USDA FSIS and EU RASFF feeds, plus manufacturer catalogs for products withdrawn without any notice, reads each notice down to the exact barcodes and lot codes, and holds only those lots.
Twelve services on RabbitMQ, every one of them recoverable when it fails: quorum queues with dead-letter limits, idempotent consumers, and a CI test that fails when the topology declared in three places drifts. Above a confidence threshold the containment service acts alone; below it, a person confirms, and a reviewer can narrow the held lots but never widen them. The LLM that reads notices sits behind a deterministic guardrail, so a lot code must appear verbatim in the notice and a barcode must pass its check digit. Every step lands in a per-incident hash chain anchored with an RFC 3161 timestamp, so "what did you do, and when" has an answer that can be verified rather than remembered.
Go Python RabbitMQ Shopify GraphQL Groq RFC 3161 React
A daily T20 cricket puzzle. One target score per day, identical for every player in the world.
You play both innings of that target. First you defend it with five bowlers and a four-over limit each, then you chase it on a budget of six attacking overs. It counts as solved only when both halves are won.
The target is solved, not chosen. Overnight, a generator simulates thousands of full games at candidate targets and keeps only situations where a competent player wins between 35 and 65 percent of the time and where the bowling choice measurably changes the result. A target you would win nine times in ten is not a puzzle. The search covers the whole tuple of target, attack, chasing side and venue, because the attack you are dealt is part of the problem rather than set dressing.
The randomness is pre-committed. The dice are not rolled when you click. Every ball of the day has a fixed coordinate of day, innings, over and delivery, and its random number is derived from the day's key plus that coordinate. Ball four of over twelve carries the same number whether you reach it or not, so replaying cannot fish for a better outcome and every player genuinely meets the same deliveries. Your choices move the probabilities, not the dice.
Which is what makes the scoring possible. Summing win-probability changes across an innings telescopes to the final result, so it measures luck. Instead, before each ball the engine evaluates every option that was available at that moment and scores the gap between what you chose and the best thing you could have chosen. A careful player who loses can score positively.
Go end to end with no cgo, so the server is one static binary: SQLite is the pure-Go implementation and model inference is a hand-written tree evaluator rather than ONNX, with fixed parity fixtures asserting the Go and Python paths agree. Ball-by-ball data comes from Cricsheet under ODC-BY 1.0; batting hand and bowling type resolve through Wikidata and therefore carry CC BY-SA. The two are kept in separate files so the share-alike obligation stays scoped to the attribute table instead of spreading into the corpus and the models.
Go Monte Carlo Empirical Bayes Python (uv) SQLite Make
| What it decides | What it refuses to do | |
|---|---|---|
| Sanchay | which sales in a year of books an auditor should doubt | give a figure it cannot trace to a ledger record |
| Soteria | which lots of a recalled product leave the shelf | pull stock the notice never named |
| Pavilion | how good your call was against the calls you had | roll the dice after you've made the choice |
|
Inquest Runs a paper's code in a sandbox, records what it actually does, and judges every numerical claim against measured seed bands. Gaps are split across specific deviations with exact Shapley values. No verdict is produced by a language model.
|
Sovereign AI Workbench Plans the work, runs the tools and hands back a reviewable draft without anything leaving the premises. Scans are read twice, by OCR and a vision model, and every figure in a deliverable traces back to a hash-chained evidence record.
|
|
Autopsy Retrieval over the strongest comparable items, a structured diagnosis grounded in them, then three rewrites with a reason for every change. Runs with zero keys, and every response is stamped live or mock so a fallback never passes as a generation.
|
OJAS Ranks thousands of camera-hours so the few reviewer-hours that exist go where they matter, and a human confirms or dismisses. Verdicts go into an Ed25519-signed hash-chain custody ledger and export as signed incident reports.
|
No logo exists for the half that mattered most: Johnson cycle search, meet-in-the-middle search, exact Shapley attribution, Monte Carlo target search, empirical Bayes shrinkage, hash chains with RFC 3161 anchors, CLIP verification.
The long tail, six more if you want them
- Manhattan. Settlement reconciliation that proves its answers, and refuses when it cannot. It derives which payments a bank credit settles by meet-in-the-middle search, counts exhaustively to show the answer is the only one, and holds the rest with a named cause, a remedy and a price. Across 996 settlements it posts 714 with none wrong, where trusting the gateway's report posts 39 wrong and marks none of them.
- Referee. A benchmark harness for AI agent architectures. Fixed tasks with machine-verifiable ground truth, and identical prompts, tool access and grading on every run, so what's being compared is the architecture and nothing else.
- Trace.ai. Predicts recurring inflate-then-discount cycles per seller: seller-grouped XGBoost over STL-decomposed price history, catalogue-wide discount concurrency and seasonality, benchmarked against a single-product z-score baseline. The labels are simulated, and the README leads with that. An existence proof, not validated ground truth.
- IFAS. Retail footfall from CCTV. Detection and tracking feed a two-stage fine-tuned ViT for gender and PETA-style SVMs for age, and a dashboard turns the run into footfall, dwell and who visits.
- Spine-Guard. Real-time posture feedback for spinal rehab over a WebSocket, with a collaborator. Landmarks, joint angles, thresholds, alerts.
- micrograd and LSTM-TextGen. Written to understand the thing rather than to import it.
Blynt (sunset). Co-founded, built and shipped a cross-platform social app end to end: architecture, microservices, real-time feeds, push notifications, deployment. Around 800 users and 120 daily active at its peak. Strangers using something you made is a different class of feedback from a green test suite.
| rishipopawala@gmail.com | ||
| /in/rishi-popawala-077624333 | ||
| github | /Rishi0507 | |
| leetcode | /u/RishiPopawala | |
| codeforces | /profile/Rishi0507 | |
| codechef | /users/rishipopawala |
If you want to know why something here is built the way it is, it's written down in the repo. Usually that's the more interesting file.

