Topic taxonomy
Every event has a dotted topic name. The first segment is the namespace. The host owns every namespace except a plugin’s own.
A plugin cannot publish into the host namespaces. A plugin’s own topics
live under
plugin.<id>.*.
Wildcards apply a trailing .*: mavlink.* matches mavlink.heartbeat
but not the bare mavlink.
Capability RBAC
Subscribing requires theevent.subscribe capability, and the topic must
be allowed for this plugin. The allowlist is the union of:
- The plugin’s own
plugin.<id>.*namespace (always allowed). - A fixed set of public topics any plugin may subscribe to:
vehicle.armed,vehicle.disarmed,vehicle.mode_changed,vehicle.battery_low,vehicle.geofence_breach,mission.started,mission.completed,mission.aborted,agent.ready,agent.shutdown. - Any extra topics the supervisor seeds from the plugin’s manifest.
event.publish (the plugin’s own plugin.<id>.*
topics are always publishable). These namespaces are reserved and a
plugin may never publish into them: vehicle., mavlink., mission.,
safety., agent., swarm., gps..
The host re-resolves the required capability from the topic, not from the
plugin’s say-so.
Telemetry
Subscribe to telemetry through the telemetry surface, gated by thetelemetry.read capability on the agent (or telemetry.subscribe on the
GCS half). Per-topic GCS grants use the telemetry.subscribe.<topic>
form, as in telemetry.subscribe.battery. Representative topics include
battery, gps, attitude, position, and system; treat the exact payload
fields as the live telemetry shape, not a frozen contract.
Delivery and back-pressure
Each subscriber has its own bounded queue (256 messages deep). The bus fans out without blocking the publisher: when a subscriber’s queue is full the event is dropped and the host logs a warning rather than stalling the producer. Telemetry and raw streams are therefore best-effort. If your plugin needs a complete record, persist from a recording rather than trying to capture every live event. To avoid dropping, do not block in the event handler. Hand work to a background task and let the handler return quickly:Plugin-to-plugin
Plugins publish into their ownplugin.<id>.* namespace. Another plugin
subscribes to that namespace only if it declares event.subscribe and
the operator approves, and the supervisor has the subscriber’s allowlist
seeded for that topic. Plugin topics are derived data on a sandboxed bus;
they never command the vehicle.