Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions domains/data/knowledge/metrametrics-identity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
name: metrametrics-identity
domain: data
description: isOptIn:true unconditionally strips user identity in MetaMetricsController — always sends as anonymous ID
---

# MetaMetrics Identity Stripping

## The Mechanism

In `MetaMetricsController` (`app/scripts/controllers/metametrics-controller.ts`):

```typescript
if (excludeMetaMetricsId || (isOptIn && !metaMetricsIdOverride)) {
idType = 'anonymousId';
idValue = METAMETRICS_ANONYMOUS_ID; // 0x0000000000000000
}
```

When `isOptIn: true` with no `metaMetricsIdOverride`:
- The user's real `metaMetricsId` is discarded
- ALL such events share a single anonymous ID (`0x0000000000000000`) in Segment
- User-level attribution is completely lost

This is **unconditional** — it applies to fully opted-in users with valid IDs, not just anonymous users.

## Intended Use

The onboarding opt-in flow (`creation-successful.tsx`) — where the user hasn't committed to MetaMetrics yet and no `metaMetricsId` has been persisted. The event must fire regardless of opt-in state.

## The Misuse Pattern

Post-opt-in `trackEvent` calls with `{ isOptIn: true }` without `metaMetricsIdOverride`. Defeats the purpose of Segment user-level dimensions (account types, feature flags).

## Detection

```bash
grep -r "isOptIn: true" app/scripts/ ui/ --include="*.ts" --include="*.tsx"
```

Any occurrence outside `creation-successful.tsx` (or the onboarding flow) is suspect.
40 changes: 40 additions & 0 deletions domains/data/knowledge/segment-governance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
name: segment-governance
domain: data
description: Segment event governance via segment-schema is advisory — no CI enforcement prevents unregistered events from shipping
---

# Segment Event Governance

## Architecture

| Component | Location |
|-----------|----------|
| Tracking plan | `Consensys/segment-schema` → `tracking-plans/metamask-extension.yaml` |
| Event registry | `shared/constants/metametrics.ts` → `MetaMetricsEventName` enum (300+ entries) |
| Review process | `CONTRIBUTING.md` in segment-schema; Data Council review |
| Governance channel | `#metamask-metametrics`, `@consensys/data-council` |

## The Gap

There is **no CI enforcement** in the extension repo. A developer can:

1. Add entry to `MetaMetricsEventName` enum
2. Call `trackEvent` with it
3. Merge and ship to production

...without registering in segment-schema or going through Data Council review.

## Implications

- Schema drift between tracking plan and production events
- No property schema validation for unregistered events
- Billing impact goes unreviewed
- Data Council review is bypassable by omission

## Recommended Fix

CI check that:
1. Parses `MetaMetricsEventName` entries
2. Validates each against `tracking-plans/metamask-extension.yaml`
3. Fails build if event is missing from the plan