Triage, not diagnosis. We claim the routing, not the answer. One engine behind a free web door and an API door; below is one real Triage Profile and the payload behind it.
The Triage Profile — one photo, one real call
No photo is shown on this sheet: the photo behind this Triage Profile is a user upload, held under a licence that covers processing only, so the Triage Profile's structure is shown with the engine's own words and coordinates.
What the engine looked at
Each box is the engine's own [ymin, xmin, ymax, xmax] for this photo on a 0–1000 scale; nothing is listed that it did not return.
WHAT IT IS
Gas Furnace and Air Handler
In the photo: Gas furnace and air handler unit in mechanical room
Nothing is named as broken.
URGENCY
WHENEVER
Sound, cosmetic, or not part of the building. Nothing to send anyone out for. Add it to the next visit, or leave it as it is.
WHICH TRADE
No trade to call — there is nothing here to fix.
SAY THIS TO YOUR TENANT NOW
I've had the photo looked at and nothing is wrong with it that shows up. There's no work owed here. If the Gas Furnace and Air Handler starts behaving differently, send me another photo and I'll look again.
No fault shows in this photo — no trade to call. If you notice something a photo can't catch — a noise, a smell, a drip that comes and goes — add it to the description and send the photo again.
HOW SURE THIS IS
Five of five reads agreed.
The same photo was read five times, independently.
Each read looks at your photo on its own. The count is how many of them landed on the same answer about a fault.
engine-v2-vote-1.0.0 · v1.1-2026-09-11 · engine-v2.deep.gemini-3-5-flash-lite.a1_rubric_v11.n5 · 2a0a447e-9ef1-4ec2-bde0-46ef5e7088bb
The shape — the same fields, every call
is_building_assetasset_typeasset_categoryphoto_subjectreport_photo_agreementfault_detectedfault_visible_in_photofault_summaryfault_classesseveritytiercriterion_1_firedtier_forced_byvisible_wiringwater_near_electricalsafety_hazardhazard_detailtrade_requiredconfidenceresident_explanation
Every reply carries all of these under core, in this order; the payload on the right shows a subset of them with this call's values.
The payload — one fixed JSON shape, every call
{
"diagnosis_id": "2a0a447e-9ef1-4ec2-bde0-46ef5e7088bb",
"engine_version": "engine-v2-vote-1.0.0",
"config_id": "engine-v2.deep.gemini-3-5-flash-lite.a1_rubric_v11.n5",
"agreement": { "mode": "deep", "n": 5, "k": 5, "decided": true },
"core": {
"is_building_asset": true,
"asset_type": "Gas Furnace and Air Handler",
"asset_category": "HVAC",
"fault_detected": false,
"fault_classes": [],
"severity": "P4",
"tier": "WHENEVER",
"criterion_1_fired": false,
"tier_forced_by": null,
"trade_required": null
},
"callback_url": "/api/outcome?diagnosis_id=2a0a447e-9ef1-4ec2-bde0-46ef5e7088bb"
}
Abridged: 10 of the 20 core fields, values verbatim from the call on the left. The full shape, field by field, is at fixragent.com/docs. The urgency word is assigned by the server from a fixed decision table, never taken from the model. Your developers map this to your work-order fields.
The API door
curl -X POST "https://fixragent.com/api/triage?config=deep" \
-H "Content-Type: application/json" -H "x-triage-key: $TRIAGE_DEMO_KEY" \
-d "{\"image\":\"$(base64 -w0 photo.jpg)\",\"mimeType\":\"image/jpeg\"}"
Same engine, headless. A diagnosis_id and a callback_url come back with every triage; tell us what it turned out to be and that answer joins the record. Keys are issued by hand today — ask at fixragent.com/docs.
The pilot offer
Send us last month's 25 closed work orders. We triage them blind. You compare.
You already hold the answer key: what each one turned out to be, who went, and when. We send back a tier, a trade and a say-this line per photo, without seeing your closeouts. The comparison table is yours either way.
To take it up: email legal@fixragent.com with how many work orders and which month. A person answers; nothing is automated on our side.
A direct Buildium connection is proven only in our own Buildium test account, needs Buildium Premium, and is not open to any manager account yet; for any other PMS or CMMS, your developers map our JSON to your work-order fields. This API keeps no photo bytes, only a hash of the photo; the web app stores a photo only when a person opts in. The model provider, Google, keeps prompt, response and photo for 55 days.
Contact
Educational AI triage. Gas, water near electrics and exposed wiring are licensed-trade jobs.