15,370 decisions · 93 days · 165/day
TRADE LAB
DATA UNTRUSTED · 79/100
2026-10-11 23:50 UTC
DATA TRUST UNTRUSTED (79/100) — 3 check(s) not passing · last run 2026-10-11 23:46 UTC (4min ago) · data_trust.py, every 15 min, alerts to OPS on change · this page regenerates every 15 min (was every 6h until 260807)
checkresultif failing
✅ join_integrityall returned price keys match the requested keys
✅ price_coverageall chains priceable
✅ unresolved_rate2% unresolved over 48h
🟡 ledger_arithmetic0 pnl mismatches, 8 rows exit before entryassert exit_ts>=entry_ts and pnl==notional*ret at WRITE time (#431)
✅ freshnessjournal 3.5h old
❌ control_armonly 2 control trades in 7dwithout a live control the scoreboard cannot be validated
🟡 dead_fields1 previously-flagged field(s) still null/empty (already baselined, awaiting triage)
✅ metric_livenessregistered KPI changes and provenance are live
Expectancy / trade
-5.9%
n=15,370 full-size
Win rate
19.3%
median -10.9%
Payoff vs needed
3.05
need 4.17 to break even
Tail rate ≥+100%
3.6%
control 5.6%
Net P&L
-$141,038
on $1,488,206 notional
Void rows excluded
7,224
feed-outage artifacts
Central issue: trades held <1h are 51% of the book and 101% of all losses (-$141,908). Everything held ≥2h is roughly flat-to-positive.
⚠ Do NOT speed up the exit cron yet: the DEAD rule counts cycles, not time — fails>=6 is 30 min of tolerance at 5-min cadence but only 6 min at 1-min cadence. Raising it before #181 makes the −100% false-death bug 5× more trigger-happy. Queue #432.
WINDOW
Funnel · seen vs taken
What the system saw, and what it chose
Outcome mix
What happened to what we took
Grey UNRESOLVED = no outcome at all. It is shown, never dropped — a hidden slice here is what made a 57%-unmeasured book look confident for two weeks.
Allocation
Share of capital deployed, by trade type
Where the money went. Compare against the chart on the right — a type taking a big slice here and a small one there is overfunded.
Earning its slot?
Share of capital vs share of profit
My addition, and the chart I'd watch daily. Teal = share of P&L, grey = share of capital. Teal shorter than grey means that type consumes more budget than it returns. This is the allocation question a pie cannot answer.
P&L composition
Where the money actually moved
Slice size = |P&L|, colour = direction (teal profit / red loss). Slices therefore sum to gross money moved — the net is in the centre, because those are different numbers and conflating them is the one way this chart can mislead.
Volume vs result
Capital deployed → what came back
Same slices, sized by capital deployed instead, coloured by whether that capital came back. Read side-by-side with the left: a type that is large here and red there is where the budget is being burned.
Precise signed magnitudes
P&L and expectancy by trade type
The exact figures behind the two donuts above. Bar length = P&L, label = expectancy per trade and sample size. Use the donuts to spot where to look; use this to confirm how big and on how many trades.
Decision quality over time
Is the selector getting better?
Expectancy per day across the window. Flat-and-negative means selection is not learning — which is expected until an entry feedback loop exists.
One paragraph
The whole problem, stated once

We take 165 trades a day and lose -5.9% on each one. The losses are not spread evenly — they are concentrated in trades that die within an hour (-$141,908 of the -$141,038 total). Two mechanical defects cause most of it: a stop that cannot fill where it is set because exits run on a 5-minute cron, and no quality gate on entry — 7% of what we block is blocked for capacity, only 8% for quality. Fix those two and the book moves roughly $110,675 without finding a single new signal.

Defect 01
There is no resting order
-$73,889
  • Stop set −20%; STOP_GAP trades realise -63.3%.
  • The stop is not an order — it is a condition tested every 5 min. Code books fill = cur*(1−slip): the polled price, not the level.
  • Gap = detection lag (fixable) + real on-chain slippage (not). $73,889 is an upper bound, not a forecast — plan on ~half.
  • Fix: 1-min cron (#185) — measured runtime is only 10s / 291 positions, and prices are one batch call per chain.
Defect 02
No quality gate
-$36,786
  • 864,777 signals blocked — but 7% only because we were full.
  • Only 69,440 (8%) were refused on merit.
  • 3 sources lose to a random control and cost $36,786.
  • Fix: gate on tail-rate vs control, not on free slots (queue #187).
What already works
Don't break these
  • Tail wins carry the book: 7% of trades produce $166,260.
  • Holding ≥2h is flat-to-positive at every bucket.
  • ETH and Base are the only chains not bleeding.
  • Never cut the tail to raise win rate — the tail is the edge.
Skip list
Stop trading these now
  • Any exit inside 60 minutes that isn't a real stop.
  • Sources marked CUT: momentum_scalp, sniper, trench.
  • Hours 03, 10, 17, 22 UTC — worst expectancy.
  • Regime extreme_poor — -6.7% expectancy.
Grounding
Where every number here comes from
  • Source: paper_journal.jsonl — 24,327 journalled positions, 93 trading days.
  • Excluded: 7,224 rows whose outcome is unknowable because the price feed died (the #181 bug booked these as −100%). Counting them would overstate losses by roughly a third.
  • Excluded: runner-bag legs below $60 — they are a second leg of one decision, not a new decision.
  • Anomaly: 67 rows have exit_ts < entry_ts (negative hold). They are counted in the totals but kept out of the sub-hour bucket, which they would otherwise inflate from 91% to 95% of losses. Separate clock bug — worth its own ticket.
  • Control cohort: n=249 random entries, expectancy -18.1%, tail 5.6% — any source that cannot beat this has no demonstrated edge.
The question
Do we enter every trade that comes into the system?

No — but not for the right reasons. Of 889,104 evaluations, 864,777 were blocked. The system therefore looks selective. But when you split the block reasons, 7% are capacity limits — we were already full, so the signal was dropped regardless of quality. Only 8% were rejected because the setup was judged bad.

That means selection is effectively arbitrary with respect to quality: which trade gets in depends on when it arrived and whether a slot was free, not on whether it was good. That is why the book tracks the random control so closely.

Funnel
Where signals go
evaluations889,104
blocked864,777
entered24,327
scored here15,370
Block reasons
Capacity is doing the selecting, not judgement
reasonn% of blockskindwhat it means
strict_gate_reject367,25442.5%DATA—
no_price178,95120.7%DATAno price available — cannot enter
mc_below_floor59,9466.9%DATA—
admission_reject57,7796.7%QUALITYadmission gate judged it bad
mc_resolved_dexscr47,2575.5%DATA—
quality_tx_unavailable46,5185.4%DATA—
src_cap45,1775.2%CAPACITYper-source slot limit hit
total_cap12,2771.4%CAPACITYglobal open-position limit hit
decision_reject11,6611.3%QUALITYdecision engine refused
sm_distrib11,5081.3%DATAsmart money selling into it
fomo_large_tx_reject8,7981.0%DATA—
quality_tx_reject7,7770.9%DATA—
throttled3,2930.4%CAPACITYrate limiter
source_cap2,3980.3%DATA—
shadow_mc_cap2,2200.3%DATA—
young_defer9560.1%DATA—
nonpositive_or_invalid_size8210.1%DATA—
oggy_net_cap1440.0%DATA—
shadow_mc_deadline250.0%DATA—
buys_band170.0%DATA—
Taxonomy
Every trade classified by what actually happened to it
verdictn% bookexpectancywinP&L
NEVER_ARMED865456.3%-19.4%8%-$175,913
STOP_GAP159610.4%-63.3%0%-$108,047
ROUND_TRIP13668.9%-26.8%0%-$29,077
CLEAN_WIN12568.2%+27.5%100%$29,602
TAIL_WIN10506.8%+198.0%100%$166,260
BE_STOP_SAVE9826.4%-9.5%0%-$9,730
DEAD_ZONE_ARM4432.9%-38.0%0%-$13,457
BE_STOP_EARLY120.1%-40.2%0%-$529
TIME_STOP60.0%-4.6%0%-$29
ORDINARY_LOSS30.0%-38.3%0%-$115
SMART_MONEY_EXIT20.0%-1.1%0%-$3
  • NEVER_ARMED — never even reached +5%. Entry was simply wrong. Biggest single bucket.
  • STOP_GAP — stop triggered but filled far below the level. Mechanical, fixable.
  • ROUND_TRIP — went up, gave it all back. Exit-timing problem.
  • DEAD_ZONE_ARM — armed, then died between arm and trail. Arm threshold too low.
  • TAIL_WIN / CLEAN_WIN — the entire positive side of the book.
By chain
Where it works
chainnexpwinP&L
sol7220-8.4%20%-$91,797
bsc3442-7.6%20%-$35,883
base1919-0.1%21%-$4,609
eth1495+2.3%19%-$411
robinhood1292-5.5%16%-$8,297
By regime
Market state at entry
regimenexpwinP&L
poor7847-8.5%19%-$94,053
ground6907-2.9%19%-$41,117
extreme_poor616-6.7%18%-$5,867
Edge test
Every source vs a random control cohort

A source only has edge if it beats random entry (n=249, expectancy -18.1%, tail 5.6%). Win rate is deliberately not the deciding column — tail rate is, because 7% of trades generate all the profit.

sourcenexpectancywintailvs controlP&Lcall
volume_path2005-1.5%18%1.1%+16.6pp-$4,659WATCH
fomo1738-3.9%20%6.3%+14.2pp-$18,271KEEP
clu:fomo1291+0.8%23%3.9%+18.9pp-$4,742WATCH
momentum_scalp893-30.0%12%3.9%-11.9pp-$29,555CUT
whalemover_rh815-3.5%14%0.9%+14.6pp-$3,423WATCH
whalemover767-2.2%22%3.0%+15.8pp-$3,584WATCH
known_conv765-5.2%15%1.6%+12.8pp-$4,460WATCH
sa_accum700-2.5%19%3.0%+15.6pp-$3,857WATCH
source_strategy669-3.4%16%2.1%+14.7pp-$3,452WATCH
oggy_kol633-9.7%19%4.7%+8.3pp-$9,414WATCH
smartmoney495-8.1%16%5.1%+9.9pp-$6,938WATCH
cluster462-10.0%20%6.1%+8.1pp-$7,549KEEP
fomo_curated417-14.9%19%4.6%+3.2pp-$7,505WATCH
accum_engine388-4.0%26%3.6%+14.1pp-$2,789WATCH
wallet_intel370-1.9%22%3.2%+16.2pp-$1,488WATCH
wallet_buysize322+11.8%27%5.6%+29.9pp$1,638WATCH
trending310-13.5%16%1.6%+4.6pp-$4,722WATCH
control249-18.1%14%5.6%+0.0pp-$5,185WATCH
alpha_brief216-8.7%20%2.3%+9.4pp-$2,190WATCH
oggy_boost198-0.0%31%10.1%+18.0pp-$985KEEP
cipher183-4.8%25%6.6%+13.2pp-$1,765KEEP
sniper163-27.3%17%2.5%-9.3pp-$4,795CUT
clu:dowville160-0.4%26%2.5%+17.7pp-$437WATCH
volume_spike141-5.3%26%2.8%+12.7pp-$1,107WATCH
inversion_alpha110-13.0%23%0.9%+5.1pp-$1,741WATCH
floor_revival107-6.4%21%6.5%+11.7pp-$1,179KEEP
trench91-22.0%22%4.4%-3.9pp-$2,436CUT
kol:michacalls81+0.4%25%4.9%+18.4pp-$503WATCH
clu:sapphy78-10.5%18%2.6%+7.5pp-$1,067WATCH
accum_sig_gmgn_cluster55+12.8%31%7.3%+30.9pp$440KEEP
clu:shadow_dowville52-4.4%25%1.9%+13.6pp-$342WATCH
accum_sig_fresh_swarm52+11.9%33%7.7%+30.0pp$405KEEP
accum_sig_flow_div47+4.7%28%4.3%+22.8pp$45WATCH
accum_sig_stealth46+7.0%26%4.3%+25.0pp$131WATCH
kien_conv40-8.4%20%7.5%+9.7pp-$525KEEP
leading_conv40-3.3%5%0.0%+14.7pp-$133WATCH
The single biggest finding
Hold time decides everything
holdnexpectancywintailP&LP&L
<1h7831-16.9%12%1.3%-$141,908
1-2h1267+3.1%23%7.4%-$3,912
2-4h1083+5.6%25%7.5%$182
4-6h579+13.5%27%5.4%$3,857
6-24h1995+1.7%27%5.9%-$8,053
1-7d1595+15.4%31%7.5%$13,338
>7d953-0.6%31%0.8%-$978
  • Sub-hour trades are 51% of the book and 101% of the losses.
  • Every bucket ≥2h is flat or positive. The edge is not in speed.
  • This is the cheapest fix available: stop taking trades that resolve in under an hour.
Entry hour · UTC
Expectancy by hour of day
00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Bar height = |expectancy|. Teal above zero, red below. Best: 00:00 (+3%), 09:00 (+1%), 14:00 (+0%). Worst: 03:00 (-13%), 10:00 (-12%), 17:00 (-11%). Treat hour-of-day as a tiebreaker only — the sample per hour is 409–899 trades and these gaps are not yet significant.

Per-trade record
What / why / when — worst offenders in each class

Full journal: paper_journal.jsonl (24,327 entries) · rendered at /journal.html. Below: the two costliest trades in each failure class, each with the machine-written why and the fix it implies.

STOP_GAP
CAPITALISMcontrolsol-200.0%-$220
WHEN 07-11 03:12 UTC · held 5m · peak -2.4% · size $110
WHY Stop set at -40% but filled at -200.0% — gapped 160 points through the stop in a 5-minute polling window.
FIX A 5-min poll cannot honour a -40% stop on this volatility. Either widen the stop to match reality (-200%) and size down, or move exits to a price-triggered watcher/limit order rather than a cron poll.
43oggy_boosteth-200.0%-$220
WHEN 07-14 11:13 UTC · held 388m · peak +3.1% · size $110
WHY Stop set at -45% but filled at -200.0% — gapped 155 points through the stop in a 5-minute polling window.
FIX A 5-min poll cannot honour a -45% stop on this volatility. Either widen the stop to match reality (-200%) and size down, or move exits to a price-triggered watcher/limit order rather than a cron poll.
NEVER_ARMED
TROLLclu:fomosol-103.0%-$85
WHEN 09-20 12:47 UTC · held 7407m · peak +21.8% · size $82
WHY Never traded above +25% after entry (peak +22%). No follow-through at all — the entry had no edge; price went against us from the first poll.
FIX This is an ENTRY problem, not an exit problem. Gate the 'clu:fomo' source on a confirmation bar (require +25% within 10 min of signal before committing full size); enter on a starter clip only.
billioggy_kolsol-59.5%-$71
WHEN 07-08 16:03 UTC · held 14m · peak -1.0% · size $120
WHY Never traded above +25% after entry (peak -1%). No follow-through at all — the entry had no edge; price went against us from the first poll.
FIX This is an ENTRY problem, not an exit problem. Gate the 'oggy_kol' source on a confirmation bar (require +25% within 10 min of signal before committing full size); enter on a starter clip only.
ROUND_TRIP
27oggy_boosteth-133.3%-$116
WHEN 07-29 07:52 UTC · held 120m · peak +91.8% · size $87
WHY Reached +92% (a genuinely profitable peak, breakeven was +42.9%) and still closed -133.3%. Gave back 225 points of open profit.
FIX Bank a scale-out: sell 1/3 at +43% to lock the trade green, then trail the rest. A single all-or-nothing trail converts winners into losers.
14oggy_boosteth-133.3%-$116
WHEN 08-01 11:03 UTC · held 199m · peak +80.4% · size $87
WHY Reached +80% (a genuinely profitable peak, breakeven was +42.9%) and still closed -133.3%. Gave back 214 points of open profit.
FIX Bank a scale-out: sell 1/3 at +43% to lock the trade green, then trail the rest. A single all-or-nothing trail converts winners into losers.
TAIL_WIN
DIMwallet_buysizeeth+3870.0%$3,193
WHEN 07-26 00:53 UTC · held 295m · peak +5270.4% · size $82
WHY Caught a power-law runner: peaked +5270%, banked 3870.0% ($+3192.74). This cohort is where the entire book's positive expectancy lives.
FIX Protect this cohort. Widen the trail once a trade clears +150% so a tail runner is never stopped on normal volatility; consider a 25% moon-bag with no trail at all.
slingclu:fomosol+4116.4%$3,087
WHEN 08-09 13:22 UTC · held 370m · peak +4901.1% · size $75
WHY Caught a power-law runner: peaked +4901%, banked 4116.4% ($+3087.29). This cohort is where the entire book's positive expectancy lives.
FIX Protect this cohort. Widen the trail once a trade clears +150% so a tail runner is never stopped on normal volatility; consider a 25% moon-bag with no trail at all.
DEAD_ZONE_ARM
SOULmomentum_scalpsol-133.3%-$110
WHEN 07-09 23:32 UTC · held 15m · peak +36.1% · size $82
WHY Armed at +36% (profile arms at +25%) but the 30% trail needs a peak above +42.9% to break even. Peaked +36%, so the trailing exit was priced below entry the moment it armed. Realized -133.3%.
FIX Raise arm above breakeven: set arm >= 48% for a 30% trail, or cut the trail to 20%. Never arm below 1/(1-trail)-1.
BRIDGE BRIDGE momentum_scalpsol-133.3%-$110
WHEN 07-12 11:08 UTC · held 14m · peak +29.1% · size $82
WHY Armed at +29% (profile arms at +25%) but the 30% trail needs a peak above +42.9% to break even. Peaked +29%, so the trailing exit was priced below entry the moment it armed. Realized -133.3%.
FIX Raise arm above breakeven: set arm >= 48% for a 30% trail, or cut the trail to 20%. Never arm below 1/(1-trail)-1.
M-22 · FinallyNitin · shadow paper
Scanner arms — coverage before performance

Realized universal-paper exits only; selection lift is graded separately in alpha_feature_scoreboard.json. Decision effect: NONE.

armresolved / totalcoverage median returnpromotion gate
M22_BURST_PROPENSITY_GE_5PCT360/38294.2%-11%WAIT_MATCHED_CONTROL_OOS_FDR
M22_NR7250/27291.9%-3%WAIT_MATCHED_CONTROL_OOS_FDR
M22_PPV10172/18692.5%-3%WAIT_MATCHED_CONTROL_OOS_FDR
M22_PPV10_NR76/875.0%-3%WAIT_COVERAGE
M22_PPV10_WR20_BREAKOUT80/8594.1%-3%WAIT_MATCHED_CONTROL_OOS_FDR
M22_SUPPLY_RECLAIM388/40994.9%-3%WAIT_MATCHED_CONTROL_OOS_FDR
M22_UNRESOLVED_SUPPLY578/64190.2%-3%WAIT_MATCHED_CONTROL_OOS_FDR
M22_WR20_BREAKOUT122/12895.3%-3%WAIT_MATCHED_CONTROL_OOS_FDR
The answer
Should there be a system that decides what we enter?

Yes — and the absence of one is the root cause, not a missing feature. Today entry is decided by arrival order and free slots. A real admission brain would score every candidate before it competes for a slot, and spend the day's risk budget on the best N rather than the first N.

  • What it decides: enter / skip, size, and which exit profile — not just yes/no.
  • What it scores on: source tail-rate vs control, chain, regime, hour, expected hold. Every one of those is already measured on this page.
  • How it learns: each decision is written to the journal with its score; weekly, the score→outcome relationship is refit and any feature that stops predicting is dropped. That loop already exists for exits (param_evaluator) — it has never been pointed at entries.
  • Guardrail: it must be graded against the random control cohort continuously. A brain that cannot beat random is worse than no brain, because it feels justified.
  • Expected gain: cutting the 3 below-control sources and sub-hour churn is worth ≈$36,786 and $141,908 respectively on this sample — before any new signal is added.
Scoreboard
Measure these, not win rate
  • Expectancy per trade (the only P&L-linked one)
  • Tail rate ≥+100% vs control
  • Payoff vs breakeven payoff
  • Stop-fill slippage (set vs realised)
  • % resolving <1h — the churn meter
  • Capacity-block rate — how often quality never got asked
  • Void rate — feed failures, so bugs can't hide as losses
Sequence
Order of work — each step makes the next measurable
01 · #181
Stop booking feed outages as −100%. Until this lands every other number is contaminated.
02 · #185
Move exits off the 5-min cron. Recovers ≈$73,889 and makes stop levels mean something.
03 · #187
Tail-rate-vs-control gate. Cuts 3 sources worth $36,786.
04 · new
Sub-hour churn filter — the largest single loss pool (-$141,908).
05 · new
Only then: the scoring brain, graded against control weekly.