01 About
I patented an athletic recovery product at seventeen and shipped 600 units before I finished high school. That taught me the only lesson that transfers: the thing is not real until someone who owes you nothing uses it.
Most of my work now sits on the layer that decides whether an AI system is actually right. Reinforcement learning environments are scored by a verifier, and the verifier is the definition of good. If it can be gamed you train a reward hacker. If it rejects work that is correct but different, you spend the most expensive resource in the pipeline teaching a model that correct is wrong. Almost everyone measures the first failure. vaudit measures the second.
What agents don’t test is the other side of that work: building the task instead of auditing the grader. It went through three versions until the newest model failed most runs, and every failing run had done the same thing: tested thousands of cases, reported a match, and missed exactly the behavior its tests never generated. When I tried a larger version inside a real codebase, three pilots came back clean, which narrowed the claim instead of widening it, and turned up a bug I fixed upstream.
The same instinct runs through the security work. pipecat-firewall blocks prompt injection before a voice agent’s model ever sees the turn, so there is no prompt left to argue with. Vibecheck runs real static analysis over a repo and opens a pull request that fixes what it finds. Sentry writes itself a new guardrail mid-call and refuses the same attack seconds later.
I have also been building AI candidate sourcing for an IT staffing firm, and I still am. Most matching tools rank résumés by keyword overlap with a job description, which is a search problem pretending to be a hiring problem. Mine scores candidates against placement history instead: who actually got hired, for what, and what the recruiter said about them. The feedback loop is a recruiter telling me the ranking is wrong and why, which is the only kind worth having.
Elsewhere: Strata, field guidance for plumbing contractors that has to keep working in a crawl space with no signal, and Yaad, a memory engine for dementia care that refuses to answer when it cannot cite a row.
The through-line is accuracy under pressure. Systems that have to be right about people, and systems that have to stay right when something is actively trying to make them wrong. In all of them the interesting engineering is the failure mode, not the demo.
That is also why every project here ships with what is wrong with it. A portfolio of things that only worked is not evidence of judgement. Most of these pages end with the part I could not solve, and seven of them are dead.
02 Experience
03 Selected work
04 Stack
Languages
Python, TypeScript, SQL. Python for anything with data or a model in it; TypeScript when a person has to look at it.
Backend
FastAPI for services, Next.js when the front end and API belong together, Supabase/Postgres for state.
AI
Claude and GPT-4o, Pinecone for retrieval, Pipecat + LiveKit for voice. Deterministic code wherever a model is not actually required.
Quant
pandas, statsmodels, scikit-learn. Enough econometrics to know when a p-value is load-bearing and when it is decoration.
Infra
Vercel, Railway, Docker, GitHub Actions. Boring on purpose, deployment should not be the interesting part.
Reach for first
The smallest thing that can be put in front of a real user this week. Everything I have learned came from that, not from the architecture diagram.
05 Interests
- AI agents under adversarial pressure
- labor markets
- calibration & forecasting
- prediction markets
- hip-hop dance
- guitar
- running
- climbing
~/R