AckdbPerson
One human. The true identity is the ULID; durable keys are pointers into it (exactly as `domain` → entityId). `status` is the IDENTITY lifecycle only — a person with three ended jobs is still `active`; employment state lives on each contact edge.
Properties
personIdstringrequirednamestring (nullable)statusstringrequired"active""merged"mergedIntostring (nullable)The surviving person after a merge (tombstone chain); null while active.
avatarUrlstring (nullable)Photo URL — a fact about the human, projected onto every contact read. http(s) only; ackDB stores the link, never the bytes (the frontend hotlinks it). Latest non-null write wins.
createdAtstring <date-time>requiredupdatedAtstring <date-time>requiredprimaryContactIdstring (nullable)The person's PRIMARY affiliation edge (#544) — the one contact row a People table shows for them. Picked by a rule over their active edges (account company before reference company, dated current job first, then most recently seen), kept current by a trigger on contacts, overridable via PATCH. Null when the human has no active edge at an active company.
primarySourcestringrequiredWho picked `primaryContactId`: `rule` (default), `manual` (PATCH / inline edit) or `ingest` (a contact mapping flagged `isPrimary`). `manual` and `ingest` stick while that edge stays active.
"rule""manual""ingest"Example
{
"personId": "01J8ZC2V9K3W4X5Y6Z7A8B9C0D",
"name": "Elly Chen",
"status": "active",
"mergedInto": "string",
"avatarUrl": "https://media.licdn.com/dms/image/v2/abc/profile.jpg",
"createdAt": "1970-01-01T00:00:00.000Z",
"updatedAt": "1970-01-01T00:00:00.000Z",
"primaryContactId": "01J8ZD3W0L4X5Y6Z7A8B9C0D1E",
"primarySource": "rule"
}