Section 53.4: Runtime monitoring and fail-safe behavior

A robust robot is not the one that never sees surprise, it is the one that notices surprise early enough to act differently.

A Runtime Monitoring Engineer
Big Picture

Runtime monitoring turns robustness from an offline evaluation concept into an online control layer. A monitor observes health signals and decides when the nominal policy should lose authority.

Runtime monitoring and fail-safe behavior illustration for Chapter 53.
Figure 53.4.1: A runtime monitor moves the robot through normal, degraded, stop, and recovery modes based on health and uncertainty signals.

Why This Matters

Runtime monitoring and fail-safe behavior is useful only when it distinguishes disturbance sources and ties them to specific corrective actions. Robustness is not one scalar, it is a map from perturbation class to degraded behavior, detection delay, and residual risk.

A simple health-state machine can be written as $$z_{t+1} = M(z_t, h_t),$$ where $z_t \in \{\text{normal}, \text{degraded}, \text{stopped}, \text{recovery}\}$ and $h_t$ collects latency, uncertainty, sensor freshness, and constraint-margin signals. The deployment claim is about this state machine as much as about the policy itself.

Key Insight

The monitor is useful only if it has authority to change behavior. Logging an alarm after a bad action is observability, not fail-safe control.

Algorithmic View
  1. Define the monitor inputs, such as confidence, sensor age, latency, and constraint margin.
  2. Set transitions between normal, degraded, stop, and recovery states.
  3. Specify what authority each state has over velocity, planning horizon, or human override.
  4. Test the transition latency on the same stress cases that motivated the monitor.
  5. Save every transition in the rollout artifact and review false triggers as carefully as missed triggers.

Worked Example

A drone localization stream that goes stale should trigger hover or controlled landing within a bounded delay. The monitor has failed even if the postmortem log is perfect but the unsafe action already happened.

state = "normal"
health = [
    {"latency_ms": 25, "uncertainty": 0.12},
    {"latency_ms": 48, "uncertainty": 0.18},
    {"latency_ms": 130, "uncertainty": 0.55},
]

transitions = []
for h in health:
    if h["latency_ms"] > 100 or h["uncertainty"] > 0.5:
        state = "stopped"
    elif h["latency_ms"] > 40 or h["uncertainty"] > 0.15:
        state = "degraded"
    transitions.append({"health": h, "state": state})

print(transitions)
[{'health': {'latency_ms': 25, 'uncertainty': 0.12}, 'state': 'normal'}, {'health': {'latency_ms': 48, 'uncertainty': 0.18}, 'state': 'degraded'}, {'health': {'latency_ms': 130, 'uncertainty': 0.55}, 'state': 'stopped'}]
Code Fragment 53.4.1 maps health signals to runtime states, illustrating the minimal interface behind a fail-safe monitor.

Expected output: The monitor first degrades behavior under moderate health drift and then stops under severe drift. That progression is the key design choice, not the exact threshold numbers.

Library Shortcut

ROS 2 lifecycle nodes, Prometheus metrics, and OpenTelemetry traces help implement the monitor as a real system service rather than an afterthought buried in policy code.

Concrete stack anchors for this chapter include Albumentations or custom disturbance wrappers for controlled perturbations, Torchmetrics and scikit-learn for calibration analysis, MAPIE or related conformal wrappers for thresholding, PyOD-style OOD baselines for score comparison, and Prometheus or OpenTelemetry for deployment-time health traces.

Good monitors are designed as control authorities with explicit latency budgets. A monitor that decides correctly but too slowly still fails its deployment role.

A recurrent mistake is to define degraded mode without specifying what actually degrades, such as speed cap, action horizon, sensing requirement, or human-supervision demand. Without that, degraded is just a label.

Cross-References

This section hands off naturally to Section 54.4 on safety filters and Section 54.5 on human override, where runtime authority becomes explicit.

Lab Recipe

Implement a four-state monitor for one robot task, feed it uncertainty and latency signals, and replay at least one episode where the monitor should have intervened earlier than the nominal policy would have.

Failure Mode

Do not tune monitor thresholds only on clean logs. Stress cases and near-failures are the data that determine whether the monitor will matter in the field.

Practical Example

A delivery robot might enter degraded mode by lowering speed and requiring fresher localization, then stop entirely when map confidence collapses. A manipulator might shrink force limits and approach speed before requesting human review.

Research Frontier

Research directions include learned runtime assurance, better fusion of heterogeneous health signals, and monitors that can actively seek information rather than only stopping or slowing.

Self Check

Can you name the signals, thresholds, and authority change in each runtime state for your system? If not, your monitor is not specified tightly enough to test.

Key Takeaway

Runtime monitoring is the bridge from uncertainty to safer behavior. Its quality is measured by the timeliness and correctness of its state transitions.

Exercise 53.4.1

Design a runtime state machine for one embodied system and define the exact actions allowed in each state. Then identify one transition you would expect to be most fragile in deployment.

Section References

Amodei, D. et al. "Concrete Problems in AI Safety." (2016). https://arxiv.org/abs/1606.06565

Still helpful for the broader framing of interventions and monitoring.

Official ROS 2 lifecycle and diagnostics documentation.

Useful implementation references for stateful runtime supervision.

What's Next

Chapter 54 now takes over by turning monitoring and intervention into a full safety architecture with hazards, formal envelopes, shields, and assurance cases.