> cat story.md
Story
In December 2025, my feed was full of trading bots doing arbitrage on fifteen-minute crypto markets. Automated trading used to belong to firms like Jane Street and Citadel. With AI, one person could try. I wanted to know if the bots were real, and if an AI could trade better than me. So I built one.
By March it had 898 paper trades, and they said it worked. On Sunday, March 8, I found out why: the simulation charged no fees and filled every order instantly. The results were fake. That evening I rebuilt the paper trader to check its fills against real trades. Two days later I shut down all eight crypto strategies.
In August, two of my agents reported 99.09% and 93.91% for the same number. One had filtered the data without saying so. On August 20 I split the data into raw files that are never edited, cleaned tables that flag every fix, and analysis tables that state their filter.
One agent builds and a different one checks. For the audit of all 53 ideas on the record, I froze the plan on October 17, before its two programs were written, and the checker never saw the builder's code. The audit adjusts for how many ideas I tested, so one lucky winner is unlikely to pass. It failed the check twice: first, mostly because the two programs had rebuilt different sets of rows; then because seven totals were each filed in two places. Under a written stopping rule, only defects a separate triage confirmed could be fixed, and the third run passed. No verdict changed between the runs.
I give this one to two hours a day, after work. When I'm at the gym, I let a fleet of agents work, behind the same gates.
The agents write most of the code. They quit early unless I'm clear about what I want. In my use, Opus 4.6, from February, felt the most truthful. Opus 4.7 and 4.8, from April to June, wrote more and gave up sooner on long research.
On February 26, an Opus 4.6 commit called "quick wins" deleted 226 lines of safety code. A 24-hour test run caught it, and that became the guard skill in my public guardrails repo. In August an agent spent about 39 minutes and 144,000 tokens re-testing an idea I had already killed, because my note didn't name the market. Kill notes now name it.
Every brief I give an agent says the same four things: finish the question, report what is true, gate anything that touches money, and have a different agent check the work.
One idea made money: a bot that bought the favorite in sports games, on the old finding that favorites win more often than their price says. It ran live from March to July and finished ahead. In August I checked it without its best month: it still came out ahead, but not by enough to rule out luck. Its markets were also too thin for bigger orders. The audit labels it not established. I'll test it again on new data, with its rules frozen first.
After correcting for luck across all 53 ideas, none has yet shown a durable edge. At the audit's snapshot, forty-four were closed, each with its cause written down, and nine were still open, the sports bot among them. One that passes the same checks is enough.
Now I'm collecting data for the next test and writing up the closed ideas one at a time.
Most of it is me and a team of AI agents. The choices and the mistakes are mine.
This site is not advice and gives no signals or trade ideas. It records what I tested and what happened.
Start with a case file. If you build with agents, the guardrails are free to use. If you're testing the same kind of thing, I'd like to compare notes: I'm @moratowers on X.
timeline
I start the repo on December 14 as a prediction-market arbitrage bot built from a Claude skill. A week later it moves to fifteen-minute crypto markets. 15 commits.
The scripts become a web service with auth, markets and bot endpoints.
Two days of hardening: ten security and correctness fixes, a paper-trading core, retries and rate limits (PR 7). 18 commits.
One day of "waves": VPIN, Monte Carlo Kelly, lifecycle tracking, an operator dashboard, alerts, CI/CD.
A "quick wins" commit strips 226 lines of safety code, and the test run halts on drift. 120 commits.
March 8: 898 paper trades turn out to be fake (no fees, instant fills). I rebuild the paper trader that evening to check its fills against real trades.
March 28: live code that does not match its backtest (a tenfold scaling slip) leads to a five-step launch rule: backtest, matching check, a day in shadow, review, smallest size.
I install a code-review graph, and "query the graph before editing" becomes a rule. 174 commits.
April 7: a backtest turns out to have used data before it was public, and I kill the strategy.
The /check skill runs only the tests a change touches. 74 commits.
Two broken upstream releases in one week break the build, and both are fenced off. Rate limiting is made spoof-resistant. 46 commits, 15 merged pull requests.
The knowledge graph becomes the agents' default way around the code. 39 commits.
July 13: I switch off the live bot. I generalize six guardrail skills from the bot's own skills.
August 20: I split the data into raw, cleaned and analysis layers, with a rule that a headline number cites its table. The first table disagrees with a number already shipped.
August 26: I publish the guardrails as a public repo.
two agents, one number
- agent A
- 99.09%
- agent B
- 93.91%
Candidate ideas get a review by a second model before any data is pulled. One agent builds, another checks.
September 22: memecoin graduation trades close with no edge.
A knowledge system: a verdict registry that renders the status page, a citation checker that fails the test suite, the whole record re-checked by a separate reviewer agent. 572 commits (380 by a second coding agent).
A research-protocol skill, a shared statistics library and a data-completeness policy, each built by one agent and reviewed by another. The dead-code merge removes 2,598 lines.
October 17: I freeze the audit's plan. October 25: the checker passes it on the third run.
the audit's checker runs
- run 1
- fail
- run 2
- fail
- run 3
- pass
- verdicts changed
- 0