Systems engineer building local-first AI agents — with a field-services / geospatial background. I design harnesses that make small, swappable models do large, verifiable work: the intelligence lives in the system around the model, not in any one model's weights. Before software, a heavy background running Trimble line-of-sight positioning systems in the field — where a wrong answer costs a dug-up site, so verification isn't a nice-to-have.
Available for contract work in document extraction pipelines, AI/agent systems, developer tooling, backend infrastructure, and software that touches surveying / field-services / geospatial.
Agent harnesses over model fine-tuning. My main system runs local models through a persistent, content-addressed memory and a retrieval layer (living RAG) instead of training — so the same harness keeps working when the model underneath is swapped. The capability accumulates in tools and records, which means it is inspectable and portable rather than frozen in a checkpoint.
Verification-first execution. ratchet is the shape: a workload is reduced to an objective contract — a metric command, a propose command, a rollback command — and a change is kept only when the metric verifiably improved. A small model drives real multi-step work and never gets a vote on whether it worked; the measurement decides what lands.
Documents that resist being read. PDFs, drawings and scanned forms, extracted into structured rows that can be audited. The parsing is the easy half; the hard half is refusing to emit a row that cannot be traced back to a spot on the page -- a wrong value that looks right is the failure mode that costs a customer money, and it is invisible until someone acts on it.
Browser and desktop automation. handle drives a real, logged-in Chrome over CDP with nine one-word verbs; a sibling driver does the Windows desktop over UIA. The model sees the page as numbered elements rather than composing selectors, which is what makes a 7B-class model able to run an authenticated workflow a headless scraper cannot reach.
Start here: deedpipe runs in one command and shows the thing I actually care about — a pipeline that refuses to post what it cannot stand behind, scored three ways. pdftext is the shortest read: one dependency-free header with a from-scratch DEFLATE decoder in it. focus-three runs in your browser right now, nothing to install. For how I think about verification, ratchet is the shortest statement of it.
| Project | What it is | Proof you can run |
|---|---|---|
| deedpipe | Recorded-document extraction — deeds, mortgages, releases — into a typed schema, with an exception queue that names the field that failed and why. Three numbers instead of one accuracy figure: automation rate, posted precision, and posted completeness, because automation alone can be driven to 100% by posting rows with null grantors. | python tools/score.py --sweep prints the whole trade-off curve. 67% automation at 100% posted precision and completeness against ground truth the generator wrote, not the parser. CI fails the build on a single wrongly posted value. |
| firstarticle | The desktop tool the extraction work came out of: a drawing's PDF text layer into an AS9102 first-article inspection form, in a single 440 KB Windows executable with no installer and no network calls. | Ships with its own accuracy report and a written log of every defect found — including two where my own test harness was wrong before the code was. 92/92 dimensional characteristics, 24/24 GD&T frames, scored against committed ground truth. |
| pdftext | PDF text extraction in a single C++ header, zero dependencies: a from-scratch DEFLATE decoder, chained /ASCII85Decode filters, subset fonts decoded through /ToUnicode CMaps, per-page attribution, and CTM tracking so rotated callouts land on the sheet. Written because the deployment was an offline machine where "copy one file" had to mean one file. |
make test — 132 checks over 8 fixtures, each named for the PDF construct it proves. The corpus generator writes its own expected output, so the parser never grades itself; CI regenerates it and fails on a diff. -Werror on g++/clang/MSVC, ASan+UBSan, and 312 mutated files that must not crash. |
| gapsmith | Resolve a whole class of porting gaps from rules that carry their own proof. A missing symbol doesn't get a bespoke script here — its shape is described as a rule, and the rule ships with a machine-checkable proof that applying it is safe. Case study: a small model driving a real porting effort ~1100 undefined symbols deep, every change ground-truthed by a compile+link. | python examples/demo.py resolves a constant proved by tileset byte-identity — then corrupt that asset, re-run, and watch the engine refuse. 13 tests, CI green, zero runtime deps. |
| ratchet | Automation that cannot grade its own work. The propose → measure → commit-or-rollback loop that pairs with gapsmith: a workload becomes four commands in a JSON contract, and the measurement — never the proposer — decides what is kept. Works the same on a script, an agent, or a local model. | The demo plants a deliberately sabotaged move and you watch the loop roll it back. 8 tests, CI green, zero runtime deps. |
| handle | A logged-in Chrome, nine verbs. A CDP driver for sites you did not write, driven by a model that can't be trusted to compose a CSS selector: elements are addressed by the number a prior links() printed. Sees into shadow roots and types with trusted events — both lessons paid for on a live signup form that defeated the textbook approach. |
10 tests that run without a browser (stub CDP), so CI stays hermetic; examples/demo.py drives a real one. |
| focus-three | Three tasks, one timer, nothing else. A native Windows app in 153 KB — one translation unit, no framework, no installer, no runtime, zero network calls, every control custom-painted so it follows the system light/dark theme including the title bar. The product-polish counterpoint to the systems work. | Download and run it — nothing to install. Or try the browser demo first. |
Writing: What PDFs actually do to you
— the defect log from the extractors above. Every entry produced a clean build, a successful
run, and a wrong answer: subset fonts that emit glyph indices rather than characters, a
tolerance that lost its ± and still looked like a number, a legal description truncated at
a line wrap into a description of a different property — and three cases where my own
measurement was wrong before the code was.
Python · C++17 · TypeScript/Node · local LLMs (Ollama, llama.cpp) · SQLite (FTS) · CDP/UIA automation · Windows-first, cross-platform aware
Every claim in these repos ships with the command that would fail if it were wrong — a test, a demo that refuses when you break its premise, a measured number rather than an assertion. That is the habit the field-services work taught: a result with no check beside it is an anecdote.
📧 datumstake@gmail.com · open to contract and consulting engagements · what-pdfs-do-to-you · repos: deedpipe · firstarticle · pdftext · gapsmith · ratchet · handle · focus-three