5d3f75110a
Slack session keys include the workspace id since #70190, but the kanban notifier rebuilds the wake source from a subscription row that has no scope column, so every terminal-event wake keyed without the workspace. The legacy-key adoption shipped in the same change (`_legacy_slack_session_key`, `_recovered_row_matches_source_scope`) resolves that unscoped key onto the same session_id, so the wake passes the busy guards that are keyed by routing key (`_active_sessions`, `_running_agents`) and only collides afterwards, on session id, under the per-session turn lease (#64934) — which serializes it behind the live turn's flush. On a live Slack gateway that shows up as a duplicate run on one task plus 400+s of waiting before the woken turn starts. Same failure mode as #56580 / #72191 (chat_type), one field over, and it needs no schema change: `_thread_metadata_for_source()` already stamps `slack_team_id`, the notify subscription persists that dict as `delivery_metadata`, and the notifier already unpacks it. Rows written by `kanban_tools._maybe_auto_subscribe` carry no workspace, so fall back to the adapter's channel → workspace map via `scope_id_for_chat()`, read with getattr so adapters opt in and unscoped platforms' keys stay byte-identical. Slack answers it from `_remember_channel_team`, which drops channels claimed by two workspaces, so an unknown or ambiguous channel degrades to today's behavior instead of guessing wrong. Also adds the contributor email mapping the attribution check requires. Co-authored-by: Junie <junie@jetbrains.com>