01
The daily work
Before the AI, there is the tracking: buildings, inspections that come back around, tasks, incidents. This is the part a spreadsheet holds today.
Your buildings, and who is allowed to touch them
Each building carries its floors, its rooms and its attachments. Access is granted building by building: a person sees the buildings they were given, and nothing else.
The grant is written against the building rather than against the person — because “who was allowed to touch this building, and when” is part of that building’s compliance history.
The inspections come back on their own
Five cadences: monthly, quarterly, semi-annual, annual, biennial. There is also the one-time inspection, which generates nothing after it. When you complete an inspection, the next one is created — attributed to the person who just completed the previous one, because that act is what caused it.
This is not AI. It is arithmetic on a cadence a person chose. The app does not decide when to inspect.
Tasks, and the proof that it was done
A task carries a due date and someone responsible. To close it, the completion evidence must point at an attachment already on that task — not a link to something else, not a note written afterwards.
A task due today counts as overdue, everywhere and in the same way, so the tile and the row badge can never disagree.
Incidents
A water leak, a breakdown, a complaint: you open it, you add dated notes as you go, and it stays in the building’s history.
An incident can become a finding on the record, through the same human act as everything else. It adds no new AI path.
The dashboard is recomputed, never stored
Overdue tasks, open findings, high-severity findings still open, inspections due soon, inspections past due, and the share of findings that have been closed. For your whole portfolio or for a single building, with the same figures.
There is no aggregates table and no cache: everything is recomputed from the rows, so the figures cannot drift from them. And the share of closed findings is not a compliance score — it stays empty when there are no findings, because “0%” on zero findings would be a lie.
02
What the AI proposes
It reads the report, proposes findings, and places each one on a page it has verified. Then it stops and waits.
Damaged heat insulating material — basement mechanical room.
- Source:
- page 23 of the PDF file
- Page verified. The finding matches the text on that page.
- Severity:
- not stated in the report
RSST, section IX.I
then
Approved by
Marie LalondeProperty manager
2026-09-14 15:08 · audit #4812
It reads the whole report — PDF and .docx
Two formats, no more. A legacy .doc file is refused by name, with instructions; a photo is told it is an image, not a report. It reads the whole document up to a limit, and when it has truncated, it says how many pages it read out of the total.
It reads the PDF’s text layer first. Character recognition is used only when there is no text layer at all, and only on the first ten pages. The extracted text is never kept.
Every finding carries a verified page
The app numbers the pages itself before handing the text to the model. The model can only point at one of those numbers: a number it invented returns nothing. The finding’s description is then compared against the full text of the claimed page, giving weight to words that are rare in the document and almost none to words that turn up everywhere.
Four conditions have to hold at once: enough shared vocabulary, enough distinct words rather than one lucky match, no other page that explains it better, and a page that stands out from the document’s average. Otherwise there is no page at all — the field stays empty. Never an approximation.
A file page, not the printed number
The verified page is the page of the PDF file. That is not always the number printed at the foot of the page: a cover and a table of contents are not numbered, so page 16 of the file can print “PAGE 14”. The app shows the file page, and says so.
And what verification guarantees is that the text on that page accounts for the finding. It cannot catch a numbering mistake made earlier — that is a separate guard, elsewhere in the app.
The page belongs to the proposal, not to the record
You see the page while you are reviewing the proposal. Once the finding is approved, the record keeps the finding — not the page number.
That is deliberate. A page belongs to one document: the day a corrected report replaces the original, a stored page number would point into the wrong document.
Nothing exists until a person approves
A proposal is stored nowhere: no table, no column, no “pending” state. The row on the record appears at the moment a person approves it. Its existence is the approval.
And there is no batch approve, deliberately: a single request that approved six proposals would produce six compliance decisions from one click.
An approval is withdrawn, not erased
An approved finding cannot be deleted. It moves to “cancelled” and the row stays. If corrective work is under way, the cancellation is refused rather than carrying everything with it: cancelling a finding never cancels someone else’s work.
The name of the person who approved is in the audit trail, not in a column on the finding. “A person signs” is true; “the finding carries an approved-by field” is not.
Who can turn a proposal into a record
A property manager can record a finding by hand. They cannot turn AI-drafted wording into a record: that takes a more senior signature.
The manual path stays open precisely because a person wrote every word. It is AI-drafted content entering the record that warrants the senior signature.
03
What it refuses to do
This is the part a competitor cannot copy honestly.
Before you send a contractor, it tells you what is missing
The RBQ licence was verified against the official register when the contractor was added, and you can re-verify it whenever you want. Insurance is confirmed by a person: their name and the date stay on the file. There is no public register for insurance.
What the check looks at: is there a policy on file, is it active, is its expiry in the future, and does its jurisdiction match. It calls nobody, reads no certificate, and evaluates neither coverage amounts nor scope.
It warns you, records it, and lets you decide
If something is missing, the app warns you, records that you were warned, and lets you override. It does not block.
Exactly one case is refused at the moment of assigning: an owner-builder licence, which covers work on one’s own account and not work for others. The refused attempt is itself recorded.
A verification is dated, because a licence can change
The date of the last verification stays on screen, and that is the part that matters. A contractor’s licence ceases to have effect as soon as its holder falls into one of the eight situations set out in the Building Act — among them bankruptcy, and failing to pay the dues required to maintain the licence by the due date. So a verification from six months ago says nothing about today.
After 90 days the app flags the record for re-verification. It never shows it as “invalid”: it does not know what changed, it only knows when it last looked. And a register lookup that fails changes nothing at all, not even the date — so a failure never silently refreshes a record.
It cites the regulation, or it refuses
955 sections across four corpora, all Québec. Where a corpus is allowed to carry the text, it quotes it. Where it is not, it gives the precise reference without the text: a question about asbestos or elevators gets an excerpt, a question about fire protection gets pointers.
This is not a setting. The text is stripped at import from the corpora that may not carry it, so a hand-edited file cannot smuggle protected text in.
Four ways to refuse rather than invent
If the search finds nothing, the model is not called at all. If it says it has nothing to answer with, that is a refusal — but the sources stay on screen. If it cites a passage it was not given, the reference is deleted rather than renumbered: guessing which passage it meant would be the same fabrication, one layer down. And if its prose names an article that was not found, the whole answer is discarded.
The list of sources is built from what the app actually found, never from what the model wrote. A model cannot add a source by talking.
The answer is in French, whatever the interface language
The interface is French and English. The answers in the regulation section are in French only: the corpus is Québec legal text, and that part is deliberately frozen to French.
Extraction is different — it follows the document’s own language. An English report yields English findings that keep their verified page, but a finding translated into French loses its page, because corroboration does not cross languages.
What the record keeps
Every change is written in the same transaction as the change itself, through a single choke point: if the change rolls back, so does the entry. Nobody is ever deleted — an account is deactivated — and that is what keeps the record readable. All four roles can read it, including the executive; what scopes what you see is the building access, not the role.
The record is append-only: no path in the app updates or deletes an entry. That does not make it a cryptographically sealed ledger, and it is not an immutable chain — we will not say that it is.
Two things are never kept
The text extracted from the report. And the AI’s proposals themselves: an unapproved proposal is a sentence a model produced, and the safest record of it is no record.
Today, the only AI engine that is implemented runs locally. That is a dated state of affairs, not an architectural promise: we will not say your data will never leave your machine, because the code does not promise that forever.
What does not exist
No email sent by the app, of any kind. No mobile app. No bulk import of contractors. No automatic reading of insurance certificates. No questions and answers over your own data: the regulation section covers Québec regulation, not your portfolio. And no compliance score.
There is no sign-up either: accounts are created by an administrator in your organisation. This page changes the day any of these lines changes.
See it on your own reports.
The demonstration runs on a report you already know. There is no account to create and no trial to activate: a person replies and books a time.