Factory.
one box · 4,003 runs recorded since Oct 25 · 984 detection cycles
The rack behind this site runs a paper-trading research harness, a few data pipelines and a local model. It is run like production: a written standard, a scorecard against it, deploys gated on CI, and a recorder on every job. The gaps are on this page on purpose.
The standard
A workload counts as production only when it meets every item that applies. Right now the 13 production workloads meet 60 of 94 applicable items.
- S1 CD Deploys come from git through one workflow. No hand deploys. 7/11
- S2 Health check A cheap check that proves it is doing its job, not just up. 11/13
- S3 Run recorder Every scheduled run and every model call is a row. 2/9
- S4 Alert hook Failure or staleness reaches me by email. 6/12
- S5 Backup Anything that can't be rebuilt from git is in the nightly backup. 7/8
- S6 Tested restore A restore has been run end to end, timed and written down. 2/7
- S7 Tests in CI Tests (and evals, where it makes decisions) gate every push. 3/9
- S8 Secrets The .env comes from a repo secret through the deploy, never hand-edited. 6/8
- S9 Own DB role The app connects as a non-superuser scoped to its own data. 3/4
- S10 Documented Listed in the system doc with repo, ports, data and owner. 13/13
met partly not yet · scorecard as of Oct 25, not-applicable cells left out
Runs, last 7 days
Every scheduled job writes a row when it finishes: how it ended, how long it took, what it wrote. A push deploys only after CI passes on that exact commit. A deploy stops the harness gracefully: no new jobs start, running ones get 30 seconds to finish, and anything still running is recorded as interrupted, only if it saw the stop signal. A real failure during a deploy still counts as an error.
| Day | Runs | error | timeout | skipped, busy | interrupted | Deploys |
|---|---|---|---|---|---|---|
| Oct 25 | 1,323 | 4 | 0 | 0 | 0 | 3 |
| Oct 26 | 2,680 | 1 | 0 | 0 | 0 | 4 |
Recording started Oct 25, so the window fills in day by day.
Restore
Two smaller databases have been restored from backup and checked row for row. The big one, the harness's 25 GB time-series database, is next: timed end to end, from reading the dump to row counts matching. That number goes here.
Read-only MCP server
Claude reads the box through its own MCP server: the run recorder, alerts, backups, the scorecard. It has no action tools and a database role that can only SELECT, so anything that changes the box still goes through a pull request.
Trading research, paper only
Every setup is pre-registered, logged when it fires, and graded on what actually happened. 36,622 graded signals so far (2026-07-12 → 2026-10-25). A setup passes only when its expectancy's confidence interval clears zero, and most don't.
| Setup | Graded | Win | Expectancy (R) | 95% CI | Verdict |
|---|---|---|---|---|---|
| lend_divergence_persist | 528 | 98% | +0.95 | +0.93 … +0.98 | pass |
| px_convex_break_8r | 42 | 21% | +0.95 | −0.44 … +2.34 | inconclusive |
| lend_stable_swap_persist | 310 | 90% | +0.80 | +0.73 … +0.87 | pass |
| funding_spread_persist | 7,262 | 70% | +0.40 | +0.38 … +0.43 | pass |
| pred_gap_buy_rich_no | 984 | 54% | +0.13 | −0.27 … +0.54 | inconclusive |
| lend_carry_persist | 299 | 55% | +0.09 | −0.02 … +0.20 | inconclusive |
| book_ev_single | 883 | 41% | +0.04 | −0.05 … +0.13 | inconclusive |
| perp_bias_follow | 954 | 40% | +0.02 | −0.04 … +0.08 | inconclusive |
| pm_follow | 21,584 | 59% | 0.00 | −0.02 … +0.02 | inconclusive |
| sharp_follow | 541 | 41% | −0.11 | −0.20 … −0.02 | retire |
| proven_consensus | 438 | 45% | −0.11 | −0.21 … −0.02 | retire |
| px_donchian55 | 30 | 33% | −0.20 | −0.59 … +0.20 | inconclusive |
| pred_gap_buy_cheap_yes | 984 | 46% | −0.21 | −0.28 … −0.15 | retire |
| stk_zone_pullback_loose | 47 | 26% | −0.26 | −0.69 … +0.16 | inconclusive |
| px_vol_surge_break | 33 | 33% | −0.29 | −0.65 … +0.07 | inconclusive |
| stk_convex_knife_8r | 773 | 9% | −0.30 | −0.49 … −0.12 | retire |
| stk_donchian55 | 151 | 7% | −0.84 | −0.91 … −0.76 | retire |
| stk_convex_knife_12r_wide | 481 | 0% | −1.05 | −1.06 … −1.04 | retire |
| stk_donchian55_slow | 153 | 0% | −1.08 | −1.11 … −1.05 | retire |
| fut_convex_knife_8r | 30 | 0% | −1.22 | −1.44 … −1.01 | retire |
11 more setups have fewer than 30 graded signals and are not shown. R is the result in units of the amount risked.
The prediction-market lane is miscalibrated: a Brier score of 0.145 over 1,968 forecasts (a coin flip scores 0.25), but the probabilities don't match how often things happened.
The local model wrote 624 memos and classifications this week, averaging 5.3 s each. 12 came back unparseable (1.9%) and were recorded as failures, not retried into a pass.
Updated daily from the box. Last export Oct 26, 16:44 UTC.