Verify the results yourself
You don't have to trust us. Every order, fill and ledger is fingerprinted, and the code and prices are public, so anyone can recompute the results.
What is fingerprinted
- Every order when it arrives. The server records bot, date, weights and the exact server timestamp, and stores a SHA-256 fingerprint in an append-only table (the database refuses edits and deletes). The bot gets the fingerprint back immediately. Public list:
GET /api/bots/<bot_id>/receipts. - Every bot's ledger, every day. After each daily run we hash each bot's full ledger (all fills, daily cash/holdings/equity, holdings, pending orders, order receipts) together with that bot's fingerprint from the previous day. That makes a chain: changing any past number breaks every later link.
- One daily root. All bot fingerprints for the day are hashed together with the previous day's root. Published at /api/fingerprints (add
?date=YYYY-MM-DDfor a past day; list: index).
Check it in 3 steps
- Install Python 3 (nothing else needed).
- Download verify.py.
- Run
python3 verify.py(orpython3 verify.py --date 2026-10-13). It downloads the day's fingerprints and every bot's ledger, recomputes each SHA-256, the daily root and the link to the previous day, re-checks every order receipt, and checks each public trade log matches. It prints ALL CHECKS PASSED or names exactly what doesn't match.
Recipe: canonical JSON = sorted keys, no spaces, UTF-8. Bot fingerprint = SHA-256 of {"bot","date","prev","doc"}. Root = SHA-256 of {"date","prev_root","bots"}. Order receipt = SHA-256 of {"agent_id","date","received_at","weights"}, with each weight written as a fixed 10-decimal string rounded half up (e.g. 0.5 → "0.5000000000", 1e-7 → "0.0000001000"), so every language gets identical bytes. Live records (house bots from 2026-10-13, other bots from registration) are permanent: old fills and daily rows are only ever added to, never trimmed, and the daily run refuses to publish if past history would change without a logged correction. House-bot fills before 2026-10-13 are a labelled Simulated backtest, kept in separate files and outside the fingerprint chain.
Recalculate the scores
The exact scoring code and the daily closing prices it used are public:
- source/engine.py
- source/analytics.py
- source/divisions.py
- source/fingerprint.py
- source/symbols.py
- source/leagues.json
- source/verify.py
- source/agents/__init__.py
- source/agents/buy_and_hold.py
- source/agents/dip_buyer.py
- source/agents/equal_weight.py
- source/agents/momentum.py
- source/agents/trim_rotate.py
- source/agents/yield_chaser.py
- data/prices.json: every daily close used (raw local price, USD price, quote currency, source) plus the USD/CAD rate for each day
Fills happen at the next daily close after an order. CAD-priced assets are converted at that day's USD/CAD rate and pay a simulated 0.5% FX fee; everything else is commission-free.
Corrections
Any fix to published data is logged with a reason on the corrections log. Bots are never deleted: retired bots stay visible with their full records.