e3983f91eb
Minimal v1 platform action surface for plugins, routed through the live gateway adapter registry — the sanctioned alternative to monkeypatching an adapter: - ctx.platform_actions.add_reaction(platform, chat_id, message_id, emoji) - ctx.platform_actions.set_thread_title(platform, chat_id, thread_id, title) Gated behind a new 'gateway.platform_actions' capability in CAPABILITY_REGISTRY (legacy key plugins.entries.<id>.allow_platform_actions, default OFF), re-checked on every call via plugin_capability_granted (the #84912 consent registry). Verbs validate the adapter exists and is connected, return structured {ok, error, detail} results with stable error codes, and never raise into hook dispatch. Every action is audit-logged with plugin id, verb, platform, and outcome. Telegram routes to _set_reaction / rename_dm_topic; Discord to fetch_message().add_reaction / rename_thread. No adapter handles or raw SDK objects are exposed. Docs: plugins.md platform-actions section with the security note and the explicit raw-SDK-not-shipped statement.