6241787662
Same class as the Matrix readers: since545e74d0the WhatsApp YAML bridge seeds `free_response_chats` into extra via the "csv" kind (any non-None value), so a present-but-blank `free_response_chats: ''` reaches `_whatsapp_free_response_chats` as '' and its `if raw is None` fallback never reads WHATSAPP_FREE_RESPONSE_CHATS. Before545e74d0the hook returned None and the key never reached extra, so the env CSV applied. Route it through the shared extra_or_secret reader (blank = unset; an explicit empty list stays "no chats"). Sibling sweep of every "csv"-kind bridged key: dingtalk, mattermost and slack readers already go through extra_or_secret and their bridges seeded extra before 0.21.2, so008caa88deliberately kept blank-means-clear there; whatsapp allow_from uses key-presence semantics by design (_select_dm_allowlist); buzz reads env first. Telegram allowed_chats: '' shadowing the env var is pre-existing (identical on v2026.9.7, via the shared-key bridge) and left as is.