AI Systems Architect

EricTetzlaff

Agentic Workflow Designer · Document Intelligence Engineer · Forensic AI Systems

I build production-grade AI systems that solve problems that actually matter — under real operational and legal pressure, for real clients.

What I've built.

Not proofs of concept. Not demos. Production systems and open-source tooling running under real operational and legal pressure.

01 Limited Demo Live · Full Demo Sept 2026
BoardPath
Governance Document Intelligence Platform

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.

Read the case study →
View full diagram
INGESTION QUALITY GATE THE EXTRACTOR mistral-ocr-latest scanned CC&Rs, bylaws scoreExtractedText 0.6 or manual review THE CORPUS Supabase pgvector embedded + indexed Q&A PIPELINE THE SEARCH text-embedding-3-small semantic + keyword, blended THE ANSWER gpt-5.6-luna scored by Transparent Confidence THE AUTHORITY ORDER statute › declaration › bylaws › rules › other amends_document_id an amendment inherits the rank of the document it amends THE BOARDROOM Q&A · topic briefs · correspondence · Chronicle AUTOMATION EMAIL IN Postmark EMAIL OUT Resend DOCUMENTS DOCX export PAPER MAIL PostGrid INGESTION → RETRIEVAL → ANSWER → OUTPUT → CHANNELS
02 In Production
Auris Intelligence
Forensic Legal Document Intelligence Platform

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.

Read the case study →
SOURCES CUSTODY PDF · DOCX XLSX · CSV Outlook MSG iOS SMS via iMazing THE MANIFEST SHA-256 chain of custody across a 110,000+ document corpus ANALYSIS THE FILTER keyword first, then zones a full read only on signal THE WORKERS disposable subagents findings go to one coordinator THE PERMISSION TABLE per-agent allow and deny lists hardcoded in the scaffold, enforced in code not prompt
03 Completed Build · June 2026
Litt
Autonomous AI Operations Agent for Small Law Firms

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.

Read the case study →
EMAIL FIRM STATE THE ROUTER coordinator.py 8 signals, 4 agents 3 parallel, 30s cap BILLING 8 checks DEADLINE cadence ANOMALY 9 detectors gemini-2.5-pro drafts prose · never gates ONE WRITE PATH idempotent · optimistic lock · append-only audit DAILY CLOSEOUT BRIEF every matter needing attorney attention HARD_LEGAL · HARD_CONTRACTUAL · SOFT_INTERNAL · ADMINISTRATIVE FOUR GATES · EVERY ACTION DECLARES ONE auto-safe review escalation blocked
04 Deployed 2022–2025
P2P Automation Stack
AI-Powered Operations Workflow System

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%.

Read the case study →
FOUR INDEPENDENT SYSTEMS · ONE OUTCOME INVOICE INGESTION straight into the CINC API PDF, image, DOCX, CSV, XLS PLATE VISION batch inspector photos make · model · color · plate GOVERNING-DOC Q&A per-client siloed corpora not in the corpus, no answer CORRESPONDENCE voice-matched drafting trained on 40,000+ documents 41% LESS OPERATING OVERHEAD 7-person team · 34 associations · 2,000+ homeowners
05 Working Prototype
Persisted Memory
Agent Memory Consolidation Sidecar

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.

Read the case study →
SOURCE · APPEND-ONLY THE OBSERVATION LOG claude-mem.db opened readonly · this tool can never write to it EACH RUN THE FOLD digest(n) = merge(digest(n−1), new observations) only observations past the watermark are folded in nothing new · the run is a no-op RESULT ONE DIGEST PER PROJECT digests.db 8 category cells · bounded however deep the history litt · 1,640 obs → 4,288 tokens · 137× digest(n−1) a completed experiment · 37.7× across all 7 · char/4 estimates
06 v0.1.0 · Open Source
ledger
Local-First Architectural Decision Record

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.

Read the case study →
READ SURFACE · MCP THE MCP SERVER read-only by protocol · writes stay CLI-only WORKS WITH NO AI NEEDS THE [ai] EXTRA ledger_list · ledger_show ledger_recall · ledger_resume LAYER 2 · OPTIONAL AI EXTRA INTELLIGENT RECALL keyword rank → hydrate top 10 → one Haiku call turned on by the [ai] extra · one model call per query without it, recall says why and stops · Layer 1 unaffected LAYER 1 · ALWAYS PRESENT THE DETERMINISTIC CORE capture · list · show · supersede SQLite from the Python stdlib · zero deps, no network, no key one test asserts the core never imports anthropic
07 Published · npm
transparent-confidence
Open-Source Confidence Scoring for RAG

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.

Read the case study →
8 DIMENSIONS IN · ONE SCORE · ONE ACTION ALWAYS ON · 3 grounding retrieval confidence evidence consistency OPT-IN · 5 relevance authority corpus freshness index integrity THE SCORER zero runtime dependencies no model call, no network arithmetic on your own signals ONE 0–100 SCORE weights renormalise so the scale stays comparable THE ACTION POLICY 10 rules cascade · the first one to fire is returned in words ANSWER REVIEW ABSTAIN
08 Open Source · Plugin
promptsmith
Prompt & Context Engineering for Agents

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.

Read the case study →
LAYER 1 · NO MODEL CALL, NO DEPENDENCIES THE METHOD /sharpen · /lens · /forge-agent 12 expert lenses · pure method the host agent does the reasoning PASTE ANYWHERE a sharpened prompt or a new agent LAYER 2 · ORCHESTRATE NEEDS A SUBAGENT HOST DECOMPOSE /orchestrate splits one job THE GALLERY 20 agents one slice each SYNTHESIS owns the seams no agent can see ONE COHERENT BUILD spec · schema · api · ui · tests · docs THE EVAL GATE 6 fixtures the suite must always FAIL nine straight all-PASS runs look like a broken judge grade is a mode of lens, not a fifth command

How I build.

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.

01Where this came from
Provenance
I was the system before I built the system.

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.

02What that forces
Enforcement
A comment is a suggestion. A test is a constraint.

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 split
If the output has to be identical every time, it is not the model’s job.

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.

Refusal
The most important path is the one where the system declines.

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.

03How I stay honest
Measurement
I grade the grader before I trust the grade.

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.

Adversarial testing
I break my own systems on purpose, and I keep the tests that must fail.

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.

Corrections
I publish what I got wrong, with the date on it.

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.

I am not betting on being right about where this technology goes. I am betting that systems which show their work, refuse when they should, and survive their author being wrong will still be worth running when the current tools are old.

Design decisions, written down.

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.

04 May 2026
I spent 14 years solving a document intelligence problem. I just didn't have the right tools yet.
What three-inch binders, unresolvable board disputes, and a rough NotebookLM beta taught me about information hierarchy — and why they became the foundation of everything I build today.
Start here · BoardPath
15 Aug 2026
The memory loop that does not grow
Read everything and each session costs more than the last. Read the newest few and old decisions silently disappear. The four-stage loop my Claude Code sessions run on: resolve, recall, work, fold — where the log grows forever and the understanding stays flat.
claude-vault · Agent Memory
14 Jul 2026
Prompts are the last resort, not the architecture
We turned off BoardPath's deterministic safeguards and ran the Q&A path naked — just the system prompt. It confidently fabricated provisions that did not exist. A prompt is a request, not a constraint. Here are the four places a guardrail can live, and why the ordering is a consequence, not a preference.
BoardPath · Guardrail Architecture
13 Jul 2026
How do you know your AI is right?
Most teams ship retrieval AI on vibes and a demo that worked once. An evaluation harness that measures whether production RAG is actually trustworthy — retrieval, faithfulness, abstention, and the metric almost everyone skips: whether you can trust your own evaluator.
BoardPath · Evaluation
12 Jun 2026
The test that proves the architecture
A design boundary is easy to describe and easy to violate. ledger's two layers stay separate because a single test imports the core and asserts the AI SDK never loaded. A comment saying "never import AI here" can be ignored. A failing test cannot.
ledger · Layer Design
11 Jun 2026
The confidence layer didn't belong to BoardPath
The part of the product I was proudest of turned out not to be governance logic at all. It was a domain-agnostic scorer I kept copy-pasting into other projects. Here's why I pulled it out, published it zero-dependency, and what extraction forced me to admit.
transparent-confidence · Library Design
10 Jun 2026
The memory that folds into itself
An append-only agent memory store grows forever — costing more to read the longer you work, while silently dropping the decisions that matter most. A fold that rewrites understanding in place instead of stacking notes. 137× compression on the deepest project, 37.7× across seven.
Claude Code · Agent Memory
09 Jun 2026
The Deterministic/Probabilistic Boundary
The agent extracts the deadline. Code activates it. The agent drafts the narrative. Code validates the billing entry. When an AI system touches real money and legal obligations, separating probabilistic reasoning from deterministic enforcement isn't a constraint — it's what makes the system auditable and safe to run in production.
Agent Architecture · Litt
08 May 2026
The amendment problem no attorney wants to solve for $400
A CC&Rs plus three amendments isn't a corpus. It's a dispute waiting to happen. Here's how BoardPath builds a single current-state view from the whole chain — and where the line is between AI inference and architectural guarantee.
BoardPath · Amendment Architecture
07 May 2026
How I stress-tested a production AI system before anyone else could
A formal hardening gate with ten behavioral categories, explicit disqualifying conditions, and five code patches — because the failure modes that matter in a governance context are confident, plausible, and cited.
BoardPath · QA Architecture
06 May 2026
The Proxy Holder Problem
49 questions. All correct. Then a proxy holder question with four conflicting documents sent the model sideways — and the harder I made the prompt, the more confidently it got the hierarchy backwards. Here's the deterministic fix.
BoardPath · Guardrail Design
05 May 2026
The Roof That Wasn't a Repair
A board argued for weeks about whether a leak was a repair or a replacement. A unit owner hired his own contractor. That chain of events ended in court. The answer was in the documents on day one.
BoardPath · Document Hierarchy
03 May 2026
Three-stage OCR or bust: why single-model document extraction fails at scale
A governing document scanned in 1987 on a photocopier that's seen better days is still a legally binding source. Your OCR pipeline has to handle it. Mine does.
BoardPath · OCR Architecture
02 May 2026
Context window economics: keeping 110,000 documents out of my coordinator's context
Feeding everything to the coordinator isn't a retrieval strategy. It's expensive, slow, and produces worse answers. Here's the subagent scaffold design that fixed it.
Auris · Subagent Architecture
01 May 2026
Why I built a confidence scoring layer — and what it taught me about AI transparency
The question wasn't whether the answer was right. The question was whether a skeptical board member in their 70s would trust it enough to act on it. That's a different design problem.
BoardPath · Confidence Design

Let's talk about
what you're building.

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.

Cleveland, OH  ·  Remote-first  ·  Available now