TANDEM · FIELD MANUAL REV. C — NIGHT OPS SO-101 × 2 | DUAL-ARM HANDOFF

Grounded refusal, by design

It knows what it can't do. And it proves it.

Voice in. Cutlery on the table. Once the sentence is heard, nothing between the intent and the actuators leaves the machine. A deterministic gate checks reachability, gripper state and collision before either arm moves — and refuses out loud what it cannot ground.

20seeds scored
INT4/INT8on-device models
0cloud calls after the instruction is heard
REVIEW IN FIVE MINUTES the console runs locally in one command

How it works

One sentence in. Four checks before anything moves.

Hear it, parse it, gate it, act on it. Every arrow below is a hard boundary — the model on the left of the gate never touches a motor, and the gate on the right of it never guesses.

01 · HEAR

Speechmatics streams a live transcript, or a scripted replay stands in when there's no key — labelled either way, never silently swapped.

02 · PARSE

A small instruction-tuned model, running on-device through OpenVINO, fills in six fields: what to place, whether to pour, what to refuse.

03 · GATE

Deterministic Python re-checks every step against the measured scene — reachability, gripper state, collisions — before a motor moves. No model in this box.

04 · ACT

The arms execute, handing objects across the shared zone because props start on the left and the setting sits on the right.

The refusal, not the reel

Ask for a knife. There isn't one.

This is the moment the whole project is built to produce honestly: a request the arms cannot ground, refused out loud, with the reason stated plainly rather than swallowed.

> "put the knife next to the plate"
OBJECT_ABSENTthere is no knife in this scene; it holds bottle, fork, mug, plate, spoon
representativereasons pulled verbatim from the same gate that runs in the console — see it live in the gate itself.
REFUSED NOT GROUNDED IN SCENE

The scorecard

Every seed, every subgoal. Failures included.

Read straight off results/eval/scorecard.json — if it doesn't exist yet on this machine, that's what it looks like, honestly, rather than a number invented for the page.

Loading scorecard…

Run it yourself

Three commands. No cloud key required.

  1. Export or point at a planner IR (a keyword fallback runs with no model at all).
  2. Start the console — see the command below.
  3. Open the dashboard and press run — or feed it a scripted voice clip from assets/audio/.
$ python scripts/serve.py --port 8000