How we did this

Every source, tool and step behind this site, with links.

Independent analysis by a PPS parent, not an official Portland Public Schools product. Confirm anything that matters against PPS's own materials: PPS rightsizing scenarios and October 6, 2026 Board of Education meeting materials (BoardBook). Built with AI, directed by a PPS parent (how).

Every source we used or read, grouped by kind, with its public link, our local text copy and a line on how we used it. Definitions of each number are on Sources & definitions; the model itself is on Method.

Contents

Built with AI. The research, data work, modeling and writing on this site were done by AI (Claude, from Anthropic), directed and guided by Paul Frazier, a PPS parent. This is an independent analysis, not a Portland Public Schools product.

Last updated 2026-10-15. A link tree of everything we used or read, with a few words on each.

The short version

We started with where kids live. We used the 2020 Census at the level of single city blocks (9,295 of them) and calibrated each block to real 2025-26 neighborhood-school enrollment. We measured real walking distances along streets and paths from every block to every school, with a local copy of the OSRM router on OpenStreetMap data. We sized every school with Portland State University's July 2026 per-school forecasts, the same forecasts PPS uses, for each year from 2027-28 to 2031-32. A solver then draws the lines. A school is at target when it is between its size floor (360 for K-5, 500 for middle, 1,100 for high school) and its building capacity. The one firm rule is to keep at least as many schools at target as PPS A every year; the solver also pushes every school toward target, then minimizes walking. Four of the five example plans keep every elementary school at target every year; Rebalanced PPS A gives up a few for fewer line changes. We checked our model against PPS's own numbers: on PPS's own lines, 58 of 62 schools land within 10% of PPS's Family Guide projections for PPS A in 2031-32 (51 in 2027-28, when PPS phases some changes in), and every miss is explained. Every figure on this site is from our model, not from PPS, unless it is quoted with a PPS source. PPS's own plans are shown with PPS's figures for school sizes and schools at target.

How to read this page

  • Original: the public link where the item lives. "Local copy only" means we have no recorded public link.
  • Local copy: a plain-text Markdown copy kept for searching and quoting. Paths are relative to the project folder. Each copy starts with front matter that records its source link, retrieval date and a checksum of the original. The copies are unofficial text extractions and may contain errors; the original is always authoritative.
  • Labels: [PPS] a PPS document · [PSU] Portland State's forecast for PPS · [State] Oregon law or rule · [Second-hand] a community or news source, or PPS data that someone else captured · [Ours] our own work.

1. PPS rightsizing documents

1a. PPS rightsizing web pages

All ten pages were archived on 2026-10-12. Index: build/pps-texts/README.md.

1b. The scenarios (October 2026)

1c. Board meeting materials

The BoardBook home for PPS (org 915) is https://meetings.boardbook.org/Public/Organization/915. Supplement index: build/pps-texts/boardbook-2026-10/README.md.

1d. Enrollment, lotteries and family surveys

1e. Buildings, capacity and feeders

1f. Transportation policy

Index with cited findings: build/pps-texts/transportation/README.md.


2. Enrollment forecasts


3. Board meetings and videos

No official transcripts exist. BoardBook says the official minutes are the video recordings (channel: https://www.youtube.com/@ppsboardofeducation; last posted written minutes: https://meetings.boardbook.org/Public/Minutes/915?meeting=758088). All transcripts we used are machine-made and contain errors; the video is authoritative. Every quote below cites the video and its timestamp.

We searched timestamped transcripts from Save PDX Schools (https://savepdxschools.org/transcripts/) [Second-hand] and a community caption archive [Second-hand]. We don't publish copies, because their speaker labels name board members, staff and public commenters.

DateMeetingVideoWhat's in it for us
2026-10-06Board regular meetinghttps://www.youtube.com/watch?v=zOUH2Jq7OwoThe scenario release presentation. A second, unlisted upload (https://www.youtube.com/watch?v=-wwHhlqx0Us) has shifted timestamps; cite the public one.
2026-09-29Board special meetinghttps://www.youtube.com/watch?v=SPwXuNlwP_UBond audit and protocols; rightsizing comments.
2026-09-23Facilities committeehttps://www.youtube.com/watch?v=zfvbTie4mpEFacilities context. The community transcript archive copy is machine-translated, so it isn't quoted here.
2026-09-16Board retreathttps://www.youtube.com/watch?v=gw0gfK9RiDQRightsizing discussion and KPIs.
2026-09-15Board regular meetinghttps://www.youtube.com/watch?v=uAf7l-ChjFoRightsizing KPIs (02:41:41-04:27:00), including the 70-100% "efficiently used" definition.
2026-09-08Teaching, Learning & Enrollment committeehttps://www.youtube.com/watch?v=S-pk57P6f_oWell-resourced schools (00:04:55-01:15:00); staff on minimum building capacities. The community transcript archive copy is machine-translated, so it isn't quoted here.
2026-09-01Board regular meetinghttps://www.youtube.com/watch?v=5RMfvT-sAPUWell-resourced schools.
2026-08-04Board regular meetinghttps://www.youtube.com/watch?v=-qhL23TOZTsEquity-audit lessons.

Moments we cite directly:

PPS's six explainer videos [PPS]. Short overviews of why and how PPS is rightsizing:


4. Oregon law and state documents


5. Data sources

  • US Census 2020: ages by block (DHC P12), single years by tract (PCT12), race by block (P.L. 94-171), block shapes (TIGER/Line) [Federal]. Originals: https://api.census.gov/data/2020/dec/dhc and https://www.census.gov/geographies/mapping-files.html · Local: build/data/raw/census/, results in build/data/blocks.parquet. Where school-age kids live, split into K-5, 6-8 and 9-12, and the race counts behind our integration measure. Method: build/data/README.md.
  • Oregon Department of Education, Fall Membership 2025-26 [State]. Original: https://www.oregon.gov/ode/reports-and-data/students/Pages/Student-Enrollment-Reports.aspx (we used the copy in PPS Data Explorer) · Local: inside build/data/raw/meub-pps-data/. Enrollment by school and grade, the target we calibrate the blocks to.
  • NCES Common Core of Data, via the Urban Institute Education Data Portal [Federal]. Originals: https://educationdata.urban.org/ and https://nces.ed.gov/ccd/ · Local: build/routing/ccd2024.json, build/routing/school_points.csv. School locations for routing, and the first-generation enrollment model.
  • City of Portland "School_Boundaries" map service [City]. Original: https://services.arcgis.com/quVN97tn06YNGj9s/arcgis/rest/services/School_Boundaries/FeatureServer/0 · Local: build/data/raw/boundaries/city_school_attendance_cells.geojson, results in build/data/boundaries/. Current attendance areas at all three levels.
  • PPS ArcGIS attendance layer ("PPS_Boundaries_All_Grades", 2023-24 final) [PPS]. Local copy only: build/data/raw/boundaries/pps_boundaries_all_grades_23_24_final.geojson (full service link not recorded). A cross-check: it matches the City layer to within 0.01% of area.
  • OpenStreetMap and OSRM [Open data / open source]. Originals: https://www.openstreetmap.org/copyright (data license) and https://github.com/Project-OSRM/osrm-backend (router) · Local: build/routing/ (walk_miles.parquet, bike_miles.parquet, README.md, validation.md). Walking and biking distances from every block to every school, computed on our own copy of the router. It matches the public FOSSGIS router (https://routing.openstreetmap.de/), used in our first-generation pages, with a median difference of 0.02 miles.
  • PPS Data Explorer [Second-hand compilation of public data]. Original: https://github.com/meub/pps-data (site: https://ppsdata.info/) · Local: build/data/raw/meub-pps-data/. A parent-built collection of public PPS, ODE and PSU files: the school list, 2021 capacities, ODE enrollment, immersion details (PPS's "Enrollment Details for Language Immersion Schools," Oct 2025) and copies of the Oct 6 board files. It is the base of our school table.
  • Focus-option students by home catchment, 2025-26 (Google Sheet) [SECOND-HAND], a community spreadsheet (not linked here). Local, public copy with counts under 10 masked for privacy: build/pps-texts/focus-students-by-catchment-sheet-2025-26-public.md and build/data/v2/focus_by_catchment_2025_26_public.csv. The model used the full counts. How many students in each neighborhood attend each focus option (ACCESS, da Vinci, Winterhaven and others). We used it only to place returning students in the "Close 2 focus options" what-if. Its first columns match PPS's Oct 2025 Enrollment Summary, but the source of the per-program columns is not stated, and its dollar columns are the sheet author's own estimates (not used).
  • Our derived data [Ours]. Local: build/data/README.md explains each file: schools.csv (83 schools and programs), blocks.parquet (9,295 calibrated blocks), focus_dli.csv and focus_dli_homes.parquet (immersion strands and focus programs, with estimated home locations), scenarios.json (PPS A and PPS B in machine form, with PPS's Family Guide projections), scenario_maps/ (our tracings of PPS's 12 maps), and v2/ (2025-26 capacities, capture rates, implied immersion arrival shares, focus-by-catchment, PSU by year).
  • Backtest of the block model [Ours]. Local: build/data/backtest.md. Tests whether Census blocks alone can predict each school's real enrollment. The answer sets our error bar: any size within about 15% of a threshold is uncertain.

6. Press and community work

News coverage

Community analyses

We compared our data and results with five independent community projects. Full comparison with side-by-side number checks: build/research/compare_resources.md. Short public write-up: build/research/other_models_section.md. We link to them; the only one whose data we build on directly is PPS Data Explorer (section 5), plus the school-profile snapshots and the follow-rate trace noted below.


7. Our research notes

  • Policy targets and scenario facts [Ours]. Local: build/research/targets.md (and targets.json). Every size floor, ceiling, immersion and transportation rule we use, each traced to a source, plus the solver spec and the open gaps.
  • Source extracts [Ours, from PPS]. Local: build/research/sources/ (plain-text extracts of the Sept 1 and Sept 15 decks, Aug 4 memo, Mar 31 work session, Resolution 7307, scenario overview and regional summaries, feeder patterns, LRFP excerpts, transport guidelines, lottery sheets and the June focus-options deck, plus a crop of the PPS A 6-8 map and the Sept 15 KPI slide). Kept so quotes in targets.md can be rechecked offline. Original links are in the sections above.
  • Where PPS's own documents don't line up [Ours]. Local: build/research/pps_internal_gaps.md. Three places where PPS's words, maps or numbers disagree (Lent-area students: Kelly vs Arleta; Buckman's lottery students; Rigler-area middle schoolers: Roseway Heights on the map vs Beaumont in the numbers), and which gaps are ours.
  • The immersion "follow rate" [Ours]. Local: build/research/follow_rate/report.md (with sources/ and scripts/implied_follow.py). Traces the "80-84%" to a community site's arithmetic. PPS states no rate. PPS's numbers imply about 80-83% arrive at Lent and Rigler, and the rest stay at the sending school.
  • PPS board-record findings [Ours]. Local: build/pps-texts/boardbook-2026-10/findings.md. What PPS documents say about immersion follow shares and how the projections were built. PPS's "no changes" numbers equal PSU's forecast; no document explains how students were reassigned under PPS A and PPS B.
  • Transportation findings [Ours]. Local: build/pps-texts/transportation/README.md. Oregon law and PPS policy on who gets a bus, each point quoted and cited.
  • Comparison with other public models [Ours]. Local: build/research/compare_resources.md and build/research/other_models_section.md. Where our numbers agree with the five community projects, and why they differ where they do.

8. Our method and results

All figures here are our model's (model v2), on PSU's per-school forecast, not PPS's. Plan display names follow the site.

  • Method [Ours]. Local: build/solver/METHOD.md. The full solver: inputs, size rules, the walking objective, exact contiguity (no islands), feeders, durability across 2027-28 to 2031-32, the v2 fixes, and known limits.
  • Plan briefs [Ours]. Local: build/solver/out_v2/BRIEFS.md. One page per plan: how it works, the good, the bad, and the trade-off. It also explains why the example plans can have shorter walks and more schools at target, and the catch (many schools sit just above 360, so a 9% enrollment miss hurts more).
  • Calibration against PPS's numbers [Ours]. Local: build/solver/out_v2/CALIBRATION.md (data: calibration_table.csv). On PPS's own lines, 74 of 76 PPS Status Quo schools and 58 of 62 PPS A schools fall within 10% of PPS's Family Guide projections for 2031-32, and every miss is explained.
  • Line quality [Ours]. Local: build/solver/out_v2/LINES_QA.md (referenced by METHOD.md section 9 and BRIEFS.md). Counts one-block notches and pockets: our cleaned elementary lines have 109-141 notches vs 197 under PPS A.
  • Bus need, fast proxy [Ours]. Local: build/solver/out_v2/BUSES.md. Kids past the bus line under each plan, and schools that would newly need buses. PPS A adds about 1,600 kids past the line vs PPS Status Quo.
  • Walkability vs durability frontier [Ours]. Local: build/solver/out_v2/FRONTIER.md. An early test of how much walking it costs to keep more schools at target. Not yet a clean result.
  • Tactical plans [Ours]. Local: build/solver/out_v2/TACTICAL.md. Tries small moves at all three levels. None met all the hard rules.
  • Per-plan trade-offs [Ours]. Local: build/solver/out_v2/<plan>/TRADEOFFS.md, one per plan:
    • option2_ms460/ — "Earlier best: balanced middle schools" (best example we modeled): spares 341 immersion students a move; 35 of 35 K-5 schools at target every year; a 460 middle-school minimum keeps elementary classes together (3 split) and fits every middle school in its building.
    • option2/ — "Boundary changes, same closures": the same plan with PPS's 500 middle-school minimum; 12 of 13 middle schools at target, Hosford over capacity early, 13 elementary schools split between middle schools.
    • option1_durable/ — "Redrawn K-8 lines": keeps every PPS A immersion move; best middle-school walking.
    • option4/ — "Rebalanced PPS A": still moves more kids than PPS A, because fixing sizes takes moves.
    • option3a/ — "Close 2 focus options: Winterhaven, da Vinci" (a what-if): best numbers, bought by closing two choice programs.
    • option1_durable_hs/ — "Most schools that last, HS lines adjusted": tests moving whole elementary zones between high schools.
    • option1_full.staging/ — "All lines redrawn, walkable K-12": dropped; redrawing high schools made trips longer.
    • cap3_500_s2.staging/ — "Solver picks schools": dropped; letting the solver also choose closures didn't beat PPS A's closures with redrawn lines (middle-school walks 2.09 mi, about 1,500 more students moved) without moving more immersion students than PPS A.
    • tactical_l/ — "Most schools last + large feeder fixes": the one tactical point that solved, with three rules broken.
  • First-generation scorecards [Ours]. Local: build/solver/out/compare.md. Model v1 results, kept for the record.
  • The first-generation model [Ours]. Local: data/ (archived pages on the Archive page). Our earlier K-5-only model and pages (nearest walk, then balanced to 360-600). Superseded by METHOD.md.

Gaps: sources we cite but couldn't trace to an original, or that are second-hand

  • Focus-students-by-catchment sheet. Second-hand. The per-program columns have no stated source. Used only for the "Close 2 focus options" what-if.
  • "80-84% of immersion students follow a moved program." A community site's inference from Family Guide numbers. PPS states no rate. Our model uses its own implied shares from PPS's numbers, labeled as inferred.
  • 2025-26 building capacities. PPS's numbers, but captured from PPS's dashboard by a community project, not by us. Boise-Eliot/Humboldt's 586 doesn't match the Family Guide's 632.
  • Lent-area students at Marysville (115). The 115 is from PPS Closure Commutes. PPS's own Enrollment Summary gives 117, which we use.
  • Meeting transcripts. All machine-made by community sites or YouTube. None is official. Two community transcript archive copies (Sept 8, Sept 23) are machine translations and must not be quoted.
  • PPS Data Explorer copies. Second-hand copies of public files. PPS's "Enrollment Details for Language Immersion Schools" (Oct 2025) and ODE's fall membership file were read only from this repo; we have no PPS link for the immersion file.
  • PPS's 2025 utilization-model workbook. Seen only through ppsdata.info, which says it came from a records request.
  • News quotes (OPB, KATU, Willamette Week, TriMet). Used for context only. We keep no local copies, only the quotes in targets.md.
  • Lottery result and slot sheets. PPS documents, but we did not record their exact links.
  • PPS ArcGIS boundary layer. We kept the data but not the full service link.
  • LRFP 2021 and the June 2026 focus-options deck. We hold only excerpts, without front matter.
  • Winterhaven and da Vinci building history. From a search of a PPS historic-survey PDF and from Wikipedia; no links recorded, and the Winterhaven-as-Brooklyn-School point is unverified.
  • Citizen Portal and Govly. Could not be read in full; not used.
  • PSU forecast hosts. The pps.net and Google Drive copies are confirmed identical. The finalsite link cited on the site was not checked against them.

This page and the analysis behind it were made by AI (Claude, from Anthropic), directed and guided by Paul Frazier. Every number is our model's unless a PPS source is quoted. Please check anything that matters against PPS's own documents.

Source: build/research/how_we_did_this.md