What the system does, who uses it, and how it is required to behave when things go wrong. Section 8 is a working model of it you can run.
The Service Assistant is the front door to a housing association. Residents ask it about the rules, book a tradesperson, pay for the work, and get a parking pass for a visitor. Providers run their own listings on it. The office runs the association on it. All of it happens in one conversation, and none of it requires telephoning anybody.
This document specifies what it is required to do and how it is required to behave. It is written to be read by somebody who will not read the code, so it names no internal parts. Where a figure is measured it says so, and where a figure is a target it says that instead.
The five qualities in section 5 are the ones this system is judged on: scalability, fallback, availability, security and observability. Each one names the scenario in section 8 that demonstrates it.
Four kinds of person arrive, at one front door, and what they came for decides which of four lanes they take. Only the first lane involves a language model.
One front door, four lanes, one of which is the AI.
Three of the four lanes are ordinary software. Booking a tradesperson, issuing a parking pass and taking a payment involve no model at all. That is worth knowing for two reasons: it is why an engine outage cannot take the product down, and it is why the parts of this system that touch somebody's money and somebody's home behave the same way every time.
And in the lane that does use one, the engine is chosen last. Which passage answers a question is settled before that, by searching the association's own documents. The engine only turns the passage it was handed into a sentence, which is why changing the engine cannot change what a resident is told.
| Actor | Who they are | What they may do |
|---|---|---|
| Resident | Somebody who lives in one of the associations | Ask questions, download documents, book a tradesperson, pay, request a parking pass |
| Visitor | Not signed in | Ask questions and browse services. Cannot book, pay, or hold a pass |
| Provider | A tradesperson or firm | Manage their own listing, prices, working hours, closures and diary |
| Office | Association staff, and gate staff | Add and withdraw documents, check a parking pass, read reporting, switch the answering engine |
A provider sees only their own business. An office user is the only actor who can change what the system knows, and every one of those actions is recorded.
Grouped by the part of the product they belong to. Only the second group involves a language model.
The five qualities the system is judged on. Each names the scenario in section 8 that shows it happening.
Where it stands today. The searching step is a single arithmetic operation over a small index and is not the constraint. The constraint is the server: production currently runs one process on a machine with 1GB of memory, and it is at the top of that allowance. NFR-1 is a requirement, not a description, and meeting it means a larger machine or a second one.
Three layers, in that order. The first is the important one: a refusal is a small annoyance, and an invented rule about somebody's home is not.
Between the two engines the behaviour is a circuit breaker: repeated failures route traffic away, and recovery is tested with a single request before traffic returns. It is built as a cached health reading rather than as a formal breaker, but that is the shape of it.
Scenario: the GPU dies, and both engines slowThe number that matters is not uptime, which is easy to claim. It is requests dropped, which should be zero through every scenario in section 8, including the ones that break things on purpose.
Note what section 2 makes visible: only one of the four lanes uses a language model at all. An engine failing degrades that lane, and even then it falls back. Bookings, parking passes and payments do not notice, because there is nothing in them that could.
Watch: dropped, and uptimeNFR-9 is enforced before ranking rather than after it, so a document belonging to another association is never a candidate in the first place. It cannot be reached by phrasing a question cleverly.
Scenario: someone probes itThe console in section 8 is this requirement drawn out. Everything on it is a thing the system is required to be able to tell you about itself.
The whole of Fig. 1Deliberate exclusions, not gaps.
A working model of section 2, running now, carrying the mix a real morning carries: questions about the rules, people booking a tradesperson, parking passes, payments, and the office at work.
Press a scenario and watch the counters. Two hold throughout, whatever you break: dropped stays at zero and uptime stays at 100%. And when you kill the GPU, watch bookings and passes carry on climbing at full speed, because nothing in those lanes was ever asking an engine for anything.
A model of the design, not a measurement of the server. Engine speeds are taken from measured figures; the load behaviour is modelled.
Measured figures in this document come from the running system: the document index holds 208 sections across 6 communities, the cloud engine answers in about 690ms, and our own GPU produces 45 to 55 words a second. Figures describing load are modelled, and section 5.1 says where the current server stands against them.