Summary
Enhance the existing [slack] config section with Enterprise Grid workspace_users support for per-workspace trust scoping.
Current State
[slack] section exists with basic allowed_users
- No per-workspace scoping for Enterprise Grid deployments
- Single-workspace Slack works fine
Target State
# Single-workspace (unchanged):
[slack]
allowed_users = ["U01ABCDEFGH", "U09XYZWVUTS"]
# Enterprise Grid — workspace-scoped:
[slack]
allowed_users = ["E0123456789"] # enterprise_user.id (cross-workspace)
[slack.workspace_users]
T012345 = ["U01ABCDEFGH", "U01IJKLMNOP"] # workspace-specific overrides
T067890 = ["U09XYZWVUTS"]
Tasks
Design Decisions (per ADR)
workspace_users present for a workspace → strict per-workspace check (ignores allow_all_users)
- No
workspace_users entry → fallback to base config
- Base fallback checks both plain
sender_id AND composite "team_id:sender_id" format
- Rate-limit key includes
workspace_id: (platform, workspace_id, sender_id)
Refs
Summary
Enhance the existing
[slack]config section with Enterprise Gridworkspace_userssupport for per-workspace trust scoping.Current State
[slack]section exists with basicallowed_usersTarget State
Tasks
PlatformTrustConfigsregistry (feat(trust): Phase 1 (slack) — L3 identity via shared gate #1363 — registry entry + redundant-but-matching gate_incoming in the adapter)workspace_usersto[slack]config schemaSlackTrustConfig::decide()with workspace-scoped logicworkspace_users= strict override (ignoreallow_all_usersfor that workspace)team_id:user_idcomposite key format in baseallowed_usersfallbackworkspace_id = Some(team_id)for Grid deploymentsenterprise_user.idassender_idwhen availableconfig.toml.exampleDesign Decisions (per ADR)
workspace_userspresent for a workspace → strict per-workspace check (ignoresallow_all_users)workspace_usersentry → fallback to base configsender_idAND composite"team_id:sender_id"formatworkspace_id:(platform, workspace_id, sender_id)Refs