Report 012026-05-28

Long Family Archive — Inventory v2: Parent-Child Chain Linkage (Pass 2 delta)

Read-only delta over 01-inventory.json. No FamilySearch API calls. No site content modified. Generated for the 2026-05-28 audit.

Adds three per-ancestor fields — parent_pid, chain_id, generation_index — plus a supplementary extraction_method. v1 is untouched; output is 01-inventory.v2.json.

Source-priority finding (read first)

Priority 1 (explicit parent reference) returned ZERO across the codebase. Every chain data structure the site renders — the AncestorTable ancestors arrays, ChainPerson/ChainNode/DescentNode in relationships.ts / ancestors/data.ts / cousins/data.ts, and FamilyTreePage members — is an ordered array with no parent_pid / parent_id field. Parentage is encoded only by position. Therefore 100% of populated links use Priority 2 (ordinal); none are structurally asserted by an explicit field.

generation_index is per chain: 0 = the most-recent generation shown on that chain, increasing upstream. For chains that reach the living brothers (the /ancestors/* descents, the Plantagenet full chain, the cousin branches) g0 is the living generation; for self-contained line tables g0 is simply the youngest person in that table.

Counts

MetricCount
Ancestor rows (total, = v1)1096
Rows placed on a chain (chain_id set)266
Rows with parent_pid populated (real edges)204
Rows with parent_pid null892
  • null — chain head (oldest on its chain, no parent shown)45
  • null — on a chain but parent has no PID17
  • null — off-chain (prose / collateral / non-chain page)830
Distinct chains51
Extraction method = ordinal266
Extraction method = unresolved830
Extraction method = structured (explicit parent field)0

Pages where NO chain structure could be extracted

These pages carry ancestor rows but no extractable parent-child ladder. Every row on them is parent_pid: null, chain_id: null, extraction_method: "unresolved".

PageWhy
/aboutnon-chain page (index / prose / thematic)
/basementnon-chain page (index / prose / thematic)
/battlesnon-chain page (index / prose / thematic)
/battles/bunker-hillnon-chain page (index / prose / thematic)
/battles/liberty-treenon-chain page (index / prose / thematic)
/battles/valley-forgenon-chain page (index / prose / thematic)
/contentsnon-chain page (index / prose / thematic)
/history/benjamin-franklinnon-chain page (index / prose / thematic)
/history/mayflowernon-chain page (index / prose / thematic)
/history/migrationnon-chain page (index / prose / thematic)
/history/nantucket-foundingnon-chain page (index / prose / thematic)
/history/portledgenon-chain page (index / prose / thematic)
/history/the-womennon-chain page (index / prose / thematic)
/history/whalingnon-chain page (index / prose / thematic)
/lines/battle-of-quebec0 table(s): 0 roster, 0 non-monotonic, 0 descent chains
/lines/benjamin-peckham0 table(s): 0 roster, 0 non-monotonic, 0 descent chains
/lines/british-gentry2 table(s): 0 roster, 2 non-monotonic, 0 descent chains
/lines/coffin1 table(s): 0 roster, 1 non-monotonic, 0 descent chains
/lines/coffin-revolution1 table(s): 1 roster, 0 non-monotonic, 0 descent chains
/lines/deborah-crowe2 table(s): 0 roster, 2 non-monotonic, 0 descent chains
/lines/long2 table(s): 0 roster, 2 non-monotonic, 0 descent chains
/lines/lucretia-mott0 table(s): 0 roster, 0 non-monotonic, 0 descent chains
/lines/mary-morrell0 table(s): 0 roster, 0 non-monotonic, 0 descent chains
/lines/mayflower2 table(s): 0 roster, 2 non-monotonic, 0 descent chains
/lines/nantucket0 table(s): 0 roster, 0 non-monotonic, 0 descent chains
/lines/perry2 table(s): 0 roster, 2 non-monotonic, 0 descent chains
/lines/portledge0 table(s): 0 roster, 0 non-monotonic, 0 descent chains
/lines/rowland-macy0 table(s): 0 roster, 0 non-monotonic, 0 descent chains
/lines/sullivan1 table(s): 0 roster, 1 non-monotonic, 0 descent chains
/lines/treefamily-group tree; spouses+collaterals interleaved; PIDs covered on dedicated line pages
/lines/winter-swift1 table(s): 0 roster, 1 non-monotonic, 0 descent chains
/notable-kinnon-chain page (index / prose / thematic)

Per-line method log (required)

Method is ordinal wherever a chain was extracted (no structured/explicit-parent source exists), unresolved otherwise. source records which ordered array the chain came from.

Pagerowson-chainw/ parentchainsmethodsource
/about11000unresolvednon-chain page
/ancestors/arthur-plantagenet6651ordinalancestors/data.ts#descentToJohn
/ancestors/charlemagne101091ordinalancestors/data.ts#descentToJohn
/ancestors/edward-iii8871ordinalancestors/data.ts#descentToJohn
/ancestors/edward-iv7761ordinalancestors/data.ts#descentToJohn
/ancestors/john-robinson9971ordinalancestors/data.ts#descentToJohn
/ancestors/king-john8871ordinalancestors/data.ts#descentToJohn
/ancestors/rollo9981ordinalancestors/data.ts#descentToJohn
/ancestors/tristram-coffin1412111ordinalancestors/data.ts#descentToJohn
/ancestors/william-the-conqueror9981ordinalancestors/data.ts#descentToJohn
/basement5000unresolvednon-chain page
/battles3000unresolvednon-chain page
/battles/bunker-hill1000unresolvednon-chain page
/battles/liberty-tree6000unresolvednon-chain page
/battles/valley-forge1000unresolvednon-chain page
/contents215000unresolvednon-chain page
/cousins/benedict-arnold-v3312ordinalcousins/data.ts (Y-chain + commonAncestor)
/cousins/benjamin-franklin3312ordinalcousins/data.ts (Y-chain + commonAncestor)
/cousins/henry-viii3312ordinalcousins/data.ts (Y-chain + commonAncestor)
/cousins/james-gardner-officer4302ordinalcousins/data.ts (Y-chain + commonAncestor)
/cousins/joseph-arnold4412ordinalcousins/data.ts (Y-chain + commonAncestor)
/cousins/kezia-coffin4212ordinalcousins/data.ts (Y-chain + commonAncestor)
/cousins/levi-coffin-ii2202ordinalcousins/data.ts (Y-chain + commonAncestor)
/cousins/maria-mitchell2202ordinalcousins/data.ts (Y-chain + commonAncestor)
/cousins/mary-queen-of-scots5512ordinalcousins/data.ts (Y-chain + commonAncestor)
/cousins/walter-folger-jr2202ordinalcousins/data.ts (Y-chain + commonAncestor)
/history/benjamin-franklin16000unresolvednon-chain page
/history/mayflower4000unresolvednon-chain page
/history/migration8000unresolvednon-chain page
/history/nantucket-founding4000unresolvednon-chain page
/history/portledge15000unresolvednon-chain page
/history/the-women10000unresolvednon-chain page
/history/whaling7000unresolvednon-chain page
/lines/battle-of-quebec3000unresolvedancestor-table
/lines/benjamin-peckham22000unresolvedancestor-table
/lines/british-gentry21000unresolvedancestor-table
/lines/cincinnati4420173ordinalancestor-table
/lines/coffin6000unresolvedancestor-table
/lines/coffin-revolution13000unresolvedancestor-table
/lines/coogan111082ordinalancestor-table
/lines/deborah-crowe25000unresolvedancestor-table
/lines/folger161182ordinalancestor-table
/lines/green7321ordinalancestor-table
/lines/herodias-long1614122ordinalancestor-table
/lines/jenkins8862ordinalancestor-table
/lines/long32000unresolvedancestor-table
/lines/lucretia-mott6000unresolvedancestor-table
/lines/manion5541ordinalancestor-table
/lines/mary-morrell6000unresolvedancestor-table
/lines/mayflower5000unresolvedancestor-table
/lines/nantucket11000unresolvedancestor-table
/lines/pelletier17761ordinalancestor-table
/lines/perry14000unresolvedancestor-table
/lines/plantagenet-descent3535302ordinalancestor-table
/lines/portledge15000unresolvedancestor-table
/lines/rowland-macy2000unresolvedancestor-table
/lines/stukely-westcott1612111ordinalancestor-table
/lines/sullivan3000unresolvedancestor-table
/lines/swift15215112ordinalancestor-table
/lines/tree93000unresolvedfamily-tree aggregate
/lines/wall21431ordinalancestor-table
/lines/warren-arden6421ordinalancestor-table
/lines/westcott1711101ordinalancestor-table
/lines/winter-swift11000unresolvedancestor-table
/notable-kin19000unresolvednon-chain page

Method notes & deliberate exclusions

  • columns="loyalist" roster tables (battle rosters, Society-of-the-Cincinnati member lists) are NOT chains — they list peers, not generations. Dropped from linkage so no peer-as-parent edges are invented.
  • Family-group tables (e.g. /lines/long, /lines/perry, /lines/swift, /lines/wall) interleave spouses and the spouses' own parents with the direct line, so birth years are non-monotonic. They fail the monotonic gate and are left unresolved rather than linked by raw position. The same individuals are linked where the site presents them as a clean descent (their /ancestors/* pages, or curated AncestorTable ladders).
  • /lines/tree (FamilyTreePage) is a family-group aggregate (spouses tagged marriage, collateral siblings/children interleaved). Not safely linearisable by ordinal; every PID on it is also carried on a dedicated line page. Treated as a non-linearisable aggregate.
  • Siblings & spouse-only nodes are filtered out of chains. A member described as a brother/sister/sibling of its neighbour, or as a wife/husband with no lineal descriptor, is removed before linking (e.g. James Coffin — Tristram's son but John Coffin's brother — was being linked as John's parent; now dropped). Lineal members who merely also have a spouse ("Son of X; husband of Y") and genuine collateral ladders ("collateral to our line" but internally parent→child, e.g. the Heman Swift Cincinnati line) are kept.
  • Multi-table chains are stitched. Where one descent is rendered across several consecutive AncestorTables under a single <h2> (e.g. the Plantagenet "Full Chain", 26 generations), the tables are greedily merged while birth years keep trending and the boundary-overlap person is de-duplicated; a divergent branch (e.g. Eleanor of Aquitaine's Capetian line) correctly splits into its own chain.
  • Cousin Y-chains prepend the mrca (most-recent common ancestor) to both the brothers' and the cousin's branch so the branch head's parent resolves to the shared ancestor.

Integrity checks (all pass)

  • Birth-year direction: 0 edges where the parent is younger than the child.
  • Self-parent edges: 0.
  • Dangling parent_pid (not present anywhere in the inventory): 0.
  • Non-standard PID format among parent_pid values: 0.

Generated by audit/build-inventory-v2.cjs (read-only; re-runnable).