← bradblake.dev

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.

  1. S1 CD Deploys come from git through one workflow. No hand deploys. 7/11
  2. S2 Health check A cheap check that proves it is doing its job, not just up. 11/13
  3. S3 Run recorder Every scheduled run and every model call is a row. 2/9
  4. S4 Alert hook Failure or staleness reaches me by email. 6/12
  5. S5 Backup Anything that can't be rebuilt from git is in the nightly backup. 7/8
  6. S6 Tested restore A restore has been run end to end, timed and written down. 2/7
  7. S7 Tests in CI Tests (and evals, where it makes decisions) gate every push. 3/9
  8. S8 Secrets The .env comes from a repo secret through the deploy, never hand-edited. 6/8
  9. S9 Own DB role The app connects as a non-superuser scoped to its own data. 3/4
  10. 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.

3,998 ok
5 error
0 timeout
0 skipped, busy
0 interrupted
7 deploys
Day Runs errortimeoutskipped, busyinterrupted Deploys
Oct 25 1,323 4000 3
Oct 26 2,680 1000 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.

3 pass
9 inconclusive
8 retire
11 too few
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.