Evidence
The criteria table on the home page points here. Each section is something you can check yourself: a test with its method and results, one published number followed back to the raw file, and the runbook format a handover comes with.
The criteria table on the home page points here. Each section is something you can check yourself: a test with its method and results, one published number followed back to the raw file, and the runbook format a handover comes with.
An automated test with axe-core 4.10.2 against the WCAG 2.0 and 2.1 level A and AA rules, plus manual checks for what automated tools cannot decide. Run on the home page, this page and the capability statement, in Chromium at desktop width, with reflow checked at 375 pixels.
Table 1. Checks and results
| Check | Result | What was found and done |
|---|---|---|
| Automated rules (axe-core) | 0 violations | Home page: 54 rule groups passed. Two issues found on the other pages and fixed: the capability statement had no main landmark, and a code sample on this page scrolled without keyboard access. |
| Text contrast in charts | Lowest 5.0:1 | axe cannot see the background behind chart text, so the colours of all 97 chart labels were measured separately. The lightest grey is 5.0:1 against white; AA needs 4.5:1. |
| Keyboard (2.1.1) | Fixed | Links, buttons and the Figure 1 logos are reachable with Tab and show a focus ring. The 98 dots in Figure 5 were mouse-only, so the same numbers now sit in a table under the chart. |
| Content on hover or focus (1.4.13) | Fixed | Tooltips closed when the pointer moved onto them and ignored Escape. They now stay open while hovered and close with Escape. |
| Text alternatives (1.1.1) | Pass | Each chart has a text description, and every logo in Figure 1 is labelled with the organisation, the work and the employer. |
| Reflow at 375 pixels (1.4.10) | Pass | No sideways page scroll. Wide charts scroll inside their own frame, which WCAG allows for content that needs two dimensions. |
Avo on ghost, 20 October 2026: after the GhostAvo figure on the home page was redrawn, the page was rechecked with axe-core 4.10.2 at 1280 and 375 pixels. No automated violations, and 35 applicable WCAG rule groups passed at each width. The drawing sits on a canvas, so axe could not see the background behind its three legend labels; their colour was measured separately at 5.4:1. All six controls are native sliders, reached with Tab and moved with the arrow keys. With reduced motion set, the opening movement does not play and a line of text says the controls can be dragged instead. Without WebGL the same contours are drawn as SVG. The scrolling figures made focusable in the earlier mobile check still pass, and no page overflow was found. The automated pass is backed by the manual checks in Table 1.
Method: I ran these tests myself, with the tools and versions above, so anyone can repeat them. On a client dashboard the same checks run before handover, and the results go in the handover pack.
Figure 2 on the home page labels its peak: 259.9c a litre for U91 in Sydney on 29 March 2026. Here is every step between the government file and that label.
March_2026.csv from the NSW FuelCheck price history on Data.NSW, licensed CC BY-SA. 147,138 rows, one for every price change at every NSW station, for every fuel. The row behind one of the last changes that day:
Pearl Energy Colyton,"86 GREAT WESTERN HWY, COLYTON NSW 2760",COLYTON,2760,Independent,U91,2026-03-29 22:52:29,259.5
Row 143,209 of the file.
Fuel code U91, postcodes 2000 to 2234 and 2740 to 2786, and prices between 100c and 400c, which drops keying errors. That leaves 8,346 price changes in March.
A station keeps its last price until it changes it. So each day uses every station's latest price by midnight, even one set days earlier. On 29 March, 701 stations had a price; 278 of them changed it that day.
Sorted, the 701 prices run from 147.5c to 299.9c. The middle one, the 351st, is 259.9c. A median, not an average, so a handful of stale or extreme prices cannot move it.
The day is written to data/fuel.json as {"d":"2026-03-29","p":259.9}, and the chart reads that file and labels the highest point.
Rebuilding from the 12 raw files reproduces data/fuel.json exactly: 133,246 price changes, 365 days, in 12 seconds. The script that does it is the one the runbook below describes.
Every build is handed over with a runbook in this format, so whoever maintains it can run, check and fix it without me. This one is for the pipeline behind Figure 2. A client runbook has the same sections, written for their system.
Turns twelve monthly FuelCheck files into one number a day: the median U91 price across Sydney stations. Output is site/data/fuel.json, which Figure 2 reads.
The twelve most recent monthly files from the FuelCheck price history on Data.NSW, saved unchanged in pipelines/fuel/raw/. They arrive as CSV and XLSX in three different layouts; the script reads all of them. Licence CC BY-SA, so the chart credits Data.NSW.
cd pipelines/fuel python3 build.py raw/ ../../site/data/fuel.json
Needs Python 3 and openpyxl. It takes about 12 seconds and prints, for each file, the rows read and the changes kept.
If any check fails it prints which one, stops, and leaves the published file as it was.
raw/. Download or remove it.parse_dt.python3 build.py raw/ --trace 2026-03-29
Prints the station count, the range, the median and the last raw rows for that day, with file and row numbers. The trace above came from this command.
The code, the raw files and this document are part of the handover. Nothing runs on my accounts.