What it answers, what it refuses, and how one association is never answered from another's rules. Written to be read by somebody who will not read the code.
SmartCommunity answers a resident's questions about the place they live, out of that association's own documents, and names the document and the section every answer came from. It does nothing else. It does not book a tradesperson, take a payment, or issue a parking pass, and the reason it does not is the subject of section 8.
It began as a floating panel inside the Service Assistant. It is now its own application, on its own machine, with its own database and its own address, and this document specifies it as that. Section 6 says what is still shared and what is not.
The qualities this system is judged on are grounding, scoping, fallback, latency, security and observability. Grounding and scoping come first, and that ordering is deliberate: an assistant that answers a rules question wrongly is worse than one that declines, because a resident will act on it.
One path, with one place where it can branch. Retrieval happens before any engine is called, and it is scoped to one association before it ranks anything. If nothing in that association's documents clears the threshold, no engine is called at all: there is nothing for it to ground an answer in, and asking it anyway is asking it to invent.
Fig. 1 · a question, and the only two things that can happen to it
The refusal path is not an error path. It is the second of the two correct outcomes, and it is drawn differently on screen from an answer because the difference is real.
| Who | What they come for | Signed in? |
|---|---|---|
| A resident | One question about a rule, a fee, a date, or a form. Usually once, usually on a phone, usually not in the mood to read a 90 page PDF. | No |
| A resident with an account | The same, with their association remembered across visits. | Yes |
| The management office | Adding a document, replacing one, seeing what each association currently holds, and choosing which engine words the answers. | Admin token |
There is no provider role and no office staff role beyond the admin token. Both exist on the Service Assistant and neither was carried across, because neither has anything to do with reading a rule.
Every sentence of every answer is required to come from a passage that retrieval returned. The engine is given those passages and told to use nothing else; it is never asked what it knows.
| Requirement | Value | Measured or target |
|---|---|---|
| Retrieval threshold | 0.30 cosine | Measured, in the code |
| Below threshold | No engine call at all | Measured |
| Answer without a citation | 0 | Required |
The threshold is doing real work rather than decorating. An unanswerable question costs nothing and reveals nothing, because the question never leaves the machine.
Scoping is applied before ranking, not after. The candidate set is narrowed to one association's passages and the search runs over that slice, so a passage belonging to a neighbouring association cannot place first and then be filtered out: it is never a candidate.
| Fact | Value |
|---|---|
| Associations | 6 |
| Documents | 20 |
| Indexed passages | 209 |
| Embedding model | all-MiniLM-L6-v2, 384 dimensions |
The associations are not evenly stocked, and the specification has to admit it: Serenity Point has 98 passages and Lauderdale Lakes 92, while Kendall Square, Valencia and Enclave at Old Cutler have one each. Those three can be searched and can be downloaded from, and a rules question asked against them will usually and correctly be refused. That is a content gap, not a defect, and it closes by uploading documents.
Where an answer does come from another association, because a resident asked for it deliberately, the citation strip says so in the resident's own words. It must not say so when it is not true: comparing an internal key against a printed label made that warning fire on a resident's own association, which is a warning that gets believed. It now compares like with like.
Two engines can word an answer: Gemini, and an open model on hardware we control. The switch chooses which is tried. Whichever answers, the passages it was given are the same, so the answer is grounded either way and the citations do not move.
This is the property that was proved end to end on 30 August 2026, against a real model in the client's own AWS account: with the switch set to the open model and the machine stopped, a resident's question was answered correctly in 1.6 seconds by Gemini, and the panel reported the fallback and named the reason.
| Stage | Time | Note |
|---|---|---|
| Retrieval | Single digit ms | 209 vectors held in memory, one matrix multiply |
| Refusal | Retrieval only | No engine is called, so no network hop |
| Answer, Gemini | 1 to 3 s | Measured |
| Answer, open model on a CPU | 70 s | Measured, and the reason the timeout exists |
| Engine timeout | 45 s | Then the other engine answers |
The honest conformance note: this runs as one process on a machine with under 2GB of memory, and the embedding model is most of that. It is sized for one association's residents, not for a portfolio of them. The index is small enough that retrieval is not the constraint and will not become one at this scale; memory is the constraint, and the first thing that fixes it is a bigger machine rather than a change to this design.
| Part | What |
|---|---|
| Address | livz.smartzees.com |
| Application | FastAPI on port 8200, one process |
| Screens | Next.js, exported as static files and served by nginx |
| Database | Its own MySQL schema, on its own machine |
| Index | 209 passages, held in memory, rebuilt on upload |
| Engines | Gemini, or the open model over the network |
Port 8200 rather than 8100 is deliberate. This machine was cloned from the Service Assistant's, and a stray request meant for that product must not find something listening here and be answered by it.
What is shared with the other two agents: the engine switch setting, and the hardware behind it. What is not shared: the database, the accounts, the sessions, the documents, the index, the process and the address. An outage of either of the other two agents does not reach this one.
One item is outstanding at the time of writing. Port 443 is not yet open in this machine's firewall, so the site is served over http. Two consequences follow and both are visible: the address bar says the connection is not private, and browsers will not hand out a microphone outside a secure context, so the spoken conversation cannot start. Both clear the moment the port is opened. Nothing in the application needs to change.
Named rather than left to be assumed, because every one of these exists on a sibling product and could reasonably be expected here.
| Not here | Where it is | Why not here |
|---|---|---|
| Booking a tradesperson | SmartService | A different job, a different diary, and a different set of people to pay |
| Payments | SmartService, SmartMarket | Nothing here costs money |
| Parking passes | SmartService | Kept with the product that already issues them, by decision, so one gate has one source of truth |
| Provider accounts | SmartService | No tradesperson has a reason to sign in here |
| Starting and stopping the GPU | SmartService | Two panels able to stop one card is a way to stop it mid answer |
| Legal advice | Nowhere | It quotes the documents and names the section. Deciding what that means for a dispute is a person's job |
Written by Abad Naseer. Every measured number in this document is cited from the running system or from the code, and every target says that it is a target. Where the two disagree, the document says so rather than choosing the flattering one.