BB.Reactor.Middleware.Safety (bb_reactor v0.2.3)

Copy Markdown View Source

Middleware that bridges reactor errors to the BB safety event stream.

When a reactor fails (returns an error), this middleware publishes the error via BB.Safety.report_error/3. The result is a BB.Safety.HardwareError message on [:safety, :error] that observers (dashboards, alerting, custom recovery logic) can subscribe to.

This middleware does not disarm the robot or otherwise change safety state. Escalation in BB happens through the supervision tree: if a process crashes often enough to exhaust the topology supervisor's restart budget, the safety controller force-disarms the robot. Reactor errors are recovered at the saga level (compensation, retries) and do not crash processes, so they will not trigger escalation on their own. If a particular reactor failure warrants disarm, subscribe to [:safety, :error] and call BB.Safety.disarm/1 explicitly.

This middleware is not automatically added by the BB.Reactor extension - add it manually if you want reactor errors published as hardware error events.

Usage

defmodule MyRobot.PickAndPlace do
  use Reactor, extensions: [BB.Reactor]

  middlewares do
    middleware BB.Reactor.Middleware.Safety
  end

  # ... steps
end

Safety State Changes Within Steps

Individual steps (like BB.Reactor.Step.Command) are responsible for detecting safety state changes during execution and returning {:halt, :safety_disarmed} when appropriate. This middleware only publishes notifications for reactor-level errors.