MAXGEN schema · v1.13

MaxPerson

A probable person. Every claim is an assertion with a source and a score.

Download MaxPerson v1.13 All versions https://opengenealogyai.org/schemas/maxgen/v1/person.schema.json

You cannot ask the dead who they are

Genealogy reconstructs people from fragments: names written by clerks who may have misspelled them, ages self-reported to a census taker, dates in calendars that no longer match ours. Most file formats can hold only one answer per fact, so the uncertainty has to be resolved before it can be saved: one John Maxwell, one father, and the doubt lives in a notebook instead of the data.

MaxPerson keeps the uncertainty in the data, where software and researchers can work with it.

What it is

A MaxPerson is a probable identity: a bundle of assertions, each saying this source claims this, with this confidence, recorded by this agent on this date. There are no bare facts in a MaxPerson. There are only assertions with evidence behind them.

Composite confidence

composite_confidence is one number, 0 to 1, for how sure we are about the identity as a whole. It is computed from all the assertions, weighted by source quality, using a "noisy-OR" combination (two independent sources agreeing raise confidence more than either alone, but not as if they were certain). Because every assertion cites a source_record_id, the engine can notice when two assertions really come from the same underlying document and avoid double-counting.

The merge model

When evidence shows two MaxPerson records are the same individual, one absorbs the other. merge_history[] records the confidence, method, signals, who merged and when. The absorbed record stays, marked merge_status: merged_away. If later evidence shows they were different people after all, the merge is reversed on the same quality of evidence that made it.

Privacy

is_living: true locks the record. Public endpoints return "not found". The record still exists internally and can be researched, but it is never exposed. Linked DNA records inherit the same lock. This is a design requirement of the standard, not a policy any implementation can switch off.

Fields

FieldTypeMeaning
person_id requiredstringGlobally unique identifier for this person entity.
schema_version const "1.13"MAXGEN version this record conforms to.
is_living booleanTrue if this person may be alive.
composite_confidence numberAggregate confidence that all assertions in this record refer to the same real individual.
name_assertions requiredarray of objectAll known names for this person with individual confidence scores.
birth_assertions array of objectAll birth event claims with individual confidence scores.
death_assertions array of objectAll death event claims with individual confidence scores.
parent_assertions array of objectAll claimed parent relationships.
spouse_assertions array of objectAll claimed spouse relationships.
gender_assertions array of objectMAXGEN v1.12 — Time-bounded gender records.
child_assertions array of objectAll claimed child relationships.
occupation_assertions array of objectAll known occupations for this person with confidence scores.
external_ids objectDenormalized quick-lookup map of {system -> top-confidence id} for this person — a convenience MIRROR of external_id_assertions[] (the authoritative, scored, multi-valued source as of v1.6).
external_id_assertions array of objectMAXGEN v1.6 — scored, sourced, REVERSIBLE links from this conclusion-person to the same individual as represented in an external database (a 'persona').
dna_evidence array of objectMAXGEN v1.2 — DNA chains that touch this person as a candidate MRCA or direct subject.
event_assertions array of objectMAXGEN v1.3 — Long-tail life events beyond the first-class birth/death/marriage assertions.
place_registry array of objectMAXGEN v1.3 — Normalized gazetteer links for places referenced anywhere in this record's assertions.
merge_status enumMAXGEN v1.3 — Lifecycle state.
duplicate_of stringMAXGEN v1.3 — When merge_status is 'merged_away', the person_id of the surviving entity this one was absorbed into.
merge_history array of objectMAXGEN v1.3 — Record of entities absorbed INTO this one.
source_record_ids array of stringAll RawRecord UUIDs that contributed evidence to this Person entity.
extensions objectMAXGEN v1.3 — Designated namespace for experimental or contributor-specific fields.
photo_assertions array of objectMAXGEN v1.4 — Photographs OF this person (portraits, snapshots, family photos).
redistribution_license enumMost restrictive license among all contributing source records.
asserted_by requiredstringAgent ID or contributor that created this Person entity.
asserted_at requiredstringTimestamp of initial entity creation.
last_updated_at string
judge_approved booleanTrue if the judge-agent has validated this entity's assertions.
judge_approved_at string

Example

Mary Todd Lincoln as a MaxPerson: two names (birth and married), an exact birth and death, one marriage, every claim citing the same marriage record.

{
  "person_id": "b1000000-0006-4000-8000-000000000006",
  "schema_version": "1.13",
  "is_living": false,
  "composite_confidence": 0.95,
  "name_assertions": [
    {
      "name_as_written": "Mary Todd",
      "given_name": "Mary",
      "surname": "Todd",
      "name_type": "birth",
      "confidence": 0.95,
      "source_record_id": "a1b2c3d4-0003-4000-8000-000000000003",
      "asserted_by": "extractor-agent-haiku-001",
      "asserted_at": "2026-05-01T14:00:00Z"
    },
    {
      "name_as_written": "Mary Lincoln",
      "given_name": "Mary",
      "surname": "Lincoln",
      "name_type": "married",
      "confidence": 0.99,
      "source_record_id": "a1b2c3d4-0003-4000-8000-000000000003",
      "asserted_by": "extractor-agent-haiku-001",
      "asserted_at": "2026-05-01T14:00:00Z"
    }
  ],
  "birth_assertions": [
    {
      "year_min": 1818,
      "year_max": 1818,
      "month": 12,
      "day": 13,
      "date_type": "exact",
      "place_as_written": "Lexington, Kentucky",
      "country_code": "US",
      "confidence": 0.98,
      "source_record_id": "a1b2c3d4-0003-4000-8000-000000000003",
      "asserted_by": "extractor-agent-haiku-001",
      "asserted_at": "2026-05-01T14:00:00Z"
    }
  ],
  "death_assertions": [
    {
      "year_min": 1882,
      "year_max": 1882,
      "month": 7,
      "day": 16,
      "date_type": "exact",
      "place_as_written": "Springfield, Illinois",
      "country_code": "US",
      "confidence": 0.99,
      "source_record_id": "a1b2c3d4-0003-4000-8000-000000000003",
      "asserted_by": "extractor-agent-haiku-001",
      "asserted_at": "2026-05-01T14:00:00Z"
    }
  ],
  "spouse_assertions": [
    {
      "spouse_person_id": "b1000000-0007-4000-8000-000000000007",
      "marriage_year_min": 1842,
      "marriage_year_max": 1842,
      "confidence": 0.99,
      "source_record_id": "a1b2c3d4-0003-4000-8000-000000000003",
      "asserted_by": "extractor-agent-haiku-001",
      "asserted_at": "2026-05-01T14:00:00Z"
    }
  ],
  "source_record_ids": [
    "a1b2c3d4-0003-4000-8000-000000000003"
  ],
  "redistribution_license": "public-domain",
  "asserted_by": "extractor-agent-haiku-001",
  "asserted_at": "2026-05-01T14:00:00Z",
  "judge_approved": true,
  "judge_approved_at": "2026-05-04T09:00:00Z"
}

Listen

Episode 2

MaxPerson — The person who might be your ancestor

22:46

Assertions not facts, probabilistic parents, composite confidence, and the merge model.