TrialONE
Fault diagnosis for real robots · early access

Your robot recorded everything.It still can't tell you what broke.

Point TrialONE at a folder of recordings or at the live ROS 2 graph. Back comes what broke, the chain that caused it, the file and line to change — and whether it goes to your coding agent or to a technician with a screwdriver.

Installs today · runs on your machine · nothing is uploaded

below: 21 repetitions of one operation · 5 deviate
01

What comes out

A recipe with fixed fields — and the list of what it could not check.

A real run, at the speed it actually happens.

01
symptom
02
causal_chain
03
condition
04
change_class
05
sites
06
pattern
07
acceptance
08
blast_radius
09
effort

The last block is the part no other tool prints — what it could not check. A clean answer is worthless if you cannot tell it from a blind spot.

02

Try it

One command. Your machine, your key, your recordings.

Point it at a folder and it watches — a finding becomes an issue in your repo, and the recording never leaves the building.

.bag.mcap.ulg.BIN.h5.csvpanic dumpgdb backtracedmesg

The diff on the right is the repair TrialONE proposed for ros2_control#1905 ↗. A maintainer needed about two hours to find it.

$ pip install https://trialone.wiki/trialone-0.1.0-py3-none-any.whl
$ trialone diagnose ./recordings/run_042
# nothing is uploaded. detection runs here; only you hold the key.
fix goes tocoding agentdomain: softwarecandidate — confirm before acting
controller_manager/src/ros2_control_node.cpp+2-1
6565 auto cm = std::make_shared<ControllerManager>(executor);
66- // lock_memory defaults to true on this build
66+ cm->set_parameter(rclcpp::Parameter("lock_memory", false));
67+ // or raise RLIMIT_MEMLOCK — see /etc/security/limits.conf
6768 executor->add_node(cm);
03

Real incidents

Four public threads where the log did not say what broke.

Open any of them. The engineer's own words, with their name. The TrialONE line is our real output on that log — not a rewrite.

The controller intermittently commands motion nobody asked for.

Differential-drive AMR, ROS 2 · diff_drive_controller

open the thread ↗
The log points at

Nothing. No error, no warning — the recording looks like a normal run, which is why the thread never resolved it.

The fault was

The system clock stepped backwards after boot, once NTP corrected it. The controller saw a negative dt.

still open · unresolved on GitHub

TrialONE said

/tr_velocity_controller/odom carries 61 message timestamps EARLIER than the message before it on the same topic, the largest going back 1.336 s, first at t = 3.4 s. This compares one clock against itself, so it is not a threshold or a deviation: a timestamp cannot precede its predecessor.

04

What every answer carries

It prints what would have proved it wrong.

The bottom of a real report, verbatim. A tool that hides its own weak spots is not more accurate — only quieter.

DIAGNOSIS (supported, 4/4 checkable predictions held)
navigation2#2373
Checks that could have killed it
  • HOLDS/Sensor origin.*out of map bounds/must appear4 matching lines
  • HOLDS/VoxelLayer::updateBounds/must appear1 matching line
  • HOLDS/ObstacleLayer::updateBounds/must NOT appear0 matching lines
  • HOLDS/bresenham3D/must appear1 matching line

Written before looking. The report prints them whether they hold or not.

What it touched
search_log×11compare_recordings×1decode_number×1list_nearby_recordings×1log_vocabulary×1

never used: show_region, decode_errno — so nothing here rests on what those would have shown.

What it could not back
Not found in anything this layer could see
-2.20x00ffff000xffff00ff

In no excerpt, no finding, no tool result. Knowledge, a derivation, a proposal — or a fabrication, and from outside all four look the same.

Absence claimed without searching
0x00ffff00

Called missing without a search. Only a search that returned zero can carry that — and a coding agent told something is missing will add it.

Names the repair introduces
0xffff00fflocal_costmap.plugins.voxel_layer.enabledsize_

Not a complaint — a repair may introduce names. But each is either a real setting of this system or an invented one, and that decides whether it can be carried out.

verbatim from output/reports/navigation2_2373.txt

05

Measured against a chat window

Twice as often on the question that costs money.

Same 20 logs, same word lists, same model. Every case is a real failure from a public issue tracker where a maintainer eventually found the cause and wrote it down — where the timeline is recorded, they needed between two hours and 111 days.

4 : 0
binary recordings

ArduPilot .BIN, MCAP, HDF5. There is nothing to paste into a chat window — it scores zero, four times out of four.

6 : 3
the file and line to change

Twice as often. Naming a fault got cheap for everyone; finding where it lives did not.

16 : 14
naming the fault in a text log

Our narrowest margin, and we print it anyway — you should know where the gap is thin.

Feature
A chat window
TrialONE
Name the fault in a text log
Find the file and line to change
Read a .BIN, MCAP or HDF5 recording
Say what it could NOT check
Prove the repair held

Text logs are 16 of the 20 cases because that is where public ground truth lives — nobody attaches a 400 MB bag to an issue.

06

Before you ask

Five questions, answered where they hurt.

Including the one about drones, where the honest answer is that nobody has solved it — our own 0.72 included.

One recording from one robot — whatever format it is already in. If it reads, you get a diagnosis. If it does not read, you get told that, not a guess.

No. It runs on your machine or on the robot and reads the folder in place. For the live path it attaches to your ROS 2 graph locally.

Every diagnosis carries the measured values it rests on and a set of checks that would have falsified it. When a check fails, the answer is labelled unverified rather than sold. Unreadable input gets an honest stop.

Partly, and we are explicit about which part. Detectors that compare against healthy repetitions need a baseline. The structural checks — a velocity that must equal the derivative of a position, a timestamp that cannot precede its predecessor — need nothing but the recording itself.

Not our target. Every flight is unique, so there is nothing to compare against, and label-free detection there is unsolved — ours included (AUC 0.72). We say so rather than sell it.

Put it on your own recordings.

The tool installs today and runs on your machine — that part needs no account. The list is for the hosted side: fleets, saved history, the login. One email, when there is something to log into.

Or skip the queue: send us a recording that went wrong and we run it for you, including whatever it gets wrong.

Harwin Singh MalhiPhilip Degenhardt

Two founders, TUM and LMU. You will talk to one of us, not a sales funnel.