bc125d59d5
Review findings (Salt, adversarial pass on the two preceding commits): - BLOCKING: a `tool_progress: null` (global, platform, or legacy overrides) counted as an explicit mode because the gate tested key presence, while the display resolver skips None and inherits. Null resolved to Slack's tier default `off` and disabled cards, which is the default-off trap the change exists to avoid. Explicit intent is now a non-None value (or the env bridge). Tests cover null at each level plus null-over-global-all; mutation to key-presence turns the three null cases red. - TASTE: `_TaskCardState.egress_declined` now also latched on unsupported destinations, so the name no longer described the field. Renamed to `publication_suppressed` with both causes documented; readers unchanged. - SHOULD-FIX: slack.md still promised an unconditional text fallback and described the opt-in as independent of tool_progress. Rewritten: cards follow an operator-written off (including /verbose), null inherits, an un-threaded chat with the card lane active shows no tool progress, other native failures keep the editable fallback.