{
  "source": "pump.fun",
  "phase": "before-graduation",
  "graduationUsd": 69000,
  "size": 0.085,
  "fee": 0.028,
  "rule": {
    "entryMin": 3000,
    "entryMax": 55000,
    "stop": 0.12,
    "takeProfit": 3,
    "trail": 0.3,
    "holdMs": 900000
  },
  "scanned": 342,
  "testCoins": 120,
  "trades": 44,
  "winRate": 0.3409,
  "totalReturn": 1.0497,
  "maxDd": 0.0848,
  "byRule": {
    "time": 1,
    "graduation": 9,
    "take-profit": 3,
    "stop": 29,
    "trail": 2
  },
  "rejected": {
    "reason": "A 1,944-rule search on the older 222 launches preferred a $4,000\u2013$40,000 band, a 20% stop, and a 4\u00d7 target. On the newer 120 launches that rule returned 1.0195 with a 0.1449 drawdown, behind the frozen rule.",
    "testReturn": 1.0195,
    "testMaxDd": 0.1449,
    "testTrades": 30
  },
  "note": "Frozen rule, retested on the newer launches. The tighter candidate was not adopted. Not a forecast.",
  "reproducible": false,
  "withdrawnAs": "a result",
  "withdrawalReason": "No code in this repository can produce this figure. Its byRule block reports a 'graduation' exit, and no candle replay engine here emits that reason (engine/replay.js emits data-gap, migration-unpriced, time, trail, stop, take-profit, unresolved). The only 'graduation' in engine/ is decide.js, a snapshot simulator that takes flow and curve-progress objects rather than OHLC candles, and whose limits have a different shape from the rule recorded here. So the rule shape comes from one engine and the exit reasons from another: it was assembled by hand, not computed. It also predates two accounting errors since fixed - a stop was priced at its trigger rather than through the bar (1.6x understated on a measured bar) and the whole round trip was charged on the entry notional (which under-charged every winner). Kept at this URL as a record of what was claimed, not as a result.",
  "reproducibleAlternative": "/engine-report.json"
}
