929be4d1aa
First slice of #64176's observer-hook half — a normalized-envelope inbound event hook, replacing raw-SDK handler args with a stable contract (per #64176's "normalized versioned envelopes only; raw SDK gated behind a capability" rule). - VALID_HOOKS: register the four gateway_* names from #64176 (gateway_platform_event fires today; gateway_session_titled / gateway_message_delivered / gateway_thread_created reserved pending #64176's fire-sites). - BasePlatformAdapter._fire_gateway_hook: reusable, has_hook-guarded, per-call-isolated fire helper (the no-subscriber common case short-circuits). - TelegramAdapter: a group-99 catch-all TypeHandler normalizes inbound updates into gateway_platform_event envelopes. message_reaction -> {platform, event_type:"reaction", payload{emojis, custom_emoji_ids, chat_id, message_id, thread_id}} (custom-emoji reactions captured via custom_emoji_id; standard via .emoji — no None in consumer-facing lists). Other update types return None pending #64176's taxonomy (#64231). Normalization is wrapped so a malformed update can't raise into PTB dispatch. Observer-only — zero behavioral change to core dispatch. Supersedes the raw inbound half of #62584 (telegram:update -> normalized gateway_platform_event). Tests: VALID_HOOKS registration; _fire_gateway_hook routing/has_hook/isolation; _normalize for standard, custom-emoji, and mixed reactions + non-reaction; _on_platform_update firing + normalize-error isolation. Ran code-review (high) + simplify before pushing.