A city published its requirements. Here is a working prototype, built against them.
The City of Medina published a permitting-software RFP in February 2026. Its own words describe the target: about 2,700 records and 2,400 inspections a year, seven staff users with three in the field, and ten enumerated capabilities it wants software to provide. Its published permit applications are PDF forms whose fee line is left blank for staff to complete, and it asked vendors to move submission, payment, and inspection requests online. Proposals closed March 13.
This is that list, working. Residents pick a permit type, see the fee calculate as they type, submit, and watch their permit move through five stages. Staff run the whole process from one screen, and the software refuses the illegal moves a paper process cannot: no inspection before fees are paid, no permit issued with an open inspection. Inspectors close permits from a phone, and a failed inspection books its own redo. It was built and red-teamed across two working sessions on August 2, 2026 from the city's published documents, as an independent exercise without stakeholder access; the catalog and form fields are the city's own, the fee amounts and workflow sequence are labeled assumptions, and discovery with the agency is where a real deployment would begin.
Demonstration only, with synthetic data; all names are fictional. Not a bid; not affiliated with, endorsed by, or submitted to the City of Medina, Medina County, or any software vendor. The city's contractor registration now runs on a commercial permitting platform and its permit applications remain PDF forms as of August 2, 2026; this exercise analyzes a closed public procurement. Contact: michael@vismu.co.
00 / What to try first
Follow one permit through it.
- Apply: pick "Building Permit & Zoning Certificate," look up parcel 028-19A-24-071, enter a cost, and watch the fee build itself. Submit and keep your record number.
- Records: find your record, advance it to Review, then to Fees Due. Now try to schedule an inspection: the software blocks you until payment is recorded, and says why.
- Pay: record the simulated payment. The record moves itself to Inspection. Schedule a Footing inspection.
- Field: open the Field tab, sized for a phone, and press Fail. A reinspection books itself for three days out.
- Pass the reinspection: the passing result supersedes the failure, and because fees are settled and nothing is open, the permit issues itself. No one had to remember.
Then break it on purpose. Try to advance an unpaid record, generate the same renewal twice, or issue past an open inspection. The refusals are the demonstration.
01 / The ten requirements
Every RFP requirement, mapped and graded honestly.
The RFP enumerates ten required capabilities. The grades below are deliberately strict: BUILT means the demo does the thing end to end; PARTIAL means a meaningful subset works and the gaps are named; SIMULATED means a real integration is stood in for; PLATFORM means it belongs to production infrastructure, not this build; PLANNED means it is scoped but not built. A demo that grades itself generously would be arguing against its own thesis.
| # | City's requirement (paraphrased from the RFP) | What the demo does, and does not | Grade |
|---|---|---|---|
| 1 | Records for permits, code enforcement, contractor registration, and boards; workflow steps; links to related records, parcels, fees, inspections, documents; multi-department access; staff customization | Does: one record store, guarded workflow, parent-child links (trade permits link their building permit at intake), fees, inspections, documents-by-name, notes. Does not: code-enforcement or board record types, roles or per-department access, staff-customizable fields | PARTIAL |
| 2 | Online applicant interface: submit applications and documents, pay fees, request inspections, interact with staff, view records | Does: type-specific submission, live fee preview, status tracker. Does not: real payment, real document upload, applicant-initiated inspection requests, two-way messaging | PARTIAL |
| 3 | Automated temporal renewals, such as annual contractor registration | Does: watches expirations, queues eligible registrations, generates a linked renewal once per source record. Does not: run on a schedule without a staff click; window and term are assumed | PARTIAL |
| 4 | Create, assign, customize, and track inspections | Does: scheduling, assignment, tracking, results, automatic reinspection after a failure, latest-attempt-per-type governs issuance. Does not: staff-customizable inspection types (the taxonomy is assumed) | PARTIAL |
| 5 | Field use on mobile devices | A phone-width worklist where an inspector records pass/fail and notes on site; failing schedules the reinspection automatically | BUILT |
| 6 | Automatic fee generation from record information | Fees compute from type and valuation at draft time and gate the workflow. Every amount and formula is an assumption, labeled in the interface: the city's posted fee-schedule link returned 404 when checked (2026-08-02) | BUILT |
| 7 | Off-site or cloud data storage sized to the department | Demo persists locally in the browser by design (no real data should exist here). Production storage is a platform concern | PLATFORM |
| 8 | Integration of Medina County Auditor property data, auto-updating | A parcel lookup by PPN pre-fills property data from a fabricated feed, refreshed only on lookup. The RFP prefers automatic updating; the real feed's access method and cadence are discovery items | SIMULATED |
| 9 | Customizable reporting, exportable to PDF, CSV, or Excel | Does: fixed operational summaries, records CSV, inspections CSV. Does not: user-configurable reports, filters, or chosen dimensions | PARTIAL |
| 10 | Migration of all data and documents from the current software | Not buildable without the incumbent's export; treated as its own phase with a parallel-run gate in the plan below | PLANNED |
02 / Honesty ledger
Which rules are the city's, and which are mine.
| Status | Items |
|---|---|
| SOURCED | The 19-type application and permit catalog (the city's page lists 4 applications, 12 permits, 4 planning/zoning entries; the Board of Building Code Appeals application is out of demo scope); the Building Permit form's fields (PPN, lot, historic-district flag, improvement and use types, construction classes I-A through V-B, sub-permit cross-references); the four workflow components the RFP names (submittals, reviews, fees, inspections), but not their sequence; volumes, user counts, dates, and population from the RFP; the broken fee-schedule link |
| DEMONSTRATED | Everything the demo actually executes: guarded transitions, fee gating, reinspection-after-failure, latest-attempt supersession, renewal generation with a once-only latch, exports |
| ASSUMED | All fee amounts and formulas; the workflow SEQUENCE and which stages a permit type passes through; which types require plan review (the demo routes review and non-review types differently, all assumed); the required-inspection set per type; the inspection taxonomy; the 60-day renewal window and 365-day registration term; contractor registration handled in-catalog (the city runs it through a separate portal) |
| UNKNOWN | Everything only discovery can supply: the real fee schedule, exception paths, the Auditor feed's shape, the incumbent's export, counter traffic, multi-department permissions, the Director's success measures |
The role this exercise responds to pairs a forward-deployed PM with a forward-deployed engineer: reusable scaffolding versus per-agency configuration. The demo tags its views accordingly, and this ledger is the same discipline applied to the claims.
03 / Discovery questions
What the RFP does not answer, and I would not guess.
A working prototype is not a deployment. These are the questions I would open discovery with, because the answers change the build and no public document contains them.
04 / Implementation plan
The rollout the RFP asked proposers to describe.
| Phase | Weeks | Work | Gate to proceed |
|---|---|---|---|
| Discovery | 1-2 | The questions above, on site; fee schedule and workflow captured as configuration; sample export from the incumbent | Director signs the workflow map and fee table |
| Configuration | 2-4 | Permit catalog, forms, fees, roles configured; staff walkthrough against real cases they choose | Staff complete five real record types end to end in the sandbox |
| Migration and parallel run | 4-8 | Full data migration; new applications enter both systems; discrepancies logged and burned down | One full week of parallel operation with zero unexplained discrepancies |
| Cutover readiness | 8-10 | Counter-assisted mode rehearsed; field devices in staff hands; support path agreed; rollback plan written | Staff, not the vendor, call the go date; the incumbent stays read-only, not off |
| Measurement | Through week 22 | 90-day scorecard against the baseline set in discovery, reviewed with the Director | Renewal decision on evidence, not inertia |
Timeline honesty: this assumes the incumbent can export and the Auditor feed has a machine-readable form. Discovery exists to test those assumptions in week one, not to discover them in week six.
05 / Cost anchors
What the buyer budgeted, and what other governments have paid.
The RFP requests costs as initial setup, recurring, and miscellaneous. Inventing a vendor quote here would be theater; what the public record supports is a buyer-side budget anchor and a set of public contract anchors, each checked against its primary council document before inclusion. These are contracts of differing scope, module count, and volume, not normalized market prices: read them as range and structure, not as a quote.
The buyer's own anchor: Medina's authorizing Ordinance 215-24 estimated "$50,000.00 for initial setup and $35,000.00 annually" for these services. Against the RFP's ~2,700 annual records, the city's own recurring budget is about $12.96 per record per year, with all the limits of a budget estimate.
| Government (2020 pop.) | Setup | Recurring | Term | Public record |
|---|---|---|---|---|
| Medina County, OH (the city's home county, 2026) | $59,500 | $72,500/yr | 5 yr; $132,000 Year 1 | Resolution 26-0476 |
| Peekskill, NY (25.4k), ~48 planning matters/yr | $5,000 | $15,000/yr | 2-yr minimum | Adopted minutes, Feb 2026 |
| Manor, TX (13.7k) | $0 (discounted) | $34,000/yr | 3 yr | Council order form, Nov 2025 |
| Panama City, FL (32.9k) | $14,500 | $33,000/yr | 3 yr; $113,500 total | Agenda item, Mar 2024 |
| Gadsden, AL (33.9k) | not separately stated | $59,000 y1; $39,000 y2-3 | 3 priced yrs | Resolution R-466-24 |
The parametric model a real quote would need: users and field seats, annual record and inspection volume, migration scope from the incumbent's sample export, document storage, integration count and depth (Auditor feed, payments), training and counter-assisted intake, support tier, and an uncertainty band that narrows at each discovery gate. Each is a line an owner can check, not a contingency bucket.
06 / Colophon
How this was made, and what it does not claim.
- Sources: the city's published RFP, its applications and permits page, its published Building Permit and Electrical Permit PDFs, and Ordinance 215-24. Cost comparables arrived as external research leads and each included figure was re-verified against the primary council document before use.
- Build: agentic tools end to end (Claude Code driving research, extraction, code, and browser verification), across two working sessions on August 2, 2026, with a cross-model adversarial review (OpenAI Codex) between them. The review found real defects across successive rounds: an issuance path that skipped payment, a stricter round that found the workflow could still be bypassed by early payment and by single-inspection issuance, discarded form fields, unescaped stored input, UTC date handling, and overstated capability grades. Each was fixed and re-tested. The review-then-fix cycle across two independent models is the process this exercise is meant to show.
- Truth standard: factual claims about the city cite its documents; everything simulated or assumed is labeled in place and in the ledger above. Where a claim could not be verified, it was removed or downgraded rather than hedged.
- What this does not claim: stakeholder discovery, which no artifact can perform; client delivery or commercial outcomes, which belong to real engagements; a production security posture; or any affiliation with the City of Medina, Medina County, GovWell, or Concourse.