Skip to content

This is one run, on 3 September 2026, published as it came out of the app. Five of its nineteen calls failed, two of them the agent's own publishing checks rejecting its report, and one figure in the final report disagrees with the table beside it. It is published unedited, and the disagreement is named below.

The prompt

The prompt, as typed

Screen NSW for data-centre land: rural- or industrial-zoned lots of 20 ha or more, within 5 km of a 330 kV or higher transmission line and 15 km of a transmission substation, within 3 km of a sealed arterial or highway, with fewer than 200 residents within 2 km but within 30 km of a town of 5,000 to 50,000 people. Exclude flood planning land and slope over 5 degrees, flag bushfire-prone land, and add the 30-year mean daily solar exposure so the same site could carry a co-located solar farm. Rank by area and map the top 25 with the transmission lines and substations.

Datasetsparcel_profiletransmission

19 tool calls39s analysis2 datasets

The prompt has nine tests and one flag. Zoning, lot size, slope and flood planning are parcel attributes. Distance to a 330 kV line, to a transmission substation and to a sealed arterial are proximity measures. Residents within two kilometres is a population sum. The town test needs the nearest town in a population band, not the nearest town. Solar exposure is a climate normal. None of these is a join the agent had to build. Each is a column on the parcel table, and the run is one filter over that table.

That is the point of the run. An earlier screen of this shape, published on this site, spent six failed calls and five minutes rebuilding a transmission distance and a neighbour count that the library already held. After that run the columns were named in the library and the packs, and this run reads them.

What the agent did

  1. Loaded expertiseLoaded expertise: data-centre land screening.
  2. Loaded expertiseLoaded expertise: report, briefing & editorial writing.
  3. Describe`parcel_profile` — 3,354,329 rows across 1 file(s). Columns: parcel_id BYTE_ARRAY, lot BYTE_ARRAY, plan_label BYTE_ARRAY, lat DOUBLE, lng DOUBLE, h3_r9 BYTE_ARRAY, area_m2 DOUBLE, area_source BYTE_ARR1.8s
  4. Ran a cell in the sandboxexited 1: LINE 17: ), both AS (failed · 36s
  5. Ran a cell in the sandbox┌───────┐1.8s
  6. Rendered a tableTOOL ERROR: column "H3 R9" shows the reader the plumbing ("H3" → areas) — alias it in the SQL (`count(*) AS "Land areas"`). Re-run the query with the column aliased and render the result — a documentfailed
  7. Rendered a mapRendered `data_2` as a points map titled "NSW data-centre land screen — top 25 lots by area" (25 features). Before placing it in a document: "NSW data-centre land screen — top 25 lots by area" measure
  8. Rendered a mapRendered `data_3` as a cells map titled "Transmission context for the top 25 screened lots" (43 features).
  9. Ran a cell in the sandboxexited 1: SyntaxError: unterminated string literal (detected at line 3)failed
  10. Ran a cell in the sandbox┌─────────────────────────────┬─────────┬────────────────┬───┬───────────────────┬──────────────────┬──────────────────┐
  11. Rendered a tableRendered `data_4` as a table (25 rows) titled "NSW data-centre land screen — top 25 lots by area". Note — a document may reject this table as it stands (an id first column or a plumbing header always;
  12. Ran a cell in the sandbox┌───────┬─────────────┬────────────┐
  13. Rendered a tableRendered `data_5` as a table (12 rows) titled "NSW data-centre land screen — 12 largest qualifying lots".
  14. Wrote the documentTOOL ERROR: this document is not publishable yet — 4 things to fix:failed
  15. Rendered a tableRendered `data_1` as a table (8 rows) titled "NSW data-centre land screen funnel".
  16. Wrote the documentTOOL ERROR: this document is not publishable yet — 4 things to fix:failed
  17. Rendered a mapRendered `data_2` as a points map titled "Top 25 qualifying NSW parcels by area" (25 features).
  18. Rendered a mapRendered `data_3` as a cells map titled "High-voltage transmission and substations near the top 25 parcels" (43 features).
  19. Wrote the documentRendered a report titled "NSW data-centre land screen" embedding 4 blocks: data_1 (table), data_5 (table), data_2 (map), data_3 (map). Their standalone copies from this turn have been removed — this r

5 calls failed and the agent recovered within the same run. Failures are shown because they happened.

Nineteen calls, five failed. The first query failed on a SQL syntax error in a common table expression. The first table render was rejected by the publishing check for showing a column called H3 R9. A Python cell failed on an unterminated string. The report was then rejected twice by its own checks, each time with four things to fix, before the third version passed. The analysis itself took under forty seconds of tool time; the run took just under three minutes end to end.

Result

NSW data-centre land screen

The NSW screen leaves 3,999 qualifying lots from 3,354,329 parcel records after the rural or industrial, size, grid, road, population, town, slope and flood-planning tests. The 25 largest range from 605.8 ha to 2,128.5 ha; bushfire-prone land is flagged on 3,562, while 3,071 remain unassessed by the flood-planning map.

Key findings

  • The final shortlist contains 3,999 lots, compared with 282,366 lots meeting only the rural or industrial, 20 ha and non-strata conditions.
  • The grid funnel leaves 27,686 lots near a 330 kV or higher line and 18,424 after the 15 km substation test, compared with 282,366 before infrastructure filters.
  • The 25 largest screened lots range from 605.8 ha to 2,128.5 ha, while the 12-row shortlist ranges from 734.9 ha to 2,128.5 ha.
  • Bushfire-prone land affects 3,562 of 3,999 final lots, whereas 3,071 are unassessed by the flood-planning map rather than confirmed outside it.

The full screen retains 3,999 lots against 3,354,329 source parcels

The cumulative funnel begins with 3,354,329 NSW parcel records and retains 282,366 rural or industrial non-strata lots of at least 20 ha. The grid test reduces that group to 27,686 lots within 5 km of a 330 kV or higher line and 18,424 also within 15 km of a transmission substation. The road and settlement tests reduce it further to 5,589 lots before the slope and flood-planning conditions leave 3,999. These are parcel counts, not hectares, and the final pool is 1.2 per cent of the source records.

NSW data-centre land screen funnel
Screen stageLots remainingMedian area of final lots (ha)Minimum solar exposure (kWh/m²/day)Maximum solar exposure (kWh/m²/day)Bushfire-prone lotsFlood-planning unassessed lots
NSW parcels in source3,354,329
Rural or industrial, >=20 ha, non-strata282,366
Also within 5 km of 330 kV+ line27,686
Also within 15 km of transmission substation18,424
Also within 3 km of sealed arterial/highway9,225
Also under 200 residents in 2 km screen7,919
Also within 30 km of 5,000-50,000 town5,589
Final screened lots3,99941.64.245.193,5623,071
Cumulative NSW parcel-screen stages and final solar, bushfire and flood-assessment counts · NSW parcel profile · current catalogue vintage, solar normal 1991–2020

The largest presented lots are 734.9 to 2,128.5 hectares

The 12-row shortlist is ordered by parcel area, with the largest lot at 2,128.5 ha and the smallest presented lot at 734.9 ha. The 12 presented lots therefore sit entirely above the requested 20 ha threshold, while the table retains the nearest high-voltage line and substation distances, road distance, sparse-population result, qualifying town, slope and solar exposure. Area is a ranking measure, not a combined suitability score.

NSW data-centre land screen — 12 largest qualifying lots
SuburbLocal government areaZoneZone nameArea (ha)Nearest 330 kV+ line (km)Nearest transmission substation (km)Nearest sealed arterial/highway (km)Residents in 2 km screenNearest qualifying townTown distance (km)Solar exposure (kWh/m²/day)Bushfire-proneFlood-planning statusLot/DP
MalleeWentworthRU1Primary Production2,128.50.993.442.960.1Mildura - Buronga (Mildura Part)10.985.16trueassessed: outside mapped flood planning land2//DP1182353
WallerawangLithgowRU3Forestry1,467.51.3761.333.8Lithgow6.954.61trueunassessed by this flood planning layer7071//DP1201227
CoombellRichmond ValleyRU3Forestry1,278.84.16.031.310.5Casino18.734.94trueunassessed by this flood planning layer42//DP1210739
KremnosClarence ValleyRU2Rural Landscape1,255.40.3814.162.7424.3Woolgoolga22.734.89trueassessed: outside mapped flood planning land742//DP621467
PenroseWingecarribeeRU3Forestry1,231.33.9814.661.750.6Moss Vale16.214.45trueassessed: outside mapped flood planning land7031//DP1202090
Ellangowan (NSW)Richmond ValleyRU3Forestry1,171.21.745.120.769.2Casino19.444.94trueunassessed by this flood planning layer13//DP1209388
BungendoreQueanbeyan-PalerangRU1Primary Production1,075.24.972.031.66126.5Canberra - Queanbeyan (Queanbeyan Part)16.824.71trueunassessed by this flood planning layer3//DP876579
Ravensworth (NSW)SingletonRU1Primary Production845.62.510.180.660.4Singleton13.444.8trueunassessed by this flood planning layer10//DP1204457
LemingtonSingletonRU1Primary Production821.80.388.12.322.5Muswellbrook18.624.86trueunassessed by this flood planning layer1//DP1112847
LanitzaClarence ValleyRU2Rural Landscape794.14.613.411.7433.7Grafton15.364.93trueassessed: outside mapped flood planning land165//DP789434
Swan ValeInverellRU1Primary Production746.70.386.781.993.9Inverell26.185.18trueunassessed by this flood planning layer1//DP1188925
BungendoreQueanbeyan-PalerangRU1Primary Production734.93.313.71.6718.7Canberra - Queanbeyan (Queanbeyan Part)27.524.68trueunassessed by this flood planning layer2//DP1039100
The 12 largest qualifying NSW lots by area, with grid, road, population, town, slope, bushfire, flood-planning and solar-screen attributes · NSW parcel and infrastructure data · current catalogue vintage, solar normal 1991–2020

The top 25 span 605.8 to 2,128.5 hectares and retain material constraint flags

The 25-lot map covers the 605.8–2,128.5 ha range. The accompanying grid-context map identifies 330 kV or higher transmission-line areas intersecting the shortlist and substation areas within 15 km. Bushfire-prone land affects 3,562 of the 3,999 final lots, compared with 437 not flagged; flood-planning status is less complete because 3,071 are unassessed rather than cleared. These figures support proximity screening, not connection capacity or flood safety. Solar exposure across the final pool ranges from 4.45 to 5.19 kWh/m²/day.

Top 25 qualifying NSW parcels by area
The 25 largest qualifying parcels, ranked by land area · NSW parcel screen · current catalogue vintage
High-voltage transmission and substations near the top 25 parcels
Mapped 330 kV or higher transmission-line areas intersecting the shortlist and substations within 15 km · NSW transmission data · current catalogue vintage

Notes on the data

  • This is a screening result, not a planning approval or a connection assessment. The zone and constraints are inherited from the parcel-centroid location; a 20 ha threshold carries plan-area uncertainty, and a title search and survey are required.
  • Transmission distances indicate proximity to 330 kV or higher lines and substations, not hosting capacity, connection cost or available load. No open long-haul fibre route, water-supply network, cooling-water entitlement or connection-queue data is included.
  • The population test is a sparsity screen based on the rural population sampling lattice. Solar exposure is the 1991–2020 modelled mean daily global horizontal irradiance in kWh/m²/day, suitable for preliminary co-location screening rather than an energy-yield estimate. Flood nulls are unassessed; bushfire-prone land is a flag, not an exclusion.
1 more figure the agent rendered on the way, which its report did not place
NSW data-centre land screen — top 25 lots by area
Lot/parcel IDLotPlanSuburbLocal government areaZoneZone nameArea (ha)Nearest 330 kV+ line (km)Nearest line voltage (kV)Nearest transmission substation (km)Nearest sealed arterial/highway (km)Nearest sealed arterial/highwayResidents in 2 km screenPopulation screen methodNearest 5,000–50,000 town (km)Nearest qualifying townRemoteness classSlope (degrees)Elevation (m AHD)Solar exposure (kWh/m²/day)Bushfire-proneFlood-planning statusMapped land use
2DP1182353MalleeWentworthRU1Primary Production2,128.50.993303.442.96Arumpo Road0.1sampled10.98Mildura - Buronga (Mildura Part)remote0.6259.045.16trueassessed: outside mapped flood planning landCropping
7071DP1201227WallerawangLithgowRU3Forestry1,467.51.3733061.33Great Western Highway3.8exact6.95Lithgowinner_regional4.4960.874.61trueunassessed by this flood planning layerProduction native forests
42DP1210739CoombellRichmond ValleyRU3Forestry1,278.84.1666.031.31Summerland Way0.5exact18.73Casinoouter_regional3.2381.064.94trueunassessed by this flood planning layerProduction native forests
742DP621467KremnosClarence ValleyRU2Rural Landscape1,255.40.3833014.162.74Orara Way24.3exact22.73Woolgoolgainner_regional3.98213.014.89trueassessed: outside mapped flood planning landOther minimal use
7031DP1202090PenroseWingecarribeeRU3Forestry1,231.33.9833014.661.75Hume Highway0.6exact16.21Moss Valeinner_regional4.13673.614.45trueassessed: outside mapped flood planning landPlantation forests
13DP1209388Ellangowan (NSW)Richmond ValleyRU3Forestry1,171.21.74665.120.76Summerland Way9.2exact19.44Casinoinner_regional3.2169.644.94trueunassessed by this flood planning layerProduction native forests
3DP876579BungendoreQueanbeyan-PalerangRU1Primary Production1,075.24.97662.031.66Molonglo Street126.5exact16.82Canberra - Queanbeyan (Queanbeyan Part)inner_regional0.57695.64.71trueunassessed by this flood planning layerGrazing modified pastures
10DP1204457Ravensworth (NSW)SingletonRU1Primary Production845.62.513210.180.66New England Highway0.4exact13.44Singletoninner_regional4.66110.534.8trueunassessed by this flood planning layerMining
1DP1112847LemingtonSingletonRU1Primary Production821.80.383308.12.32Jerrys Plains Road2.5exact18.62Muswellbrookinner_regional4.69123.944.86trueunassessed by this flood planning layerGrazing native vegetation
165DP789434LanitzaClarence ValleyRU2Rural Landscape794.14.613213.411.74Orara Way33.7exact15.36Graftoninner_regional2.5147.434.93trueassessed: outside mapped flood planning landGrazing native vegetation
1DP1188925Swan ValeInverellRU1Primary Production746.70.383306.781.99Gwydir Highway3.9exact26.18Inverellouter_regional3753.615.18trueunassessed by this flood planning layerCropping
2DP1039100BungendoreQueanbeyan-PalerangRU1Primary Production734.93.31663.71.67Tarago Road18.7exact27.52Canberra - Queanbeyan (Queanbeyan Part)inner_regional2.69730.864.68trueunassessed by this flood planning layerGrazing native vegetation
2DP1167699Lake GeorgeQueanbeyan-PalerangRU1Primary Production728.50.383306.021.75Tarago Road8.2exact23.7Canberra - Queanbeyan (Queanbeyan Part)inner_regional0.75682.594.71trueunassessed by this flood planning layerGrazing modified pastures
3DP109536Uralla (NSW)UrallaRU1Primary Production721.73.633305.551.74New England Highway16.3exact12.16Armidaleinner_regional0.961,052.25.05falseunassessed by this flood planning layerCropping
39DP830586ClifdenClarence ValleyRU2Rural Landscape713.81.143308.612.49Summerland Way34.2exact12.32Graftonouter_regional4.5376.374.93trueassessed: outside mapped flood planning landOther minimal use
12DP1155686TirrannavilleGoulburn MulwareeRU1Primary Production708.403306.41.01Braidwood Road18.5exact4.67Goulburninner_regional0.52638.274.66trueunassessed by this flood planning layerGrazing modified pastures
1DP1246686Good HopeYass ValleyRU1Primary Production672.91.983304.511.01Wee Jasper Road24.6sampled5.03Yassinner_regional2.83551.844.84trueassessed: outside mapped flood planning landGrazing modified pastures
6DP569308Breadalbane (NSW)Upper LachlanRU1Primary Production663.64.641328.431.32Cullerin Road10.9exact17.01Goulburninner_regional2.06699.934.73trueunassessed by this flood planning layerGrazing modified pastures
1DP748197Uralla (NSW)UrallaRU1Primary Production6573.483306.290.66New England Highway25.8exact11.2Armidaleinner_regional1.241,042.485.05falseunassessed by this flood planning layerGrazing modified pastures
1DP564941Rocky River (Uralla - NSW)UrallaRU2Rural Landscape645.74.613309.842.11Thunderbolts Way22.6sampled21.11Armidaleinner_regional3.01983.615.06falseunassessed by this flood planning layerGrazing modified pastures
10DP1016481Eglinton (NSW)BathurstRU1Primary Production638.50.383309.052.63Sofala Road30.2exact4.62Bathurstinner_regional1.91713.694.89trueassessed: outside mapped flood planning landGrazing modified pastures
1DP977426Laffing WatersBathurstRU1Primary Production625.90.381327.61.91Sofala Road42.4exact4.38Bathurstinner_regional2.3688.024.87trueassessed: outside mapped flood planning landGrazing modified pastures
2DP1122828Breadalbane (NSW)Upper LachlanRU1Primary Production6242.891326.141.01Cullerin Road17.4exact18.9Goulburninner_regional1.43698.584.73trueunassessed by this flood planning layerGrazing modified pastures
3DP1114623Camberwell (NSW)SingletonRU1Primary Production615.52.021326.171.32New England Highway4.7sampled9.67Singletoninner_regional1.6772.484.8trueunassessed by this flood planning layerGrazing modified pastures
34DP1210649GillenbahNarranderaRU3Forestry605.82.3733013.060.76Newell Highway1.9sampled28.89Leetonouter_regional0.26144.845.04trueunassessed by this flood planning layerProduction native forests

What the figures say

The funnel is the useful table. Of 3,354,329 NSW parcel records, 282,366 are rural or industrial lots of twenty hectares or more. The 330 kV test cuts that to 27,686 and the substation test to 18,424. The sealed arterial test halves it again to 9,225. The population, town, slope and flood tests bring it to 3,999 lots across 44 council areas, with a median area of 41.6 hectares.

The largest lot on the list is 2,128.5 hectares of cropping land at Mallee in Wentworth Shire, under a kilometre from a 330 kV line, 3.4 kilometres from a substation, three kilometres from the sealed Arumpo Road, with a rounded 0.1 residents within two kilometres and Mildura eleven kilometres away. The next eleven are between 735 and 1,468 hectares, at Wallerawang, Coombell, Kremnos, Penrose, Ellangowan, Bungendore, Ravensworth, Lemington, Lanitza and Swan Vale.

The local screen, run against the same parcel table before the prompt was sent, returns the same 3,999 lots, the same 3,562 bushfire-prone, the same 3,071 unassessed for flood planning, and the same top lot.

One figure is wrong. The report's third section says solar exposure across the final pool ranges from 4.45 to 5.19 kWh/m²/day. The funnel table it sits beside says 4.24 to 5.19, and the local screen agrees with the table. The report stays as the agent wrote it.

Code

bashthis cell failed
python3 - <<'EOF'
import zn
con=zn.lake_con()
PP=zn.read('parcel_profile')
# ranked survivors and funnel summary
screen_sql = f"""
WITH screened AS (
 SELECT parcel_id, lot, plan_label, suburb, lga_name, zone_code, zone_name,
        round(area_m2 / 10000.0, 1) AS area_ha, lat, lng, h3_r9,
        tx_330kv_nearest_km, tx_nearest_kv, substation_nearest_km,
        road_arterial_nearest_km, road_arterial_nearest_name,
        persons_2km, persons_2km_fill,
        town_5k_50k_nearest_km, town_5k_50k_nearest_name,
        remoteness, slope_deg, elevation_m, ghi_kwh_m2_day,
        bushfire_prone,
        CASE WHEN flood_planning IS FALSE THEN 'assessed: outside mapped flood planning land'
             ELSE 'unassessed by this flood planning layer' END AS flood_status,
        alum_label
 FROM {PP}
 WHERE zone_group IN ('Rural','Industrial')
   AND area_m2 >= 200000
   AND lot <> ''
   AND tx_330kv_nearest_km <= 5
   AND substation_nearest_km <= 15
   AND road_arterial_nearest_km <= 3
   AND persons_2km < 200
   AND town_5k_50k_nearest_km <= 30
   AND slope_deg <= 5
   AND flood_planning IS NOT TRUE
)
SELECT * FROM screened ORDER BY area_ha DESC, parcel_id LIMIT 25
"""
con.execute(f"COPY ({screen_sql}) TO '/workspace/out/datacentre_top25.csv' (HEADER)")
summary_sql=f"""
WITH c AS (
 SELECT zone_group IN ('Rural','Industrial') AND area_m2 >= 200000 AND lot <> '' AS c1,
        tx_330kv_nearest_km <= 5 AS c2,
        substation_nearest_km <= 15 AS c3,
        road_arterial_nearest_km <= 3 AS c4,
        persons_2km < 200 AS c5,
        town_5k_50k_nearest_km <= 30 AS c6,
        slope_deg <= 5 AND flood_planning IS NOT TRUE AS c7,
        flood_planning, bushfire_prone, area_m2, ghi_kwh_m2_day
 FROM {PP}
), k AS (SELECT *, c1 AND c2 AND c3 AND c4 AND c5 AND c6 AND c7 AS kept FROM c)
SELECT 'NSW parcels in source' AS stage, count(*) AS parcels, NULL::DOUBLE AS median_area_ha, NULL::DOUBLE AS solar_min, NULL::DOUBLE AS solar_max, NULL::BIGINT AS bushfire_flagged, NULL::BIGINT AS flood_unassessed FROM k
UNION ALL SELECT 'Rural or industrial, >=20 ha, non-strata', count(*) FILTER(c1), NULL, NULL, NULL, NULL, NULL FROM k
UNION ALL SELECT 'Also within 5 km of 330 kV+ line', count(*) FILTER(c1 AND c2), NULL, NULL, NULL, NULL, NULL FROM k
UNION ALL SELECT 'Also within 15 km of transmission substation', count(*) FILTER(c1 AND c2 AND c3), NULL, NULL, NULL, NULL, NULL FROM k
UNION ALL SELECT 'Also within 3 km of sealed arterial/highway', count(*) FILTER(c1 AND c2 AND c3 AND c4), NULL, NULL, NULL, NULL, NULL FROM k
UNION ALL SELECT 'Also under 200 residents in 2 km screen', count(*) FILTER(c1 AND c2 AND c3 AND c4 AND c5), NULL, NULL, NULL, NULL, NULL FROM k
UNION ALL SELECT 'Also within 30 km of 5,000-50,000 town', count(*) FILTER(c1 AND c2 AND c3 AND c4 AND c5 AND c6), NULL, NULL, NULL, NULL, NULL FROM k
UNION ALL SELECT 'Final screened lots', count(*) FILTER(kept), median(area_m2) FILTER(kept)/10000.0, min(ghi_kwh_m2_day) FILTER(kept), max(ghi_kwh_m2_day) FILTER(kept), count(*) FILTER(kept AND bushfire_prone), count(*) FILTER(kept AND flood_planning IS NULL) FROM k
"""
con.execute(f"COPY ({summary_sql}) TO '/workspace/out/datacentre_funnel.csv' (HEADER)")
# grid context: 330kV+ line cells overlapping top25 extent, plus substations within 15 km of any top25 lot
base_lines=zn.read('transmission',file='lines_h3r9')
base_lines_dim=zn.read('transmission',file='lines')
base_sub=zn.read('transmission',file='substations')
grid_sql=f"""
WITH top AS (SELECT h3_r9 FROM read_csv_auto('/workspace/out/datacentre_top25.csv')),
line_cells AS (
 SELECT l.h3_r9, max(l.voltage_kv) AS voltage_kv,
        'transmission line' AS feature, string_agg(DISTINCT coalesce(d.name,'unnamed line'), '; ') AS label
 FROM {base_lines} l LEFT JOIN {base_lines_dim} d USING(line_id)
 JOIN top t USING(h3_r9)
 WHERE l.voltage_kv >= 330
 GROUP BY l.h3_r9
), sub AS (
 SELECT s.h3_r9, max(coalesce(s.voltage_kv,0)) AS voltage_kv,
        'substation' AS feature, string_agg(DISTINCT s.name, '; ') AS label
 FROM {base_sub} s
 JOIN (SELECT DISTINCT lat, lng FROM read_csv_auto('/workspace/out/datacentre_top25.csv')) p
   ON h3_great_circle_distance(s.lat,s.lng,p.lat,p.lng,'km') <= 15
 GROUP BY s.h3_r9
), both AS (
 SELECT * FROM line_cells UNION ALL SELECT * FROM sub
)
SELECT h3_r9, max(voltage_kv) AS voltage_kv, string_agg(DISTINCT feature, ' + ') AS feature, string_agg(DISTINCT label, '; ') AS label
FROM both GROUP BY h3_r9
"""
con.execute(f"COPY ({grid_sql}) TO '/workspace/out/datacentre_grid_context.csv' (HEADER)")
print(con.sql("SELECT * FROM '/workspace/out/datacentre_top25.csv' LIMIT 2"))
print(con.sql("SELECT * FROM '/workspace/out/datacentre_funnel.csv' ORDER BY parcels DESC LIMIT 1"))
print(con.sql("SELECT * FROM '/workspace/out/datacentre_grid_context.csv' LIMIT 2"))
EOF
bashcell 2 of 5
python3 - <<'EOF'
import zn
con=zn.lake_con()
lines=zn.read('transmission',file='lines_h3r9')
dim=zn.read('transmission',file='lines')
sub=zn.read('transmission',file='substations')
sql=f"""
WITH top_sites AS (SELECT h3_r9 FROM read_csv_auto('/workspace/out/datacentre_top25.csv')),
line_cells AS (
 SELECT l.h3_r9, max(l.voltage_kv) AS voltage_kv,
        'transmission line' AS feature,
        string_agg(DISTINCT coalesce(d.name,'unnamed line'), '; ') AS label
 FROM {lines} l LEFT JOIN {dim} d USING(line_id)
 JOIN top_sites t USING(h3_r9)
 WHERE l.voltage_kv >= 330
 GROUP BY l.h3_r9
), substation_cells AS (
 SELECT s.h3_r9, max(coalesce(s.voltage_kv,0)) AS voltage_kv,
        'substation' AS feature,
        string_agg(DISTINCT s.name, '; ') AS label
 FROM {sub} s
 JOIN (SELECT DISTINCT lat, lng FROM read_csv_auto('/workspace/out/datacentre_top25.csv')) p
   ON h3_great_circle_distance(s.lat,s.lng,p.lat,p.lng,'km') <= 15
 GROUP BY s.h3_r9
), combined_features AS (
 SELECT * FROM line_cells
 UNION ALL
 SELECT * FROM substation_cells
)
SELECT h3_r9, max(voltage_kv) AS voltage_kv,
       string_agg(DISTINCT feature, ' + ') AS feature,
       string_agg(DISTINCT label, '; ') AS label
FROM combined_features
GROUP BY h3_r9
"""
con.execute(f"COPY ({sql}) TO '/workspace/out/datacentre_grid_context.csv' (HEADER)")
print(con.sql("SELECT count(*) AS cells FROM '/workspace/out/datacentre_grid_context.csv'"))
EOF
bashthis cell failed
python3 - <<'EOF'
import duckdb
con=duckdb.connect()
con.execute("COPY (SELECT * EXCLUDE (h3_r9, lat, lng) FROM read_csv_auto('/workspace/out/datacentre_top25.csv')) TO '/workspace/out/datacentre_top25_reader.csv' (HEADER)
")
print(con.sql("SELECT * FROM read_csv_auto('/workspace/out/datacentre_funnel.csv')"))
print(con.sql("SELECT count(*) AS n, min(area_ha) AS min_ha, max(area_ha) AS max_ha, min(ghi_kwh_m2_day) AS min_ghi, max(ghi_kwh_m2_day) AS max_ghi, sum(CASE WHEN bushfire_prone THEN 1 ELSE 0 END) AS bushfire FROM read_csv_auto('/workspace/out/datacentre_top25.csv')"))
print(con.sql("SELECT parcel_id, suburb, lga_name, area_ha, zone_code, ghi_kwh_m2_day, bushfire_prone FROM read_csv_auto('/workspace/out/datacentre_top25.csv') LIMIT 5"))
EOF
bashcell 4 of 5
python3 - <<'EOF'
import duckdb
con=duckdb.connect()
q="""COPY (SELECT * EXCLUDE (h3_r9, lat, lng) FROM read_csv_auto('/workspace/out/datacentre_top25.csv')) TO '/workspace/out/datacentre_top25_reader.csv' (HEADER)"""
con.execute(q)
print(con.sql("SELECT * FROM read_csv_auto('/workspace/out/datacentre_funnel.csv')"))
print(con.sql("SELECT count(*) AS n, min(area_ha) AS min_ha, max(area_ha) AS max_ha, min(ghi_kwh_m2_day) AS min_ghi, max(ghi_kwh_m2_day) AS max_ghi, sum(CASE WHEN bushfire_prone THEN 1 ELSE 0 END) AS bushfire FROM read_csv_auto('/workspace/out/datacentre_top25.csv')"))
EOF
bashcell 5 of 5
python3 - <<'EOF'
import duckdb
con=duckdb.connect()
q="""COPY (SELECT suburb, lga_name, zone_code, zone_name, area_ha, tx_330kv_nearest_km, substation_nearest_km, road_arterial_nearest_km, persons_2km, town_5k_50k_nearest_name, town_5k_50k_nearest_km, ghi_kwh_m2_day, bushfire_prone, flood_status, parcel_id AS "Lot/DP" FROM read_csv_auto('/workspace/out/datacentre_top25.csv') ORDER BY area_ha DESC, parcel_id LIMIT 12) TO '/workspace/out/datacentre_top12_reader.csv' (HEADER)"""
con.execute(q)
print(con.sql("SELECT count(*) AS rows, min(area_ha) AS smallest_ha, max(area_ha) AS largest_ha FROM read_csv_auto('/workspace/out/datacentre_top12_reader.csv')"))
EOF

The screen is one query. The map cells are the second query: it unions the H3 cells that carry a 330 kV or higher line with the cells that hold a substation, within the area the top 25 lots cover, and labels each cell by what it holds. Lots are drawn as points at the parcel centroid because a map block carries one form at a time.

Limits of this run

Zoned for a data centre is not a phrase this run uses. Data centres are permitted with consent in the NSW employment and industrial zones. Every lot on this shortlist is rural. On rural land a data centre is a planning proposal or a State Significant Development question, and above 15 megawatts of power consumption it is the latter regardless of zone. The screen finds land with the physical attributes; it does not find land that is approved.

Proximity is not capacity. A lot a kilometre from a 330 kV line has no claim on that line. Hosting capacity, connection cost, the connection queue and the new ministerial grid-connection controls for facilities over five megawatts are not in any open dataset. The same applies to water: no open source maps the reticulated supply or recycled-water availability the NSW Data Centre Guidelines expect.

Fibre is absent. No open dataset carries long-haul fibre routes. The library's broadband layer records private fibre estates and NBN technology at the cell, which is not backhaul.

Residents within two kilometres is a census-night sum over a lattice. The population layer places each rural mesh block's people on a coarse grid, so a rounded 0.1 residents means the disk touched a sampled cell, not that a tenth of a person lives there. The table carries a fill-quality column for exactly this reason.

Flood planning is unassessed for most of the shortlist. Only some councils publish the flood planning layer. 3,071 of the 3,999 lots sit in councils that do not, and the report reports them as unassessed rather than clear.

Solar exposure is a resource, not a yield. The 1991 to 2020 mean daily global horizontal irradiance says how much sun reaches the ground. Tilt, tracking, module temperature, losses and curtailment are not in it. It ranks sites; it does not size a farm.

Bushfire-prone land is a flag. 3,562 of the 3,999 lots carry it. Excluding on it would have removed almost the entire shortlist, which is why the prompt asked for a flag.

Run it on your own criteria

The thresholds are the prompt's: twenty hectares, five kilometres, fifteen kilometres, three kilometres, two hundred residents, thirty kilometres, five degrees. Each is a number in the question. The same screen runs with different numbers, a different zone list, a different voltage, or a polygon of your own. To run it, request access. Related pages: renewable energy siting and renewable energy developers.

Run it on your own portfolio

Zenancy is in private preview with Group 2 reporters and their advisers.

Request access