method
Every figure, and where it comes from.
Two sources and no others: this register’s own record of what it stamped, and a price feed for what the price was. They are never mixed — a caller cannot supply either.
A handle, a mint and a window, recorded at the instant the button was pressed. The price at that instant is read by this service from the deepest pool the feed lists for that mint, and written down. No field on the form accepts a price or a time.
How long a call gets before it is judged. One of 1 hour, 6 hours, 24 hours, 7 days — chosen by the caller, at the moment of the call, and fixed from then on.
The closing price is more than +2% above the stamped price. Strictly greater: exactly +2% is a miss, because a wash is not a win.
The +2% bar is an ASSUMPTION about what it costs to act — roughly 1% a side on pump.fun, plus slippage. It is not measured per trade and it is not discovered. Change it and every rate on this site changes, which is why it is one constant in one place rather than a number sprinkled through the code.
Everything settled that is not a hit, including a call that ended up +1%. Drawn at the same weight as a hit — same size, same contrast, different hue and a hollow mark instead of a filled one.
The window shut and no price could be read. It is NOT a miss. A rate limit on somebody else's API is a fact about this service, and recording it against a caller would give them something they cannot appeal.
Read once, when the first request arrives after the window shuts, and kept forever. There is no historical feed here, so grading against the price right now would silently judge an old call on days of extra drift.
How late that closing reading was taken. This register settles on request, not on a schedule, so a call can close at 04:00 and be read at 06:30. Every settled row prints its own lag rather than presenting the reading as taken on the bell.
A scheduler would shrink this number. Nothing would make it zero, so it is published instead of smoothed away.
Hits over settled calls. Open and ungradeable calls are excluded from the denominator and shown separately. With nothing settled the rate is not 0% — it is absent, and the caller sits in their own section.
A caller’s record can only be built from a CompleteSet, a type minted in one place — the register — over every call it holds for that person. Passing a filtered array does not compile.
record(calls.filter(c => c.mark === "HIT")) // rejected by tsc
and what it does not: a determined as unknown as CompleteSet defeats it in one line, and so would a second register that dropped rows before the set was built. scripts/check-complete.mjs greps for the first, refuses any second factory, and compiles a deliberate cherry-pick to confirm the compiler still rejects it. None of that is a guarantee — it raises the cost of doing it quietly and makes it visible in a diff. An enforcement claim that overstates itself stops people looking, which is worse than no claim at all.