008caa88a2
dingtalk _extra_get, mattermost _extra_or_env and slack _extra_or_env_flag/_channel_set fell through to env only on None, so `allowed_channels: ""` / `free_response_channels: ""` meant "no whitelist" rather than "use the env CSV". The shared reader treated blank as unset and silently widened those to the env value. New `blank_is_unset=False` knob restores the old semantics at those seven call sites; the default (blank = unset) stays for the readers whose old body was `extra.get(k) or env`.