openclaw/plugin-sdk/channel-ingress-runtime for receive paths.
Runtime resolver
Result
Bundled plugins should consume modern projections directly:
Event authorization stays available on the ordered
ingress.graph and the
decisive ingress.reasonCode; no separate event projection is emitted.
Deprecated third-party SDK helpers may rebuild older shapes internally. New
bundled receive paths should not translate modern results back into local
DTOs.
Access groups
accessGroup:<name> entries stay redacted. Core resolves static
message.senders groups itself and calls resolveAccessGroupMembership only
for dynamic groups that require a platform lookup. Missing, unsupported, and
failed groups fail closed.
Event modes
Use
mayPair: false for reactions, buttons, callbacks, and native commands.
Routes and activation
Use route descriptors for room, topic, guild, thread, or nested route policy:channelIngressRoutes(...) when a plugin has several optional route
descriptors; it filters disabled branches while keeping route facts generic
and ordered by each descriptor’s precedence.
Mention gating is an activation gate. A mention miss returns
admission: "skip" so the turn kernel does not process an observe-only turn.
Most channels should leave activation after sender and command gates. Public
chat surfaces that must quiet non-mentioned traffic before sender allowlist
noise can opt into activation.order: "before-sender" when text-command
bypass is disabled. Channels with implicit activation, such as replies in bot
threads, resolve channels.defaults.implicitMentions plus channel and account
overrides with resolveChannelImplicitMentions(...), then pass the result as
activation.implicitMentions. The projected
activationAccess.shouldBypassMention reports when command or implicit
activation bypassed an explicit mention.