Phoenix · Heat · Schools

Shade Before the Bell

Phoenix children walk out of school into 40 °C air. If the city can only shade a few schools a year, which should go first? I put the question to FortyGuard's temperature data, and checked its answers before believing them.

By Abhra Kanti DubeyNovember 2026Built with Claude Code and the FortyGuard Temperature MCP

I built a small agent in Claude Code that asks FortyGuard's Temperature MCP about the heat around 14 elementary schools, measures the shade around each one, and writes a short brief for the schools at the top of the list. Along the way the data nearly misled me three times. Those detours turned out to be the most useful part of the work, so they are in here too.

1The heat is the same everywhere

Figure 1Air temperature at the 3 pm bell
Each dot is one school: the mean of a FortyGuard heatmap over a square of about 400 m around it. Thirteen sit inside half a degree; the outlier is Desert Trails, in the far north. Source: FortyGuard heatmap, Tuesday 12 August 2025, 15:00 local.
Figure 2Tree canopy within 100 m of each school
Share of ground under trees at least 3 m tall, from the Meta and World Resources Institute 1 m canopy height map. FortyGuard's own satellite estimate for the same circle, for comparison. Sources: Meta & WRI canopy map (imagery January to April 2020); FortyGuard satellite.

2What does differ is shade

Shade is also the thing a tree programme can change. So the agent ranks schools on canopy, and uses the feels-like temperature only to break ties.

3The data I almost trusted

FortyGuard's satellite tool estimates what covers the ground around a point, and my first ranking used it. Then I looked at aerial photos of every school with its 100 m circle drawn on. Wilson Elementary was the clearest case.

Figure 3Wilson Elementary School, inside the red circle
Aerial photo of Wilson Elementary School with its 100 metre circle drawn in red; a large grass sports field fills the left half of the circle, the school building the right
The red circle has a 100 m radius, centred on the school's map point. Imagery: USGS The National Map (public domain), which may be newer than the satellite images either estimate used.

The photos caught a second problem, this one in my own inputs. Moya Elementary's map point, taken from OpenStreetMap, sat in the mobile-home park next door. I moved it onto the school and collected its data again; the first set is kept in the repository.

Figure 4Moya Elementary: where the map said it was, and where it is
Aerial photo with a red dot among the rows of a mobile-home park, west of Moya Elementary School
Before: OpenStreetMap's point, in the mobile-home park
The same aerial photo with the red dot on the main school building
After: moved onto the main school building

The third detour was simpler. FortyGuard's heatmap failed for the area around Hopi Elementary in Arcadia on three separate attempts, so that school is left out rather than ranked on missing data.

4The shortlist

Ranked by least canopy, these are the schools to visit first. The five are close to one another, so treat them as a group rather than a strict order; Lookout Mountain is clearly the lowest. Select any school to see it from above with its 100 m circle, and every number with a link to the data it came from.

Figure 5Fourteen Phoenix elementary schools, numbered by shade priority
Less canopyMore
#SchoolTree canopyFortyGuard est.Feels likeAir
Ranked by tree canopy within 100 m, lowest first; ties go to the higher feels-like temperature. The orange line marks the five to visit first. Aerial view: USGS The National Map. Street map © OpenStreetMap contributors. School locations: OpenStreetMap.

5How it's built

The agent runs in Claude Code, connected to FortyGuard's Temperature MCP. The method is written down as a Claude Code skill, so it can be rerun for other U.S. schools, dates or cities by asking for it.

For each school it requests a heatmap at the bell and reads it back with heatmap_read. It then passes FortyGuard's own temperature into env_params to get the feels-like figure, so nothing in that chain is guessed. Finally, satellite provides the land-cover estimate. A small Python client saves every reply, with the exact request, to an evidence folder. A checker then reads every brief and fails it if any number is missing a source or doesn't match the saved reply.

6What this can't tell you