← 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.

assertedaboutwhat happened
okequalsblocker_kindis part_missing, want part_missing
okpresentblocking_partis EBC FA388HH front pads
okmentions_anyblocking_partfound ['pad', 'EBC']
okinproposed_statusis deferred, want one of ['deferred']
okis_falsesafety_flagis False