I build production-grade AI systems that solve problems that actually matter — under real operational and legal pressure, for real clients.
Not proofs of concept. Not demos. Production systems and open-source tooling running under real operational and legal pressure.
Converts fragmented HOA and condominium governing documents into citation-grounded, meeting-ready answers. Scored extraction with an absolute completeness gate, authority-weighted retrieval where amendments inherit their parent's rank, six-layer deterministic conflict resolution, and a two-axis confidence card that names what it could not measure — so a board member who doesn't trust AI can see the work.
SHA-256 chain-of-custody ingestion across a 110,000+ document corpus spanning PDFs, spreadsheets, Outlook email, and SMS corpora. Context-window-aware subagent scaffolding. AI-orchestrated case analysis mapped to specific legal complaint counts. In active production use by a law firm in civil litigation defense.
A daily sweep across a firm's billing, deadlines, client silence, and anomalies that ends in one Daily Closeout Brief. Routing is a Python dict, not a prompt; an 8-check prebill scrubber and 9 anomaly detectors run with no model in the loop; every write goes through one audited path. Autonomous on operations, gated on every legal decision.
A compounding stack of workflow automations — format-agnostic invoice ingestion with direct API integration, license plate recognition for parking enforcement, governing document Q&A with hallucination guardrails, and a voice-matched correspondence assistant trained on 40,000+ personal documents — that collectively reduced operating overhead by 41%.
An append-only agent memory store grows forever, costing more to read the longer you work. A read-only sidecar folds raw observations into one evolving digest per project category — rewriting understanding in place instead of stacking notes. 137× compression on the heaviest project; flat read cost regardless of history depth.
Every serious build accumulates invisible architecture — the reasoning behind the code, not the code itself — and it disappears the moment you switch projects. A two-layer decision store with a hard boundary between what the architecture guarantees and what the AI judges: a zero-dependency SQLite core that always works, and an optional Haiku retrieval layer on top. Read-only by protocol over MCP.
The scoring engine behind BoardPath, extracted into a standalone npm package.
Turns the signals a RAG pipeline already produces into a 0–100 scorecard
where every point has a reason attached — and returns an answer /
review / abstain action, not just a number. Eight
dimensions, 412 tests, dual ESM/CJS, zero runtime dependencies. Apache-2.0.
The invisible scaffolding a skilled person adds to a prompt — named tone, missing constraints, edge cases, professional push-back — turned into four commands on one zero-model-call engine. A 20-agent gallery and 12 expert lenses underneath, and an orchestration layer that coordinates specialists into a single coherent build, resolving the conflicts no individual agent can see. Apache-2.0. A Part II case study covers the pre-launch hardening + blind eval pass.
I spent fourteen years answering questions out of three-inch binders, for boards whose decisions had legal consequences. Everything below came from that, and every part of it is enforced somewhere in code you can read.
For fourteen years I managed community associations. Thirty-four of them at the end, with two thousand homeowners and fifteen million dollars in reserves. When a board asked whether they could fine a homeowner for a fence, the answer lived in a declaration written in 1987, amended three times since, sitting in a binder nobody had read end to end.
I was the retrieval system. I was also the ranking function, and the part that decided which amendment won.
That is not a metaphor I reached for later. When I designed BoardPath's answer scoring, the question I actually asked was: if this output were challenged in a legal setting, what would need to be documented about how it was produced? I had appeared in court on behalf of client associations. I knew what an evidentiary standard looked like, so I built to one.
The cost of being wrong was never abstract to me. A bad answer sent a board into a decision they could not take back, and it was my name on the advice.
Every architecture has a rule it depends on and cannot enforce. Mine used to live in README files: never import the AI layer into the offline core. That rule survives exactly as long as nobody is in a hurry.
So in ledger, my decision-record tool, one test does nothing but import the core and assert that the AI library never loaded. Cross the boundary and the build goes red before the code reaches anyone else's machine. The directory structure stopped being a convention and became something the test enforces.
The same move shows up everywhere I work, because it is the only version of a rule I trust. The memory tool opens the database it reads from in read-only mode, so a bug in it physically cannot corrupt the thing it is compressing. The private-notes repository ignores everything by default and allows files in one at a time, so a new file is private unless I say otherwise. I would rather make the wrong thing impossible than remember not to do it.
The useful question about an AI system is not what the model can do. It is which parts of the system are allowed to vary.
In Litt, my operations agent for small law firms, the router that decides which specialist handles an incoming signal is a plain Python dictionary. No model call. It returns the same answer for the same input, forever. The language model writes the narrative that a human reads, and it never decides what happens.
The consequence is the point: an outage costs prose, never correctness. A system where the model drafts and code decides degrades into something quieter and more manual. A system where the model decides degrades into something confidently wrong.
The failure I design against is not an error. Errors announce themselves. The failure is a fluent, well-cited, confidently wrong answer, produced because the system found two documents that disagreed and quietly picked one.
So BoardPath has a path that returns nothing. When the retrieved material will not support an answer, the request never reaches the language model at all, because a model handed thin evidence will write something anyway. Document ingestion has a gate that fails a corpus with a hole in it: six of seven expected articles is 85.7% of the document, and it is rejected rather than indexed. The confidence scorecard names the dimensions it could not measure instead of averaging them into a friendlier number.
Every one of those makes the product look worse in a demo. They are the ones I would defend hardest.
Most AI quality reporting is a language model scoring a language model, with nobody checking whether the scorer is any good. That produces a number, and a number is persuasive.
Before BoardPath's evaluation numbers counted for anything, I validated the judge against public human-labelled sets and recorded its own precision and recall. An evaluation I have not validated is a more expensive guess. When a measurement and a feature both looked broken, I fixed the measurement first, because until the instrument is trustworthy every decision after it is a coin flip with extra steps.
I turned off BoardPath's deterministic safeguards and ran the question path with nothing but the system prompt holding it together. It fabricated provisions that did not exist, fluently. That experiment is why the guardrails sit in code and not in instructions, and it is why I can tell you what the prompt is worth on its own: not much.
promptsmith, my prompt-engineering plugin, ships a set of deliberately broken test cases that the suite is required to fail. I built them after nine consecutive all-pass runs, because a suite that always passes and a suite that is broken produce exactly the same output. Now if the known-bad cases pass, the judge is wrong, and I find out from the harness instead of from a user.
I built a cross-encoder reranker for BoardPath. It measured well on clean synthetic documents. On real scanned governing documents it made retrieval worse, so I switched it off and left it in the codebase, dormant, with the evidence written next to it. The work was not wasted. The claim was.
Two of the architecture notes on this site carry dated corrections at the top, because the systems they describe changed underneath them and deleting the posts would have been tidier and less honest. The confidence package I published declares which of its dimensions are not being scored rather than quietly scoring them badly.
A number I withdraw is worth more than a number I defend past its evidence. Anyone can check the ones that are left.
Short-form posts on specific architectural choices from real builds. How I think, not just what I shipped. Newest first, after the one that explains where all of it came from.
Open to full-time, contract, and fractional engagements across AI systems architecture, agentic workflow design, and document intelligence. Remote-first. Available for hybrid with reasonable travel.