Projects
A few things I have built.
Some started with a work problem. Others started with a camera, a pillbox, or a student's question.
The projects here are the ones I return to. Each carries its evidence: a paper, a repository, or a trace. The rest of the code is on GitHub.
TraceGuard
State-based runtime verification for tool-using AI agents.
The problem: an agent saying done is not proof the world changed. Self-checks pass while the actual effect, a notification, a booking, a payment, never lands anywhere.
The solution: completion contracts. A task declares the external states that must hold if done is true. After the agent reports, TraceGuard checks the systems where the result should exist.
The impact: in the first synthetic trace, the agent and its self-check both report completion, and the contract catches the missing traveler notification. The research page carries the trace, the results specification, and the current boundary of the work.
Deterministic Offload
Replacing rule-shaped LLM calls with certified code.
The problem: agent stacks route decisions through a model that are not judgment at all, just rule application. Those calls cost tokens and latency, and they drift. Mine flagged a $251 charge as material two days after silently archiving a $1,066 one, applying a test I never wrote.
The contribution: a replay method for deciding when code can take the call. Logged decisions replay against the operator's own corrections as ground truth, with per-class error bounds and an explicit refusal when a class lacks evidence. The method is submitted upstream to TRACER, an open-source routing library, and written up as a preprint while the arXiv submission awaits endorsement.
The impact: in my stack, six written rules matched my corrections on every covered decision and the model did not. Those calls now run as code in front of the model, with the model's agreement logged as evidence.
gsuite MCP
A local-first MCP server for operating multiple Google Workspace accounts through one explicit interface.
My agents live in Google Workspace: they search and read mail, hold drafts for approval, send, schedule, write calendar events with Meet links, answer free/busy across every visible calendar, update exact sheet ranges, and file documents in Drive. Chat, Docs, and Contacts round it out.
The design rule that matters: every call names its account. Work and personal are separate aliases with separate OAuth clients, so an agent cannot act in the wrong mailbox by accident. Deletes go to recoverable Trash. This is the workhorse under the daily agent operations on the home page.
Google Flights Policy Recommender
An MCP server for corporate-travel-policy-aware flight search.
It searches Google Flights, checks each option against the company's travel policy, and labels it in-policy or out. Results rank by traveler preferences such as nonstop travel, airline alliance, price, duration, and red-eye avoidance.
The value is where the policy check happens. Compliance usually shows up after the trip, at expense review. Here it sits inside the search, so a traveler, or an agent booking on their behalf, starts from choices that already fit the rules.
The hosted version returns ranked choices and sends the traveler to Google Flights. A browser-driven version stops at the payment step. It does not buy a ticket.
PillWatch
A student research program I design and run for four high schoolers, with faculty mentorship from the JHU EEHPC Lab. A Raspberry Pi 5 camera reads a 21-cell pill organizer on device. A 99 percent per-cell classifier reads the whole box right only 81 percent of the time, so the work is whole-box reliability.
The data collection is the team's own pipeline. A browser app on the Pi captures rig photos with live preview; the Pi pushes photos and labels to the data repository hourly, and people and training jobs pull. Captures follow a condition checklist, and rare conditions get targeted sessions instead of waiting for them: 159 photographs so far, 50 fully labeled, 1,029 labeled cells.
A raw rig capture, as pushed to the data repository. Shot on the Pi's IMX708 camera.
The impact of the data: the hard tail is where models separate. On deliberately camouflaged pills, a transfer-learned YOLO holds 87.5 percent while the classic baseline falls below 40; a reference-conditioned CNN leads overall at macro-F1 0.81 with 80k parameters. Splits are by photograph, never by cell, so reported numbers stay honest. The set is being prepared for public release with a datasheet and DOI.
Read the essay Read the data essay See the code See the data pipeline
Network, cameras, and automation
My home network and cameras are useful because they fail in ordinary ways. I use them to understand what happens when several products, protocols, and failure modes meet.