AI Adoption GuideGovernmentPlan
Regulatory gap scanner
RAG over the existing law corpus flags contradictions, gaps, and overlaps between a proposed plan and current statutes.
Government processPlanFundAuthorizeDeliverInspectEnforceReportClose
By Don, DoneThat’s AI coach · updated
Dual-cite flags are the only usable output
A regulatory gap scanner earns its keep when every flag names two pinpoints: the proposed clause and the statute section it is said to contradict, leave uncovered, or duplicate. A row that says "may conflict with housing law" is not a flag. A row that cites a short title the corpus never contained is not a flag. If retrieval does not return the Act, the cell stays empty. Empty is not a finding that the law is complete. It is a finding that this load does not support a dual-cite claim.
Counsel still advises. The scan retrieves and compares. It does not construe ambiguity, pick among canons, or clear the draft for introduction.
Statute collections from vendors such as Westlaw and LexisNexis, and document environments from vendors such as Microsoft and Palantir, already hold the proposal, the code, or both. The scanner works only on what those stores can actually return. It does not replace the official compilation or the duty to read the full section.
Load the proposal against the corpus you have
Freeze a snapshot of the proposal: bill, ordinance, plan amendment, or rule, with version, date, and clause numbers. If numbering is still moving, lock a working set and treat inserts as a new run.
Load the law next and write down what is in it. Primary Acts the proposal sits under, plus implementing regulations you have in machine-readable form. Keep commentary, floor debate, and news out. If an annotated code is present, use headnotes to navigate, not as the statute.
For each proposed clause, retrieve candidate sections from that corpus, then compare only those passages. Do not let the model reach for an Act that never appeared in retrieval. If nothing on point comes back, that clause stays blank.
Chunk by section and subsection so a citation opens a place a lawyer can read. Store official citation metadata: jurisdiction, title, section, session or year. Informal names are not enough. Keep in-force text apart from repealed and not-yet-effective text. A collision with a sunset clause is a different flag from a collision with current law. Record what you refused to load. A missing enabling Act is a corpus gap, not a hole in the legislature's work.
Emit at most three classes, and only with both pinpoints: contradiction (the proposal requires or forbids what the statute already settles the other way), gap (the proposal assumes authority, a definition, or a procedure the corpus does not supply), overlap (two schemes would apply to the same act). No dual cite, no row.
Keep policy impact simulation off this pass. Impact asks what a change would do if it became law. This scan asks whether the text can sit beside the law you loaded.
Empty rows, invented Acts, and other rejects
Empty is the correct output when the Act is not in the store. Counsel may know the Act exists. They pull it from the official source or the annotated service, add it, and re-run. They do not type a familiar chapter number into the flag to make the table look complete.
Reject these on sight.
A flag without a section cite. "This density bonus may conflict with state housing law" cannot be checked and cannot be marked in the draft. Send it back until a section number appears, or drop it.
An invented Act. Models complete familiar patterns: coastal setbacks, takings language, hearing clocks. If that Act was not retrieved, the completion is fiction. Any citation that does not match loaded metadata is void. Re-retrieve. Do not "correct" it by guessing the nearest real section.
A flag treated as legal advice. A dual-cite row is a work ticket: read both passages, consider later amendments and preemption, then advise the sponsor. It is not an opinion that the proposal is unlawful, and it is not clearance that unflagged clauses are clean. Unflagged means unflagged.
If one clause triggers a gap and an overlap, keep two rows. A missing definition and a duplicate permit path are different repairs.
Example: eight stories against a six-story cap
A planning amendment adds Policy H-14: in the downtown overlay, a project that delivers a stated share of units as affordable may build to eight stories. The municipal code in the corpus caps the same overlay at six stories. The listed exceptions do not include affordability. Retrieval returns the height section and the exception list, and nothing on bonuses.
A usable contradiction flag is: Policy H-14 (eight stories with the affordable set-aside) versus Municipal Code § 17.40.210 (six-story cap) and § 17.40.218 (exceptions; affordability not listed). Quote both sides. Stop. Do not declare the amendment unlawful. Do not invent a state density-bonus statute if that statute was not in the corpus. If counsel knows the state bonus law exists and it was omitted, add those sections and run again. Do not type a plausible chapter into the row.
A gap flag appears if H-14 uses "affordable" with no cross-reference and the loaded code defines affordability only inside another program. Dual cite: H-14 versus that definition section. Counsel decides whether to import the definition, write a new one, or point to state code once that code is loaded.
An overlap flag appears if the overlay already has a planned-unit-development path that can waive height. Two discretionary paths for the same relief is a process collision. Counsel and the planning director choose which path survives.
Do not attach counts of issues found or hours saved. The quality bar is the cite pair.
When several drafts remain, send surviving flags into a scenario comparison matrix so sponsors can see which version still hits the cap, which fills the definition gap, and which leaves the second waiver path in place. The matrix compares options. It does not invent statutes the scan never retrieved.
Counsel dispositions, not scanner verdicts
Counsel reads every flag against the full section, not the snippet. Session laws, uncodified provisos, and judicial gloss can reverse what a chunk suggested. If the official compilation and a vendor database disagree on a subsection letter, the official compilation wins and the corpus is corrected.
Each flag gets one disposition: confirmed conflict (amend the proposal, amend the existing section, or schedule both), confirmed gap (add authority, a definition, or a procedure, or drop the assumption), confirmed overlap (repeal, subordinate, or preserve the older path in express terms), or closed as false retrieval (the sections do not speak to the same thing). False retrievals are expected. They cost less than invented Acts.
This workflow does not replace the advice letter, the committee memo, or the hearing. It exists so those documents start from dual cites instead of from a general sense that the draft might be preempted.
Where a confirmed conflict will be cured by permit conditions rather than by rewriting the plan, hand the same pinpoint pair to the condition generator for approvals. A condition that cannot cite both sides recreates the original failure: a requirement nobody can trace.
The table that later work is allowed to trust
After dispositions, impact work, fiscal notes, and map changes use the surviving text, not the first draft that tripped H-14.
Keep a table: proposal pinpoint, statute pinpoint, flag class, disposition, and who signed it. That table is what a legislative compliance report assembler should ingest. A report that lists "potential conflicts with housing law" without sections is the same unusable hunch, on letterhead.
Re-run when the proposal is amended, when a new Act is loaded, or when a section in the corpus is updated. A clean scan of last month's snapshot is not a clean scan of today's text. Empty rows stay empty until the missing Act is actually in the store.
The quality outcome is narrow. You want a flag that cites the proposed clause and the statute section, or you want silence. Counsel still advises on what that silence is worth.
Is this worth automating for you?
Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.
DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.
Measure the baseline first