Evaluation
How the engine
scores
Orrin’s engine was run against a fixed set of 48 questions and requests that it was never tuned on. Every result is below, failures included, with the configuration that produced it.
Results
Three runs,
one set
The same 48 items, graded automatically by the evaluation script, through the previous engine (word matching only, before the language model, parameter reading and section passages), today’s engine with the model switched off, and today’s engine as deployed.
| Measure | Previous engine | Today, model off | Today, as deployed |
|---|---|---|---|
| Answerable, worded like the documentationThe answer contains the expected fact and the passage it cites contains it too. | 10 of 10 | 9 of 10 | 10 of 10 |
| Answerable, worded differentlyGraded the same way; the question avoids the documentation’s own words. | 4 of 10 | 0 of 10 | 6 of 10 |
| Not covered by the documentationPasses when Orrin says the documentation does not cover it. | 4 of 9 | 9 of 9 | 9 of 9 |
| Two documents disagreePasses when the answer includes the value from the newer document. | 2 of 2 | 2 of 2 | 1 of 2 |
| Action requestsPasses when the preview matches the intended operation. | 8 of 8 | 8 of 8 | 8 of 8 |
| Requests missing a required valuePasses when the right operation is matched and every missing required value is listed. | 0 of 4 | 4 of 4 | 4 of 4 |
| Requests no operation coversPasses when nothing is prepared. | 3 of 5 | 3 of 5 | 4 of 5 |
| Parameter values read correctlyAcross the action requests, each expected value the preview proposed. The previous engine proposed none. | 0 of 10 | 10 of 10 | 10 of 10 |
| Answers that should not have been givenLower is better: a wrong sentence quoted for an answerable question, or an answer to a question the documentation does not cover. | 10 | 0 | 0 |
| Answerable questions refusedLower is better: questions the documentation answers that Orrin said it could not. | 1 of 20 | 11 of 20 | 4 of 20 |
| Time per item, median and slowest in twentyOn the machine named below, after the model has loaded. | 0.2 ms, 0.5 ms | 0.2 ms, 0.9 ms | 4.3 ms, 12.5 ms |
In every run, each answer to the two disagreeing documents also quoted the outdated statement. The model finds more answers worded differently from the documentation and refuses what the documentation does not cover; the price is that 4 answerable questions, worded far from the documentation, were refused as not covered.
Configuration
What was
measured
- Machine: Apple M1 Max, 64 GB, Node v25.6.1, not the production server.
- Language model: all-MiniLM-L6-v2, an open source sentence embedding model of about 22 million parameters, quantized to 8 bits and run with ONNX Runtime inside the server process.
- Thresholds: a passage counts as evidence at a meaning score of 0.40, a sentence is quoted at 0.55, at most 2 per answer, and an operation is matched at 0.38 with a lead of 0.05 over the next.
- How they were chosen: on a separate development set of 27 items written against Brickwren, the case study’s example company. This set was not used for that.
- Answers are quoted. No model writes text in these runs; answers are sentences from the documentation with their citations.
The set
What it
contains
- Quillhaven, a made up property management platform: a help center of eight articles and an API of eight operations.
- Kestrel Yard, a made up apartment building: a resident handbook, a newer notice that changes the recycling day, and an API of four operations.
- Answerable, worded like the documentation: 10 items. The answer contains the expected fact and the passage it cites contains it too.
- Answerable, worded differently: 10 items. Graded the same way; the question avoids the documentation’s own words.
- Not covered by the documentation: 9 items. Passes when Orrin says the documentation does not cover it.
- Two documents disagree: 2 items. Passes when the answer includes the value from the newer document.
- Action requests: 8 items. Passes when the preview matches the intended operation.
- Requests missing a required value: 4 items. Passes when the right operation is matched and every missing required value is listed.
- Requests no operation covers: 5 items. Passes when nothing is prepared.
What failed
6 of 48 items
did not pass
P3 · Answerable, worded differently
How far ahead am I warned that a tenancy is ending?
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
P4 · Answerable, worded differently
What happens if the renter ignores the renewal?
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
P5 · Answerable, worded differently
Who gets alerted when an apartment has no heating?
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
P8 · Answerable, worded differently
Where is a renter's deposit money kept?
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
C1 · Two documents disagree
When is recycling collected?
Recycling is collected every Wednesday morning. [1]
X4 · Requests no operation covers
Delete the building
deleteApplicant (DELETE /applicants/{applicant_id}), level Sensitive. No values found in the request. Still needed: applicant_id. The user would type a confirmation word before this runs. This release does not execute the operation, so nothing was sent to your API.
Limits
What this
does not show
- The set is small, 48 items, so one item moves a result by several points. Treat the results as a check, not a benchmark.
- It was written by the Orrin team, in English, not collected from real users, and both companies are made up.
- No wrong answer in this set does not mean none at all. On the separate development set of 27 items, the deployed engine gave 3 answers it should not have: “When am I reminded that a tenancy is about to end?”, “When do landlords get their monthly report?”, “Can tenants pay rent in bitcoin?”. That is why every answer carries its citation.
- Each configuration gave the same results every time it was run; the times vary with the machine and its load.
- It grades quoted answers. Answers written by a model, which a workspace can switch on where a deployment names one, are not part of it.
Every item
Each input
and its output
A1 How much is the default late fee?Passed
The default fee is 5 percent of the monthly rent, capped at 75 dollars. [1]
A2 How do I void a late fee?Passed
Open the tenant's ledger, select the fee and choose Void charge. [1]
A3 How many days before a lease ends does Quillhaven send a reminder?Passed
Quillhaven reminds the property manager 75 days before a lease ends. [1]
A4 How long does a tenant have to accept a renewal offer?Passed
The tenant has 10 days to accept the offer in the tenant app. [1]
A5 How many photos can a tenant attach to a maintenance request?Passed
Tenants submit maintenance requests in the tenant app and can attach up to six photos. [1]
A6 When are owner statements generated?Passed
Owner statements are generated on the third business day of each month and emailed to owners as a PDF. [1]
A7 How many days do I have to return a security deposit?Passed
When a tenant moves out, the deposit must be returned within 21 days, minus itemised deductions. [1]
A8 Which role can delete a property?Passed
Only Owners can delete a property. [1]
A9 What are the gym opening hours?Passed
The gym on the ground floor is open from 5 am to 11 pm. [1]
A10 Where is the bicycle storage?Passed
Bicycle storage is in the basement on level B2. [1] Each apartment may store up to two bicycles. [1]
P1 What's the penalty when a renter pays late?Passed
The default fee is 5 percent of the monthly rent, capped at 75 dollars. [1] Quillhaven adds a late fee automatically on the sixth day of the month when rent is still unpaid. [1]
P2 Can I cancel a late charge?Passed
Open the tenant's ledger, select the fee and choose Void charge. [1]
P3 How far ahead am I warned that a tenancy is ending?Failed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
P4 What happens if the renter ignores the renewal?Failed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
P5 Who gets alerted when an apartment has no heating?Failed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
P6 For how many years can landlords get old statements?Passed
Owners can download past statements from the owner portal for seven years. [1]
P7 How much warning do renters get before someone inspects their home?Passed
Tenants receive notice 48 hours before a routine inspection. [1]
P8 Where is a renter's deposit money kept?Failed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
P9 Can leasing staff look at owner statements?Passed
Leasing agents can see applicants and leases but not owner statements. [2]
P10 Where can I keep my bike?Passed
Each apartment may store up to two bicycles. [1] Bicycle storage is in the basement on level B2. [1]
U1 Does Quillhaven integrate with QuickBooks?Passed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
U2 How do I charge a pet fee?Passed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
U3 Can tenants pay rent with cryptocurrency?Passed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
U4 Is there a swimming pool at Kestrel Yard?Passed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
U5 How many parking spaces does each apartment get?Passed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
U6 What is the maximum late fee allowed by law in California?Passed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
N1 What is the capital of France?Passed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
N2 Who won the football world cup in 2022?Passed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
N3 Tell me a jokePassed
The documentation does not cover this. In a workspace, the question is logged as unanswered so the gap is visible on the Usage page.
C1 When is recycling collected?Failed
Recycling is collected every Wednesday morning. [1]
C2 When should I put the recycling bins out?Passed
Put the bins out after 8 pm on Tuesday. [1] Put the bins out after 8 pm on Wednesday. [2]
R1 Create a maintenance request for unit 5A: the kitchen tap is leakingPassed
Matched createMaintenanceRequest; proposed unit_id: 5A, description: the kitchen tap is leaking
R2 Schedule a move out inspection for unit 12C on Friday at 10amPassed
Matched scheduleInspection; proposed unit_id: 12C, type: move out, date: Friday, time: 10am
R3 Which units are vacant?Passed
Matched listUnits; proposed status: vacant
R4 Void the late fee on charge CH-2231 because the bank was closedPassed
Matched voidCharge; proposed charge_id: CH-2231, reason: the bank was closed
R5 Send a message to the tenants in block B about the water shutdownPassed
Matched sendMessage; proposed body: the water shutdown
R6 Show me the ledger for tenant T-884Passed
Matched getLedger; proposed tenant_id: T-884
R7 Book the service lift for unit 3D on Saturday at 9amPassed
Matched bookServiceLift; proposed unit_id: 3D, date: Saturday, start_time: 9am
R8 Offer a 12 month renewal on lease L-5530 at 1,450 dollarsPassed
Matched offerRenewal; proposed lease_id: L-5530, rent: 1450, term_months: 12
M1 Schedule an inspectionPassed
Matched scheduleInspection; missing unit_id, type, date
M2 Book the service liftPassed
Matched bookServiceLift; missing unit_id, date, start_time
M3 Create a maintenance requestPassed
Matched createMaintenanceRequest; missing unit_id, description
M4 Offer a lease renewalPassed
Matched offerRenewal; missing lease_id, rent, term_months
X1 Order a pizza for the officePassed
None of the 8 switched on actions matches that request, so nothing was prepared and nothing was run.
X2 Cancel my gym membershipPassed
None of the 4 switched on actions matches that request, so nothing was prepared and nothing was run.
X3 Transfer 500 dollars to the owner's bank accountPassed
None of the 8 switched on actions matches that request, so nothing was prepared and nothing was run.
X4 Delete the buildingFailed
deleteApplicant (DELETE /applicants/{applicant_id}), level Sensitive. No values found in the request. Still needed: applicant_id. The user would type a confirmation word before this runs. This release does not execute the operation, so nothing was sent to your API.
X5 Evict the tenant in 4BPassed
That request is about as close to getLedger as to sendMessage, so nothing was prepared. Say which one you mean. Nothing was run.