2026-05-31 · verification
Ontario changes its laws about 500 times a year. I built the tool that reads every one.
Enacted tracks all 3,055 Ontario regulations and statutes, computes the exact diff when one changes, and explains it in plain English. The interesting part is what the AI isn't allowed to do.
Ontario files roughly 500 regulations a year and amends its statutes continuously. Every one of those changes is published, in full, on the province's official legislation site, and almost nobody operational reads them, because they're published as consolidated legal text, not as answers to the only question a business owner has: what changed, and does it affect me?
If you want that question answered today, you can pay about $1,000 a month for an enterprise monitoring tool aimed at banks, or read the free newsletters Bay Street firms write by hand for the changes they happen to find interesting. Or you find out when the fine arrives.
So I built Enacted. It checks every consolidated regulation and statute in Ontario daily, all 3,055 of them, computes the exact line-by-line difference when one changes, and publishes a plain-English summary of what changed and who it affects. Weekly digest by sector, every item linked to the official text. Free.
The part I care about: what the AI isn't allowed to do
Enacted is an AI product in a domain where being wrong is expensive. A summary that invents an effective date or misattributes a regulation number is worse than no summary at all, because it looks authoritative. So the architecture starts from a rule I now apply to every system I ship: the parts that must be right are never left to the model.
The model never decides that a law changed. Change detection is a fact read from the official index, like a new effective date on a consolidated version. A state flip or a new instrument appearing counts the same way.
The model never produces the diff either. When a regulation changes, the pipeline fetches the new consolidated text and the previous version, normalizes both, and computes a unified diff. That diff is the product's evidence layer, and it appears on every change page so you never have to take a summary's word for anything.
The model writes exactly one thing: the plain-English explanation of a diff it was handed. Its input is the computed diff plus official metadata, nothing else.
And because instructions aren't guarantees, there's a gate. Before any summary publishes, a deterministic check scans it for legal citations and date strings and rejects it if it contains any that weren't in its input. A rejected summary doesn't get fixed up or retried into compliance. The page renders the diff without one, flagged for review.
Change detected
A fact read from the official index: a new effective date on a consolidated version, a state flip, a new instrument appearing. The model never decides this.
Fetch both consolidated versions
The new text and the previous version, normalized.
Compute the unified diff
Plain code. This is the evidence layer, and it appears on every change page.
Model writes the plain-English summary
Its input is the computed diff plus official metadata, nothing else.
Citation and date gategate
A deterministic check rejects any summary containing a citation or date string that wasn't in its input. No retries.
Publish, or render the diff alone
A rejected summary means the page ships with just the diff, flagged for review.
The gate caught one on day one
I seeded Enacted with eight weeks of history before launch: 128 change events, each diffed and summarized. The citation gate rejected exactly one summary, one where the model had introduced a citation that wasn't in its input.
One out of 120 published is a good model on a tight leash. But the reason I'm writing about it is what that single catch represents. Without the gate, that summary ships, looks exactly as authoritative as the other 119, and is wrong in the one way this domain can't tolerate. With the gate it cost nothing: the summary got flagged and the page rendered the diff on its own until I reviewed it. Every probabilistic system I ship now has a deterministic layer like this.
The data was technically public and practically locked
One thing I didn't expect: Ontario has no bulk download for its regulations. The province's own data catalogue lists the table of filed regulations as unavailable, citing cabinet confidentiality. The official site is a JavaScript app, and the legal text it renders comes from somewhere.
That somewhere turned out to be an undocumented JSON API underneath the site, which I found by reading the app's own network traffic and then verified endpoint by endpoint before writing a line of pipeline code. It's a clean API. It enumerates every law sorted by what changed most recently and serves full version histories, and it can return the consolidated text of any version, current or historical. The pipeline respects the site's published crawl delay and identifies itself honestly, and at steady state it touches a few dozen pages a day.
The legal footing is good too: Ontario grants royalty-free reproduction of its statutes and regulations, with two conditions the site honors on every page, attribution to the King's Printer and a clear statement that this isn't an official version.
What it costs to run
Less than a gym membership. Polling is free, the model spend is one summary per actual change, which lands under ten dollars a month at Ontario's regulatory pace, and hosting is a static site. The heavy thing isn't compute, it's deciding which parts of the system are allowed to be probabilistic.
What's next
Enacted launched Ontario-first because I live here and the licensing is clean. The day after launch I added the entire federal corpus: Justice Canada publishes its consolidated laws as an XML repository, so federal change detection is a tree diff between official updates, one that can't silently miss or invent a change. BC runs a public API for its laws and is the natural next expansion. Proclamations, the mechanism that brings statute provisions into force outside the regulation stream, are the known gap I want to close next. The methodology page lists everything the system can and can't catch, because a monitoring tool shouldn't be vague about its blind spots.
If you operate anything regulated in Ontario, the weekly digest is at enacted.ca. And if this pattern, a deterministic core with AI at the edges, is something you're wrestling with in your own documents, that's the problem space I live in.