Every position the system opened between
07-07 and 08-13 2026 — what we entered and why, what
actually happened, which numbers are real, which are fabricated, and what each fix is worth in
dollars. Built from paper_universal_ledger.jsonl,
paper_decisions.jsonl and paper_journal.jsonl.
exit_px = null. On the 10,193 positions we actually watched exit, the
book is −$92,653 (-13.1%).Both facts matter, and they point in opposite directions. The accounting bug means the reported number is wrong and every parameter tuned on it is untrustworthy. But the corrected number is still deeply negative, on every source, every exit profile, every chain, every regime and every hour of the day. Fixing the accounting does not produce a profitable system — it produces an honest one, which is the precondition for finding out why this loses.
paper_universal v1.8.0 shipped 439.3h ago
(2026-07-25T20:50Z). Everything below is measured on real observed exits
since that moment, against the counterfactual the code records at decision time — not a replay.
Refreshed every 2h by paper_fix_tracker.py → thread 37479.
Book since deploy (observed exits only): n=5920 · −$24,031 · -6.3% · expectancy −$4 · PF 0.78 · WR 26.8%
147 historical exits
(−$10,864) were booked at exactly −100% off a
>99.99% single-interval price collapse — entry ~6e−05 marked at ~1e−10 inside one
5-minute poll, with the same symbol recurring. That is the dust-pool signature, not 104 independent
rugs. It is the same class as the DEAD bug, but unlike DEAD (where exit_px was
literally null) a real rug looks identical, so v1.8.0 flags these
(suspect_price) and counts them — 44 since deploy —
rather than repricing them. Repricing would be inventing an outcome, which is the exact thing
Fix 1 exists to stop. Awaiting a ruling (queue #204).
Effectively yes. There is a rejection log — 179,809 entries — but it is a capacity ledger, not a quality filter. The system opens a position on anything it can still afford to hold.
src_cap / total_cap — 15% of all
rejections. The book was simply full (25 per source, 300 total). A signal rejected here was not
judged: it queued behind a position we happened to already hold. Change the cap and a completely
different set of trades gets taken.no_price — 3%. We could not fetch a price, so we
could not fill. A data outcome, not a decision.sm_distrib — 3,915 rejections, 2.2%.
Smart money was seen selling. This is the only quality judgement in the entire entry path —
and where it did fire on positions we took anyway, those exits are the one
break-even cohort in the book (SM_DISTRIB: $3,318
over 335 exits).Every signal carries a score. In paper_universal.py:263 it is
used once — to sort the candidate list so higher scores fill first. It is never compared
against a threshold. Nothing is ever rejected for being low quality.
| score bucket at entry | n | net EV $ | net EV % | CI low | win rate | net PF | grade | tail % | total P&L | shape |
|---|---|---|---|---|---|---|---|---|---|---|
| none | 3861 | −$6 | +3.7% | -4.1% | 25.9% | 1.13 | CONFIDENT | 79% | −$19,600 | |
| 80-99 | 791 | −$11 | -7.7% | -15.2% | 23.6% | 0.73 | CONFIDENT | 69% | −$7,847 | |
| 100+ | 1782 | −$12 | -10.9% | -15.5% | 24.2% | 0.63 | CONFIDENT | 72% | −$18,388 | |
| 40-59 | 749 | −$12 | -9.1% | -15.2% | 25.6% | 0.70 | CONFIDENT | 63% | −$8,426 | |
| 1-19 | 278 | −$13 | -11.2% | -19.6% | 22.7% | 0.58 | CONFIDENT | 65% | −$3,253 | |
| 20-39 | 1979 | −$14 | -10.5% | -18.2% | 20.2% | 0.68 | CONFIDENT | 80% | −$24,750 | |
| 60-79 | 753 | −$15 | -14.2% | -19.6% | 23.5% | 0.56 | CONFIDENT | 69% | −$10,389 |
Non-monotonic and near-random: r = 0.012 on n=6,332. The 100+ bucket is not better than the unscored bucket. Two live config files — conviction_gates.json (v1.2.0) and copy_decision_gates.json (v1.0.0) — define exactly the category weights, size-by-grade and conviction multipliers that would make this a real gate. paper_universal.py never reads either file.
A position is marked from a batched DexScreener call. If the batch does not return a
price, fails increments; at six strikes the position is closed
DEAD at a hard-coded −1.0 return — with exit_px = null.
Nothing verifies the token actually died.
# paper_universal.py:416-421
cur = px_cache.get(ca)
if cur is None:
p["fails"] = p.get("fails", 0) + 1
if p["fails"] >= 6:
closed.append((k, "DEAD", -1.0, None)) # ← -100% on no evidence
continue
Each bar is one day; the number under the label is total closes that day. v1.7.3 shipped on 260723 and deliberately removed the GMGN price fallback to cure a 300s cron timeout — its own comment notes the batch “typically misses ~100+” positions, then treats every miss as a death. DEAD went from ~0–15% of closes to a sustained 8%. $133,245 of the $172,080 phantom loss is in those three days.
| 10-minute window (UTC) | positions killed | booked loss | had been up | distinct sources | chains |
|---|---|---|---|---|---|
| 07-12 16:50 | 280 | −$27,585 | 158 | 23 | 5 |
| 07-23 18:30 | 248 | −$20,038 | 138 | 21 | 5 |
| 07-20 23:00 | 45 | −$4,278 | 17 | 11 | 4 |
| 07-17 12:20 | 36 | −$3,742 | 11 | 9 | 4 |
| 07-25 00:40 | 34 | −$3,730 | 2 | 4 | 4 |
No market event kills 280 tokens across 5 chains and 23 independent detectors inside ten minutes — and 158 of them were trading above entry at the time. These are infrastructure outages recorded as trading losses. The two largest windows alone account for 528 of the 1,689 DEADs.
We cannot recover these outcomes. The honest treatment is a bound: the floor assumes every unresolved position went to zero, the ceiling assumes each exited at its last observed peak (impossible in practice). Peaks above 100× were dropped as feed garbage (5 legs) and the rest capped at +1000%.
| scenario | assumption for the 1,689 unresolved | book P&L | return on notional | reading |
|---|---|---|---|---|
| A | All unresolved = total loss | −$264,380 | -30.0% | status quo — what the ledger says today |
| C | Half give-back from peak | −$220,313 | -25.0% | pessimistic reconstruction |
| B | Peak minus the profile's own trail | −$112,540 | -12.8% | what the exit engine WOULD have done |
| D | Exit exactly at peak | −$78,281 | -8.9% | unreachable ceiling |
Median peak among unresolved positions was -1.0% — i.e. the typical one never ticked above its own entry-plus-slippage, which is why the pessimistic reconstructions land close to the floor. But 130 of them had been up 25% or more, and 37 had more than doubled. Those were not rugs. Best single number to quote: -13.1% on the 10,193 positions we actually observed.
13,585 positions carry a journal entry — one verdict, one plain-language reason, one fix. Grouped, they say something the aggregate P&L cannot: the losses are not one problem, they are five, and only two of them are about trading.
(no description)
e.g. “Price feed lost this token for ? consecutive marks after 0 GMGN rescue attempt(s); retired after 8175 min with peak +12%. NO exit price exists, so no return was booked — v1.7.3 would ha”
Never traded up to the arm threshold. The entry had no edge.
e.g. “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.”
ADMIT This is the whole hole. Needs a pre-trade admission gate.
Stop filled far below its level — 5-min polling gap.
e.g. “Stop set at -50% but filled at -65.1% — gapped 15 points through the stop in a 5-minute polling window.”
EXEC Faster mark loop; accept that part of this is unrecoverable in live.
Was genuinely profitable at peak, still closed red.
e.g. “Reached +94% (a genuinely profitable peak, breakeven was +42.9%) and still closed -12.2%. Gave back 106 points of open profit.”
EXIT Ratchet the stop to breakeven the moment the position arms.
Mass simultaneous DEAD — infrastructure, not market.
e.g. “Booked -100% in a cluster of simultaneous DEADs at 07-12 16:57 UTC: the GMGN price feed dropped, the token did not necessarily rug. Outcome is UNKNOWN.”
FIX Do not book. Write to unresolved.jsonl with pct_return=null.
Trailed out properly and captured a real share of the move.
e.g. “Trailed out properly: peak +146%, captured 61.5% ($+46.15), 42% of the available move.”
KEEP Keep. This is the shape to reproduce.
Feed died on this token alone; outcome genuinely unknown.
e.g. “Closed at -100% on '6 consecutive price-feed failures' after 7205 min. exit_px is null — no trade actually happened at this price.”
FIX Do not book. Retry via GMGN before giving up.
Power-law runner. This cohort carries the entire book.
e.g. “Caught a power-law runner: peaked +238%, banked 43.9% ($+36.19). This cohort is where the entire book's positive expectancy lives.”
KEEP Protect tails: never tighten the trail on a runner.
(no description)
e.g. “Peaked +11% — inside TIGHT5's dead zone (+5%..+17.6%), where the trail is priced BELOW entry. Exited flat at -1.2%; the old v1.7.3 trail would have booked -5.6%. Saved 4.5 points.”
Armed at a peak mathematically below its own breakeven.
e.g. “Armed at +38% (profile arms at +25%) but the 30% trail needs a peak above +42.9% to break even. Peaked +38%, so the trailing exit was priced below entry the moment it armed. Realized -2”
EXIT Require arm > trail/(1-trail) per profile. Design bug, not variance.
(no description)
e.g. “Peaked +17% — inside TIGHT5's dead zone (+5%..+17.6%), where the trail is priced BELOW entry. Exited flat at -62.7%; the old v1.7.3 trail would have booked -0.2%. Cost 62.5 points.”
Expiry reached with no resolution.
e.g. “Held 1.0 days to expiry and closed -11.6%. Capital was parked, not working.”
KEEP Low volume; ignore for now.
Exited because the signal that got us in reversed.
e.g. “Exited on smart-money distribution at -1.9%. The signal that got us in reversed.”
KEEP Working as designed — the only quality gate we have.
Every position with its verdict, its plain-language why, and the single
actionable fix — click any row to expand them. 13,585 positions journalled;
newest 2,000 shown. Sortable, filterable. Symbols link to GMGN.
Regenerated by trade_journal.py v1.1.0.
| exit (UTC) | token | chain | source | profile | size | return | P&L | peak | held | exit | verdict | grade |
|---|
A row with a blank return is UNRESOLVED — the feed lost the token and v1.8.x refuses to invent an outcome. Those contribute exactly $0, by design.
A position “arms” when it first trades above its profile's arm threshold — the moment it has actually gone up. Split the observed book on that single fact:
Among positions we actually watched, every dollar of loss sits in trades that never went up at all. The ones that did go up collectively made money, even with a demonstrably broken exit engine. That reframes the whole problem: this is an entry failure, not an exit failure. Better trailing rules cannot fix a trade that was red from the first poll.
It does not license a “filter for arming” rule. Arming is only knowable after entry. This number bounds the prize — it is not itself a strategy. Finding a pre-trade attribute that predicts arming is precisely the job an admission system exists to do.
All tables below exclude the 1,689 unresolved positions, so nothing here is
contaminated by the DEAD bug. Sorted by expectancy. profit factor < 1.00 means the
cohort loses money.
| source / process | n | net EV $ | net EV % | CI low | win rate | net PF | grade | tail % | total P&L | shape |
|---|---|---|---|---|---|---|---|---|---|---|
| wallet_copy | 15 | $26 | +25.1% | -17.6% | 40.0% | 2.86 | UNRELIABLE | 44% | $403 | |
| wallet_buysize | 252 | $6 | +17.0% | -14.4% | 32.5% | 1.72 | CONFIDENT | 83% | $1,835 | |
| clu:fomo | 679 | $1 | +12.0% | -2.7% | 33.4% | 1.61 | CONFIDENT | 76% | $1,738 | |
| wc:SPRAYER | 18 | −$3 | +1.5% | -29.2% | 27.8% | 1.07 | UNRELIABLE | 51% | −$36 | |
| clu:shadow_dowville | 50 | −$4 | -1.6% | -12.0% | 32.0% | 0.87 | LOW | 36% | −$167 | |
| cipher | 131 | −$5 | +3.0% | -9.4% | 33.6% | 1.14 | CONFIDENT | 48% | −$452 | |
| sa_accum | 79 | −$5 | +7.8% | -13.6% | 29.1% | 1.40 | LOW | 48% | −$310 | |
| wallet_intel | 80 | −$7 | -9.0% | -17.3% | 26.2% | 0.50 | LOW | 60% | −$462 | |
| oggy_boost | 153 | −$7 | -16.9% | -35.9% | 32.0% | 0.65 | CONFIDENT | 53% | −$730 | |
| whalemover | 305 | −$7 | -4.2% | -11.8% | 28.9% | 0.79 | CONFIDENT | 59% | −$1,764 | |
| fomo | 1205 | −$8 | +4.4% | -11.2% | 23.7% | 1.13 | CONFIDENT | 79% | −$8,011 | |
| known_conv | 262 | −$8 | -6.1% | -15.0% | 23.7% | 0.71 | CONFIDENT | 75% | −$1,824 | |
| clu:dowville | 70 | −$8 | -12.3% | -18.8% | 22.9% | 0.31 | LOW | 54% | −$509 | |
| cluster | 873 | −$9 | +4.3% | -17.6% | 24.3% | 1.12 | CONFIDENT | 81% | −$6,732 | |
| fomo_curated | 945 | −$9 | -3.9% | -17.7% | 23.2% | 0.87 | CONFIDENT | 77% | −$7,537 | |
| oggy_kol | 875 | −$9 | -6.8% | -14.3% | 23.1% | 0.75 | CONFIDENT | 76% | −$7,109 | |
| floor_revival | 77 | −$10 | -10.8% | -20.6% | 24.7% | 0.53 | LOW | 49% | −$633 | |
| alpha_brief | 84 | −$10 | -6.5% | -18.6% | 27.4% | 0.71 | LOW | 51% | −$731 | |
| control | 232 | −$10 | -7.1% | -27.8% | 18.5% | 0.82 | CONFIDENT | 79% | −$2,083 | |
| volume_spike | 75 | −$11 | -12.2% | -19.7% | 28.0% | 0.39 | LOW | 42% | −$717 | |
| clu:sapphy | 61 | −$12 | -5.1% | -21.9% | 23.0% | 0.75 | LOW | 56% | −$631 | |
| known_dist | 28 | −$12 | -20.6% | -30.1% | 10.7% | 0.06 | UNRELIABLE | 93% | −$301 | |
| accum_engine | 314 | −$12 | -9.8% | -17.6% | 26.1% | 0.56 | CONFIDENT | 62% | −$3,357 | |
| trending | 423 | −$12 | -13.0% | -17.6% | 21.7% | 0.41 | CONFIDENT | 64% | −$4,570 | |
| inversion_alpha | 53 | −$14 | -18.3% | -26.0% | 22.6% | 0.21 | LOW | 39% | −$697 | |
| smartmoney | 749 | −$15 | -13.3% | -20.6% | 22.2% | 0.60 | CONFIDENT | 71% | −$10,468 | |
| kol:michacalls | 82 | −$17 | -14.2% | -25.2% | 28.0% | 0.50 | LOW | 57% | −$1,325 | |
| wc:shadow_dowville | 14 | −$18 | -15.2% | -34.2% | 14.3% | 0.36 | UNRELIABLE | 81% | −$227 | |
| momentum_scalp | 1590 | −$18 | -15.4% | -21.7% | 19.3% | 0.61 | CONFIDENT | 79% | −$27,276 | |
| kien_conv | 36 | −$19 | -12.9% | -35.8% | 16.7% | 0.59 | LOW | 40% | −$623 | |
| sniper | 223 | −$23 | -25.1% | -31.5% | 19.3% | 0.26 | CONFIDENT | 67% | −$4,851 | |
| trench | 83 | −$29 | -29.2% | -42.4% | 20.5% | 0.28 | LOW | 75% | −$2,310 |
Only two cohorts are positive and both are too small to act on (n=15 and n=17). There is no detector in this book with meaningful sample size and positive expectancy. That is the finding — not a shortlist to promote.
| exit profile | n | net EV $ | net EV % | CI low | win rate | net PF | grade | tail % | total P&L | shape |
|---|---|---|---|---|---|---|---|---|---|---|
| SWING | 5918 | −$8 | -1.6% | -7.2% | 26.4% | 0.95 | CONFIDENT | 75% | −$42,072 | |
| TIGHT5 | 3788 | −$12 | -8.8% | -12.5% | 21.1% | 0.67 | CONFIDENT | 78% | −$40,180 | |
| SNIPE | 127 | −$20 | -18.3% | -37.3% | 17.3% | 0.51 | CONFIDENT | 74% | −$2,247 | |
| TRAIL-hair | 350 | −$24 | -19.7% | -29.2% | 18.6% | 0.45 | CONFIDENT | 81% | −$7,711 | |
| MOMENTUM | 10 | −$47 | -37.5% | -93.9% | 20.0% | 0.35 | UNRELIABLE | 94% | −$443 |
Every profile loses. profile_for() now returns SWING for every APEX-book entry (promoted 2026-07-27, approved by Chris), so the legacy age-based SNIPE/MOMENTUM/SWING routing stays dead code. The #259 A/B config (profile_ab_config.json) keeps a 1-in-4 control slice on TIGHT5 for wallet-copy entries only — everything else routes to the live profile above. Runner bags now inherit whichever profile their parent position carried (roadmap #271, fixed 260730) rather than being force-set to one profile; only bag hard_sl stays pinned at -50% regardless of the parent's profile so bag risk behavior is unchanged.
| chain | n | net EV $ | net EV % | CI low | win rate | net PF | grade | tail % | total P&L | shape |
|---|---|---|---|---|---|---|---|---|---|---|
| eth | 330 | −$0 | +3.2% | -21.5% | 30.9% | 1.09 | CONFIDENT | 73% | $816 | |
| base | 632 | −$5 | -2.0% | -7.4% | 28.2% | 0.90 | CONFIDENT | 64% | −$2,558 | |
| bsc | 2119 | −$11 | -7.7% | -11.4% | 24.4% | 0.70 | CONFIDENT | 71% | −$21,148 | |
| sol | 7011 | −$11 | -4.9% | -9.7% | 23.3% | 0.85 | CONFIDENT | 78% | −$68,398 | |
| robinhood | 101 | −$15 | -15.5% | -26.8% | 17.8% | 0.42 | CONFIDENT | 74% | −$1,366 |
| regime at entry | n | net EV $ | net EV % | CI low | win rate | net PF | grade | tail % | total P&L | shape |
|---|---|---|---|---|---|---|---|---|---|---|
| ground | 3773 | −$6 | +3.2% | -5.0% | 24.7% | 1.11 | CONFIDENT | 79% | −$17,115 | |
| poor | 6155 | −$13 | -9.7% | -12.7% | 23.9% | 0.69 | CONFIDENT | 74% | −$70,555 | |
| extreme_poor | 265 | −$20 | -18.2% | -25.8% | 18.1% | 0.42 | CONFIDENT | 78% | −$4,984 |
Regime is known before we enter, which makes it one of the few free filters available — but all three observed regimes lose, so there is no regime to hide in. Base is the least-bad chain and Solana carries 74% of the total loss on 69% of the trades.
| time in position | n | net EV $ | net EV % | CI low | win rate | net PF | grade | tail % | total P&L | shape |
|---|---|---|---|---|---|---|---|---|---|---|
| >24h | 1233 | $2 | +12.4% | +3.6% | 29.7% | 1.58 | CONFIDENT | 75% | $3,313 | |
| 4-24h | 2176 | −$3 | +12.3% | -1.0% | 27.3% | 1.47 | CONFIDENT | 80% | −$3,236 | |
| 1-4h | 2650 | −$3 | +5.0% | -1.1% | 30.1% | 1.19 | CONFIDENT | 71% | −$5,118 | |
| 30-60m | 1531 | −$9 | -10.5% | -14.7% | 26.5% | 0.66 | CONFIDENT | 67% | −$11,205 | |
| 15-30m | 1269 | −$19 | -25.3% | -28.5% | 18.1% | 0.29 | CONFIDENT | 73% | −$22,954 | |
| 5-15m | 1008 | −$38 | -42.5% | -44.8% | 5.5% | 0.05 | CONFIDENT | 100% | −$37,033 | |
| 0-5m | 326 | −$52 | -52.2% | -55.1% | 1.2% | 0.00 | CONFIDENT | 31% | −$16,420 |
The gradient is enormous and almost entirely circular: a position exits in 0–5 minutes because it hit a hard stop, so short holds are losses by construction (297 of 326 sub-5-minute exits are stops). Do not read this as “hold longer”. Read it as: 1334 positions were dead inside fifteen minutes, costing −$53,453 — an entry-quality signal wearing a holding-period costume.
| entry hour (ET) | n | net EV $ | net EV % | CI low | win rate | net PF | grade | tail % | total P&L | shape |
|---|---|---|---|---|---|---|---|---|---|---|
| 20:00 | 523 | $2 | +18.2% | -4.7% | 26.8% | 1.63 | CONFIDENT | 79% | $1,480 | |
| 09:00 | 364 | −$2 | +5.9% | -18.0% | 24.5% | 1.20 | CONFIDENT | 85% | −$132 | |
| 12:00 | 581 | −$2 | +31.4% | -12.2% | 26.0% | 2.07 | CONFIDENT | 79% | −$343 | |
| 05:00 | 304 | −$3 | +1.5% | -10.6% | 28.3% | 1.06 | CONFIDENT | 69% | −$696 | |
| 10:00 | 377 | −$5 | +1.7% | -18.4% | 25.2% | 1.05 | CONFIDENT | 82% | −$1,271 | |
| 21:00 | 381 | −$8 | +5.8% | -16.1% | 24.1% | 1.18 | CONFIDENT | 81% | −$2,584 | |
| 14:00 | 475 | −$9 | -6.9% | -20.5% | 21.5% | 0.78 | CONFIDENT | 85% | −$3,693 | |
| 07:00 | 523 | −$9 | -7.5% | -16.4% | 25.4% | 0.73 | CONFIDENT | 73% | −$4,121 | |
| 15:00 | 438 | −$11 | -9.0% | -16.5% | 27.2% | 0.70 | CONFIDENT | 59% | −$4,307 | |
| 13:00 | 454 | −$11 | -5.2% | -15.8% | 25.6% | 0.82 | CONFIDENT | 67% | −$4,476 | |
| 17:00 | 517 | −$11 | -6.1% | -15.6% | 23.6% | 0.80 | CONFIDENT | 74% | −$5,266 | |
| 02:00 | 291 | −$12 | -11.7% | -21.0% | 23.4% | 0.61 | CONFIDENT | 75% | −$3,022 | |
| 00:00 | 447 | −$12 | -10.4% | -16.3% | 27.1% | 0.63 | CONFIDENT | 62% | −$4,670 | |
| 04:00 | 378 | −$12 | -10.6% | -18.0% | 26.2% | 0.62 | CONFIDENT | 68% | −$4,022 | |
| 18:00 | 742 | −$12 | -11.8% | -19.5% | 21.2% | 0.60 | CONFIDENT | 79% | −$7,936 | |
| 19:00 | 435 | −$12 | -12.1% | -22.2% | 20.7% | 0.64 | CONFIDENT | 80% | −$4,733 | |
| 03:00 | 259 | −$14 | -10.7% | -19.4% | 25.5% | 0.63 | CONFIDENT | 63% | −$3,206 | |
| 22:00 | 410 | −$14 | -11.2% | -20.0% | 23.9% | 0.66 | CONFIDENT | 65% | −$5,261 | |
| 01:00 | 337 | −$14 | -11.1% | -23.1% | 23.4% | 0.64 | CONFIDENT | 68% | −$4,443 | |
| 11:00 | 376 | −$15 | -15.8% | -23.4% | 23.4% | 0.51 | CONFIDENT | 65% | −$5,107 | |
| 08:00 | 372 | −$16 | -15.1% | -22.8% | 23.1% | 0.48 | CONFIDENT | 66% | −$5,428 | |
| 06:00 | 310 | −$16 | -14.1% | -22.2% | 24.2% | 0.56 | CONFIDENT | 69% | −$4,537 | |
| 23:00 | 434 | −$16 | -12.8% | -25.7% | 20.5% | 0.59 | CONFIDENT | 76% | −$6,434 | |
| 16:00 | 465 | −$19 | -22.3% | -27.8% | 19.4% | 0.33 | CONFIDENT | 80% | −$8,444 |
| weekday | n | net EV $ | net EV % | CI low | win rate | net PF | grade | tail % | total P&L | shape |
|---|---|---|---|---|---|---|---|---|---|---|
| Sun | 1485 | −$3 | +16.4% | -3.0% | 24.4% | 1.56 | CONFIDENT | 83% | −$2,430 | |
| Mon | 1322 | −$9 | -3.5% | -11.3% | 25.1% | 0.89 | CONFIDENT | 74% | −$10,668 | |
| Sat | 1676 | −$9 | -8.2% | -13.0% | 24.8% | 0.72 | CONFIDENT | 72% | −$13,573 | |
| Tue | 1686 | −$11 | -6.7% | -12.6% | 25.0% | 0.78 | CONFIDENT | 74% | −$17,045 | |
| Fri | 1495 | −$13 | -10.8% | -17.5% | 21.8% | 0.64 | CONFIDENT | 78% | −$16,834 | |
| Wed | 1260 | −$13 | -11.3% | -16.8% | 24.9% | 0.62 | CONFIDENT | 72% | −$14,394 | |
| Thu | 1269 | −$15 | -13.2% | -18.6% | 22.1% | 0.60 | CONFIDENT | 72% | −$17,710 |
Both are knowable before entry, and the spread between best and worst hour is real money per trade — but with n≈424 per bucket over a single 19-day window, treat this as a hypothesis to test out-of-sample, not a schedule to deploy. Every hour and every weekday is negative.
| identity | n | net EV $ | net EV % | CI low | win rate | net PF | grade | tail % | total P&L | shape |
|---|---|---|---|---|---|---|---|---|---|---|
| smart wallet | 58 | $1 | +1.9% | -13.8% | 31.0% | 1.10 | LOW | 42% | $122 | |
| no identity | 10127 | −$10 | -5.2% | -8.7% | 24.0% | 0.83 | CONFIDENT | 77% | −$92,412 | |
| KOL | 8 | −$47 | -47.5% | -59.5% | 0.0% | 0.00 | UNRELIABLE | 0% | −$363 |
Directionally the most interesting cell in the whole analysis — identity-backed signals are the only non-trivial cohort approaching break-even — but n is tiny. Worth a deliberate test, not a deployment.
Fixes 3 and 5 are mechanical: their value is arithmetic on trades we already observed, with no cohort selection. Fix 6 is the real prize and deliberately carries no promised number, because none can be honestly given yet.
exit_px = null and were written as a realised −100%. We never saw a price. paper_universal.py:417-421 — six batch misses ⇒ −100%.unresolved.jsonl with pct_return=null. Never into P&L.arm < trail/(1−trail). TIGHT5 arms at +5% but needs +17.6% to break even. 1,467 positions armed inside that window.arm ≥ trail/(1−trail) at config load; fail loudly if violated.Fix 3 + Fix 5 together, applied to the observed book with no cherry-picking: −$92,653 → −$598 (-13.1% → -0.1%). Still negative. The exit engine is not why this book loses money — it is why the book gives back what it earns.
Part of Fix 5 is not truly recoverable: a real memecoin dump will not fill at your stop either. Treat $50,642 as an upper bound on that line, and Fix 3's $41,413 as solid, since it is a logic change rather than an execution assumption.
Dropping every negative-expectancy source turns the observed book from −$92,653 into roughly break-even — by keeping 946 of 10,193 trades. That is in-sample selection of the survivors and it is not a result. It is exactly the error that promoted TIGHT5 on peak-replay math and then lost ~25% live. The same applies to the hour-of-day and profile cuts. Any of these becomes real only after out-of-sample validation against the random control cohort, with FDR correction.
Equally: requiring score ≥ 40 makes expectancy worse
(−$9 → −$11). That negative result is
more valuable than the positive ones, because it is not selected — it kills the assumption that the
score we already compute is a usable gate.
Yes — and its first job is not to raise expectancy. It is to stop paying $100 11,882 times to learn the same lesson, and to make the lesson legible when it arrives.
conviction_gates.json + copy_decision_gates.json — fully specified, never loadedcopy_decision_gates.json (S 1.0 → D 0.0). Wire it.Named failure modes: selecting survivors in-sample (the TIGHT5 error); training on a contaminated ledger where 14% of labels are fabricated (this must be fixed first — it is why Fix 1 gates everything else); optimising win rate instead of expectancy; and starving the tail cohort that produces 76% of all gross profit by filtering for consistency.
Fix 1 and 2 are not improvements, they are preconditions. Until the ledger stops fabricating 14% of its rows, every backtest, every parameter search and every promotion decision is being computed on noise — including any admission model trained to predict it. Ship the accounting fix, let the book run clean for a week, and only then fit anything.
Fix 3 is safe to ship in parallel: it is a one-condition logic change whose value is arithmetic on already-observed trades, and it does not depend on the accounting being correct.
docker exec <gw> python3 /opt/data/scripts/paper_forensics_gen.py ·
Hermes → queue #201, thread 37479