You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix: keep placeholder ids and shared meeting accounts from snowflake out of member identities - #5043
Stops the Snowflake connectors from turning placeholder values and known shared meeting accounts into member identities. In meetings, these built a black-hole member that grew to 474 identities and that data sink auto-merged about 108 times in 24 hours.
Invitees without an LF account arrive with INVITEE_LF_USER_ID = 'NONE'. The lf_sso_lookup CTE grouped on that value, so the COALESCE gave every non-LF invitee the same LF SSO (andres.twenty), and all of them resolved to one member. NONE was also used as the member sourceId, so every non-LF invitee of a meeting shared the activity sourceId <meetingId>-NONE.
Shared Zoom host accounts (zoom@hyperledger.org, zoom2@lfai.foundation, meetings@dpdk.org and others) show up as invitees across many meetings and tie unrelated people together. The blob holds them.
The other connectors read identity fields the same way. Cvent already has placeholder usernames (na, none, null) and the user id -.
Changes
cleanIdentityValue (transformerBase) treats empty values and placeholders (none, null, undefined, na, n/a, -) as missing. Every Snowflake transformer (meetings, Cvent, committees, and TNC enrollments, courses and certificates) uses it for LF username, platform username and user id.
cleanPersonalEmail (core/personalEmail.ts) drops a strict list of 9 shared meeting host accounts, such as zoom@hyperledger.org, zoom2@lfai.foundation and meetings@dpdk.org. Every one of them has been found inside the black-hole member; on 2026-10-20 it held 9 of them alongside 23–27 different LF accounts. Every transformer uses it for the email, and a row with a listed email is skipped. Other Zoom accounts, mailing lists, bots and noreply addresses are left alone: they each sit on their own member with 1–2 identities, so nothing shows they cause bad merges.
In meetings, the GENERATED_SOURCE_ID fallback applies again, and the lf_sso_lookup CTE leaves out placeholder user ids and SSOs.
Migration V1792492400__soft-delete-shared-snowflake-identities.sql soft-deletes identities that are known to be wrong, using the same explicit list:
the 9 shared meeting accounts (meetings email and username identities);
the Cvent placeholder usernames na, none and null;
the LFID undefined.
It also touches members.updatedAt for each affected member, the same way the data-access layer soft-deletes identities. A read-only dry run against production matches 18 identities on 8 members, including the current black-hole member. It does not split that member.
Unit tests cover placeholder cleaning, the email blocklist and the lookup query. The transformers themselves can't be imported under vitest, because @crowd/integrations loads its integrations with dynamic require.
Not in this PR:
A guard on data sink's identity-conflict auto-merge for oversized members. It moved to linuxfoundation/lfx-cdp-insights-ops#854.
Repairing members already affected: splitting the blob, removing the <meetingId>-NONE activities, and handling the members left with no identities.
Medium Risk
Changes how members are resolved across Snowflake ingest and runs a one-time soft-delete on existing identities; incorrect rules could drop valid people or leave members without identities.
Overview
Stops Snowflake connector transforms from creating member identities from placeholder strings (none, null, undefined, etc.) and from a fixed list of shared Zoom/meeting host emails, so rows with only junk identifiers are skipped instead of collapsing many people into one member.
Connector pipeline: New cleanIdentityValue and cleanPersonalEmail are wired through meetings, Cvent, committees, and TNC transformers for emails, LF usernames, platform usernames, and source IDs. Meeting attendance SQL now excludes those placeholders from the lf_sso_lookup CTE and ignores placeholder INVITEE_LF_SSO when falling back to the lookup.
Data cleanup: Migration V1792492400 soft-deletes matching bad identities (shared meeting emails/usernames, Cvent placeholder usernames, LFID undefined) and bumps members.updatedAt for affected members.
Unit tests cover the cleaners and the meeting source-query placeholder filters.
Reviewed by Cursor Bugbot for commit 0f5592f. Bugbot is set up for automated code reviews on this repo. Configure here.
joanagmaia
changed the title
fix: stop meetings placeholder ids and unguarded auto-merges from building black-hole members
fix: treat placeholder lf user ids from the meetings source as missing
Oct 20, 2026
joanagmaia
changed the title
fix: treat placeholder lf user ids from the meetings source as missing
fix: treat placeholder identity values from snowflake connectors as missing
Oct 20, 2026
Normalize the direct SSO before the COALESCE at line 52 as well. If a valid LF user ID has 'NONE' on the current row and a real SSO on another row, the filtered lookup contains the real username, but COALESCE still selects 'NONE'. The transformer then discards it and emits no LFID identity. Convert direct placeholder SSOs to SQL NULL so the lookup fallback can recover the username.
joanagmaia
changed the title
fix: treat placeholder identity values from snowflake connectors as missing
fix: keep placeholder and shared emails from snowflake connectors out of member identities
Oct 20, 2026
joanagmaia
changed the title
fix: keep placeholder and shared emails from snowflake connectors out of member identities
fix: keep placeholder ids and shared meeting accounts from snowflake out of member identities
Oct 20, 2026
Normalize the primary SSO before applying the fallback. The SELECT still uses COALESCE(t.INVITEE_LF_SSO, sso.LF_SSO), so a row with a real LF user ID and SSO NONE ignores a valid SSO found on another row for that ID. The transformer then cleans NONE to null and omits the LF identity, even though the lookup can supply it. Treat placeholder primary SSOs as NULL before COALESCE, and add a regression case for a placeholder primary SSO with a valid lookup value.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Stops the Snowflake connectors from turning placeholder values and known shared meeting accounts into member identities. In meetings, these built a black-hole member that grew to 474 identities and that data sink auto-merged about 108 times in 24 hours.
INVITEE_LF_USER_ID = 'NONE'. Thelf_sso_lookupCTE grouped on that value, so theCOALESCEgave every non-LF invitee the same LF SSO (andres.twenty), and all of them resolved to one member.NONEwas also used as the member sourceId, so every non-LF invitee of a meeting shared the activity sourceId<meetingId>-NONE.zoom@hyperledger.org,zoom2@lfai.foundation,meetings@dpdk.organd others) show up as invitees across many meetings and tie unrelated people together. The blob holds them.na,none,null) and the user id-.Changes
cleanIdentityValue(transformerBase) treats empty values and placeholders (none,null,undefined,na,n/a,-) as missing. Every Snowflake transformer (meetings, Cvent, committees, and TNC enrollments, courses and certificates) uses it for LF username, platform username and user id.cleanPersonalEmail(core/personalEmail.ts) drops a strict list of 9 shared meeting host accounts, such aszoom@hyperledger.org,zoom2@lfai.foundationandmeetings@dpdk.org. Every one of them has been found inside the black-hole member; on 2026-10-20 it held 9 of them alongside 23–27 different LF accounts. Every transformer uses it for the email, and a row with a listed email is skipped. Other Zoom accounts, mailing lists, bots and noreply addresses are left alone: they each sit on their own member with 1–2 identities, so nothing shows they cause bad merges.In meetings, the
GENERATED_SOURCE_IDfallback applies again, and thelf_sso_lookupCTE leaves out placeholder user ids and SSOs.Migration
V1792492400__soft-delete-shared-snowflake-identities.sqlsoft-deletes identities that are known to be wrong, using the same explicit list:na,noneandnull;undefined.It also touches
members.updatedAtfor each affected member, the same way the data-access layer soft-deletes identities. A read-only dry run against production matches 18 identities on 8 members, including the current black-hole member. It does not split that member.Unit tests cover placeholder cleaning, the email blocklist and the lookup query. The transformers themselves can't be imported under vitest, because
@crowd/integrationsloads its integrations with dynamicrequire.Not in this PR:
<meetingId>-NONEactivities, and handling the members left with no identities.Type of change
Related issue
Closes linuxfoundation/lfx-cdp-insights-ops#853