C:\GRIFFIN\PROJECTS\GAMES\PERMIT-OFFICE>

[@] MAP
###C########P###
#...........$..#
#.&&..&&...&&..#
#......@.......#
#...*......&&..#
#..............#
###H########O###
GAMES/PERMIT-OFF

Doors are hotkeys. Or click the screen and walk with the arrow keys.

Permit Office

A 12-week city-management game built in ArcGIS Pro, where permits, inspections and map selections change the city.

Status
Public beta
Stack
Game · ArcGIS · ArcPy · Python
Source
github.com/Griffinhale/permitOffice

At a glance

  • Outcome: A 12-week city-management game that runs inside ArcGIS Pro. You are the municipal permit clerk; feature classes hold the city, map selections are your input, and a goal you pick and three audits grade the season.
  • Status: Public beta. v0.97.0 was tagged October 5, 2026 and checked live in ArcGIS Pro 3.7; it needs Pro 3.3+ and was tested on 3.6 and 3.7. Known issue: with a basemap in the map, the districts go blank for a second or two at each week close.
  • Role: Designed the rules, ArcGIS adapter, tests and docs solo; reviewed and debugged AI-assisted implementation.
  • Contribution: I wrote the rules, the 17 decision records and a failed-experiments log. I built the VM testing harness and designed the probes; AI sessions drive Pro, and I review the recordings and choose fixes.
  • Validation: The recorded pre-release VM round at 4a81546 reports 428 offline tests passed and one skipped, plus live ArcGIS Pro checks of New Game, Continue and season-end reports. Offline tests run without an ArcGIS license. A preview script renders the desk without Pro.
  • Stack & libraries: Python, arcpy, Tkinter, ArcGIS Pro 3.3+ (tested on 3.6 and 3.7), file geodatabase.
  • Source: MIT-licensed on GitHub, with architecture docs and decision records.

Permit Office is a turn-based city game that runs inside ArcGIS Pro, the mapping software city analysts use. You play the permit clerk, keeping an odd city running through inspections, approvals, denials, conditions and audits. Every permit is tied to real map shapes, district conditions, pressure from interest groups and ongoing costs, and its effects show up on the map. The longer goal is live city simulations built from standard ArcGIS tools, for things like disaster planning and emergency rerouting.

Each run opens on a main menu. A new season offers three goals drawn from the seed, such as quieting every grievance or raising city trust to 55. You file one, and week 12 judges the season by it. Each week brings two new cases plus follow-ups, and you have two action points. A case might be a street vendor agreement, a utility trench, a parade route or a rewilding permit. You inspect the file if you can spare a point, then approve it, approve it with conditions or deny it. Each case says what happens if you ignore it. Once a week you can also start an initiative that favors a district type or pushes the districts selected on the map. Ignored cases build pressure until a weak district gets bought out by a neighbor and changes its type and name. The council audits the office at weeks 4, 8 and 12. A failed audit costs patience: a warning, then one action point less, then dismissal.

The map database is the game. Districts, cases, projects and permits all live in one ArcGIS database file, so the save file is the map and the selection tool is the controller. The game rules are plain Python that never loads ArcGIS code. A fixed seed can play all 12 weeks in tests on a computer with no ArcGIS license. ArcGIS Pro’s scripting and its map share one thread. Re-adding a map layer took 4 to 5 seconds, so the game redraws only the layers a decision changed. On Pro 3.7, switching a layer’s filter instead brings the district step down to 0.33 to 0.52 seconds, and a district underlay avoids the whole-map white flash on an empty map. A basemap still causes the documented one-to-two-second gap; New Game opens an empty map when other layers are present.

I built a harness to test Windows-only ArcGIS Pro inside a VM from NixOS. Each probe records one map operation and captures layer snapshots before and after it. Comparing those snapshots with timestamped video makes brief redraw problems visible where logs alone cannot show them. I used the loop to isolate a dashboard-close crash, then witnessed the fix by running another ArcGIS operation after closing the dashboard.

Pure-Python tests check seeded game rules without Pro. Offline adapter tests use ArcPy substitutes to check how the game calls ArcGIS. The VM checks exercise Pro itself, including map redraws and dashboard behavior. I review those results separately: an offline pass does not establish a live pass, and gaps between captured frames limit what a recording can rule out.

v0.97.0 is on the releases page with the new desk, goals, audits and initiatives. The same rules-first design now runs on real city map data in Civic Sims, a separate ArcGIS Pro add-in.