San Lee

Technical program manager building reliable AI systems.

Product at JPMorganChase, on collaboration platforms serving 300,000 employees, after seven years in infrastructure and operations.

I set direction, define the interfaces between teams and systems, and gate delivery on evidence. I use AI agents to accelerate execution while retaining ownership of the architecture, decisions, and quality bar.

Calls that shipped, and calls that were reversed.

A doubled rule marks a decision that was reversed.

Selected work

Four views of the work: how I structured the system, measured its decisions, tested a judge, and managed the program. Deeper investigations remain linked throughout the record.

Run the classifier demo

Direction, then contracts, then an evidence gate. Direction set the aim Contracts freeze seams Evidence gate the merge eval gates the merge

The system

Three services wired into one loop: an API, an LLM classifier, and a RAG agent.

Notes API BackgroundTask Classifier Tags Knowledge base KB Agent Grounded answer

Select a component to see what it does and the decision behind it.

Read the full writeup

The decision log

Reversed. BM25 retiredEVAL · BM25

I added retrieval grounding, measured it, and cut it

I added BM25 lexical retrieval to ground each call, expecting a clear win. The first measurement said it barely helped. Then I found the measurement itself was unfair.

The result: I had been scoring the grounded arm against a stale baseline built on an older prompt. Rebuilt so both arms ran the same prompt, grounding fixed a domain call zero times and broke four across 162 classifications. It was retired outright, not left on as an option.

An unfair baseline flatters the change you hoped for. The retrieval code stays in the repo so the measurement can be rerun. Full eval →

Reversed. Model gated on evidenceSYS-002 · ADR-013

Gate model choice on evidence

Sonnet by default across the system. Escalate to Opus only where an eval shows the quality gain pays for itself. I built the upgrade, measured it, and declined it.

The result: routing the uncertain cases to the premium model moved zero rows on both axes at about 1.97× the cost per article. Sending everything to the premium model scored identically, so there was no headroom for any router to capture.

A targeted prompt fix had already taken the ground routing was aimed at. The cheapest fix won. The harness stays in the repo as the record. Full verdict →

Eval rebuiltEVAL · v1 → v3

I rebuilt the eval on human-labeled real text

v1 graded the model on 300 snippets it generated itself. That measures consistency, not correctness. v2 replaced that with 54 hand-labeled real snippets, cross-checked by an Opus judge.

The result: domain accuracy fell from 97.3% to 88.9% on real text, and that lower number is the trustworthy one.

Category accuracy actually rose, because real vocabulary separates more cleanly; domain fell because the synthetic set was trivially easy to grade. Full eval →

Eight more, in one line each. The full telling of every one is on the page it links to.

Classifier evidence

Where the classifier stands now, on 54 hand-labeled real snippets.

Category and region are scored separately. They happen to land on the same figure here.

Those numbers are from the harder gold set. Full eval →

The classical baseline that lost the case for an LLM is vendored here and runs in the browser, on the same rows. Run it yourself →

Field notes

Notes I keep while learning, in plain language, on the techniques behind all of this. Read them →

A selection; the full, growing set is on the notes site.

About

For the short version of how I came to this work and how I approach it, read About →

It is a solo build, so the program layer is simulated — I lay out what that means on the Product & Program page.

A second record sits off this system: a physical lab that makes a factory-blank router provision itself. Zero-touch provisioning →

Outside the work I hike, take pictures, and live with a Scottish Fold named Sango. The rest is on About and in the gallery.

Sango, a Scottish Fold, asleep
Sango, Chief Nap Officer.