| Host-dependent content | Staging hostnames, localhost, archive URLs and the "Retrieved <date>" citation stamp rewrap every block below them | Text-walker rewrites to a canonical origin, PR #6 |
| Copy-to-clipboard buttons | Need a secure context, so production has them and plain-HTTP staging never does; they share a flex row with the code they copy | Removed before the shot, PR #6 |
| Archived-version link | Only production has one, and it takes a line in the header | Removed, PR #6 |
| Charts redrawing during capture | The full-page screenshot collapses the viewport to 1×1 for ~175 ms; mobile CSS collapses the containers, grapher re-measures and redraws small, and its 400 ms debounce lands after the pixels are read | Pin container widths inline and freeze window.innerWidth/innerHeight, PR #7 |
| HTTP error pages | A staging server down for a minute produced six nginx 502 images committed as that branch's screenshots | --fail in run.sh, PR #8 |
| CSS motion | The cookie banner fades in over the last rows, so two runs catch it at different opacities — 2,705 px at 10/255 | Freeze all transitions and animations, PR #9 |
| Charts still loading | A spinner or a half-width chart shifts everything below it | Wait for quiet, then fail rather than shoot, PR #9; budget raised to 180 s in PR #10 |
| Browser-computed dates | The homepage kicker ("7 DAYS AGO") and a data insight's dateline ("Today"/"Yesterday") are rendered from dayjs(), so they record when the shot was taken. The --is-today class also turns the dateline vermillion | Canonicalise both, and drop the highlight class, PR #11 |
| Blank charts | A grapher that mounted but never announced itself has an empty .GrapherComponent, a zero loading count and no spinner, so the page reads as finished and is photographed with a white box — 68,959 px on one branch, 23.6% on another | Settle on "every visible placeholder holds a non-empty chart", PR #12 |
| Homepage editorial content | Production and staging serve different featured articles, because staging is baked from a DB snapshot taken when its container was created. The list is offset by one and the page shifts — 22.1%, six branches at once. Not normalisable: there is no value to agree on | Remove the featured-work, announcement and data-insight items, PR #13 |
| Image source flipping | 58 of 66 images on /life-expectancy are a <picture> whose <source sizes="350px"> beats an <img> carrying a w=1200–w=3542 fallback. At the capture's 1×1 viewport the source stops winning and the browser falls back, so the same picture is drawn from a different file — 66,596 px at 1–3/255, four branches | Pin img.src = img.currentSrc and drop the candidates, for loaded images only, PR #14 |
| Thumbnails that are in the shot but never arrived | An unloaded <img> renders its alt text, and whether a lazy thumbnail got that far varies: /energy's reference is missing two the branch runs have — 21,250 px, three branches | Force loading = "eager" on painted-and-unloaded images and await them, in bounded rounds, PR #14 |