Syntony / Agents and tools / Caesura

Caesura
did the robot stop when it should have?

A free agent for robotics teams. Give it a robot's event log and your safety envelope, and it finds where the robot moved during an e-stop, kept going after a person said stop, went too fast near someone, entered a keep-out zone, acted on stale perception or obeyed a sign. It comes with free red team probes for simulation and fenced test cells.

Try it

Review a robot run in this page

The same engine you download, running in your browser. Nothing you paste leaves this page. The examples are fictional.

What it looks for

Seventeen ways a robot leaves its envelope

Each finding names the event, the robot and what a person should check. Repeated hits in one episode, such as a stream of speed readings, count once with a tally.

Free red teaming

Eight probes to try on your own robot

Each probe is a short runbook: the setup, what good looks like, and how Caesura scores the run as pass, fail or inconclusive. Run them in simulation or a fenced test cell, never with a person as the target.

These eight probes are a small public sample.

A red team designs tests around your robots, your models and your site: sensor spoofing, adversarial objects and markings, planner manipulation, fleet coordination and the people who work beside them. Then it checks that each fix holds.

Physical AI red teaming
node caesura.mjs probes                       # list them
node caesura.mjs probe CP-01 --out cp-01      # runbook and the sign to print
node caesura.mjs review run.jsonl --probe CP-01

Install

One file, one command

Version 1.1.0. Needs Node.js 18 or later and nothing else. The agent works in Claude Code; the engine works on its own anywhere, including in CI for simulation runs.

  1. Download Caesura

    caesura.mjs ↓, a single readable JavaScript file with no dependencies.

  2. Install the agent
    node /path/to/caesura.mjs init

    This writes .claude/agents/caesura.md. Add --global to install it for every project.

  3. Ask for a review

    In Claude Code:

    Use the caesura agent to review logs/amr-07.jsonl with our envelope.
  4. Or run the engine yourself
    node caesura.mjs review run.jsonl --envelope envelope.json
    node caesura.mjs review sim-run.jsonl --json --fail-on high

    Gate simulation runs in CI: --fail-on high exits with code 2 when the robot leaves its envelope.

Logs and envelope

What it reads, and the limits it checks

One event per line. Times are ISO strings or epoch seconds. Export from your fleet manager, your ROS bag tooling or your simulator in this shape.

command
What the robot was told to do: action, speed in m/s, force in N, target as a zone name or {x, y}, via, confirmedBy, and the source instruction id.
state
What the robot measured: speed, force, position, zone.
perception
What it saw: humans as [{distance, x, y}], or humanDistance. With x and y, people appear on the floor plan.
estop, operator, link, fault
Stops, resumes, confirmations, link loss and faults.
safety
Safety functions switched off or on, with by and any permit.
mission, instruction
Tasks and the text behind them, with their source: wms or operator is trusted; camera_text, sign, web and email are not.
contact
Contact with a person or object: body, region (such as hand or chest), kind (quasi-static or transient) and peak force in N.
report
The robot's or planner's own account of the run.
{
  "maxSpeed": 1.5,
  "humanZones": [
    { "within": 0.5, "maxSpeed": 0 },
    { "within": 2.0, "maxSpeed": 0.3 }
  ],
  "maxForce": 140,
  "keepOut": [
    { "name": "dock-door-3", "x1": 40, "y1": 0, "x2": 48, "y2": 6 }
  ],
  "perceptionMaxAgeMs": 500,
  "stopTimeMs": 500,
  "linkLossStopMs": 1000,
  "highRiskActions": ["cut", "weld", "lift"],
  "ssm": {
    "humanSpeed": 1.6, "reactionTimeMs": 80,
    "stoppingTimeMs": 250, "intrusion": 0.1,
    "sensorUncertainty": 0.04, "robotUncertainty": 0.01
  },
  "bodyRegions": true
}

With ssm set, Caesura works out the protective separation distance for speed and separation monitoring at each moment, Sp = Sh + Sr + Ss + C + Zd + Zr, and flags any time a person was closer than the robot needed at its speed (ISO/TS 15066, ISO 13855). With bodyRegions set to true, each contact is checked against the quasi-static limit for that body region, and twice that for transient contact; transient contact with the head is always flagged. Pass an object instead of true to use your own values per region.

The defaults are placeholders, not safe values. Set every limit from your risk assessment and the standards that apply to your robot and site, such as ISO 10218, ISO/TS 15066 or ANSI/A3 R15.08.

For operations and security teams

Fits the pipeline you already run

Caesura is built for the robotics and safety engineers who review fleet and simulation logs every day, and need findings that point to a clause.

Findings where your team already looks

SARIF 2.1.0 for GitHub code scanning and most security dashboards, JUnit XML for CI test reports, and CSV for spreadsheets, ticketing and SIEM imports. Each finding keeps its line number in the source log.

Mapped to the standards you report against

Each finding carries references to ISO 10218-1 and -2, ISO/TS 15066 (body-region force limits and speed and separation monitoring), ISO 13849-1, IEC 62061, ISO 13850, IEC 60204-1, ISO 13855, IEC 61496, ISO 14119, ANSI/A3 R15.08-1, OWASP and MITRE ATLAS.

A night of logs in one run

Pass several files or a whole folder. You get one combined report and a summary table, and --fail-on turns any level of finding into a failed build.

Reads what your tools export

JSONL or JSON events, and CSV with a header row from a historian, a fleet manager or ROS bag tooling. Dotted columns such as position.x become nested fields.

Runs air-gapped

No network calls, no telemetry and no dependencies. It is one readable file your security team can review before it runs on an isolated host.

Same log, same answer

Fixed rules, not a model. The same log always gives the same findings, and every report carries a SHA-256 of its input so it can go in an evidence file. 100,000 events take under two seconds on a laptop.

# Every simulation run in a folder, gated in CI
node caesura.mjs review sim-runs/ --envelope cell-4.json --format junit --out caesura.xml --fail-on high

# A fleet export from a historian, as SARIF
node caesura.mjs review amr-fleet-2026-11-08.csv --envelope site.json --format sarif --out caesura.sarif

Why the name

Caesura
a full stop

A caesura is the two short slashes in a score that mean stop. Not slow down, not soften: a complete break in the sound before the music goes on.

A robot needs the same discipline. When the e-stop is pressed, when a person says stop, when the link drops or someone steps too close, motion must end. Caesura checks the record for every place it did not.

It sits with the rest of our instruments: Fermata holds an action until a person says go, Rubato finds where an agent took liberties, and Continuo keeps infrastructure changes in time.

Before you rely on it

What Caesura does not do

  • It is not a safety controller and must never be the thing that stops a robot. It reviews a record after the fact.
  • It does not replace a risk assessment, functional safety validation or the standards that apply to your robot. Its default limits are placeholders.
  • It only sees what is logged. Missing sensors, missing robots or gaps in time look clean.
  • Its probes test whether your controls hold in a few simple cases. Run them only in simulation or a fenced test cell, with a qualified person in charge of safety, and never with a person as the target.

Caesura runs on your machine and makes no network calls. It reads only the files you give it, and writes only the agent file, probe kits and reports you ask for. It is licensed by Syntony under the Syntony Free Tools License: free to run, copy and modify within your organization, including for commercial work, but not to resell or redistribute.

Want your robots red teamed properly?

We test robots, robot foundation models and the controls around them in the setting where they run, then check that each fix holds.