U of I × MindRouter App Gallery

Extension Atlas

Administration Built with OpenCode v1.18.21 Critic status: shipped

Extension Atlas

U of I Extension across Idaho's counties

One map of University of Idaho Extension's statewide presence: county offices, research and Extension centers, and program areas — searchable, filterable, and ready for planning conversations.

Extension Atlas running on a desktop screen, u of i extension across idaho's counties Desktop · click to enlarge
Extension Atlas running on a phone, u of i extension across idaho's counties
Phone · click to enlarge

What it is ✎ blurb written by the AI critic

A map of University of Idaho Extension across Idaho's 44 counties: 45 county and tribal offices and 10 research and Extension centers, taken from the university's public pages and placed with the Census Bureau geocoder. Shade counties by 2020 population, population per office or distance to the nearest office, filter by region or program area, and click a county, marker or table row to see an address and a link to the office's page. Type a town or click the map to list the five closest locations by straight-line distance, then export the table as CSV or the map as PNG.

Try this

  1. Type 'Stanley' under Nearest office, press Find nearest, and look at the dashed lines drawn to the five closest locations
  2. Switch 'Shade by' to Distance, then click Shoshone County (it has no office of its own) to see its three nearest locations and their distances
  3. Choose 'Natural resources' under Program area, then click one of the three table rows to jump to that office on the map

Highlights ✎ written by the AI critic

  • SVG map of all 44 Idaho counties with 55 office and center markers; the 14 approximately placed locations are marked and explained
  • Three shading modes: 2020 Census population, population per office, and distance to the nearest office
  • Nearest-office tool: type one of 235 Idaho cities or census places, or click the map, to list the five closest locations with mileage and lines on the map
  • Search plus office-type, region and program-area filters, kept in sync across the map, region cards and a sortable table
  • CSV export of the filtered table and PNG export of the map with title, legend and data credit

Who it's for

Extension administrators and educators, county partners, the public

Features

  • Hand-drawn SVG choropleth of Idaho's 44 counties (projection coded in JS), with office and center markers
  • Search box and filters (office type, region), and a side panel with details and a link to the office's public page
  • Choropleth metric switcher (population, population per office, distance to nearest office computed from centroids)
  • 'Nearest office' tool: click anywhere or enter a city to find the closest locations with straight-line distances
  • Regional summary cards and a sortable table synced with the map
  • Export the table as CSV and the map as PNG

Data & sources

  • tigerweb.geo.census.gov — U.S. Census Bureau TIGERweb State_County, Counties layer (Jan 1 2026 vintage): 44 Idaho county polygons
  • U.S. Census Bureau 2020 Census total population (POP100) by county via TIGERweb tigerWMS_Census2020 layer 82 (Census Data API now requires a key)
  • U.S. Census Bureau TIGERweb Places (Incorporated Places + Census Designated Places): internal points for city search and approximate town locations
  • geocoding.geo.census.gov — U.S. Census Bureau Geocoder (Public_AR_Current benchmark): coordinates for the 55 published office/center addresses (47 matched)
  • www.uidaho.edu — University of Idaho Extension county locations directory, source of district/region classes, and 45 county/tribal office pages (addresses, phones, program areas)
  • www.uidaho.edu — University of Idaho Idaho Agricultural Experiment Station Research and Extension centers page and 10 center pages
Full data provenance ✎ written by the AI reviewer

Raw data sources — extension-atlas

All files were retrieved on 2026-09-13 (approx. 17:50–18:10 UTC) with plain HTTP GET requests, User-Agent UIdaho-gallery-data-prep/1.0, one request at a time. No request bodies, no API keys, no cookies. Every file is the unmodified response body. The only exception is census_geocoder_offices.json, a bundle. It wraps each unmodified geocoder JSON response with the query that produced it; see section 6.

Total size of data/raw/: 11,015,206 bytes (≈11.0 MB) in 63 data files, plus this SOURCES.md (≈38 KB), 64 files in all (byte counts per file below).

Quick map:

#File(s)WhatPublisher
1tigerweb_idaho_counties.geojson44 Idaho county polygons (WGS84)U.S. Census Bureau (TIGERweb)
2tigerweb_census2020_idaho_county_population.json2020 Census population (POP100) for the 44 countiesU.S. Census Bureau (TIGERweb, Census 2020 layers)
3tigerweb_idaho_incorporated_places.json, tigerweb_idaho_census_designated_places.jsonIdaho cities/CDPs with internal-point lat/lon (for city-level fallback locations)U.S. Census Bureau (TIGERweb)
4uidaho_extension_county_directory.html, uidaho_extension_home.html, uidaho_iaes_centers.htmlOfficial listing pages: county offices directory (with district map), Extension home, Research & Extension centersUniversity of Idaho
5uidaho_county_pages/*.html (45), uidaho_center_pages/*.html (10)One public page per county office / tribal office / center; the office address is only on these pagesUniversity of Idaho
6census_geocoder_offices.jsonCensus Geocoder responses for the 55 published street addressesU.S. Census Bureau (Geocoder)

1. tigerweb_idaho_counties.geojson (63,926 bytes)

  • URL (GET): https://tigerweb.geo.census.gov/arcgis/rest/services/TIGERweb/State_County/MapServer/1/query?where=STATE%3D%2716%27&outFields=NAME,BASENAME,GEOID,STATE,COUNTY,AREALAND,AREAWATER,CENTLAT,CENTLON,INTPTLAT,INTPTLON&returnGeometry=true&maxAllowableOffset=0.005&outSR=4326&f=geojson

  • Publisher: U.S. Census Bureau, TIGERweb REST service TIGERweb/State_County MapServer.

  • Layer check: layer id 1 is "Counties". The layer metadata (.../MapServer/1?f=json) says "Counties (or statistically equivalent entities); January 1, 2026 vintage". In that service, layers 0/1, 2/3, … are the same States/Counties features at different display scales. Layer 1 is the first Counties layer.

  • Contents: GeoJSON FeatureCollection with 44 features, one per Idaho county (FIPS 16001–16087, odd codes). Validated: the file parses, has 44 unique GEOIDs and every Idaho county name including Shoshone, and exceededTransferLimit is absent (not truncated).

  • Geometry: all 44 are Polygon with exactly one ring each (no holes, no MultiPolygons). There are 2,820 vertices in total. Coordinates are [lon, lat] in WGS84 degrees (outSR=4326) with no crs member. Rings are closed, and exterior rings are counter-clockwise in lon/lat (RFC 7946 order). The bbox is lon −117.243 … −111.044, lat 41.989 … 49.001. Server-side generalization maxAllowableOffset=0.005 degrees (≈0.4–0.55 km) rounds coordinates to 3 decimals. That is fine for a statewide SVG map, but adjacent counties may not share identical vertices. Note: these are TIGER/Line-based boundaries (not the "cartographic boundary" shoreline-clipped files); for Idaho the visual difference at statewide scale is negligible.

  • Properties (features[].properties): NAME ("Ada County"), BASENAME ("Ada"), GEOID (5-char string, "16001"), STATE ("16"), COUNTY ("001"), AREALAND / AREAWATER (integers, square meters), CENTLAT/CENTLON (centroid) and INTPTLAT/INTPTLON (internal point, guaranteed inside the polygon). The last four are strings with an explicit sign, e.g. "+43.4507085" and "-116.2408880". Use parseFloat.

  • Date: boundary vintage January 1, 2026.

  • License/terms: U.S. Government work, public domain (17 U.S.C. §105); no restrictions; attribution appreciated.

  • Suggested citation: U.S. Census Bureau, TIGERweb State_County service (Counties, Jan. 1, 2026 vintage), https://tigerweb.geo.census.gov/, accessed 2026-09-13.

2. tigerweb_census2020_idaho_county_population.json (8,642 bytes)

  • URL (GET): https://tigerweb.geo.census.gov/arcgis/rest/services/TIGERweb/tigerWMS_Census2020/MapServer/82/query?where=STATE%3D%2716%27&outFields=GEOID,STATE,COUNTY,BASENAME,NAME,POP100,HU100,AREALAND,AREAWATER&returnGeometry=false&orderByFields=GEOID&f=json

  • Publisher: U.S. Census Bureau, TIGERweb tigerWMS_Census2020 MapServer, layer 82 "Counties" (layer description: "2020 Census - January 1, 2020 vintage").

  • Why this and not the Census Data API: the requested endpoint https://api.census.gov/data/2020/dec/pl?get=NAME,P1_001N&for=county:*&in=state:16 returned HTTP 302 → https://api.census.gov/data/missing_key.html with response header X-DataWebAPI-KeyError: 1. That happened on 3 keyless attempts about 10 s apart, and also for the dec/dhc dataset, i.e. the Census Data API now requires a key. No key was used. The TIGERweb Census 2020 layer publishes the same 2020 Census total population count as POP100, which is the same universe as PL 94-171 P1_001N.

  • Contents: Esri JSON (not GeoJSON). features[] has 44 records, one per county, ordered by GEOID. Validated: 44 records, GEOID set identical to file 1, sum of POP100 = 1,839,106 (Idaho's official 2020 Census population), min 790 (Clark County), max 494,967 (Ada County).

  • Format notes: features[i].attributes = {GEOID, STATE, COUNTY, BASENAME, NAME, POP100, HU100, AREALAND, AREAWATER}. POP100 = total population on the 2020 Census day (April 1, 2020). HU100 = total housing units. Both are declared esriFieldTypeDouble but hold whole numbers. AREALAND/AREAWATER are square meters from the 2020 vintage, so they differ slightly from file 1. The top level also has displayFieldName, fieldAliases, and fields (schema). There are no missing values.

  • Date: reference date 2020-04-01.

  • License/terms: U.S. Government work, public domain.

  • Suggested citation: U.S. Census Bureau, 2020 Census total population (POP100) by county, via TIGERweb tigerWMS_Census2020, accessed 2026-09-13.

3. Idaho places (for city-level fallback coordinates)

tigerweb_idaho_incorporated_places.json (82,767 bytes) and tigerweb_idaho_census_designated_places.json (16,740 bytes)

  • URLs (GET):

    • https://tigerweb.geo.census.gov/arcgis/rest/services/TIGERweb/Places_CouSub_ConCity_SubMCD/MapServer/4/query?where=STATE%3D%2716%27&outFields=*&returnGeometry=false&orderByFields=NAME&f=json (layer 4 "Incorporated Places")

    • https://tigerweb.geo.census.gov/arcgis/rest/services/TIGERweb/Places_CouSub_ConCity_SubMCD/MapServer/5/query?where=STATE%3D%2716%27&outFields=*&returnGeometry=false&orderByFields=NAME&f=json (layer 5 "Census Designated Places")

  • Publisher: U.S. Census Bureau, TIGERweb. Layers 4/5 are the service's default (current-vintage) group, the same series as file 1. Layer metadata (.../MapServer/4?f=json, .../MapServer/5?f=json, checked by the verifier on 2026-09-13) reads "Incorporated Places; January 1, 2026 vintage" and "Census Designated Places; January 1, 2026 vintage".

  • Why included: 8 of the 55 office/center addresses were not matched by the Census Geocoder (section 6). SPEC allows "approximated to the city with a note". These files give an official internal point for every Idaho city/CDP, so no coordinates need to be made up. All 8 unmatched towns are present: Arco, Fairfield, American Falls, Plummer, Cascade, Rupert and Newdale (incorporated), and Fort Hall (CDP).

  • Contents: Esri JSON, features[].attributes. 199 incorporated places (LSADC "25" = city) and 36 CDPs (LSADC "57"), all STATE "16". Fields: NAME (with suffix, e.g. "Aberdeen city", "Fort Hall CDP"), BASENAME ("Aberdeen", "St. Anthony"), GEOID (7 chars = state 2 + place 5), PLACE, PLACENS, PLACECC, LSADC, FUNCSTAT (A = active government, I = inactive government — only "Lost River city" has I — and S = statistical, all 36 CDPs), MTFCC, CBSAPCI, NECTAPCI, AREALAND/AREAWATER (m²), CENTLAT/CENTLON and INTPTLAT/INTPTLON (signed strings, e.g. "+42.9440982"), OBJECTID, OID, DISP_CLR (a map-display code; ignore it). No geometry.

  • Name-matching gotchas: the Fremont County office page writes "Anthony ID 83445", but the place is BASENAME "St. Anthony". The Census Geocoder matched it as "SAINT ANTHONY". Malad City's BASENAME is "Malad City".

  • License/terms: public domain.

  • Suggested citation: U.S. Census Bureau, TIGERweb Places (Incorporated Places and Census Designated Places), accessed 2026-09-13.

4. University of Idaho listing pages (HTML)

All are GET requests to https://www.uidaho.edu/.... Each returned HTTP 200 with no redirect, and each is the real page, not an error or consent page. The site is a server-rendered Next.js / Sitecore JSS app, so each file has visible HTML plus a large embedded JSON payload.

uidaho_extension_county_directory.html (1,028,578 bytes)
  • URL: https://www.uidaho.edu/extension/county. <title> is "County locations | University of Idaho" and the H1 is "UI Extension in Your Community".

  • Contents: "County offices" A–Z list with 46 entries: 43 counties, then Fort Hall Reservation, Nimiipuu Reservation and Schitsu’umsh Reservation. Links go to /extension/county/<slug>, with 45 unique targets.

    • Boise County has no page of its own. Its list link points to /extension/county/gem, whose page is titled "University of Idaho Extension in Gem and Boise Counties".

    • Shoshone County is not listed and its map shape has no link. There is no Shoshone County office page.

    • This matches the Extension home page's statement "offices in 42 Idaho counties and three federally recognized tribes".

  • Extension districts (useful for the "region" filter): the page embeds an interactive SVG map. In the HTML it appears inside embedded JSON strings, so quotes are escaped as \" and < as \u003c in places. Each county is a <g … class="countyshape dist-XXX" aria-label="Name County">, grouped under <g id="north-dist">, south-dist, cent-dist and east-dist. Labels use underscores for spaces ("Bear_Lake County", "Nez_Perce County"). The Valley shape has no aria-label, only id="valley". The Idaho County shape has class before aria-label. The Fort Hall Reservation has its own shape, labelled "Fort_Hall County", in dist-east. The Nimiipuu and Schitsu’umsh reservations have no shapes. Parsed membership, from the class names, all 44 counties:

    • dist-north (10): Benewah, Bonner, Boundary, Clearwater, Idaho, Kootenai, Latah, Lewis, Nez Perce, Shoshone

    • dist-south (10): Ada, Adams, Boise, Canyon, Elmore, Gem, Owyhee, Payette, Valley, Washington

    • dist-central (10): Blaine, Camas, Cassia, Gooding, Jerome, Lincoln, Minidoka, Oneida, Power, Twin Falls

    • dist-east (14): Bannock, Bear Lake, Bingham, Bonneville, Butte, Caribou, Clark, Custer, Franklin, Fremont, Jefferson, Lemhi, Madison, Teton The district display names are not present as text: the map legend is drawn as glyph outlines. Label them from the class names (North / South / Central / East) and say so. Assigning the two reservation offices without shapes (Lapwai, Plummer) to a district would be an inference, e.g. from the county they geocode into, so label it that way.

  • Suggested citation: University of Idaho Extension, "County locations," https://www.uidaho.edu/extension/county, accessed 2026-09-13.

uidaho_extension_home.html (165,528 bytes)
  • URL: https://www.uidaho.edu/extension, the University of Idaho Extension home page.

  • Why kept: it has the official summary sentences "UI Extension has offices in 42 Idaho counties and three federally recognized tribes" and "Extension faculty are also located at 10 research and Extension centers". It also links the centers list (/idaho-ag-experiment-station) and the Extension program-area pages (/extension/4h, /extension/food, /extension/health, /extension/horticulture, /extension/natural-resources, /extension/water, /extension/community). Those program pages were not downloaded.

  • Suggested citation: University of Idaho Extension, https://www.uidaho.edu/extension, accessed 2026-09-13.

uidaho_iaes_centers.html (160,368 bytes)
  • URL: https://www.uidaho.edu/idaho-ag-experiment-station/centers, with <title> "Research and Extension Centers | University of Idaho" and H1 "Research and Extension centers" (Idaho Agricultural Experiment Station, College of Agricultural and Life Sciences).

  • Contents: "The Idaho Agricultural Experiment Station operates 10 agricultural research and Extension centers". Each of the 10 has a name and a one-paragraph description: Aberdeen; Caldwell; Idaho Center for Agriculture, Food and the Environment (Idaho CAFE); Idaho Falls; Kimberly; Nancy M. Cummings; Palouse; Parma; Tetonia; Twin Falls. Nine link to /idaho-ag-experiment-station/centers/<slug>, and Idaho CAFE links to /research/statewide/agriculture-food-environment. The page also lists 5 affiliated centers with no addresses: Aquaculture Research Institute, Food Technology Center, Rinker Rock Creek Ranch, Sandpoint Organic Agriculture Center, U.S. Sheep Experiment Station. Their pages were not downloaded. Parsing trap: one affiliated center also links under /research/statewide/ (/research/statewide/rinker-rock-creek-ranch), so do not treat every /research/statewide/ link as one of the 10 centers; only agriculture-food-environment (Idaho CAFE) is.

  • No addresses on this page. Addresses are on the individual center pages (section 5).

  • Suggested citation: University of Idaho, Idaho Agricultural Experiment Station, "Research and Extension centers," https://www.uidaho.edu/idaho-ag-experiment-station/centers, accessed 2026-09-13.

License/terms (all uidaho.edu HTML, sections 4–5): © 2026 University of Idaho (page footer). No open license is stated. The files are saved here only so facts can be extracted: office names, counties, street addresses, public office phone numbers and page links. Credit and link to the pages in the app.

5. Individual office and center pages (HTML)

Why dozens of pages: the directory and listing pages carry no street addresses. Each office's address and main phone appear only in the header of its own page. There are 45 county/tribal pages (145–187 KB each, 7,166,848 bytes total) and 10 center pages (160–299 KB each, 2,229,703 bytes total). All returned HTTP 200, and all have the expected <title> and H1 (validated for every file).

  • uidaho_county_pages/<slug>.html ← https://www.uidaho.edu/extension/county/<slug>. The slugs are exactly the 45 link targets of the directory: ada, adams, bannock, bear-lake, benewah, bingham, blaine, bonner, bonneville, boundary, butte, camas, canyon, caribou, cassia, clark, clearwater, custer, elmore, fort-hall-reservation, franklin, fremont, gem, gooding, idaho, jefferson, jerome, kootenai, latah, lemhi, lewis, lincoln, madison, minidoka, nez-perce, nimiipuu-reservation, oneida, owyhee, payette, power, schitsuumsh-reservation, teton, twin-falls, valley, washington.

  • uidaho_center_pages/<slug>.html ← https://www.uidaho.edu/idaho-ag-experiment-station/centers/<slug> for aberdeen, caldwell, idaho-falls, kimberly, nancy-m-cummings, palouse, parma, tetonia, twin-falls, plus uidaho_center_pages/idaho-cafe.html ← https://www.uidaho.edu/research/statewide/agriculture-food-environment.

  • Where the data is in each page (format notes): <link rel="canonical" href="…"> gives the public page URL to link to from the app.

  • Visible header: an H1 office name, then one line PHONE | ADDRESS, e.g. 208-287-5900 | 5880 Glenwood St, Boise ID 83714. Usually there is no comma between city and "ID". Irregular cases:

    • Caribou: 208-547-3205 | 117 West 1st North | mailing: PO Box 190, Grace ID 83241, with the street and a mailing PO box in separate segments.

    • Elmore: the phone has ext. 1250.

    • Kootenai: Coeur d’Alene Idaho 83814, with a curly apostrophe and "Idaho" instead of "ID".

    • Minidoka: ZIP+4 with a double space, Rupert ID 83350-1608.

    • Fremont: Anthony ID 83445 (the town is St. Anthony).

    • Fort Hall Reservation: Pima Dr Bldg 7, Fort Hall ID 83203, with no house number.

    • The office email is on the next line (e.g. ada@uidaho.edu).

    • H1s for reservation offices read "University of Idaho Extension on the … Reservation", while their <title> says "in … Reservation". The Schitsu’umsh H1 uses a straight apostrophe; the directory uses a curly one.

  • Idaho CAFE is different: there is no phone|address header line. The address is in the "Contact us" <address> block: Location: 1350 N. 100 W. Rupert, Idaho 83350, Phone: 208-885-6681. The same values are in the embedded JSON as "Location":{"value":"1350 N. 100 W. Rupert, Idaho 83350"}.

  • Ignore the site-wide footer address 875 Perimeter Drive, Moscow, ID 83844, which appears on every page and is not an office.

  • Program areas (for the SPEC's "program areas"): every one of the 45 county/tribal pages has a <nav aria-label="Tertiary" …> block whose <a href="/extension/county/<slug>/<area>">Label</a> links are the office's program tabs. Area slugs seen (count of pages): 4h (45), agriculture (34), horticulture (28), health (22), community (4), natural-resources (3), and local-food, small-farms, finance, aquaculture (1 each). Labels vary per page (e.g. "Health and wellbeing", "Livestock and agriculture", "Range and natural resources"), so group by the slug. Each page has 2–5 tabs. Separately, 44 pages (all except Nimiipuu Reservation) have a free-text list after We offer programming in:</p><ul><li>…</li></ul> (2–7 items, wording differs per office). Center pages have no such nav. The site does not publish program statistics, so none should be shown. (Verifier-derived counts, parsed from the saved HTML with regex.)

  • County pages also list a "Meet our people" staff list, with individual names, titles and some individual emails. The app does not need individual staff details. If any are shown, they must come verbatim from these pages; do not invent staff, phone numbers or program statistics.

  • A per-file table of the published address lines and geocoder outcomes is appended at the end of this document. It was generated from the raw files.

  • Suggested citation: University of Idaho Extension county office pages (https://www.uidaho.edu/extension/county/…) and Research and Extension center pages (https://www.uidaho.edu/idaho-ag-experiment-station/centers/…), accessed 2026-09-13.

6. census_geocoder_offices.json (92,106 bytes) — raw response bundle

  • Endpoint (GET): https://geocoding.geo.census.gov/geocoder/locations/onelineaddress?address=<urlencoded>&benchmark=Public_AR_Current&format=json. The exact request URL of every call is stored in the bundle.

  • Publisher: U.S. Census Bureau Geocoder, benchmark "Public_AR_Current" (Public Address Ranges – Current Benchmark, id 4).

  • Structure: a top-level JSON object with 55 keys. Each key is the office's page H1 exactly as published, e.g. "University of Idaho Extension in Ada County", "University of Idaho Extension in Gem and Boise Counties", "Center for Agriculture, Food and the Environment". Each value is:

  { "office_type": "county_office" | "research_extension_center",   // 45 county/tribal offices, 10 centers
    "source_page": "<canonical page URL>",
    "saved_html": "uidaho_county_pages/ada.html",                    // relative to data/raw
    "address_line_as_published": "208-287-5900 | 5880 Glenwood St, Boise ID 83714",   // Idaho CAFE: the Location value
    "attempts": [ { "query_address": "...", "request_url": "...", "http_status": 200,
                    "retrieved": "2026-09-13T18:0x:xxZ",
                    "response": { ...unmodified Census Geocoder JSON... } } ] }
  • response is the geocoder's JSON body parsed and re-serialized with no keys added, removed or changed. Its key order is preserved. Reading a result: use the last attempt, attempts[-1].response.result.addressMatches. An empty array means no match. Each match has coordinates.x = longitude and coordinates.y = latitude (NAD83 ≈ WGS84, decimal degrees), plus matchedAddress (upper case), addressComponents (zip, streetName, city, …) and tigerLine (side, tigerLineId). response.result.input echoes the query and benchmark.

  • Derived query strings (clearly derived, not published text): query_address was built from address_line_as_published by these rules:

    1. Drop the leading phone segment before the first | .

    2. If the next segment is followed by | mailing: PO Box …, City ID zip (Caribou only), keep the street plus the "City ID zip" part after the comma.

    3. Replace ’ with '.

      A second attempt was made only when the first returned zero matches and the variant differed. It removed Ste|Suite|Rm|Room|Bldg <token> and "Evergreen Bldg", changed Idaho 83xxx to ID 83xxx, cut ZIP+4 to 5 digits, and stripped periods. Every attempt, including failed ones, is kept.

  • Results: 47 of 55 matched (attempts were sequential, 1 s apart, all HTTP 200).

    • No match (8): Butte County office (Arco), Camas County office (Fairfield), Fort Hall Reservation office (Fort Hall), Power County office (American Falls), Schitsu’umsh Reservation office (Plummer), Valley County office (Cascade), Idaho CAFE (Rupert), Tetonia Research and Extension Center (address published as Newdale). For these, approximate to the town's internal point from section 3 and label the location "approximate (town)".

    • Matched but worth flagging as approximate (the matched address differs from the published one):

      • Caribou County: 2 candidates, 117 W 1ST S, GRACE and 117 E 1ST N, GRACE. Neither equals "117 West 1st North". The two are about 330 m apart (haversine).

      • Jerome County: published "600 2nd Ave W", matched 600 2ND AVE E, JEROME.

      • Kimberly R&E Center: published "3806 E 3600 N", matched 3806 N 3600 E, KIMBERLY.

      • Twin Falls R&E Center: 2 candidates, 315 FALLS AVE and 315 FALLS AVE W, about 900 m apart (haversine).

      • Owyhee County: 2 near-identical candidates (238 8TH AVE W / 238 8 AVE W, about 240 m apart, haversine).

      • Bannock County: published "10560 N Fairgrounds Rd Bldg A", matched 10560 FAIRGROUND DR, POCATELLO.

    • All matched coordinates fall inside Idaho's bbox. Street-range geocodes are interpolated along the street segment, not rooftop positions.

  • License/terms: Census Geocoder output is U.S. Government work, public domain.

  • Suggested citation: Office coordinates geocoded with the U.S. Census Bureau Geocoder (Public_AR_Current benchmark), accessed 2026-09-13; unmatched addresses approximated to Census place internal points.


Not obtained / caveats

  • Census Data API (api.census.gov) PL 94-171 county table: not obtainable without an API key as of 2026-09-13 (HTTP 302 to missing_key.html). The same 2020 Census count comes from TIGERweb instead (file 2).

  • More recent population (ACS or Population Estimates) was not downloaded. The app should label population "2020 Census".

  • Affiliated centers (Sandpoint Organic Agriculture Center, Rinker Rock Creek Ranch, etc.) and the Extension program-area pages were not downloaded.

  • Extension district names are not published as text on the directory page; only the class names north/south/central/east are available.

  • Shoshone County has no U of I Extension office page, and Boise County is served by the Gem County office (per the directory).

  • Independent verification (2026-09-13, ~18:25–18:35 UTC): live re-fetches were byte-identical for the county GeoJSON and both places files; TIGERweb layer 82 returned the same attributes for Ada (494,967), Clark (790), Kootenai (171,362) and Shoshone (13,169); layer metadata confirmed the vintages quoted above; api.census.gov/data/2020/dec/pl still answers 302 → missing_key.html with X-DataWebAPI-KeyError: 1; the Caribou and Idaho CAFE pages were byte-identical and the Kootenai, Tetonia and directory pages differed only in a same-length per-request token with unchanged address lines; the geocoder returned the same match/coordinates for Ada and Jerome (600 2ND AVE E) and still no match for Butte (Arco). The appendix table was re-checked against the bundle (55/55 rows agree).

Appendix — per-location table (generated from the raw files)

Byte sizes are of the saved files. The "published address line" is copied verbatim from the page (section 5). The geocoder columns come from attempts[-1] in census_geocoder_offices.json. "n" is the number of candidate matches, and when n > 1 only the first candidate is shown.

Saved fileBytesPage H1 (bundle key)Published address linenFirst matched addresslat, lon
uidaho_county_pages/ada.html186,943University of Idaho Extension in Ada County208-287-5900 &#124; 5880 Glenwood St, Boise ID 8371415880 GLENWOOD ST, BOISE, ID, 8371443.65774, -116.27970
uidaho_county_pages/adams.html164,687University of Idaho Extension in Adams County208-253-4279 &#124; 203 S Galena, Council ID 836121203 GALENA ST, COUNCIL, ID, 8361244.73106, -116.43709
uidaho_county_pages/bannock.html170,811University of Idaho Extension in Bannock County208-236-7310 &#124; 10560 N Fairgrounds Rd Bldg A, Pocatello ID 83202110560 FAIRGROUND DR, POCATELLO, ID, 8320242.91413, -112.43259
uidaho_county_pages/bear-lake.html148,580University of Idaho Extension in Bear Lake County208-847-0345 &#124; 21620 US HWY 30, Montpelier ID 83254121620 US HWY 30, MONTPELIER, ID, 8325442.33306, -111.29769
uidaho_county_pages/benewah.html150,045University of Idaho Extension in Benewah County208-245-2422 &#124; 711 W Jefferson Ave Ste 2, St Maries ID 838611711 W JEFFERSON AVE, ST MARIES, ID, 8386147.31421, -116.56687
uidaho_county_pages/bingham.html168,552University of Idaho Extension in Bingham County208-785-8060 &#124; 412 W Pacific St, Blackfoot ID 832211412 W PACIFIC ST, BLACKFOOT, ID, 8322143.19187, -112.34833
uidaho_county_pages/blaine.html153,803University of Idaho Extension in Blaine County208-788-5585 &#124; 302 First Avenue South, Hailey ID 833331302 1ST AVE S, HAILEY, ID, 8333343.51818, -114.31264
uidaho_county_pages/bonner.html156,640University of Idaho Extension in Bonner County208-263-8511 &#124; 4205 N Boyer Ave, Sandpoint ID 8386414205 N BOYER AVE, SANDPOINT, ID, 8386448.30951, -116.55711
uidaho_county_pages/bonneville.html164,800University of Idaho Extension in Bonneville County208-529-1390 &#124; 1542 East 73rd South, Idaho Falls ID 8340411542 E 73RD S, IDAHO FALLS, ID, 8340443.43177, -112.00158
uidaho_county_pages/boundary.html173,456University of Idaho Extension in Boundary County208-267-3235 &#124; 6791 B Main Street, Bonners Ferry ID 8380516791 MAIN ST, BONNERS FERRY, ID, 8380548.68633, -116.31771
uidaho_county_pages/butte.html159,259University of Idaho Extension in Butte County208-527-8587 &#124; 159 N Idaho St, Arco ID 832130— no match ——
uidaho_county_pages/camas.html146,751University of Idaho Extension in Camas County208-764-2230 &#124; 517 Soldier Rd, Fairfield ID 833270— no match ——
uidaho_county_pages/canyon.html173,039University of Idaho Extension in Canyon County208-459-6003 &#124; 501 Main St, Caldwell ID 836051501 MAIN ST, CALDWELL, ID, 8360543.66845, -116.69021
uidaho_county_pages/caribou.html155,174University of Idaho Extension in Caribou County208-547-3205 &#124; 117 West 1st North &#124; mailing: PO Box 190, Grace ID 832412117 W 1ST S, GRACE, ID, 8324142.57559, -111.73187
uidaho_county_pages/cassia.html161,611University of Idaho Extension in Cassia County208-878-9461 &#124; 1459 Overland Ave Rm 4, Burley ID 8331811459 OVERLAND AVE, BURLEY, ID, 8331842.53474, -113.79319
uidaho_county_pages/clark.html146,540University of Idaho Extension in Clark County208-374-5405 &#124; 332 W Main St, Dubois ID 834231332 W MAIN ST, DUBOIS, ID, 8342344.17632, -112.23361
uidaho_county_pages/clearwater.html169,737University of Idaho Extension in Clearwater County208-476-4434 &#124; 2200 Michigan Avenue, Orofino ID 8354412200 MICHIGAN AVE, OROFINO, ID, 8354446.48558, -116.22079
uidaho_county_pages/custer.html149,891University of Idaho Extension in Custer County208-879-2344 &#124; 1340 E Pleasant Ave, Challis ID 8322611340 PLEASANT AVE, CHALLIS, ID, 8322644.50456, -114.22457
uidaho_county_pages/elmore.html154,878University of Idaho Extension in Elmore County208-587-2136 ext. 1250 &#124; 535 E. Jackson, Mountain Home ID 836471535 E JACKSON ST, MOUNTAIN HOME, ID, 8364743.13275, -115.68896
uidaho_county_pages/fort-hall-reservation.html158,569University of Idaho Extension on the Fort Hall Reservation208-236-1044 &#124; Pima Dr Bldg 7, Fort Hall ID 832030— no match ——
uidaho_county_pages/franklin.html159,724University of Idaho Extension in Franklin County208-852-1097 &#124; 561 W Oneida, Preston ID 832631561 W ONEIDA ST, PRESTON, ID, 8326342.09629, -111.89019
uidaho_county_pages/fremont.html152,333University of Idaho Extension in Fremont County208-624-3102 &#124; 19 W First N St, Anthony ID 83445119 W 1ST N, SAINT ANTHONY, ID, 8344543.96741, -111.68279
uidaho_county_pages/gem.html154,046University of Idaho Extension in Gem and Boise Counties208-365-6363 &#124; 2199 S Johns Ave, Emmett ID 8361712199 S JOHNS AVE, EMMETT, ID, 8361743.85741, -116.49280
uidaho_county_pages/gooding.html161,039University of Idaho Extension in Gooding County208-934-4417 &#124; 203 Lucy Lane, Gooding ID 833301203 LUCY LN, GOODING, ID, 8333042.94613, -114.71757
uidaho_county_pages/idaho.html159,212University of Idaho Extension in Idaho County208-983-2667 &#124; 320 West Main Street Rm 3, Grangeville ID 835301320 W MAIN ST, GRANGEVILLE, ID, 8353045.92636, -116.12282
uidaho_county_pages/jefferson.html160,337University of Idaho Extension in Jefferson County208-745-6685 &#124; 210 Courthouse Way Ste 180, Rigby ID 834421210 COURTHOUSE WAY, RIGBY, ID, 8344243.67958, -111.91129
uidaho_county_pages/jerome.html151,645University of Idaho Extension in Jerome County208-324-7578 &#124; 600 2nd Ave W, Jerome ID 833381600 2ND AVE E, JEROME, ID, 8333842.72613, -114.51037
uidaho_county_pages/kootenai.html175,844University of Idaho Extension in Kootenai County208-292-2525 &#124; 1250 West Ironwood Dr Ste 107, Coeur d’Alene Idaho 8381411250 W IRONWOOD DR, COEUR D ALENE, ID, 8381447.69732, -116.80401
uidaho_county_pages/latah.html165,506University of Idaho Extension in Latah County208-883-2267 &#124; 200 S Almon Street Ste 201, Moscow ID 838431200 S ALMON ST, MOSCOW, ID, 8384346.73298, -117.00399
uidaho_county_pages/lemhi.html171,795University of Idaho Extension in Lemhi County208-742-1697 &#124; 200 Fulton Street Ste 202, Salmon ID 834671200 FULTON ST, SALMON, ID, 8346745.17858, -113.90203
uidaho_county_pages/lewis.html148,049University of Idaho Extension in Lewis County208-937-2311 &#124; 510 Oak Street Rm 6, Nezperce ID 835431510 OAK ST, NEZPERCE, ID, 8354346.23355, -116.24054
uidaho_county_pages/lincoln.html153,331University of Idaho Extension in Lincoln County208-886-2406 &#124; 201 S Beverly, Shoshone ID 833521201 S BEVERLY ST, SHOSHONE, ID, 8335242.93366, -114.40488
uidaho_county_pages/madison.html160,955University of Idaho Extension in Madison County208-356-3191 &#124; 56 E main St, Rexburg ID 83440156 E MAIN ST, REXBURG, ID, 8344043.82600, -111.78200
uidaho_county_pages/minidoka.html159,610University of Idaho Extension in Minidoka County208-436-7184 &#124; 85 East Baseline Rd, Rupert ID 83350-1608185 E BASELINE RD, RUPERT, ID, 8335042.61958, -113.65281
uidaho_county_pages/nez-perce.html165,217University of Idaho Extension in Nez Perce County208-799-3096 &#124; 1239 Idaho St, Lewiston ID 8350111239 IDAHO ST, LEWISTON, ID, 8350146.41661, -117.01656
uidaho_county_pages/nimiipuu-reservation.html145,204University of Idaho Extension on the Nimiipuu Reservation208-621-3514 &#124; 95 Agency Rd, Lapwai ID 83540195 AGENCY RD, LAPWAI, ID, 8354046.39882, -116.80280
uidaho_county_pages/oneida.html148,283University of Idaho Extension in Oneida County208-766-2243 &#124; 459 S Main St, Malad City ID 832521459 S MAIN ST, MALAD CITY, ID, 8325242.17626, -112.24277
uidaho_county_pages/owyhee.html164,917University of Idaho Extension in Owyhee County208-896-4104 &#124; 238 8th Ave W, Marsing ID 836392238 8TH AVE W, MARSING, ID, 8363943.54365, -116.81214
uidaho_county_pages/payette.html149,618University of Idaho Extension in Payette County208-642-6022 &#124; 16 S 9th Street, Payette ID 83661116 S 9TH ST, PAYETTE, ID, 8366144.07462, -116.93358
uidaho_county_pages/power.html151,931University of Idaho Extension in Power County208-226-7621 &#124; 73 Fort Hall Ave Ste A, American Falls ID 832110— no match ——
uidaho_county_pages/schitsuumsh-reservation.html157,543University of Idaho Extension on the Schitsu'umsh Reservation208-686-1716 &#124; 402 Annie Antelope Rd, Plummer ID 838510— no match ——
uidaho_county_pages/teton.html156,058University of Idaho Extension in Teton County208-776-8235 &#124; 445 North Main St, Driggs ID 834221445 N MAIN ST, DRIGGS, ID, 8342243.72830, -111.11091
uidaho_county_pages/twin-falls.html168,393University of Idaho Extension in Twin Falls County208-734-9590 &#124; 630 Addison Ave W Ste 1600, Twin Falls ID 833011630 ADDISON AVE W, TWIN FALLS, ID, 8330142.56419, -114.49449
uidaho_county_pages/valley.html157,954University of Idaho Extension in Valley County208-382-7190 &#124; 110 West Pine St, Cascade ID 836110— no match ——
uidaho_county_pages/washington.html154,538University of Idaho Extension in Washington County208-414-0415 &#124; 116 W Idaho St, Weiser ID 836721116 W IDAHO ST, WEISER, ID, 8367244.24601, -116.97185
uidaho_center_pages/aberdeen.html298,893Aberdeen Research and Extension Center208-844-6300 &#124; 1693 S 2700 W, Aberdeen ID 8321011693 S 2700 W, ABERDEEN, ID, 8321042.95855, -112.82863
uidaho_center_pages/caldwell.html223,518Caldwell Research and Extension Center208-459-6365 &#124; 1904 E Chicago Street Suite AB, Caldwell ID 8360511904 E CHICAGO ST, CALDWELL, ID, 8360543.66101, -116.67269
uidaho_center_pages/idaho-cafe.html250,099Center for Agriculture, Food and the Environment1350 N. 100 W. Rupert, Idaho 833500— no match ——
uidaho_center_pages/idaho-falls.html171,524Idaho Falls Research and Extension Center208-529-8376 &#124; 1776 Science Center Drive Suite 205, Idaho Falls ID 8340211776 SCIENCE CENTER DR, IDAHO FALLS, ID, 8340243.51640, -112.05105
uidaho_center_pages/kimberly.html269,119Kimberly Research and Extension Center208-423-4691 &#124; 3806 E 3600 N, Kimberly ID 8334113806 N 3600 E, KIMBERLY, ID, 8334142.54837, -114.34519
uidaho_center_pages/nancy-m-cummings.html187,563Nancy M. Cummings Research, Extension and Education Center208-756-2749 &#124; 16 Hot Springs Ranch Road, Carmen ID 83462116 HOT SPRINGS RANCH RD, CARMEN, ID, 8346245.28612, -113.88815
uidaho_center_pages/palouse.html232,871Palouse Research, Extension and Education Center208-885-3526 &#124; 255 Farm Rd, Moscow ID 838431255 FARM RD, MOSCOW, ID, 8384346.73976, -117.01892
uidaho_center_pages/parma.html199,762Parma Research and Extension Center208-722-6701 &#124; 29603 U of I Lane, Parma ID 83660129603 U OF I LN, PARMA, ID, 8366043.80153, -116.94228
uidaho_center_pages/tetonia.html161,792Tetonia Research and Extension Center208-456-2879 &#124; 888 West Highway 33, Newdale ID 834360— no match ——
uidaho_center_pages/twin-falls.html234,562Twin Falls Research and Extension Center208-736-3600 &#124; 315 Falls Avenue Evergreen Bldg, Twin Falls ID 833012315 FALLS AVE, TWIN FALLS, ID, 8330142.57794, -114.47355

How it was built

Written by OpenCode 1.18.21 (opencode.ai) on qwen/qwen3.8-27b, served by MindRouter, the University of Idaho's on-premises AI platform.

15harness rounds
128.8minutes of harness work (2.1 h)
2,345lines of code
241KB, single-file app

Rounds by kind

build1
continue6
feedback7
critic1

Lines of code per file

body html198
app css386
app js1,297
scripts464

Critic scores ✎ scored by the independent AI critic, 1–10

visual 7 out of 10
usefulness 8 out of 10
correctness 8 out of 10
interactivity 8 out of 10

Independent audits ✎ by the AI critic

Data honesty: checked against raw data Authorship audit: every app-code commit is a harness round

Automated checks

Console no console errors No network 0 external requests Phone layout 0 px overflow Canvases no empty canvases Brand header header present No key leak no key in source

Checked by critic-verify.

Data spot checks ✎ written by the AI critic

  • Ada County population: app shows 494,967 (table, legend max); raw tigerweb_census2020 POP100 = 494,967
  • Clark County population: app shows 790 (legend min, first row when sorted by pop); raw POP100 = 790
  • Idaho population card 1,839,106; sum of raw POP100 over 44 counties = 1,839,106 (0 of 44 counties differ)
  • North region card: 10 counties, 12 locations, Pop. 363,642; independent recompute from embed + raw = 10 / 12 / 363,642 (South 845,395, Central 219,067, East 411,002 also match)
  • Adams County office address: app shows '203 S Galena, Council ID 83612'; raw uidaho_county_pages/adams.html header reads '208-253-4279 | 203 S Galena, Council ID 83612'; geocoder match 203 GALENA ST at (-116.43709, 44.73106) = embed coords
Show all 10 spot checks
  • Nearest to Moscow (computed): app lists 0.4 / 1.2 / 21.6 / 24.6 / 40.6 mi; independent Python haversine from the raw Census internal point (46.7285829, -116.999299) gives 0.4 / 1.2 / 21.6 / 24.6 / 40.6 mi, same order
  • Nearest to Salmon (computed): app 0.5 / 7.7 / 49.0 / 106.8 / 110.5 mi; independent calc 0.5 / 7.7 / 49.0 / 106.8 / 110.5 mi
  • Boise County 'Dist. to nearest office' (computed): app 36.2 mi (Ada office); independent calc 36.2 mi. Distance legend range 3-46 mi matches independent min/max (max = Owyhee)
  • Per-office for Bannock (2 offices): 87,018 / 2 = 43,509 by hand; per-office range 790-494,967 matches app legend
  • Shoshone County has no office page in the raw directory and is shown grey 'No office serving this county' in the Per office view, consistent with the raw data
Build notes ✎ written by the AI reviewer

The app is OpenCode 1.18.21's work only: I never edited src/, scripts/, data/embed/ or index.html, and the tamper guard never fired. Raw data came from the data-prep workflow (verdict ready-after-repair). I re-checked it before round 1: 44 counties, population summing to 1,839,106, 55 geocoder entries with 47 matches, and 58 genuine HTML pages. No data changes were needed.

  • Rounds: 12 in total, taking 7,707 s of harness time. Kinds were 1 build, 7 feedback and 4 continue. Round 1 (build) went into a repetition loop: the same python -c command 227 times and no files written. I killed it.

  • Round 2 (continue, same prompt) built the whole app.

  • Rounds 3 and 4 (feedback, then a continue re-run) both looped on python -c inspection commands and produced no code; I killed both.

  • Round 5 used the same feedback plus working-style lines: don't re-run inspection commands, edit directly, work item by item. It implemented most of the 14 items, then oscillated, adding and removing the same lines 67 times. I killed it; its real work was committed.

  • Rounds 6–9 were short (2–4 min) and productive. Round 7 introduced a desktop table regression, and round 8 fixed it only partly, so round 9 finished the fix.

  • Round 10 hid all 44 county labels. Its new inside-own-county test compared SVG pixels with longitude/latitude.

  • Round 11 looped on build.py --check (153 times) with no code change.

  • Round 12 (continue, same prompt) fixed the root cause.

Summary: OpenCode with qwen3.8-27b often degenerates into loops (repeated commands or oscillating edits), especially early in a round. It sometimes marks fixes done that don't work in the browser. Short, concrete feedback with measured evidence (computed styles, pixel overlaps, element counts) worked best.

Final state: no console errors, no external requests, no phone overflow, and every SPEC feature confirmed with my own Playwright scripts at 1440 px and 390 px. After the last round I deleted FEEDBACK.md and committed the deletion. No servers or browsers are left running.

Round-by-round timeline

Every harness round, in order. The prompts and FEEDBACK.md were written by the AI reviewer; the app code was written by the harness. Expand a round to see the exact prompt and the FEEDBACK.md the harness received.

    1 build 18.8 min · 1 file changed, 107 insertions(+) Show prompt

    Prompt given to the harness:

    Read AGENTS.md, SPEC.md and BRAND.md in this directory. Then build the complete app they describe, step by step: first write scripts in scripts/ that turn the raw data in data/raw/ (see data/raw/SOURCES.md — it has detailed format notes for every file: county GeoJSON, 2020 Census population, Census places for city lookups and approximate locations, the Census geocoder bundle with office/center coordinates and published address lines, and the saved uidaho.edu pages for regions, program areas and page links) into compact JSON in data/embed/ and run them. The saved HTML pages are large (150 KB to 1 MB each), so never print them whole; extract what you need with Python regular expressions. Then write src/body.html, src/app.css and src/app.js; run python3 build.py --check and fix any error it reports. Implement every required feature in SPEC.md with a polished, modern, responsive University of Idaho design. Do not stop until python3 build.py --check succeeds and every feature is implemented.
    

    No feedback file was sent in this round.

    2 continue 17.9 min · 8 files changed, 2807 insertions(+), 7 deletions(-) Show prompt

    Prompt given to the harness:

    Read AGENTS.md, SPEC.md and BRAND.md in this directory. Then build the complete app they describe, step by step: first write scripts in scripts/ that turn the raw data in data/raw/ (see data/raw/SOURCES.md — it has detailed format notes for every file: county GeoJSON, 2020 Census population, Census places for city lookups and approximate locations, the Census geocoder bundle with office/center coordinates and published address lines, and the saved uidaho.edu pages for regions, program areas and page links) into compact JSON in data/embed/ and run them. The saved HTML pages are large (150 KB to 1 MB each), so never print them whole; extract what you need with Python regular expressions. Then write src/body.html, src/app.css and src/app.js; run python3 build.py --check and fix any error it reports. Implement every required feature in SPEC.md with a polished, modern, responsive University of Idaho design. Do not stop until python3 build.py --check succeeds and every feature is implemented.
    

    No feedback file was sent in this round.

    4 continue 15.9 min · — Show prompt

    Prompt given to the harness:

    Read FEEDBACK.md in this directory — it lists problems a reviewer found when testing index.html in a real browser. Fix every item, keeping everything that already works, then run python3 build.py --check.
    

    No feedback file was sent in this round.

    5 continue 28.2 min · 8 files changed, 1135 insertions(+), 323 deletions(-) Show prompt

    Prompt given to the harness:

    Read FEEDBACK.md in this directory — it lists problems a reviewer found when testing index.html in a real browser. Fix every item, keeping everything that already works, then run python3 build.py --check.
    
    Working style for this round (important — earlier attempts got stuck re-running the same inspection command over and over without editing anything):
    - You already know this codebase: read src/app.js, src/app.css, src/body.html and scripts/build_data.py once, then start editing right away.
    - Do NOT use long `python3 -c "..."` one-liners to inspect data, and never run the same command twice. If you need new data (for example the Census places for the city search), add it to scripts/build_data.py, run that script once, and check the output file size.
    - Work through FEEDBACK.md in order, one item at a time: make the edit, run python3 build.py --check, then move on to the next item.
    

    FEEDBACK.md the harness received ✎ written by the AI reviewer:

    Reviewer findings — tested index.html in Chrome at 1440×900 and 390×844

    The app builds, loads with no console errors and no network requests, and search, filters, sorting, row selection, region cards and CSV export work. Fix the problems below, most important first, and keep everything that already works.

    1. "Nearest office: click anywhere" does not work on the map.

      • Clicking inside any county (for example the middle of Custer County) opens the detail panel. The "Nearest office" results never change, because county clicks never reach the nearest tool. Only clicks on the empty margin around Idaho are used.

      • Clicks that are used get the wrong coordinates. The SVG is letter-boxed inside a card much wider than its 720×820 viewBox, and the click→lat/lon conversion ignores that. Clicking near the Shoshone County border drew the red "clicked point" ring far to the east in Montana, reported as (47.509, -114.893). Clicking the empty right part of the map card did nothing.

      • Expected: the user can pick any point on the map, including on top of a county, e.g. with an obvious "Pick a point" toggle or by making clicks both select the county and set the point. The red ring must appear exactly under the pointer. The 5 nearest locations are then listed with straight-line distances, and lines from the point to those locations or a highlight on them would help.

    2. The city search in the Nearest office tool only knows the ~50 towns that have an office.

      • "Nampa", "Meridian", "Ketchum", "McCall" and "Coeur d'Alene" (typed with a straight apostrophe) all answer No match for "…".

      • Expected: any Idaho city or census-designated place works. data/raw/tigerweb_idaho_incorporated_places.json and data/raw/tigerweb_idaho_census_designated_places.json have internal-point lat/lon for 235 Idaho places; see SOURCES.md section 3.

      • Matching should ignore case, curly vs straight apostrophes, and "St." vs "Saint", and the suggestion list (datalist) should offer these places.

    3. The "Dist. to nearest office" metric is computed wrongly.

      • It only looks at offices inside the same county, so Boise County and Shoshone County are grey "no data" — exactly the two counties that have no office, which are the ones planners care about.

      • Expected: the distance from each county's centroid to the nearest Extension office anywhere in Idaho, so every county gets a value. Add a one-line caption under the legend explaining each metric, e.g. "Straight-line distance from county centroid to the nearest office".

      • "Pop. per office" is also grey for Boise and Shoshone, and its legend range (790–494,967) is identical to Population, so the metric looks like a duplicate. Boise County is served by the "Gem and Boise Counties" office, so count that office for both counties or explain the rule. Shoshone County should use its nearest office. No county should be grey.

    4. Counties without an office make a false claim. Clicking Boise County opens a panel saying "No Extension office or center is located in this county. The nearest office is shown on the map", but nothing is highlighted on the map and the nearest-office list does not change. Expected: the panel names the nearest office(s) with distances, and for Boise County the Gem office that serves it, each with a link. Those markers are highlighted on the map.

    5. The desktop layout wastes space, and the detail panel covers the controls.

      • At 1440 px the map is only about 400 px wide in the middle of a 1270 px card, with large empty areas on both sides.

      • Details slide in as a fixed overlay on the right third of the window, covering the Program area filter and part of the map.

      • Expected: a two-column map area. On the left, a larger map filling roughly 700 px of height. On the right, a persistent side panel that shows details for the selected county or location. With nothing selected, the panel shows a friendly empty state ("Select a county or marker…") plus summary facts.

      • On phones the panel can become a bottom sheet or sit below the map.

    6. The PNG export is broken visually.

      • In the downloaded extension-atlas-map.png, every office and center marker is solid black: marker colors come from CSS variables that do not resolve in the exported image.

      • The image also has no title, no legend for the active metric, no marker key and no source credit.

      • Expected: the PNG looks like the on-screen map (teal offices, lupine centers, dashed rings for approximate locations, the nearest-point ring if present). It includes the title, the current metric's legend, the marker key and a "Data: U.S. Census Bureau; University of Idaho Extension" line.

    7. Missing empty states.

      • When search or filters match nothing (e.g. search "zzqx"), the "All locations" table shows only its header row. It needs a helpful message with a "Clear filters" button.

      • Pressing "Find nearest" with an empty box shows No match for "". It should instead ask the user to type a city or click the map.

    8. The Nearest office city input is unstyled. It renders as a tiny native text box, about 150 px wide with small default-font text and a thin gray border, next to a large gold button. It should match the styled Search field (same height, padding, radius and focus ring) and fill the column width.

    9. The tooltip gets stuck on touch devices. On a phone, after tapping a marker, the black hover tooltip ("University of Idaho Extension in Butte County · Arco · County office · approx.") stays on screen on top of the detail panel and hides the Program areas. Hide the tooltip on tap/click, when the panel opens and on scroll.

    10. County labels are hard to read.

      • Labels such as "Kootenai", "Nez Perce", "Madison" and "Canyon" sit under markers and are cut off.

      • The "Ada" label is dark text on the darkest brown fill and is unreadable.

      • Expected: label color adapts to the fill (light text on dark fills), labels of tiny counties are hidden or moved, and labels do not collide with markers. On the phone map the labels are illegibly small, so hide them there and rely on the tooltip or panel.

    11. Table and map should feel synced both ways.

      • Hovering a table row should highlight that marker on the map.

      • Selecting a marker or county should highlight its row and scroll it into view in the table.

      • Hovering a region card should outline that region's counties on the map.

      • Add smooth transitions so the map visibly responds.

    12. Approximate locations are under-reported.

      • SOURCES.md section 6 lists 6 geocoder matches whose matched address differs from the published address: Caribou County, Jerome County, Kimberly R&E Center, Twin Falls R&E Center, Owyhee County, and Bannock County. These should also be flagged "approximate", with a short note saying why, in the table, the panel and the CSV.

      • The regions of the Nimiipuu and Schitsu'umsh reservation offices are inferred from the county they sit in. Say so in their detail panels.

    13. Accessibility.

      • When the detail panel is closed it is only moved off-screen, so keyboard Tab still walks into its hidden close button and link. Make it unfocusable when closed, and move focus into it when it opens.

      • The metric legend is aria-hidden, so screen-reader users never hear the scale. Give it a text alternative.

    14. Phone polish at 390 px. The three "Shade by" buttons wrap into two-line pills of uneven height. Use a compact segmented control that fits on one row, e.g. shorter labels "Population / Per office / Distance". The map could also be taller or allow pinch/zoom so the dense southern-Idaho markers can be tapped individually.

    12 continue 2.0 min · 2 files changed, 30 insertions(+), 62 deletions(-) Show prompt

    Prompt given to the harness:

    Read FEEDBACK.md in this directory — it lists problems a reviewer found when testing index.html in a real browser. Fix every item, keeping everything that already works, then run python3 build.py --check.
    
    Working style for this round (important — earlier attempts got stuck re-running the same inspection command over and over without editing anything):
    - You already know this codebase: read src/app.js, src/app.css, src/body.html and scripts/build_data.py once, then start editing right away.
    - Do NOT use long `python3 -c "..."` one-liners to inspect data, and never run the same command twice. If you need new data (for example the Census places for the city search), add it to scripts/build_data.py, run that script once, and check the output file size.
    - Work through FEEDBACK.md in order, one item at a time: make the edit, run python3 build.py --check, then move on to the next item.
    

    FEEDBACK.md the harness received ✎ written by the AI reviewer:

    Reviewer findings (round 7) — tested index.html in Chrome at 1440×900 and 1024×768

    Fixed, keep as is: "Back to list ↑" is now fully visible below the gold button, and everything else still works: table, cards, row-click scrolling, the nearest-office tool, metrics, exports, phone layout, and no console errors.

    Regression (most important): every county name has disappeared from the map.

    • In the live page, all 44 <text class="county-label"> elements have the attribute display="none". This happens at 1440 px and at 1024 px, before any interaction.

    • The exported PNG also has no county names.

    • In the previous version about 44 labels were visible, and only 3 pairs touched: Nez Perce/Lewis, Gem/Payette and Fremont/Madison.

    • The new "label must sit inside its own county" test rejects every label, even big counties such as Idaho, Owyhee, Custer and Lemhi, where the name obviously fits. The point-in-county check is probably comparing a label box in SVG pixel coordinates with county outlines in longitude/latitude, or the other way round. Both must be in the same coordinate system.

    1. Expected: Labels are visible again for practically all counties, as before: at least the 40 or so that fit inside their county at the current map size.

    2. Only a label that would overlap another label or a marker is hidden. When two labels collide, hide the one for the county with the smaller land area. Nez Perce/Lewis, Gem/Payette and Fremont/Madison must not touch.

    3. No label sits inside a different county. For example, "Madison" must not appear inside Fremont County.

    4. The PNG export shows the same labels as the screen.

    Please check the result in the browser itself: count the county labels that do not have display="none". There should be 40 or more, with no two overlapping.

    13 critic 0.1 min · 1 file changed, 28 insertions(+) Show prompt

    Prompt given to the harness:

    Read FEEDBACK.md in this directory — it lists problems a reviewer found when testing index.html in a real browser. Fix every item, keeping everything that already works, then run python3 build.py --check.
    
    Working style for this round (important — earlier attempts got stuck re-running the same inspection command over and over without editing anything):
    - You already know this codebase: read src/app.js, src/app.css, src/body.html once, then start editing right away.
    - Do NOT use long `python3 -c "..."` one-liners to inspect data, and never run the same command twice. Do not re-run build.py --check more than once per item.
    - Do not touch the county label placement code (buildMap label candidates, resolveLabelCollisions).
    - Work through FEEDBACK.md in order, one item at a time: make the edit, run python3 build.py --check, then move on to the next item. When all 5 items are done, stop.
    

    FEEDBACK.md the harness received ✎ written by the AI reviewer:

    Reviewer feedback (critic pass)

    Everything else works in the browser — keep it: search, filters, region cards, sortable table, nearest-office tool, pick-a-point, CSV and PNG export, county labels. Do NOT change the label placement code in buildMap()/resolveLabelCollisions().

    1. Desktop map composition (most important)
    • Measured at a 1440x900 window, after scrolling to the map section: #map-svg is 862 px wide x 820 px tall, but the drawn Idaho shape only spans x=294..770 (476 px wide). There is a ~210 px empty band between Idaho and the Details panel, and ~190 px empty on the left.

    • .atlas__mapwrap is 995 px tall, taller than the 900 px window, so the "Shade by" tabs, the whole map and the "Pick a point / Export map" buttons can never be seen at the same time.

    • The legend (#legend) sits at the far right of .atlas__mapbar, 670 px away from the map.

    • Fix: In src/app.js, compute the viewBox width from the projected bounds instead of the fixed 720: after computing s, set VB.w = Math.ceil((maxLon - minLon) * kx * s + 2 * VB.pad) (recompute offX with the new width) and set the svg viewBox attribute to 0 0 VB.w VB.h in buildMap(). The PNG export already reads VB.w/VB.h, so check it still centres the map.

    • In src/app.css (desktop only, min-width 1100px): #map-svg { height: calc(100vh - 190px); max-height: 760px; width: auto; max-width: 100%; margin: 0 auto; } and change .atlas__mapcols to grid-template-columns: auto minmax(360px, 1fr) so the Details column takes the freed width.

    • Move #legend out of .atlas__mapbar into the top of the right-hand column, directly above #detail (same column, 12 px gap), so the legend sits next to the map.

    • Target: at 1440x900 with the map section scrolled to the top, the tabs, the full Idaho shape and the map footer buttons are all inside the 900 px window, and the gap between Idaho's right edge and the right column is under 60 px.

    • Phone (390 px) must stay as it is now: map full width, legend and Details below it.

    2. "Per office" legend caption

    41 of 44 counties have exactly one office, so the Per office map looks identical to Population (same 790 – 494,967 range). Append to the per-office caption in metricCaption(): " Only Bannock, Benewah and Nez Perce have two offices, so most counties equal their population; Shoshone has none (grey)." Compute the county names from the data (counties with 2+ serving offices, and counties with 0) rather than hard-coding them.

    3. Distance caption wording

    The distance is measured from each county's Census internal point (c.intpt), not its centroid. Change the distance caption (legend and PNG header) to "Straight-line distance from the county's Census internal point to the nearest county office".

    4. Program-area chips vs "Programming" text

    Adams County's "Programming" text lists Agriculture, but it has no Agriculture chip and is excluded by the Agriculture filter. The chips are the program sub-pages linked from each office's page. In the location Details panel, under the Program areas chips, add a small muted note: "Program sub-pages linked from this office's page." Also add title="Program sub-pages linked from each office's public page" to the Program area filter label.

    5. Phone table header

    At 390 px, "55 of 55 locations" wraps onto two lines and the "Export CSV" button wraps its text onto two lines. Make .table__actions wrap as a flex row with white-space: nowrap on the count and on the button text, so each stays on one line.

    14 continue 0.2 min · — Show prompt

    Prompt given to the harness:

    Read FEEDBACK.md in this directory — it lists problems a reviewer found when testing index.html in a real browser. Fix every item, keeping everything that already works, then run python3 build.py --check.
    
    Working style for this round (important — earlier attempts got stuck re-running the same inspection command over and over without editing anything):
    - You already know this codebase: read src/app.js, src/app.css, src/body.html once, then start editing right away.
    - Do NOT use long `python3 -c "..."` one-liners to inspect data, and never run the same command twice. Do not re-run build.py --check more than once per item.
    - Do not touch the county label placement code (buildMap label candidates, resolveLabelCollisions).
    - Work through FEEDBACK.md in order, one item at a time: make the edit, run python3 build.py --check, then move on to the next item. When all 5 items are done, stop.
    

    No feedback file was sent in this round.

    15 continue 0.1 min · — Show prompt

    Prompt given to the harness:

    Read FEEDBACK.md in this directory — it lists problems a reviewer found when testing index.html in a real browser. Fix every item, keeping everything that already works, then run python3 build.py --check.
    
    Working style for this round (important — earlier attempts got stuck re-running the same inspection command over and over without editing anything):
    - You already know this codebase: read src/app.js, src/app.css, src/body.html once, then start editing right away.
    - Do NOT use long `python3 -c "..."` one-liners to inspect data, and never run the same command twice. Do not re-run build.py --check more than once per item.
    - Do not touch the county label placement code (buildMap label candidates, resolveLabelCollisions).
    - Work through FEEDBACK.md in order, one item at a time: make the edit, run python3 build.py --check, then move on to the next item. When all 5 items are done, stop.
    

    No feedback file was sent in this round.

What the agent was asked

The full specification the harness received, rendered from the original Markdown.

Read the specification

Extension Atlas — U of I Extension across Idaho's counties

Category: Administration Who it is for: Extension administrators and educators, county partners, the public

What it should do

One map of University of Idaho Extension's statewide presence: county offices, research and Extension centers, and program areas — searchable, filterable, and ready for planning conversations.

Data

Idaho county boundaries (US Census cartographic boundary GeoJSON, Idaho FIPS 16) plus U of I Extension county office and research-and-Extension-center locations taken at build time from the public uidaho.edu Extension pages (name, county, address, city; lat/lon geocoded or approximated to the city with a note). County population from the Census (e.g. 2020 decennial or latest ACS) with the source cited. Do not invent staff names, phone numbers or program statistics.

Raw downloads (if any) are in data/raw/ with data/raw/SOURCES.md describing where each file came from. Transform what the app needs into compact JSON in data/embed/ (write a small script in scripts/ to do it, so the transformation is reproducible). Every dataset the app shows must be credited in a visible "Data & sources" section of the app, with links. If a dataset is illustrative/synthetic, label it clearly as such in the UI — never present made-up numbers as real University of Idaho figures.

Required features

  • Hand-drawn SVG choropleth of Idaho's 44 counties (projection coded in JS), with office and center markers

  • Search box and filters (office type, region), and a side panel with details and a link to the office's public page

  • Choropleth metric switcher (population, population per office, distance to nearest office computed from centroids)

  • 'Nearest office' tool: click anywhere or enter a city to find the closest locations with straight-line distances

  • Regional summary cards and a sortable table synced with the map

  • Export the table as CSV and the map as PNG

Quality bar

This app is going into a University of Idaho gallery that shows faculty, staff and students what they can build with AI coding agents. It must look polished and modern (think a well-designed data product, not a homework demo), feel alive (smooth transitions, responsive hover/selection states, animated where it helps understanding), and do real, useful work — every control should change something meaningful. It must work well on a laptop and on a phone. Include a short "How to use" hint for first-time visitors and a helpful empty state wherever the user must supply data.

Known limitations

Reported by the independent critic. ✎ written by the AI critic

  • Desktop map layout: at 1440x900 the map box is 862x820 px but Idaho is drawn only 476 px wide, leaving a ~210 px empty band before the Details panel. The map section is 995 px tall, so the Shade-by tabs, the whole map and the Pick a point / Export buttons never fit on one screen, and the legend sits far to the right of the map.
  • Critic rounds 13-15 made no changes. OpenCode exited after 4-11 s each time with no output: its log shows the session being created, then no prompt processing or model request and no error. MindRouter was up (401), and other OpenCode apps ran normally at the same time. FEEDBACK.md (5 items: map layout, per-office caption, distance caption wording, program-area note, phone table header) was never applied.
  • The 'Per office' shading looks almost identical to 'Population', with the same 790-494,967 range, because 41 of 44 counties have exactly one office. No caption explains this.
  • The Distance caption says 'from county centroid', but distances are measured from each county's Census internal point (the difference is tiny).
  • Program-area chips come from each office page's program sub-pages, so they don't always match the 'Programming' text. Adams County lists Agriculture but has no Agriculture chip and is left out by the Agriculture filter. Nothing in the UI explains where the chips come from.
  • Canyon (second most populous county), Madison, Lewis and Payette labels are hidden on desktop to avoid collisions, and all county labels are hidden on phones. Names still appear in tooltips and details.
  • At 390 px the table header's '55 of 55 locations' count and the 'Export CSV' button text each wrap onto two lines.