ADR-0057: Remove the participant allowlist
ACCEPTED
Context
Experiment.participant_allowlist gated three surfaces: the per-message ParticipantValidationStage run on every channel, the token-less fallback in SessionAccessPermission._has_legacy_access (described in ADR-0039 (Consequences) and ADR-0044 (Decision)), and the legacy public start page plus its Share button. The public channel (#3682) serves anonymous visitors, and whether the consent page's identifier capture survives is an open question in that design. The feature is removed, with no deprecation window for the v2 inspect API field: nothing on web can match it once identifier capture goes, and the messaging-channel use was negligible.
Decision
We will remove the feature in two phases.
- Phase 1 (this branch): enforcement and configuration go; persistence stays.
ParticipantValidationStagebecomesParticipantIdentifierStage;ctx.participant_allowedis deleted. The keyless fallback in_has_legacy_accessis unconditional for non-widget sessions andNONE-level widget channels. The legacy start page and Share dialog no longer gate on it. The settings section, form field,normalize_participant_allowlist, the v2 inspect and write API fields, and the version-diff field go. - Phase 2 (#4278): persistence goes: the column, its
VERSIONED_CONTENT_FIELDSentry, the export-surface field, andVersionFieldDisplayFormatters.format_array_fieldare dropped.
Consequences
- Token-less sessions on chatbots with a stored allowlist go from 403 to readable and writable by whoever holds the session UUID.
- Chatbots whose public link was allowlist-disabled become reachable at their existing
public_idURL. - Messaging-channel bots restricted by allowlist answer any sender.
- Until Phase 2, new versions keep cloning the dormant column value, and
compare_with_latest()no longer sees allowlist changes. - The evaluation pipeline drops its inert
PersistenceStageexplicitly, since it had relied on the deleted flag. - Spans recorded before this release keep the old stage name.
- A v2 write request (
POST/PATCHchatbot) that still sendsparticipant_allowlistis rejected with400as an unknown key, sinceChatbotWriteSerializerrejects unknown keys; the field is not silently ignored. - The token-less widening is bounded: new non-widget sessions require a session token (ADR-0044), so it reaches only sessions backfilled as token-less and
NONE-level widget channels.
Alternatives considered
- Keep the check on messaging channels until Phase 2 - rejected: it would leave a half-removed feature and a per-message check whose only remaining users were negligible.
- Block creating a public channel while an allowlist is set - moot, since the allowlist no longer exists.