Permit Office
Public betaA 12-week city-management game built in ArcGIS Pro, where permits, inspections and map selections change the city.
At a glance
- Outcome: Runs a playable, seeded 12-week city game in ArcGIS Pro. Feature classes store state; selections provide input; geoprocessing ends with an audit.
- Status: Released public beta v0.95 after 19 working days in May and June 2026. Verified live district repaint; cold-start resume, feature rings, legacy saves and balance remain unverified.
- Role: Designed and built the rules, adapter, tests and documentation solo.
- Stack & libraries: Uses Python, arcpy, Tkinter, ArcGIS Pro 3.3+ and a file geodatabase.
- Source: Publishes MIT-licensed source with architecture documents, ADRs and a changelog on GitHub.
- Validation: Runs 314 rule/adapter-shim tests. The recorded v0.95 run passed 313 and skipped 1 waived redraw file-size guardrail; a fixed seed passes all 12 weeks without ArcGIS Pro.
- Limitations: Requires ArcGIS Pro. Leaves 33 written live-smoke checks unrun and fair-result tuning as open design work, not polish.
Game rules
Assigns permit-clerk paperwork, inspections, approvals, denials and reports rather than mayoral control. Each four-case week provides two action points; inspection and issuance cost one, ordinary denial is free, and mandatory deferral is not. Unhandled cases resolve automatically, return, close, raise district pressure, or create enforcement and incidents.
Creates business/housing/transit/hazard features whose effects reach their district and neighbors. Seeds reproduce cities and dockets; audits grade week 12. GIS structures provide state, selections provide input and spatial rules provide the game loop.
Docket model
Represents permits/incidents/enforcement orders/maintenance follow-ups/multi-week project steps with one record. Two dozen hand-written templates define effects, costs, risk, stakeholders and ignored outcomes; new events add templates. One function returns changed districts and amounts, feature updates and stakeholder changes. The ArcGIS-free rules and adapter share only this result; the adapter repaints stale layers.
Storage and adapters
Uses one file geodatabase for the city and save. It stores districts, features, docket rows, projects and actions; the dashboard rebuilds per reload and retains only session bookkeeping. Interrupted sessions resume without a second save.
Implements districts, dockets, decisions, turns and audits in plain Python. The adapter contains all arcpy and Tkinter calls, enabling rules and balance work without a license or running session. ArcPy selects districts, generates proposed geometry, computes spillover, activates features and writes results.
District redraw
Handles ArcGIS reusing cached renderers after attributes change. The first optimization measured safe and shipped, then froze the initial board; its commit is reverted and its decision record documents the conflicting faulty measurement.
Avoids four-to-five-second layer replacement. Three display slots allow a hidden rebuild and symbol pass before swapping; failure preserves the previous slot. Rejected faster variants, including an approximately one-second path that painted red and gray after exit. Visual correctness gates the work; redraw and performance span 42 of 155 commits. Reused Evocatio simulation logic, then supplied its later docket-and-rulings interface.
Screenshots




