I'm a data scientist in Chapel Hill, North Carolina. Right now I build MCP servers and other agent-accessible interfaces for insurance-linked securities data at Ledger Investing, where I make the case internally that agent-accessible interfaces are becoming table stakes. Before that I was the technical lead on a user analytics platform for Kessel Run, a software factory inside the US Air Force, deployed to classified networks.

The thing I keep coming back to is the setup tax — the distance between a person and a tool they ought to be able to reach. In 2019 that meant a PyData talk on putting Jupyter notebooks into Docker containers. More recently it meant putting an MCP server in front of Bermuda, our open-source actuarial library, so that attendees at a conference demo could use it live even though their IT controls wouldn't let them install it. It's the same problem each time: the work is ready before the environment is.

A reinsurance loss triangle, drawn in a terminal

A terminal-rendered scatter plot of paid age-to-age factors by development lag, shown inside a Claude Code selection drawer

This is a Claude Code plugin that repurposes the user-input drawer as a live preview surface. Arrowing through the options list re-renders the same reinsurance loss triangle four ways — paid loss heatmap, data completeness, paid age-to-age factors, and a paid-versus-reported scatter — all drawn with glyphs, because it's a terminal. When there are more periods than columns to draw them in, it says so rather than quietly dropping the ones that don't fit.

Elsewhere: GitHub, LinkedIn, résumé, a longer work history, and some older writing from a stretch in 2017 when I was posting analyses regularly.