File S2. Google Earth Engine and Python scripts, Overpass query, second-reading files, GRAC reference sample and construction-date imagery

1. DW_habitat_screening_IMPROVED_V3.js
   Dynamic World screening within the habitat types as first implemented (ten-pixel patch filter on a
   20 m grid; reported as the "20 m variant" in Table S3).
   Snapshot: https://code.earthengine.google.com/874a58eb2b303cf19a828c9b039ec7b6
2. Solar_baseline_QUICK_v2.js
   Dynamic World baseline land cover within the solar-site polygons (Section 2.6, Table 5); the eight sites
   PV697-PV704 were processed with the same code.
   Snapshot: https://code.earthengine.google.com/afe4190521777c0d61c16d880981985b
3. R1_validation_sample_DW.js
   Stratified random reference sample (250 locations, 50 per stratum; five map strata) used for the
   accuracy assessment (Section 2.4, Table S4).
4. R1_interpretation_app.js
   Interpretation interface: annual Sentinel-2 composites (true colour, false colour, NDVI), NDVI
   series of the pixel and coordinates for Google Earth historical imagery. The map stratum is never
   shown. Locations were presented in point_id order (random with respect to stratum).
5. R1_DW_strata_sensitivity_tiles.js
   Stratum areas for the accuracy estimators, the ten decision-rule variants (Table S3) and the 10 m
   values of Table 4, computed per 10 km tile (EPSG:3035) and summed.
6. R1_accuracy_estimation.py
   Stratified estimators of overall, user's and producer's accuracy and of the area of reference
   change with 95% confidence intervals (Olofsson et al. 2014; Stehman 2014).
7. R1_grac_at_points.py
   Reads the GRAC 2018-2021 and 2021-2024 values (20 m) at the reference locations.
8. R1_grac_check.py
   Check of the GRAC loss class with the same reference sample, using the stratified estimators for
   strata that differ from the map classes (Stehman 2014) (Section 3.4, Table S4, sheet "GRAC check").
9. R1_second_reading/
   Blinded second reading of the locations first labelled as change (Section 2.4):
   the protocol (criteria.txt), the anonymised monthly NDVI input series (ndvi_series_anonymised.txt)
   and the evaluation labels and notes (second_reading_labels.csv).
   The second reading was done by the interpreter (M.T.), who inspected the series of every location and
   decided its label; the series were presented, and the labels and notes recorded, in one browser session
   with an AI assistant (Claude, Anthropic), and every recorded label was checked by the interpreter.
10. R1_OSM_solar_sites_overpass.txt
   Overpass query for the OpenStreetMap solar-site extraction (Section 2.5). With its date setting (20:30 UTC on
   1 September 2026) it returns 696 closed ways and 8 multipolygon relations that correspond one-to-one to
   PV001-PV696 and PV697-PV704 in File S1.

11. GRAC_reference_sample/
   GRAC-stratified reference sample used to assess the GRAC loss and gain classes and to estimate the area of
   reference grassland loss (Sections 2.3 and 3.3; Table S5).
   R1_GRAC_sample.py                   draws the sample (seven strata from the two GRAC products; 250 cells;
                                       seed 20261009); needs the GRAC tiles and the ExEA habitat layer
   R1_GRAC_evidence_GEE.js             Earth Engine script that reproduces the evidence shown to the interpreter
                                       (Sentinel-2 May-September composites 2018, 2021, 2024; monthly NDVI)
   R1_GRAC_interpretation_protocol.txt the written protocol (reference definition, decision cues) and notes on
                                       the evidence and the procedure
   R1_GRAC_NDVI_monthly.csv            the monthly NDVI input of each location (point_id, year, m01-m12)
   R1_GRAC_labels.csv                  the labels: grassland yes/no/uncertain in 2018, 2021, 2024; change in
                                       each period; cover type; interpreter's note
   R1_GRAC_sample_strata_codes.csv     stratum and GRAC classes of each location (no coordinates)
   R1_GRAC_strata_area.csv             cells and area of each stratum
   R1_GRAC_accuracy.py                 stratified accuracy and area estimates, normal and bootstrap intervals
                                       (uses R1_accuracy_estimation.py in the parent folder)
   R1_GRAC_results.json, R1_GRAC_summary.csv   outputs of R1_GRAC_accuracy.py
   R1_GRAC_eucropmap_GEE.js            Earth Engine script that tabulates EUCROPMAP 2018 and 2022 over the four
                                       10 m pixels of each cell (cell coordinates to be supplied; not published)
   R1_GRAC_eucropmap_raw.json          its output: pixel counts per EUCROPMAP class for each cell
   R1_GRAC_eucropmap_compare.py        compares the labels with EUCROPMAP (Section 3.3; Table S5, sheet
                                       "EUCROPMAP_check"); run in this folder: python3 R1_GRAC_eucropmap_compare.py
   Run: python3 R1_GRAC_accuracy.py R1_GRAC_sample_strata_codes.csv R1_GRAC_strata_area.csv R1_GRAC_labels.csv R1_GRAC
   The labels were made on 9 October 2026 under the written protocol, blind to the strata, the GRAC
   classes, other land-cover products and the coordinates (Section 2.3); each location was read once.
   The interpreter (M.T.) inspected the evidence of every location and decided each label. The evidence panels
   (R1_GRAC_evidence_GEE.js) were presented in batches, and the labels and notes recorded, in one browser
   session with an AI assistant (Claude, Anthropic) instead of separate Code Editor tabs; every recorded label
   was checked by the interpreter.

12. R1_construction_dates_imagery_GEE.js
   Sentinel-2 and Landsat image chips of Figure S2 for the 17 dated solar sites (Table 6, Table S2): the last
   summer without panels, the first year with panels (August-December composite) and a later year, on square
   EPSG:3035 extents around the File S1 polygons. Checked on 13 October 2026: the script reproduces the chips of
   Figure S2 pixel for pixel.

The habitat asset referenced in the scripts is derived from the ExEA national habitat mapping and is
not redistributed; it is available from ExEA under its access conditions (reference [25]).

Point coordinates of the reference sample are not published; they are available from the corresponding
author on reasonable request.
