Incident reconstruction for field robotics

Know what failed first.
Prove it line by line.

Rebuild field failures from the logs your robots already keep. One timeline, one map, and a report where every finding cites the line that proves it.

INC-0142, UAS-04Replay
Time
14:32:04.118Z
Position
13R FP 7639 8764
Altitude, speed
59.5 m AGL, 5.4 m/s
Ground link
Nothing received, 1.20 km
Flight logJournalProcessesReceiveStep 3 of 8
  • Runs in your AWS GovCloud account
  • Air-gapped install
  • PX4 ULog, systemd journal, MAVLink
  • SHA-256 on every original

The example incident

Four logs on one clock. Scrub it, and the map follows.

INC-0142: telemetry stopped within a second of the kernel killing a service that had run out of memory. Every event is drawn as wide as its clock error, so you can see which ones the evidence can put in order.

Example incident timelineFour sources on one UTC axis. Memory rises above its threshold at 14:32:01.204, the kernel kills perception_node at 14:32:04.118, telemetry stops, and the service restarts at 14:32:09.214. A detail view shows the last obstacle_distance sample and the kernel kill 39 ms apart, inside a 46 ms combined clock error, so their order is unknown.INC-0142Telemetry gap after perception.service was killedAligned ±46 msUTC, 24 Sep 2026FindingsRule resultsFlight controller14_13_19.ulg±40 msCompanion journaluas04-orin±6 msProcess samplesperception_node±6 msGround receivesysid 4, 1 Hz±15 ms14:32:0014:32:0214:32:0614:32:0814:32:1014:32:12MissionThreshold 6,144 MiB6,800 MiB5,800 MiBrestarted at 412 MiB, below this scaleMemory above thresholdperception.service killed, and 2 moreTelemetry gap 6.96 sService restartedTelemetry back14:32:04.118Every event is drawn as an interval as wide as its clock error.No dataOrder unknownFindingDetail14:32:04.030 to 14:32:04.170, drawn 100 times closerFlight logJournal04.05004.10004.150obstacle_distance, last sample, ±40 msKernel OOM kill and systemd, ±6 msOrder unknown39 ms apart, inside ±46 ms
  1. 14:32:01.204±6 ms
    perception_node memory passed 6,144 MiB
    Observed
  2. 14:32:04.079±40 ms
    Last obstacle_distance sample before a 7.5 s stall
    Order unknown
  3. 14:32:04.118±6 ms
    Kernel killed perception_node, out of memory
    Order unknown
  4. 14:32:04.152±6 ms
    mavlink-router.service stopped
    Observed
  5. 14:32:04.912±15 ms
    Heartbeat due and not received. Nothing for 6.96 s
    Correlated
  6. 14:32:09.214±6 ms
    perception.service restarted
    Observed
  7. 14:32:10.874±15 ms
    Telemetry received again
    Observed
Read it

Move along the timeline and the vehicle moves on the map above. The flight log’s last obstacle sample and the kill are 39 ms apart, inside a 46 ms combined clock error, so Foxborne does not put them in order.

Step through it

Seven moments. Each one cites the line that recorded it.

Scroll, and the incident clock moves with you. The map, the merged log from all four sources and the time ruler follow it, one finding at a time.

INC-0142Example incident, 24 Sep 2026Replay
14:31:59.500UTCAligned ±46 ms

14:31:59.500ZBefore anything breaks

UAS-04 is flying Route Iron.

59.5 m above the ground and 1.22 km from range control, which hears it once a second. On the companion computer, perception_node holds 6,131 MiB.

14:32:01.204ZProcess, ±6 ms

The first sign, 2.9 s before anything breaks.

On the companion computer, perception_node passes 6,144 MiB and keeps climbing, to 6,655 MiB by 14:32:03.204Z. The memory pressure rule fires. Range control is still hearing the drone once a second.

Observed

14:32:04.118ZJournal, ±6 ms

The kernel kills perception_node.

Out of memory, in the companion journal at 14:32:04.118Z. The flight log’s last obstacle sample is 39 ms earlier, inside the 46 ms the two clocks can disagree by. Foxborne marks the order unknown instead of guessing.

Order unknown

14:32:04.152ZJournal, ±6 ms

The telemetry path goes down with it.

34 ms later, systemd has stopped mavlink-router, the process that bridges the flight controller to the mesh radio. Why it stopped stays a hypothesis until someone reads the unit files: it may be bound to perception.service.

Why: hypothesis

14:32:04.912ZRange control, ±15 ms

Range control hears nothing.

The next heartbeat was due at 14:32:04.912Z and never came. The receive log stays empty for 6.96 s. The radio keeps no log of its own, so Foxborne claims only what the evidence shows: nothing arrived.

Observed

14:32:09.214ZJournal, ±6 ms

systemd brings both back.

The router starts at 14:32:09.203Z and perception.service 11 ms later, 5.1 s after the kill. The router reopens the mesh radio link at 14:32:10.718Z.

Observed

14:32:10.874ZRange control, ±15 ms

Telemetry is back after 6.96 s.

Range control hears the drone again at 14:32:10.874Z. On board, PX4 flagged the missing ground heartbeat on TELEM2 at 14:32:06.510Z and logged it restored at 14:32:12.944Z.

Observed

The finding

One sequence. Every line cited.

  • Observedperception.service exited at 14:32:04.133.
  • CorrelatedThe next heartbeat was due 0.76 s after the router stopped.
  • HypothesisThe router unit may be bound to the perception unit.
  • UnknownNothing supports an order between the stall and the kill.
  1. Range controlHEARTBEAT from system 4
  2. Processperception_node RSS 6,131 MiB

The hand-off

A report your safety review board can check line by line.

Findings, sequence and evidence on marked pages, with the file, line and SHA-256 behind every statement. What the engineer concluded stays apart from what the sources show.

  • CUI banner and designation indicator
  • File, line and byte offset
  • Open questions travel with the report
CUI
Controlled by
Harrow Field Robotics
Controlled by
Reliability Engineering
CUI category
EXPT
Dissemination
FEDCON
POC
[email protected]
Incident report INC-0142

Telemetry gap after perception.service was killed

1Finding
Hypothesis

Telemetry stopped reaching range control within one second of the kernel killing perception_node. The router unit may be bound to the perception unit.

Written by the investigating engineer. Everything below is extracted from the sources.
2Sequence
Time, UTCEventLevelRef
14:32:04.079±40 msLast obstacle_distance sample
Order against E3 is unknown: 39 ms apart, inside ±46 ms.
Order unknownE2
14:32:04.118±6 msKernel killed perception_nodeOrder unknownE3
14:32:04.152±6 msmavlink-router.service stoppedObservedE5
14:32:04.912±15 msHeartbeat due and not received
0.76 s after the router stopped.
CorrelatedE6
3Evidence
E3
Kernel killed perception_node
uas04-orin-journal.json, line 18,314, sha256:a0741c955f33…cdf4
Out of memory: Killed process 2213 (perception_node) total-vm:11873248kB, anon-rss:6823516kB
  1. 1
    The engineer’s conclusion, labeledA finding says whether it is an observation, a hypothesis or unknown, and who wrote it. Everything below it is extracted from the sources.
  2. 2
    Uncertainty stays visibleTwo events inside each other’s clock error are marked order unknown in the report, exactly as on screen.
  3. 3
    Every line points at bytesThe file, the line or byte offset, and the SHA-256 of the file. Anyone holding the original can check each line.
  4. 4
    Your marking on every pageThe banner marking at the top and bottom of every page, and the CUI designation indicator on the first, set once by your administrator.

AI models

Models that check the work. Engineers still conclude.

Foxborne uses AI models where a rule cannot reach, from reading an unfamiliar log to checking a finding’s figures against the records. They run inside your boundary, and every proposal is checked by code before anything changes.

How Foxborne uses AI

Read a log nobody wrote a parser for

Reads the first lines of an unfamiliar text log, such as a radio’s status export, and proposes the time column, its clock and what each column holds.

Find one moment on two clocks

Finds events on an unsynchronized companion clock that have a counterpart in the flight log, so the clock can be aligned by hand.

Check a finding against the records

Lists every time, time difference, value and parameter an engineer’s finding states, and every word that claims a cause.

Turn an investigation into a rule

Reads incident findings for two rules that fire in order on one vehicle, such as a disconnect seconds after a vibration spike.

Explain a raw record

Reads a flight log message or a journal entry field by field, and says what the record cannot tell you.

Search by meaning

Finds evidence that says the same thing in other words: a search for radio finds USB disconnects and heartbeat losses.

Deployment

Runs inside your boundary. Sends nothing out.

Install it in your AWS GovCloud account, your data center or an air-gapped enclave. It reads the buckets and shares you already run, keeps originals under your keys, and never phones home.

Security and deployment

Your cloud account, your data center, or an air-gapped network
Foxborne application

Serves the console on your network only.

Workers

Parse, align and run rules on your hardware.

PostgreSQL

Events, notes, reports and the audit log.

Your object storage

Originals, written once, under your key.

Your key management

Keys stay there. Revoke one and the data is unreadable.

Your IdP and SIEM

SAML or OIDC sign-in. Audit events out.

Nothing is sent to usNo telemetry, crash reports or license calls. Updates arrive as signed bundles that your administrator installs.
Reads from the storage you already runRead-only
Amazon S3Including AWS GovCloud, through a read-only IAM role.
S3-compatible storageMinIO, Ceph or any S3 API inside your network.
Azure Blob StorageIncluding Azure Government, through a managed identity.
Google Cloud StorageThrough a service account with the viewer role.
SFTPGround stations and log servers, polled on a schedule.
SMB or NFSNetwork shares mounted read-only on the worker.
Companion collectorA read-only service on each companion computer.
MAVLink receiverRecords every receipt on the ground with its own clock.
Ingest APITest rigs and pipelines push signed bundles.
Manual uploadDrop files into the console. Hashed in the browser first.
  • AWS GovCloud
  • Azure Government
  • Air-gapped
  • Customer-managed keys
  • SAML or OIDC
No command channel

The collector never sends MAVLink to the flight controller. Foxborne cannot fly, command or reconfigure a vehicle.

No open port on the vehicle

Collectors connect outbound over mutual TLS and spool on board while the link is down.

Engineers conclude

Rules report what they observed. The engineer writes the conclusion, and the report keeps the two apart.

No invented confidence scores

A figure like 91% needs a calibrated model and labeled incidents. Reviewers get the evidence itself, which is what they sign off on.

Write-once originals

Files are hashed on arrival and never rewritten. Reviewers annotate beside the evidence, never on top of it.

Nothing sent to us

A self-hosted deployment has no telemetry, no crash reporting and no license call home.

A pilot on your own data

Bring your hardest incident.

Send one failure you have already investigated. We rebuild it on your data, beside your current tools, and show where the evidence agrees with your conclusion and where it doesn’t.

  1. 1
    Send one incidentA failure you have already investigated, with the flight log and whatever companion or ground evidence you kept.
  2. 2
    We reconstruct itBeside your current tools, on your data, with every claim traced to its source.
  3. 3
    Compare the answersWhere the evidence agrees with your conclusion, where it does not, and what it cannot decide.