Identity resolution · PII detection · abstraction pipeline · field-level encryption · right to erasure
{ pseudoId ↔ clerkUserId ↔ stripeCustomerId }. This table must exist because the pseudoId is randomly generated; it cannot be computed from either external identifier. Clerk and Stripe also issue different, unrelated identifiers, so neither can be derived from the other.The offline analytics pipeline runs entirely outside the application layer on a scheduled basis. It never touches the Bridge or the DynamoDB mapping table. Its input is already pseudoId-keyed, AES-256-GCM encrypted Convex data. Its output is a PostgreSQL analytics store with no individual-level identifiability. This data is used for analytics and training purposes, such as when users submit feedback on Soc's responses.
<PERSON>, <LOCATION>, <DATE>, etc.has_pii audit flag is written if residual PII is detected despite upstream Haiku passes.anonId = SHA-256(ANON_SALT + pseudoId).slice(32).anon_threads, anon_messages, etl_runs. No real identifiers. No pseudoIds. All IDs are salted SHA-256 hashes.feedback_rating, feedback_comment_scrubbed (Presidio-cleaned). User-submitted feedback is routed through the same anonymization pipeline; it is never reviewed using raw Convex data.deletionRequestedAt timestamp written. Account access immediately suspended.deletionRequestedAt to null.