The problem
The client is a civic information service used by residents who want to know what a public body is scheduled to discuss, what a published notice says, and where to read it. Staff were answering from the agenda packet, the notice, and the public register. The questions repeated. The risk in answering faster was inventing a clause the packet did not contain, or sounding like the institution had taken a position it had not published.
The scope was written down at the start, because the same tools are sometimes asked to do something else. This system does not take a voter file, does not score residents, and does not draft persuasion. It answers from documents the institution has already published, with the document attached.
Why the published record is the whole product
A civic answer that cannot be opened beside the agenda is a rumor with a confident tone. The requirement was a citation to the agenda, the notice, or the register, and a refusal when those documents do not address the question. Refusal is a successful answer. Filling the gap is not.
Architecture
Only published documents are indexed
The corpus is the agenda packet, the public notice, and the register entries the client already posts. Drafts, staff notes, and anything not published are not ingested. A question about an unpublished draft is refused, even if someone pasted the draft into the chat.
The citation is checked before release
Each answer names the document and the section. An answer with no matching passage is not shown. The resident sees the passage, not a paraphrase standing alone.
No person-level political data
There is no voter file, no party field, and no demographic append. The system does not know who is asking beyond the question text. We did not build a slot for those fields, so a later request cannot turn the feature on quietly.
The institution's voice stays with a person
The assistant does not issue a statement for an office. If the resident asks what the office 'believes,' and the published record does not say, the answer is that the record does not say. A person publishes anything that speaks for the institution.
Challenges and tradeoffs
- A packet updated after publication left the index stale. A substituted agenda item was still being quoted from the morning file. The index now follows the published URL the clerk treats as current, and the answer shows the document time.
- Residents asked the assistant to write testimony for them. That is a generated position, not a quotation. Those requests are refused with a pointer to the agenda, so the resident can speak from the record rather than from a drafted script.
- A fluent summary dropped a condition in the notice. The notice limited a comment period. The summary omitted the limit. We require the limiting sentence to be in the quoted passage when the question is about how to participate, and the evaluation set includes those notices.
Results
On the held-out questions, 93% of answers the assistant released cited a passage a reviewer found in the published document. The rest were refusals. The system has no voter-file field and no persuasion generator, which we verified by inventory, not by a promise in the prompt. A person still publishes anything that speaks for the institution.
Residents with a question the packet does not answer get told that, which is the result the clerk asked to be able to stand behind.
What we'd do differently
We would have put substituted-agenda updates in the first pilot week. The morning file felt current until the first substitution, which is a normal clerk workflow we had treated as an edge case.