The decision behind AI Policy Builder
The problem
I built AI Policy Builder for EDU 280, Social Justice and Urban Education, at American University, for Dr. William N. Thomas IV. My design problem sat in one place: a district policy can be defensible on its face and still land hardest on the students with the least room to absorb it. A student can agree with that sentence in a seminar without ever having made a decision that produced it. What I wanted was a machine that produced it, four rounds and twelve decisions deep, across three school years from 2026 to 2029.
What the dashboard had to decide
Every decision in the game moves outcomes for seven student groups. The groups are multilingual learners, students with IEPs, students who qualify for free or reduced-price lunch, Black and Latino students, students without reliable home internet, students in AP and honors tracks, and students outside them. The engine tracks all seven from the first round, so the numbers exist whether or not anyone looks at them. My open question was what the outcome dashboard should show when it opens, and the two answers available are not equivalent.
I could open the dashboard disaggregated, which is the defensible choice and the one the course content argues for. The seven rows are the material of the course, and putting them on screen means no player finishes a campaign claiming nobody told them. However, a screen that hands over the disaggregation performs the one move the course is trying to teach. The habit I am after is asking who a number covers for, inside a room where nobody else is asking. A chart that arrives open never puts that question to the player at all.
- Multilingual learners
- Students with IEPs
- Free/reduced-price lunch
- Black and Latino students
- No reliable home internet
- AP/honors track
- Not in AP/honors
What I built
The dashboard opens on one number. It reports the aggregate outcome score for the whole district, and the line under it says that nothing on the screen yet establishes whether that number reads the same for every student. Disaggregating is a control the player presses, and it is always available, it costs nothing, and it is never required. When it is pressed, the seven rows open underneath, and I demote the aggregate to a dashed reference rule crossing them. The largest figure on the screen becomes the distance between the best served group and the worst served group, sitting inside the single number the player had been governing on. My engine also records which rounds the player pressed it in, and that one tracked field is what changed the rest of my build.
What changed
The evaluation at the end of a campaign does not score whether the player optimized anything. What I could ask instead was what the player saw and when they saw it. I wrote the report’s second section to state that the dashboard showed one number by default, and that disaggregating it was always available, always free, and never required. It then names the round in which the player first pressed it. A player who never pressed it is told so, and told that the report is the first time this campaign has shown them their own subgroups.
That framing spread into the mechanics around it. Consultation worked the same way without announcing itself, since bringing a stakeholder group into the room costs staff capacity that under-resourced districts do not have. The groups left out are the ones whose warnings arrive later as consequences nobody predicted. The game says none of that while it is being played, but every mechanic reports itself at the end, in writing. The measure is the record of what the player did rather than the record of what the player meant.
What this shows, and what it does not
I know what my build does, and I know the engine is deterministic, so the same district, the same seed and the same choices produce the same campaign every time. I do not know what any of it does to a student. The application has no accounts, no database and no analytics, and it stores nothing about a player anywhere. As a result, no record of a single campaign is sitting somewhere for me to go back and read. Anything I learn about how my choice lands has to come out of a room, from watching a section play it and asking afterward. I believe that is the right trade, but it costs me the evidence I would most want to have. The test I want is the one my own application cannot run for me: how many rounds pass before somebody presses Disaggregate.