Reading a report
What the score, grades, findings, severities, and the request waterfall actually mean.
The score#
The 0–100 score is Harpoon's own transparent metric — deliberately not a Lighthouse score. Five dimensions are each scored 0–100 from concrete signals in your capture, then combined with fixed weights. The gauge on every report shows the exact breakdown, so the score is never a black box:
| Dimension | Weight | What moves it |
|---|---|---|
| Render-blocking JS/CSS | 30% | How late render-blocking resources finish, plus how many there are. |
| Critical path length | 20% | Dependency-chain depth and the absolute page-load span. |
| Third-party overhead | 20% | Third parties' share of bytes and their total request time. |
| Cache quality | 15% | Bytes of static assets served without adequate caching. |
| Asset efficiency | 15% | Bytes recoverable via compression, de-duplication, or right-sizing. |
Grades band the overall score: A ≥ 90, B ≥ 75, C ≥ 60, D ≥ 40, F below that.
Findings & severities#
Findings are discovered by deterministic rules — one per performance concern. Each carries a severity (critical, high, medium, low, info), the concrete evidence (the requests, bytes, and milliseconds involved), and its measured impact. The default trigger thresholds:
| Rule | Flags (defaults) |
|---|---|
| Render-blocking | Scripts/styles that delay first paint, individually and in aggregate. |
| Cache quality | Cacheable static assets with no policy, or max-age under 1 day. |
| Compression | Compressible text assets over ~1.4 KB served uncompressed. |
| Large assets | Scripts > 300 KB, stylesheets > 100 KB, images > 500 KB, fonts > 200 KB, anything else > 1 MB. |
| Slow requests | Any request taking over 1 s. |
| Redirect chains | Two or more redirects in a row. |
| Third-party overhead | Third parties over 40% of transfer or 1.5 s of blocking time. |
| Duplicate assets | The same asset fetched more than once. |
| Critical chains | Request dependency chains 3+ levels deep (needs initiator data in the HAR). |
| Waterfall gaps | Idle gaps of 300 ms+ on the critical timeline. |
The request waterfall#
The waterfall lists every request with a phase-colored timing bar: blocked (queueing), dns, connect (incl. TLS), send, wait (time to first byte), and receive. A long wait is your server thinking; a long receive is a heavy response; lots of blocked means connection contention.
Sort by size, time, status, or type; filter by URL text or resource type. The table is virtualized, so captures with thousands of requests stay smooth.
Same capture, same report#
The engine is deterministic: identical HAR input produces identical findings, values, and finding ids, every time. That's what makes comparisons and trends trustworthy — a change in the report always reflects a change in the capture, never noise from the tool. The AI report is a separate, clearly-marked layer on top.