Case studies
The long version
I spent fifteen years building things for other people. Banks, defense, automotive retail, healthcare, state records. Some of it was first of its kind, some of it won awards, and one of it was acquired.
Almost none of it can be shown to you.
You can confirm a bank shipped a single-page application in 2014. You cannot read the code, see what I argued for and lost, or watch what happened the week before it went live. That is the trade every senior engineer makes: the more the environment mattered, the less of the work can ever leave it.
I had wanted to write open source that entire time and never found anything reasonable enough to build. Not a shortage of ideas — a shortage of problems I actually had, repeatedly, and understood well enough to solve properly. Libraries written for problems you have merely read about come out looking right and being useless.
Then I went and learned the machine-learning side properly, started building my own models, and discovered that most of the job isn’t modeling.
It is data. Arriving from scraped pages and from APIs, in every format there is, none of them agreeing. Pieces of the same record living in different sources under different names, needing to be merged, labeled, and passed up through the pipeline in a form the next stage can trust. Every value point-in-time accurate — as it faithfully stood then, not as it reads now. The opposite side derived when only one side exists. A growing case space deciding whether a datum is usable at all.
So many pieces have to pass through that chain, and each must be correct at all times, because one mistake anywhere degrades the model.
And nothing tells you. That’s the part that reorganized how I build. If a future value leaks backward into training, the model doesn’t get worse — it gets better. Accuracy climbs. The backtest improves. Every number moves the way you were hoping. Nothing fails, nothing alerts, and everything built on top of that measurement is resting on nothing.
That was the problem I had been waiting for, and everything since has been the same problem at a different layer.
The tools came out of that. Every one of them is a thing I needed twice in a week and got tired of doing by hand — checking whether a page could be scraped before writing the scraper, pulling values out of formats that had no interest in cooperating, finding the key missing from one environment file before a deploy went out. I published them because they were already written, and they found an audience I did not have and never asked for. Sixteen models now cover six sports year-round as their seasons rotate, retrained weekly at minimum in season, behind the same discipline: if a stage cannot say whether it worked, it does not ship.
Then I hit the version of it that scared me. A prediction record is worthless if the person who published it can edit it afterward, and I could not prove I had not. Not because I would lie — because a schema migration does not feel like lying, and from the outside the two are identical. So I built a ledger that commits each day into Bitcoin and into a public transparency log, neither of which I can reach.
Six weeks in, a schema migration rewrote an anchor that was already published. I broke my own append-only rule, and that day’s Bitcoin proof can never be made to bind again. The record says so, permanently, because a rule that bends when it’s inconvenient for its author isn’t a rule.
The worse finding was underneath it. The verifier’s offline mode had never checked the binding it laid its output out as though it were checking. The one piece of software whose entire job was to catch me was reporting a pass on a test it was not running. That is what the rebuild is designed around — not the broken rule, but the tool that failed to notice.
The tools are becoming Rust command-line binaries now, for the reason everything else here happened: a pipeline cannot click a menu, and the consumer that matters next isn’t a person.
I have never written about any of this publicly. That was deliberate — I wanted the work standing on its own before I said anything about it. This is the long version.
- Less magic, more factory Sixteen tools that came out of a data pipeline I could not take on trust, grown with no launch and no marketing. A year of building them with a model, the rewrite that threw the first version away, and the honest accounting of what the Rust port costs me.
- Built to refuse Managed tools hand you a high number on a leaked dataset and call it a result. Model Zero is the answer to that: a data tool designed around refusing to guess, and the honest accounting of which half of it is built.
- When the bug improves your score The characteristic failure in machine learning makes your metrics better, so a good number proves nothing. Two times I was fooled, and the apparatus built so a desk does not have to take my word for any of it.
- The public audit trail A prediction record nobody has to trust, including me. Two independent roots, a verifier that needs nothing from me, and the three disclosures the alpha cost.