Fig. 01 · Infrastructure for physical AI
RAVN
Self-healing infrastructure for robot fleets. An agent on the robot and a brain on the server detect software failures, propose fixes, and only call a robot fixed once it's actually back at work.
- Role
- Lead Engineer
- Team
- 2 cofounders
- When
- 2025 – present
- Stack
- Rust, tonic gRPC + mTLS, C++ rclcpp, ROS 2, Laravel, React, PostgreSQL, Redis Streams, SQLite, protobuf, Claude
- Links
- useravn.com
01The problem
When a deployed robot fails because of software (a hung node, a bad config, a bad release, lost task state), an engineer has to diagnose and fix it by hand. Fleet tools can restart services, but green services don't mean the robot is doing its job again.
02How RAVN got here
4 versionsv1
Hardware generation
Plain English in; schematics, PCB layout, firmware, BOM and fabrication files out. Parts sourced through Digi-Key, Mouser and LCSC, boards handed off to JLCPCB and PCBWay.
v2
Give your AI a body
An MCP interface with only three public tools (instruct, autonomous_instruct, check), so outside AI agents could drive a robot without ever touching low-level motion commands. An internal body agent mapped each task to allow-listed tool calls.
v3
Latency runtime, then downtime
Two shorter explorations, into robot runtime latency and then fleet downtime, on the way to the current product.
Now
Self-healing fleets
Detect software failures on deployed robots, fix them safely, and prove the robot is working again.
03How it works
7 steps01 · System moves data
The robot reports in
A C++ ROS 2 probe and ravnd, a Rust agent, send compact state snapshots every 2–5 s over gRPC with mTLS, buffering to SQLite when the robot is offline.
02 · System moves data
The gateway commits
A Rust gateway holds one connection per robot, acks only after the Postgres commit, and fans events out through a transactional outbox to Redis Streams.
03 · Rules decide
Detection opens an incident
Deterministic, debounced detectors, so a single bad reading never triggers an action.
04 · AI proposes
An investigator proposes a fix
A Claude agent with read-only tools (fleet view, snapshots, past incidents, robot profile) suggests a root cause and a fix. It can't act.
05 · Person approves
An engineer approves
Any fix the model proposes needs a person. Routine playbooks run in shadow, approve or auto mode, set per playbook.
06 · Rules decide
The robot executes safely
Commands are signed and verified on the robot. A local safety gate refuses to act while the robot is moving or e-stopped, and only allow-listed actions run.
07 · Rules decide
Verify the work resumed
An incident resolves only when the task actually continues, such as reaching the next waypoint. Otherwise it escalates with evidence.
- AI proposes
- Rules decide
- Person approves
- System moves data
04Hard problems
4 of them“Fixed” has to mean working, not green
Verification checks that the robot's task resumed before an incident closes. The test robot models what it believes separately from what's true, so a robot can look healthy while doing nothing, just like in the field.
Testing recovery without real robots
I built a mock ROS 2 warehouse robot (14 systemd services, immutable releases) and a chaos injector that breaks it through real mechanisms instead of flags. A ground-truth scoreboard grades every recovery, and permissions stop the agent from reading it.
A thin agent on a secure channel
A private CA issues per-robot mTLS certificates at enrollment. Every command is signed and verified on the robot, and the gateway acks only after commit, so the outbox path loses and duplicates nothing end to end.
Keeping the LLM out of the control loop
Detection and playbooks are plain code. The model only runs when an incident opens, only reads, and only proposes.
05By the numbers
Measured in development against simulated robots, Oct 2026.- simulated robots in a load test, every message acked, p99 829 ms
- 1,000
- memory for the on-robot agent, about 2% of a CPU
- 8 MB
- correct investigator decisions on its first live run, $1.29 total
- 5 / 5
- automated tests across the web app and Rust agent
- 535
- Accepted into Antler Singapore's residency, Oct 2026
- Slingshot 2026, top 250
- Techstars interview
06What I'd do differently
The product changed five times. The engineering held up because each rebuild was disciplined, but I'd sign paying design partners before building the next system, not after. I'd also build the test rig (mock robot, chaos, scoreboard) before any product code. It turned out to be the most valuable thing in the repo.