person

Every canonical field of a person record, how one is keyed tier by tier, and the relations its fields mint, generated from spec/fields/person.json

What you'll learn

You're mapping a column or a vendor field to a person field and need the exact name, its tier, and its normalization rule.

  • every canonical field of a person, with its tier and type
  • how a person is keyed, tier by tier
  • which fields mint a relation to another type

Canonical field registry for person records (SPEC.md §4a, ADR-017). Seeded from the fields the v0 adapters actually touch plus the curated cross-provider overlap. A field name not listed here must be vendor-namespaced (<vendor>.<field>). A subject type (ADR-054): what a pipeline delivers to. The identity list is SPEC.md §4's person derivation, tier by tier.

Identity

A person is keyed by the first of these tiers the record has, strongest first.

TierFromKey
1emailthe normalized value
2linkedin_urlthe normalized value
3github_usernamethe value prefixed gh:
4twitter_handlethe value prefixed tw:
5(full_name or first_name + last_name) and company_domaina SHA-256 of those, prefixed nh:

As the type file states it:

[
  {
    "field": "email"
  },
  {
    "field": "linkedin_url"
  },
  {
    "field": "github_username",
    "prefix": "gh:"
  },
  {
    "field": "twitter_handle",
    "prefix": "tw:"
  },
  {
    "hash": [
      {
        "any": [
          "full_name",
          {
            "join": [
              "first_name",
              "last_name"
            ]
          }
        ]
      },
      "company_domain"
    ],
    "prefix": "nh:"
  }
]

Fields

FieldTierTypeNormalizationDescription
emailidentitystring (email)emailWork or personal email. Identity tier 1 (SPEC.md §4).
linkedin_urlidentitystring (uri)linkedin_urlPUBLIC LinkedIn profile URL (vanity slug) only. Identity tier 2 via the derived slug. An internal-form or Sales-Navigator URL is an INVALID value for this field — those are linkedin_internal_url / linkedin_sales_nav_url (SPEC.md §4, ADR-020); the shapes are separate fields precisely so they can never collide under one name.
linkedin_internal_urlcorestring (uri)trimInternal-form LinkedIn profile URL (opaque token in the /in/ path, such as linkedin.com/in/ACwAA…). Stored as the URL, case preserved — gtme distinguishes observable URL shapes and does not reinterpret them as identifiers. NOT key material in v0 (SPEC.md §4, ADR-020): an enrichment that resolves it to the public profile writes linkedin_url, and the ordinary key upgrade applies.
linkedin_sales_nav_urlcorestring (uri)trimSales Navigator URL form (linkedin.com/sales/lead/… or /sales/people/…). Stored as the URL, case preserved. NOT key material in v0 (SPEC.md §4, ADR-020); same recovery path as linkedin_internal_url.
first_nameidentitystringtrimGiven name. Feeds the name-hash fallback tier with last_name (SPEC.md §4).
last_nameidentitystringtrimFamily name. Feeds the name-hash fallback tier with first_name (SPEC.md §4).
github_usernameidentity, reservedstringhandleGitHub username. Reserved identity tier 3, key prefix gh: (SPEC.md §4, ADR-020); no v0 adapter provides it.
twitter_handleidentity, reservedstringhandleTwitter/X handle without the @. Reserved identity tier 4, key prefix tw: (SPEC.md §4, ADR-020); no v0 adapter provides it.
full_namecorestringtrimFull display name. Feeds the name-hash fallback tier when first/last are absent.
titlecorestringtrimCurrent job title, as stated.
senioritycorestringlowerSeniority band, lowercased. No locked value domain in v0 — providers do not converge enough to pin one; a domain is declared only if real cross-provider evidence shows convergence (SPEC.md §4a).
headlinecorestringtrimProfile headline/tagline.
aboutcorestringtrimProfile summary / about section.
citycorestringtrimCity of residence/work.
statecorestringtrimState/region.
countrycorestringtrimCountry.
locationcorestringtrimFree-form location string when a provider does not split city/state/country.
company_namecorestringtrimCurrent employer's name.
company_domaincorestringdomainCurrent employer's registrable domain (eTLD+1). The comparable, dedupe-safe form — never a full URL. Declares the works_at reference (ADR-054): a person record carrying it also names a company, keyed and populated from company_domain and company_name, and the runner writes works_at from the person to it.
company_websitecorestring (uri)trimCurrent employer's website URL as provided. company_domain is the comparable form.
company_linkedin_urlcorestring (uri)linkedin_urlCurrent employer's LinkedIn company page URL.
company_employeescoreintegernoneCurrent employer's headcount as an integer — never a range string. An adapter whose provider reports a range maps it to a point estimate or omits the field.
company_industrycorestringtrimCurrent employer's industry label. Value domain deferred until a second adapter forces comparability (rule of two).
current_rolecorestringtrimCurrent role as an enrichment provider states it (may differ from a source's title).
current_companycorestringtrimCurrent employer as an enrichment provider states it.
role_historycorearray of stringnonePast roles, most recent first, one string per role.
recent_postscorearray of stringnoneRecent public post texts, most recent first.
follower_countcoreintegernoneSocial follower count.
open_to_workcorebooleannoneWhether the profile advertises being open to work.
email_statuscorestringlowerEmail verification status as the providing adapter reports it. Waterfall-relevant; canonical value domain deferred until a second adapter forces comparability (rule of two).
first_linecorestringtrimComposed personalized opening line, consumed by deliver steps.
ps_linecorestringtrimComposed personalized P.S. line, consumed by deliver steps.

References

A field with a reference names a record of another type. A source that writes it also mints that record and the relation between them.

FieldNames aRelationFields carried
company_domaincompanyworks_atcompany_domain, company_name

Examples

FieldExample value
emailjane.doe@acme.com
linkedin_urlhttps://www.linkedin.com/in/jane-doe
linkedin_internal_urlhttps://www.linkedin.com/in/ACwAAAbQ2xKB9…
linkedin_sales_nav_urlhttps://www.linkedin.com/sales/lead/ACwAAAbQ2xKB9…,NAME_SEARCH
first_nameJane
last_nameDoe
github_usernamejanedoe
twitter_handlejanedoe
full_nameJane Doe
titleVP Marketing
seniorityvp
headlineBuilding outbound that people actually read
about20 years of B2B marketing…
cityPortland
stateOregon
countryUnited States
locationPortland, Oregon, United States
company_nameAcme Corp
company_domainacme.com
company_websitehttps://www.acme.com
company_linkedin_urlhttps://www.linkedin.com/company/acme-corp
company_employees120
company_industryComputer Software
current_roleVP Marketing at Acme Corp
current_companyAcme Corp
role_history[VP Marketing, Acme Corp (2022–) Director of Growth, Beta Inc (2018–2022)]
recent_posts[Shipped our new onboarding flow today…]
follower_count4821
open_to_workfalse
email_statusverified
first_lineLoved your post on onboarding flows —
ps_lineP.S. congrats on the Series B.