660d4b8d87
Follow-up to the salvaged #110716 commit. Drops the module-level _build_telegram_command_menu wrapper (telegram_menu_max_commands is a config read and stays on the loop; asyncio.to_thread takes kwargs directly), and applies the same hop to _ensure_forum_commands, which rebuilds the menu on the inbound-message path for every forum chat until registration succeeds — the second live fire site named in #110707. Replaces the contributor's test with one that proves the invariant for both sites: the loop keeps ticking while telegram_menu_commands blocks. Red on origin/main, green here.