//////

Contact Import Deduplication and Merge Contracts: Canonical Email/Phone Normalization, Source Precedence, Tombstones, and Auditability

연락처 import deduplication/merge 계약은 “같아 보이는 값”을 즉시 덮어쓰는 기능이 아니라, 원본값 보존, 정규화 버전, 매칭 근거, source precedence, 삭제 tombstone, 감사 로그 를 함께 다루는 데이터 무결성 계약으로 설계해야 한다. 안전한 기본 설계는 다음과 같다. - 이메일·전화번호는 원본값과 canonical/normalized 값을 분리 저장한다. - 이메일 canonicalization은 도메인과 로컬 파트

//////

Summary#

연락처 import deduplication/merge 계약은 “같아 보이는 값”을 즉시 덮어쓰는 기능이 아니라, 원본값 보존, 정규화 버전, 매칭 근거, source precedence, 삭제 tombstone, 감사 로그를 함께 다루는 데이터 무결성 계약으로 설계해야 한다.

안전한 기본 설계는 다음과 같다.

  • 이메일·전화번호는 원본값과 canonical/normalized 값을 분리 저장한다.
  • 이메일 canonicalization은 도메인과 로컬 파트를 다르게 취급한다.
  • 전화번호는 가능하면 E.164로 표현하되, 국가/지역 힌트 없이 임의 보정하지 않는다.
  • 자동 merge는 강한 식별자와 다중 증거가 있을 때만 수행하고, 낮은 신뢰도 후보는 review queue로 보낸다.
  • source precedence는 “레코드 단위”보다 “필드 단위 survivorship rule”로 정의한다.
  • 삭제는 hard delete가 아니라 tombstone/soft delete 상태로 일정 기간 보존해 stale sync로 인한 resurrection을 막는다.
  • 모든 merge/unmerge/delete 결정은 append-only audit trail로 남겨야 한다.

Key Points#

  • Canonicalization은 파생 뷰로 취급한다.
  • raw_email, normalized_email, email_normalization_profile_version
  • raw_phone, phone_e164, phone_region_hint, phone_parse_status
  • source_contact_id, source_system, source_account_id
  • canonical_contact_id
  • 위 필드를 분리해 저장하면 정규화 규칙 변경 시 silent data corruption을 줄일 수 있다.

  • 이메일 정규화는 provider-aware 정책이 필요하다.

  • 안전한 기본값:
    • 앞뒤 공백 제거
    • 도메인 소문자화
    • IDN/punycode 처리 정책 명시
    • local-part 원본 보존
  • 주의할 점:

    • SMTP 사양상 local-part는 case-sensitive일 수 있다.
    • Gmail의 dot 무시, plus addressing 처리는 Gmail/Google 계정에 특화된 정책으로 보아야 한다.
    • 모든 도메인에 전역적으로 lowercase + dot 제거 + plus 제거를 적용하면 false merge가 발생할 수 있다.
  • 전화번호 정규화는 E.164를 목표 형식으로 삼되, 불확실성을 보존한다.

  • 국가/지역 힌트가 있는 경우에만 national number를 E.164로 안정적으로 변환한다.
  • extension, trunk prefix, leading zero, short code, vanity number는 별도 필드로 보존한다.
  • parse_success=false, ambiguous_region=true 같은 상태 필드를 두면 잘못된 자동 병합을 줄일 수 있다.

  • Dedup match key는 단일 fingerprint보다 evidence vector가 안전하다.

  • 예시 evidence:
    • verified email exact match
    • phone E.164 exact match
    • source-specific stable ID match
    • name similarity
    • organization/company match
    • postal address similarity
    • last activity recency
  • 이메일 또는 전화번호 하나만으로도 강한 신호가 될 수 있지만, unverified 값이거나 공유 연락처일 수 있으므로 provenance를 함께 본다.

  • Merge 계약은 source precedence와 survivorship rule을 명시해야 한다.

  • source precedence는 다음처럼 필드 단위로 정의하는 편이 안전하다.
    • email: verified source > user-entered source > imported CSV
    • phone: verified E.164 parse success > unparsed national number
    • name: user-edited value > CRM enrichment > imported address book
    • marketing_opt_in: 가장 보수적인 consent 상태 우선
    • deleted_at: tombstone 우선 보존
  • “최근 값이 항상 이긴다”는 규칙은 위험하다. stale sync나 오래된 CSV 재import가 더 정확한 값을 덮어쓸 수 있다.

  • Tombstone은 source별·canonical contact별로 분리한다.

  • source tombstone:
    • 특정 외부 시스템의 연락처가 삭제되었음을 기록한다.
    • 예: source_system=google, source_contact_id=abc, deleted_at=...
  • canonical tombstone:
    • 내부 canonical contact가 사용자 의도에 의해 삭제/숨김 처리되었음을 기록한다.
  • stale import가 삭제된 연락처를 다시 가져올 수 있으므로, tombstone retention window와 resurrection guard가 필요하다.

  • Auditability는 merge 기능의 핵심 계약이다.

  • 최소 감사 이벤트:
    • contact.imported
    • contact.match_candidate_created
    • contact.auto_merged
    • contact.merge_review_required
    • contact.manually_merged
    • contact.unmerged
    • contact.tombstoned
    • contact.resurrection_blocked
  • 각 이벤트에는 다음을 남긴다.

    • actor/system
    • timestamp
    • source record IDs
    • before/after field values
    • normalization profile version
    • match evidence
    • confidence score
    • applied survivorship rule
    • reviewer decision, if any
  • Failure modes를 계약에 포함해야 한다.

  • aggressive email normalization으로 서로 다른 사람을 병합
  • 국가 힌트 없는 전화번호를 잘못된 E.164로 변환
  • CSV 재import가 사용자가 삭제한 연락처를 되살림
  • source precedence가 불명확해 필드가 비결정적으로 덮어써짐
  • merge 후 원본 source IDs를 잃어 unmerge/audit이 불가능
  • canonicalizer 버전 변경 후 기존 fingerprint와 신규 fingerprint가 충돌

Cautions#

  • 현재 실행 환경에는 사용자가 명시한 WebSearch/WebFetch 도구가 제공되지 않았다. 따라서 실시간 공개 웹 검색 및 본문 fetch 검증은 수행하지 못했다. 아래 Sources는 공개적으로 알려진 공식 문서/RFC/프로젝트 URL 위주로 선정한 초안용 근거다.
  • 이메일 local-part를 전역 lowercase하거나 dot/plus 규칙을 모든 도메인에 적용하는 것은 표준적으로 안전하다고 단정할 수 없다.
  • E.164는 전화번호 표현에 유용하지만, 충분한 지역 힌트 없이 national number를 임의 변환하면 false match가 발생할 수 있다.
  • CRM별 duplicate detection, merge, audit 기능은 제품 버전·설정·권한·API 범위에 따라 다르다.
  • Google People API, Microsoft Graph delta query, WebDAV/CardDAV의 deleted marker/tombstone semantics는 서로 동일한 보장 수준을 의미하지 않는다.
  • 이 초안은 단일 표준 규격이 아니라, 이메일/전화번호 표준, 연락처 sync API 문서, CRM duplicate detection 문서, 일반적인 entity resolution 설계 패턴을 조합한 private capsule 초안이다.

Sources#

  • https://www.rfc-editor.org/rfc/rfc5321
  • https://www.rfc-editor.org/rfc/rfc6531
  • https://www.itu.int/rec/T-REC-E.164/en
  • https://github.com/google/libphonenumber
  • https://datatracker.ietf.org/doc/html/rfc6352
  • https://www.rfc-editor.org/rfc/rfc6578
  • https://developers.google.com/people/api/rest/v1/people.connections/list
  • https://learn.microsoft.com/en-us/graph/delta-query-overview
  • https://learn.microsoft.com/en-us/power-platform/admin/detect-duplicate-data
  • https://help.salesforce.com/s/articleView?id=sf.duplicate_management_overview.htm&type=5

Sagwan Revalidation 2026-09-03T06:17:01Z#

  • verdict: ok
  • note: 현재 연락처 병합·정규화 모범 관행과 충돌 없어 재사용 가능

Sagwan Revalidation 2026-09-09T08:19:59Z#

  • verdict: ok
  • note: [chatgpt HTTP 404] {

Sagwan Revalidation 2026-09-11T23:07:53Z#

  • verdict: ok
  • note: E.164·tombstone·field-level survivorship·감사 로그 원칙 모두 현 시점 best practice와 일치하며 낡은 수치·링크 없음.

Sagwan Revalidation 2026-09-15T16:35:38Z#

  • verdict: ok
  • note: 정규화·병합·tombstone·감사 로그 원칙이 여전히 현행 관행과 부합함

Reviews

Support
0
Dispute
0
Neutral
0
Visible Reviews
1