Public eval methodology¶
"Does an agent actually work on Crank" should be an answerable, checkable
question -- not a claim. This page documents how we measure it: a reference
agent, run in paper mode, over a fixed window, against point-in-time
market data, with a full cost model and a strategy-consistency score
alongside the raw outcome. The harness is a script in the repo
(scripts/eval/run_reference_eval.py); anyone can run it and get the same
numbers.
Measured outcomes, not promises
Every number on this page is a measured outcome over one fixed eval window, on one reference strategy, in paper mode. It is not a return, a profit projection, or an expectation of future performance (see Fee schedule and the platform's language rules). Simulated behaviour over a single historical window does not indicate what any agent will do going forward.
What "reference agent" means here¶
The harness runs a minimal, fully-specified implementation of the same loop
shape the Crank portfolio loop skill
teaches for portfolio_loop: observe -> assess -> plan -> simulate ->
execute -> verify -> journal. For this eval it is an SMA-crossover long/flat
strategy on a single asset -- deliberately simple, so every step in the report
is auditable by hand. It is not a "best" strategy; it is a reference
implementation that exercises the full loop and the full cost model.
Eval discipline (why the harness is built this way)¶
Three findings from 2025-26 live-trading-agent eval literature (LiveTradeBench, PortBench, CLQT) shaped the harness:
- Point-in-time data only -- no look-ahead. At step
ithe agent only ever sees OHLCV bars[0..i]. The eval loop inrun_reference_eval.run_reference_evalis structured so a later bar is never indexed before its own step -- there is no code path that can leak a future price into a decision. - Strategy-consistency scoring alongside outcome. A good-looking outcome
that came from the agent ignoring its own stated plan is not evidence the
loop works. Every step records both the planned intent (from
assess/plan) and the executed action (after any guardrail veto -- the
reference run uses a position-flip cooldown guardrail), and
strategies.backtest.score_strategy_consistencyreports the match rate. A mismatch is not a failure of the harness; it is the guardrail working and the harness being honest about it. - Full cost modeling. Every paper fill is charged the real cost stack an
agent would pay live: the platform's technology service fee (never
"trading commission" -- see Fee schedule), a slippage haircut,
and a Solana priority-fee estimate.
strategies.backtest.compute_trade_costcomputes this per fill; nothing here nets fees out of the reported outcome.
Running it¶
# Reproducible, offline, no API key -- runs against the bundled frozen fixture.
python3 scripts/eval/run_reference_eval.py
# Replay against a freshly recorded pull instead of the frozen fixture
# (needs Django settings configured + BIRDEYE_API_KEY).
python3 scripts/eval/run_reference_eval.py --data-source live \
--window-start 2026-06-01T00:00:00Z --window-end 2026-06-06T00:00:00Z
# Write the full JSON report (per-step planned/executed log, trade-by-trade
# cost breakdown, equity curve) alongside the printed summary.
python3 scripts/eval/run_reference_eval.py --out /tmp/eval_report.json
The default (fixture) mode is the reproducibility guarantee: same inputs, same
seeded reference data, same deterministic strategy -> byte-identical output
every run, on any machine, with no network access. --live-fees swaps the
hand-built LOCKED fee-schedule snapshot for a live read of the admin-updatable
FeeShareConfig row, for checking the harness against current governance
parameters rather than the schedule at time of writing.
Reference run (fixed window)¶
Window: SOL/USDC, 1h bars, 2026-06-01T00:00Z .. 2026-06-06T00:00Z (120
bars), reference SMA(8)/SMA(24) crossover, $10,000 starting paper capital,
4-bar flip cooldown guardrail, scripts/eval/run_reference_eval.py default
(fixture) mode:
| Metric | Measured value |
|---|---|
| Bars evaluated | 120 |
| Trades executed | 4 |
| Starting capital | $10,000.00 |
| Ending equity | $9,728.2524 |
| Measured outcome over eval window | -$271.7476 (-2.7175%) |
| Total cost paid (fee + slippage + priority) | $354.8881 |
| Strategy-consistency score | 1.0 (120/120 steps, 0 mismatches) |
This is one run, on one fixed window, on one simple reference strategy. It is
published so the harness itself -- point-in-time discipline, cost accounting,
consistency scoring -- is checkable, not as a claim about what any live agent
will earn. Re-run the command above to reproduce these exact numbers, or point
--data-source live at a different window to measure a different one.
Recall Network competition assessment¶
Recall Network runs verifiable paper-trading arenas with a public leaderboard -- infrastructure that overlaps with, rather than competes against, this eval harness (per the harness spec's MB#18289 research: complementary, not competitive). This section is a recommendation for Andrew, not an entry -- entering any Crank-branded agent on an external platform is a public representation of the brand and stays a deliberate, Andrew-gated decision, not an auto-entry from this harness.
Recommendation: go, at low priority, once the reference harness above has a second (non-toy) reference strategy.
Reasoning:
- Complementary, not competitive. Recall's leaderboard is a third-party verifiable venue; it does not replace this page's self-published, reproducible-from-a-script methodology. Entering does not require retiring or changing anything documented above.
- Low direct cost. The reference agent + cost model already built for
this ticket (
strategies.backtest,scripts/eval/run_reference_eval.py) is most of the integration surface -- the incremental work is an adapter from Recall's competition API/format to the existing paper-mode loop, not a new agent. - Effort estimate: small-to-medium (1-2 dev-days). Scope: (1) read
Recall's competition entry API/rules, (2) adapt the reference loop's
execute step to Recall's paper-trading submission format, (3) decide which
reference strategy to enter (the SMA-crossover reference above is
intentionally minimal -- entering it as-is risks reading as "this is
Crank's best effort" rather than "this is the harness's audit fixture";
recommend at least one composite/regime-aware strategy from
backend/strategies/composite.pyas the entrant instead). - Decision points for Andrew before entry:
- Which strategy represents Crank publicly on the leaderboard (not the bare SMA-crossover reference -- see above).
- Whether Recall's leaderboard copy/branding constraints are compatible with language rules 5-8 (no "returns"/performance-promise framing) -- needs a one-time review of Recall's public profile/bio fields before entry, since that copy is Recall's UI, not ours.
- Timing relative to this harness's own roadmap -- entering before a second reference strategy exists risks the SMA-crossover audit fixture becoming the public face of "Crank on Recall" by default.
No entry has been made. This is a documented go/no-go for Andrew to action, not a completed integration.