When rt-control refuses a request it returns HTTP 409 (413 for an oversized body, 404 for an unknown resource) with a reason code in error. This page lists every reason in the contract, grouped by area, with the operations that can return it. It also covers the numeric reasons inside native receipts, the execution fault bits and the per-axis readiness states in Status.
The reason list is generated from reasons in rt-core/protocol/application-v1.schema.json, which the contract calls the closed catalogue of adapter-owned labels. The same names are exported as constants by all three clients: control.Reason… in Go, rosie::rt_control::Reason… in C++ and Reason… in TypeScript.
Tip
Machine-readable. Every reason on this page, with its meaning, group, HTTP status and the operations that return it, as JSON.
error is a catalogue label, or a diagnostic that starts with one (native_limit_exceeded: segment=2 sample=118 axis=J3). Some errors are open diagnostics with no label: JSON decoding, I/O, context and native text such as RTCore rejected operation 0x124: reason 2. Match on the leading label.
native_result is present when the core refused a command. Read its numeric Reason in native command reasons.
native_jog_result is present when the jog lane refused. Read StateReason, ControlReason or UpdateReason in native jog reasons.
data.limit_violation accompanies native_limit_exceeded and native_segment_rate_exceeded from a program upload. It gives kind (position or velocity), segment, sample, axis, value, limit and unit (rad or rad/s).
Treat an unknown label, a malformed reply or a transport failure as an unknown outcome. Stop producing motion, send an authenticated stop if you can, and reconcile Status before acquiring again.
All 153 reasons, in 13 groups. Returned by links to the operation on the rt-control HTTP API page. The meaning is the contract's own text where it gives one, and otherwise a description of the code that raises the reason.
Native execution ended without successful completion; motion completion is unverified. Inspect status and fault details, correct the cause, and explicitly prepare and start a new execution.
execution.error in GET /v1/status when a started program ends without completing.
Anchor storage could not be read or persisted; unverified stored evidence cannot authorize restoration. Filesystem details are logged locally and never returned in public feedback. Retry after checking the anchor directory and disk. On restore refusal, the anchor store is not modified.
At startup: --pair-id is empty, --pair-revision is 0, or --configuration-sha256 does not match the core.
rt-control startup; exits.
resource_artifact_invalid
Startup refuses an incomplete, mismatched, malformed or over-bound compiled resource artefact.
rt-control startup; exits.
socket owned by a live process
Another live process holds the socket's lock. rt-control exits with status 3.
rt-control startup; exits with status 3.
socket ownership cannot be verified
The existing socket path is not a socket owned by this user.
rt-control startup; exits.
socket lock ownership cannot be verified
The .lock file beside the socket is not a private regular file owned by this user.
rt-control startup; exits.
socket lock path changed
The .lock file was replaced while rt-control was claiming it.
rt-control startup; exits.
bound path is not a socket
After binding, the socket path is not the expected socket.
rt-control startup; exits.
process start time unavailable
rt-control could not read its own start time to record socket ownership.
rt-control startup; exits.
unsupported socket ownership transport
An internal socket type other than stream or datagram was requested.
rt-control startup; exits.
Four error texts carry detail after a fixed prefix: unmapped_dense_axis: <axis>, native_limit_exceeded: segment=<index> sample=<index> axis=<id>, discard preparation <handle>: <cause> and jog_native_rejected_<number> (a WebSocket jog refusal carrying a native jog reason). At startup, remote CRL signature: <cause> reports a CRL that the CA did not sign.
The numeric native_result.Reason in a refused command, from reasons in rt-core/protocol/control.json. native_result.Result is 0 accepted, 1 rejected or 2 prepared.
Code
Name
0
none
1
invalid_command
2
not_ready
3
mode_conflict
4
unknown_handle
5
capacity
6
invalid_trajectory
7
pdo_mapping_mismatch
8
outside_limits_outward
9
no_grant
10
wrong_generation
11
inhibited
12
io_not_configured
13
io_not_armed
14
io_fast_input_unsatisfied
15
io_readback_disagreement
16
io_torch_unqualified
17
io_marker_late
18
io_exchange_lost
rt-control translates some of these into labels: 8 becomes outside_limits_outward, the cell I/O reasons 9..18 become their labels for I/O-carrying calls, and 2 or 3 during a Start become not_ready or mode_conflict. Anything else arrives as native_rejected. Reason 5 (capacity) during a program upload arrives as busy, and reason 6 (invalid trajectory) retires every prepared handle.
The numeric reasons of the jog lane, from jog_reasons in control.json. They appear in JogObservation (StateReason, ControlReason, UpdateReason), in /v1/jog/ingress counters and in WebSocket jog_native_rejected_<n> refusals. Reason 14 (limited) is an accepted, governed state, not a failure.
core.execution_fault_reasons in Status is a bit mask of latched execution faults. RecoveryStatus.faults[] names each latched bit with its affected axes and recovery class. This table is generated from rt-core/include/fault_recovery.hpp, whose own comments call the policy unverified.
Bit
Name
Invalidates Home
Needs drive reset
Needs reverification
Recovery class
0
start_discontinuity
No
No
No
reset_clears
1
position_rate
Yes
No
No
rehome_required
2
cycle_deadline
No
No
No
reset_clears
3
cycle_sleep
No
No
No
reset_clears
4
target_lead
Yes
No
No
rehome_required
5
following_error
No
No
No
reset_after_condition_clears
6
coordinate_reference
Yes
No
No
rehome_required
7
drive_readiness
No
Yes
Yes
reset_after_condition_clears
8
bus_transport
No
No
Yes
reset_after_condition_clears
9
completion_timeout
No
No
No
reset_clears
10
brake_hold
No
No
Yes
restart_required
11
pdo_mapping_mismatch
Yes
No
Yes
restart_required
12
collision_watchdog
No
No
No
reset_after_condition_clears
13
cell_io
No
No
No
restart_required
Loss of trusted feedback can also require Home even when the table says No. Unknown bits persist.
Recovery class
What to do
reset_clears
reset_fault clears it.
reset_after_condition_clears
Remove the cause first (fresh feedback below the bound, a healthy bus, drives fault-free), then reset_fault.
rehome_required
reset_fault, then Home (or a qualified restore_anchor) on the axes in rehome_axis_mask before any motion.
restart_required
Reset cannot clear it. Investigate, then restart the core.
reset_fault outcomes per bit are cleared, persists or rehome_required. Any persistent selected condition refuses the whole reset with fault_persists.
Each entry of axes[] in Status has a readiness string: the first failing gate for that axis, in this order. It is an observation, not authority: the group gates (lease, Arm, bus, faults, configuration) still apply at every Start.
Order
Value
What to do
1
faulted
A drive alarm or latched safety fault. Diagnose it and follow its recovery class.
2
mode_mismatch
The drive is not in CSP mode (8). Wait for an expected commissioning transition, or restore the mode.
3
home_required
Home, or a qualified restore_anchor, before Start.
4
coordinate_invalid
Coordinates are not trustworthy. Restore feedback, configuration or Home evidence.
5
not_enabled
Enable the axis under a live grant.
6
not_operation_enabled
Wait for the CiA402 transition to Operation Enabled.
7
brake_wait
Wait for the brake release delay.
8
ready
This axis passes. Check the whole selected group and the grant before Start.
The code also defines warning_tolerated: one tolerated drive warning on an axis without an encoder battery. It grants nothing, and Home and Enable keep their normal gates.