← all model tests
Instructorpass
part missing
A named missing part must come back as part_missing WITH the part named, because the Foreman's reorder depends on a field the Instructor is the only one who can fill.
The answer conformed to the contract and every assertion held.
modelgemini-3.5-flash
temperature0
scenarioscenarios/instructor/part-missing.json
cassetteab7b7a63c30be6a6…
latency0.0s
tokens1,845
What the model was given
System instructionassembled from the contract schema, not hand-written
A technician has said they cannot complete this step. Turn what they said into a structured reason and recommend the next action for the person standing there right now, knowing the procedure, the machine and its history. Return JSON with these fields: - reason_summary (string, required): Their reason in one clause, in their terms. Do not sanitise it. - blocker_kind (one of part_missing | tool_missing | access | seized_or_damaged | unsafe | machine_absent | procedure_wrong | other, required) - recommended_action (string, required): What to do next. Concrete and doable now, or explicitly 'stop and hand off'. - proposed_status (one of deferred | waived | impossible, required): A proposal only. The Foreman disposes and a waiver needs a named person with standing. There is no skip. - blocking_part (string, null when it does not apply): Part number or description when blocker_kind is part_missing. - safety_flag (boolean, required): True if continuing would put someone at risk. Overrides everything else.
## The procedure
{
"title": "Front brake service \u2014 Segway Xyber",
"version": 3,
"strictness": 2
}
## The step they are stuck on
{
"title": "Fit the new pads and torque the caliper bolts",
"why it exists": "An under-torqued caliper bolt backs out under braking heat and the caliper moves. This is the step that kills someone if it is skipped.",
"what it asks for": [
"Torque both caliper bolts to spec and record the reading"
],
"position": "step 4 of 9"
}
## The machine
{
"asset id": "XYBER-07",
"model": "Segway Xyber",
"hours or km": "31,402 km",
"history": [
"2026-05-02 front pads replaced at 24,880 km",
"2026-06-19 fork seal weep noted, not actioned",
"2026-07-30 tyre replaced front"
]
}
## What is on the shelf right now
{
"EBC FA388HH front pads": 0,
"caliper bolts M8x30": 6,
"brake fluid DOT4": "2 x 500ml"
}
## Steps after this one
[
"Bleed the front circuit",
"Road test",
"Sign off"
]
## What the technician said
{
"spoken or typed": "voice",
"verbatim": "Yeah I can't do this one, there's no pads on the shelf. The EBC ones. Bin's empty, I checked the back as well."
}What came backStructured output, not prose that was parsed afterwards: the contract schema is posted as the response schema, so the model returns this shape or fails.
{
"reason_summary": "there's no pads on the shelf. The EBC ones. Bin's empty, I checked the back as well.",
"blocker_kind": "part_missing",
"recommended_action": "Stop and hand off to procurement to source EBC FA388HH front pads.",
"proposed_status": "deferred",
"blocking_part": "EBC FA388HH front pads",
"safety_flag": false
}What this scenario asserted
Assertions pin the part of an answer that decides something, never the whole object — exact-matching a rationale would fail the first time it was reworded, and a suite that cries wolf is abandoned inside a day. Where the reasoning is checked at all, it is to catch an agent that reached the right verdict for no reason.
| asserted | about | what happened | |
|---|---|---|---|
| ok | equals | blocker_kind | is part_missing, want part_missing |
| ok | present | blocking_part | is EBC FA388HH front pads |
| ok | mentions_any | blocking_part | found ['pad', 'EBC'] |
| ok | in | proposed_status | is deferred, want one of ['deferred'] |
| ok | is_false | safety_flag | is False |