Complete index
Work
The complete index. Home is the short cut.
Flagship case studies
- telltaleFive agent CLIs on one brief, and gauges that render absent rather than zero
- The SystemArchitecture, interfaces, asynchronous delivery, and a contract seam I found broken and closed
- Defense News ClassifierHuman-labeled evaluation, reversals, and evidence-gated model decisions
- Faithfulness JudgeWhether an LLM judge can reliably identify unsupported claims
- Product & ProgramRoadmap, dependencies, risks, metrics, and the limits of a solo simulation
Evaluation and reliability
- Classifier baseline and live demo — run the TF-IDF logistic-regression baseline in the browser.
- False Green — six checks that passed when the required work never ran.
- Tool Seam — a 40-item attack gold set on kb-agent’s tool-result path. Citation poisoning held on 10 of 10. One field-smuggling item failed.
- Retrieval, Measured — a 27-query gold set and three paired retrieval experiments.
- The Autonomy Ladder — four levels of agent autonomy, with two shipped and two rejected.
- Loop Replay — interactive playback of two autonomous improvement runs.
- Context Architecture — I scored my agent context against five published criteria. Three failed.
Systems and infrastructure
- One Note, End to End — one payload traced across the real service contracts.
- Zero-Touch Provisioning — a factory-blank router configured after one power cycle.
Public repositories
Each row is a public repository this site already names, with the description, the language, and the last-push date from GitHub at build time.
- defense-news-classifier — Classifies public defense news into category, operational domain, and region. Human-graded gold at v3.2.1: 94.4% / 98.1% / 94.4%. Python. Last push: .
- faithfulness-judge — Can an LLM judge be trusted to catch unsupported claims? Measured against 189 human-labeled claims on public defense text: kappa 0.72-0.75 across two model tiers, 90-98% fabrication recall, and neither axis separates the tiers at this sample size. Python. Last push: .
- kb-agent — Local knowledge base over my projects. RAG and tool-use agent, with an MCP server and optional calls to project HTTP APIs. Python. Last push: .
- notes-api — Notes REST API in FastAPI. Tags, search, and optional classifier enrichment. Python. Last push: .
- portfolio — Systems and product work by San Lee. A decision log, reversals included. Astro. Last push: .
- architecture — System ADRs that span more than one repo. Product, program, and engineering views, plus a generated docs portal. Python. Last push: .
- learning-notes — Plain-language notes on the AI-engineering concepts behind my projects — with an interactive D3 concept map. Python. Last push: .
- netops-lab — MikroTik and Raspberry Pi home lab. Zero-touch provision a factory-blank router on hardware. Shell. Last push: .
- telltale — Dispatch room for five vendor CLIs. One brief, answered side by side. Statusline and HUD; every number is measured. Go. Last push: .
- agent-ops — Operating layer for a multi-vendor agent fleet: security posture, mechanical guards, postmortems, and working agreements. Python. Last push: .
The decision log
Eight decisions, one row each. Each row links to the page that records it in full.
A doubled rule marks a decision that was reversed.
- I decoupled the repos with frozen HTTP contracts. Then I audited the seam and found it broken with both repos' CI green. Each side asserted against its own copy of the shape. Now each provider publishes one generated schema, and every consumer asserts against that file in CI. The System →
- I audited my own gates. Six of them reported success for work that never ran. One review lane went green in 36 seconds and posted nothing. The counter I built to find that failure read a key that does not exist. False Green →
- Reversed. I built hybrid lexical retrieval to rescue one specific miss. I measured it and kept the dense-only default. The measurement returned MRR identical to four decimals. The miss it was built for was not a lexical failure at all. Retrieval →
- I nearly published a dramatic premium-vs-cheap model gap. The gap was my own bug. A
max_tokenscap truncated the cheap tier before its verdict on 20% of claims. I counted each one as a disagreement. Judge → - I called it a ceiling. Then I looked anyway. The misses clustered on one boundary. Two rubric clauses moved category 90.7% → 94.4%, and cost one domain row. It was a prompt problem, not a ceiling. Classifier →
- Reversed. A prompt read better to a human and measured worse. Category moved 79.0% → 76.7%, and industry recall moved 0.217 → 0.100. I reversed it. Classifier →
- Reversed. I built the enrichment loop on Kafka to learn it properly. Then I cut it. A single-user idempotent workload never needed a distributed log. It is now an in-process background task. The System →
- I forced output to a tool schema instead of a prose parse. The API layer rejects an invalid label. It rejected one out-of-enum response in 300, and a re-sample handled it. Classifier →
Field notes
Plain-language notes on the techniques used across these projects. Read them →
Model routing
Environments and checkpoints
This is a selection. The notes site carries the full set, and the set still grows.
Three decisions shape how this site reads. The colophon lists six.
- ADR-002 — the site states the AI assist as method: San sets the direction, the contracts, and the bar; Claude does most of the typing; the evals and postmortems are the proof.
- ADR-007 — a long page splits into whole arguments, and a split never trims the substance.
- ADR-011 — the site keeps public career copy at résumé facts plus a short About tell, and the résumé is the factual spine.
Looking for terminology used across the projects? Open the glossary →