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

personIdstringrequired
namestring (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>required
updatedAtstring <date-time>required
primaryContactIdstring (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.

primarySourcestringrequired

Who 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

AckdbPerson 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"
}