This page checks out/map-2022.png and out/reporting-lag.png, built from the same out/stocks.csv.gz and the same raw archive. It answers one question: does the map faithfully represent the source, and where would I notice if it did not. The assertions in src/build_table.py and src/draw_map.py are the record; this page recomputes them in the browser, it does not replace them. Every number below is computed from the embedded data at load. Nothing is pre-aggregated, so every count clicks through to the rows behind it.
Sequential counts: a row removed as an aggregate is not counted again as a composite item. The standalone column is how many rows each rule matches on its own, and the two differ where rules overlap. Click a stage to read the rows it removed.
Element 5112 is filed in thousands of head. If the mapping were not one to one, the times-1000 scaling would hit the wrong rows and throw no error.
The composite row and the sum of mainland, Hong Kong, Macao and Taiwan for the selected year. A non-zero difference means the composite is not what the filter assumes it is.
The kept table, exactly as it sits in out/stocks.csv.gz. Value as filed and head after normalisation are always shown side by side, because hiding the filed value is how the thousands trap becomes invisible. Click an area to open its card in panel 3.
One row per geometry per species, read from out/map-2022-drawn.csv, which draw_map.py writes as it paints. The join key is the M49 code, so a wrong key produces a perfectly consistent picture of the wrong country: the flag will agree with the source row it matched, and the only thing out of place is the name. That is why the check that matters here is name similarity and distinct areas drawn, not flag agreement.
Similarity is a plain trigram overlap between the Natural Earth name and the FAO area name. Legitimate pairs score low too (Natural Earth "China" against FAO "China, mainland"), so the list is read, not thresholded.
Must be empty. On the broken build it holds China, Taiwan Province of.
Must be empty apart from the sentinel. Two geometries on one key means one country is about to be painted with another's data.
These render grey on every panel. The sentinel rows are geometries Natural Earth does not give a UN code at all; two of them are given one by hand in draw_map.py.
The country sum from the kept table against FAOSTAT's published World row, which the pipeline never uses as an input. The World row is a comparison, never a denominator. Click any cell for the areas with a series but no row in that year.
The FAO reclassified its own estimated and imputed labels between 2014 and 2015. Across that break the estimated share falls from about 24 per cent to 8 and the imputed share rises from 3 to 38, which reads as a collapse in data quality and is a change of vocabulary. The rule is drawn on every axis on this page for that reason.
lag_panel.py computes the per-country official share over whatever species each country happens to report; the adversarial review asked for it restricted to countries reporting all five. The two series differ and neither is picked silently here. Recomputed values are shown beside the shipped CSV; any disagreement is flagged.
The ratio is the imputed value over the last official one. A ratio of exactly 1.000 would mean the value was carried forward, which is not what the FAO does here.
Grey on every panel in every year. They are not gaps in reporting; there is no FAOSTAT area behind them.