A long-lived, channel-agnostic gate prompt (e.g. a parked SOP approval):
rendered natively per channel (Discord embed + buttons, Telegram inline
keyboard, …), answered through the channel’s normal inbound path — a
component click or a <choice> <reference> text reply — NOT a blocking wait.
The single authority for the channel-SOP event topic grammar
channel.alias:event_type. The producer that lifts a forge/platform event
into SOP ingress builds the topic here; the SOP engine parses it here. The
grammar lives in one place so the two sides cannot drift.
A low-level, provider-relative forge API request routed through a
forge-backed channel. Channel-neutral so the Channel trait carries no
forge-specific types; the git channel maps this onto its provider’s
forge_request. method is an uppercase HTTP verb (GET/POST/PATCH/
PUT/DELETE); path is relative to the provider’s API base (e.g.
repos/owner/repo/issues/12/labels); body is an optional JSON payload.
The outcome of a forge API request: the HTTP status and decoded JSON body
(Null when the response had no body). Non-2xx statuses are carried here
rather than raised, so the caller inspects the forge’s own error envelope.
The fixed vocabulary of gate-answer tokens, and the single source of truth
for their wire spelling. A gate answer crosses two stringly-typed transports
— a Discord custom_id and a <choice> <reference> text reply — so the
token must be a string on the wire; this enum keeps producer (the route
adapter that mints GateChoice::id) and consumer (the orchestrator that
maps an answer to an approval decision) matching on ONE definition instead of
re-typing the literal at each site, so adding a choice is a compile error at
every place that must handle it rather than a silent drift.
Reserved ChannelMessage.subject prefix the git/forge channel uses to
label SOP-ingress events. Routing is NOT keyed on this (see
ChannelMessage::internal_sop_event); it exists so channels that fill
subject from user-controlled data (email) can keep this reserved
namespace out of inbound subjects.