Results
Validation
Browser numbers cannot be proven honest. They can be made hard to fake by accident and awkward to fake on purpose.
Tickets
- Issued
- When a run starts, by POST /api/ticket. HMAC-signed with a server secret.
- Minimum age
- 30 s when the result arrives (8 s for development quick runs).
- Maximum age
- 30 minutes.
- Duration
- The claimed run duration cannot exceed the ticket's age plus 5 s.
- Single use
- The nonce is written to used_tickets in the insert transaction; a replay returns 409.
Rules
The server recomputes the score and applies these checks to every submission.
| Condition | Flag | Outcome |
|---|---|---|
| Unknown engine version | engine-mismatch | Rejected |
| Fewer than 5 kept samples in a phase (3 for latency) | insufficient-samples | Rejected |
| A phase reports zero or a non-finite value | zero-throughput, non-finite | Rejected |
| Random above 0.5 × read | implausible-random | Rejected |
| Copy above 1.2 × the larger of read and write | implausible-copy | Rejected |
| Sustain above 1.1 × copy | implausible-sustain | Rejected |
| Latency below 60 ns or above 100 µs | implausible-latency | Rejected |
| Run shorter than 30 s | too-short | Rejected |
| Any phase above 1.1 × a fixed published peak | exceeds-published-peak | Rejected |
| Quick mode submitted to production | quick-mode | Rejected |
| Above a fixed published peak, within 10 % | above-published-peak | Unranked |
| Above 1.1 × the envelope of a variable class | above-spec-envelope | Unranked |
| Model hidden, or WebGL and WebGPU disagree | model-unresolved | Unranked |
| Model parsed but not in the spec table | model-unlisted | Unranked |
| Software renderer | software-adapter | Unranked |
| Working set below 256 MiB | reduced-workload | Unranked |
| Read, write or copy spread above 25 % | unstable | Unranked |
| Wall-clock timing, hidden tab, declared form factor, clamped byte count | wall-clock-timing and others | Note |
The same checks bound what reaches The Stack totals: working sets must be engine-shaped, and byte counts are capped at duration × peak throughput.
Flag meanings
What a result shows for each flag, rendered from src/lib/shared/resultView.ts.
quick-mode | Quick mode: shortened phases for development. Not part of The Stack's production data. |
|---|---|
model-unresolved | This browser hides the GPU model, so the run cannot join a device class. Chrome and Edge expose it. |
software-adapter | A software renderer ran this test instead of your GPU. |
reduced-workload | The browser capped buffer sizes, so the working set was smaller than standard. |
unstable | Samples varied by more than 25 %. Close other GPU work and run again. |
above-spec-envelope | Throughput above the published peak for this class. Flagged for review. |
above-published-peak | Throughput slightly above the published peak (overclocked memory or a measurement error). Measured, not ranked. |
model-unlisted | This GPU model has no published memory spec on file yet, so its runs cannot rank until the class is added. |
bytes-moved-clamped | The reported data volume exceeded what the run could have moved and was capped. |
duration-mismatch | The run reported a longer duration than the time since it started. |
exceeds-published-peak | Throughput above the published peak for this device: caching or tampering. |
insufficient-samples | Too few stable samples to report. |
inconsistent-stats | The reported statistics contradict each other, so the run cannot be trusted. |
duplicate-result | This exact result was already submitted. |
implausible-random | Scattered reads outran sequential reads, which a real memory system cannot do. |
implausible-copy | Copy throughput is inconsistent with read and write. |
implausible-sustain | Sustained throughput is inconsistent with copy. |
implausible-latency | Latency outside any physical range. |
too-short | The run finished faster than the workload allows. |
engine-mismatch | Unknown benchmark engine version. |
zero-throughput | A phase reported no throughput. |
non-finite | A phase reported an invalid number. |
wall-clock-timing | Timed with the wall clock because GPU timestamps were unavailable. |
tab-hidden | The tab was hidden for part of the run. |
declared-laptop | Form factor declared as laptop. |
declared-desktop | Form factor declared as desktop. |
Limits
- Tickets
- 40 per hour per client address
- Submissions
- 24 per hour per client address, 60 per day per operator
- Body
- 256 KB, enforced while streaming
Browser numbers cannot be proven honest. The checks keep obviously invalid runs off the boards; points are capped and every competitive reward is class-relative, so a forged number buys little.