In production · Mid-sized city — Development Services
Source code FeaturedPermit application intake triage
Result in one line: Applications returned for a missing document fell from 46% to 12% of intake
Reads incoming building and trade permit applications, checks them against the submittal requirements for that permit type, and routes complete ones straight to a plan reviewer.
Published February 24, 2026 Updated June 30, 2026 Verified July 28, 2026
- Skills needed to set it up
- Developer
- Readiness
- Needs customization Human review built in
- Data it touches
- Personal information (PII) Internal, non-public data
- Who sees the output
- Internal staff
- License
- MIT
- Cost to stand up
- $25k–$100k
- Portable to other platforms
- Partially — with rework
- Use case category
- Administrative & task automation
- Reviews it went through
- Privacy review Security review or authority to operate Records retention review
- Security review
- Automated checks only
What do these mean?
- Developer
- A software developer to deploy or adapt it.
- Needs customization
- Your team will need to adapt it before use.
- Human review built in
- A person checks the AI's output before it is used.
- Personal information (PII)
- Names, addresses, IDs or other personal identifiers.
- Internal, non-public data
- Non-public operational data without personal identifiers.
- Internal staff
- Used only inside the organization.
- MIT
- Permissive; reuse with attribution.
- Partially — with rework
- Some pieces are vendor-specific and would need swapping.
- Administrative & task automation
- Forms, intake, scheduling, records — the routine work that eats staff time.
- Security review or authority to operate
- A security assessment, ATO or equivalent sign-off.
- Records retention review
- Confirmed how long the outputs must be kept and where.
- Automated checks only
- Nobody has reviewed this project. All that is recorded is what the monthly sweep could observe from the outside — repository activity, license, security policy, public OpenSSF Scorecard — and none of that inspects what the code does.
Problem
Roughly 9,000 permit applications a year arrive through the online portal, and close to half of them were returned to the applicant for something missing — an unsigned form, no site plan, an expired contractor licence. A permit technician found that out by opening every attachment and comparing it against a submittal checklist that lives in a different document for each of 34 permit types. The check took eight to ten minutes per application, and the queue ran three to five days behind for most of the year.
The cost of that delay was not evenly spread. An applicant with a permit expediter on retainer got their corrections back the same afternoon. A homeowner filing their own deck permit waited a week to find out they had forgotten one form.
What we built
A service that sits between the portal and the permitting system. When an application lands, it reads the attached documents, extracts the fields that the submittal checklist for that permit type asks for, and produces one of three outcomes: complete and routed to a plan reviewer, incomplete with a specific list of what is missing, or unclear and sent to a technician to look at.
The checklists were the real work. They existed as 34 separate documents written over about fifteen years, and turning them into one machine-readable rubric took longer than building the service. That rubric is in the repository and is probably the most reusable thing here.
How it works
Uploaded documents go through Azure AI Document Intelligence for text and layout. A model then answers a fixed set of questions per permit type — is there a site plan, is the contractor licence number present and unexpired, is the valuation stated — using only the extracted text, and it must cite the page it took each answer from. The citation requirement is what makes the output checkable; a technician clicks through to the page rather than taking the answer on trust.
Nothing is rejected automatically. “Incomplete” means the applicant gets a message listing what is missing, which is what a technician would have sent anyway. “Unclear” always goes to a person. Complete applications route to a reviewer and a technician spot-checks 10% of them each week.
Everything is deployed with Terraform into the city’s own subscription.
Results
Over the first four months in production, applications returned for a missing document dropped from 46% of intake to 12%, because most of what used to be caught after a three-day wait is now caught at submission while the applicant still has the file open. Median time from submission to first response went from 3.4 days to under an hour.
The 10% spot check has found the model wrong 27 times in four months, almost all of them in the same direction: calling something complete when a required drawing was a placeholder page. We now check drawing sets separately and more strictly, which is the change the spot check paid for.
Lessons learned
Write the rubric with the technicians who currently apply it, in a room, before you write any code. Half of our checklist items turned out to be applied differently by different technicians, and the model made the disagreement visible rather than causing it.
Do not let the model reject anything. Every design conversation where someone proposed auto-rejection ended with a case where a person would have made the call differently, and the value was never in rejection anyway — it was in telling the applicant sooner.
Budget for the drawing files. Text-heavy PDFs are easy; a 40 MB drawing set with a scanned cover sheet is where the extraction gets expensive and slow.
How to reuse
Clone the repository, replace the rubric with your own checklists, and expect the rubric work to be most of the project. We used an AI coding assistant heavily for the parsing and infrastructure code, which is why ai_role says both. A developer with cloud access can have the shadow-mode deployment running in a week; getting the checklists agreed took us eleven.
About
- Area of work
- IT & operations
- Data & informatics
- Policy & planning
- Review status
- Reviewed & approved
How it's built
- How AI is involved
- Both
- Types of AI
- Classification & NLP
- Document Q&A (RAG)
- Computer vision
- AI tools & models
- Azure OpenAI Service
- Azure AI Document Intelligence
- Python
- Terraform
- Where it runs
- Microsoft Azure
Sharing & licensing
- Portability notes
- The rubric, the prompts and the queue logic are plain Python and travel anywhere. Document parsing uses Azure AI Document Intelligence; a team on another cloud would swap that for its own OCR service and re-tune the field extraction, which is about two weeks of work.
What it took
- Cost to keep running
- Under $10k/yr
- How it was bought
- Existing enterprise licence
- No procurement needed
- Who it affects
- Everyone who applies for a permit is affected, and the group most helped is the one least likely to have a permit expediter: homeowners and small contractors filing on their own, who accounted for most of the returned-for-corrections queue. We compare the return rate for self-filed and agent-filed applications every month. Completeness is the only thing the model judges — it never scores an applicant, and no approval decision is made from its output.
Data & access
- No PII/PHI in the shared material
- Yes
- Data sources
- Permitting system application records
- Uploaded submittal documents (PDF, DWG cover sheets)
- Submittal requirement tables by permit type
- Data-governance caveats
- Applications carry applicant names, addresses and contact details. Everything stays inside the city's own Azure subscription, nothing is used to train a model, and extracted text is deleted after 30 days while the permit record itself follows the existing retention schedule. No real application data appears in this entry or its screenshot.