Skip to content
CodeAncestry

Documentation · Protocol

Typed lineage edges

Hybrids have more than one parent, so the structure is a directed acyclic graph, not a family tree. Every edge that matters carries evidence.

Why a graph

A child declares what it inherited rather than silently copying it. A hybrid names every parent. A rejected offer stays on the graph so the refusal is a fact, not an absence.

Drawing diagram…

A slice of the KEYLIT family: descent, recombination, and a proposal travelling upstream.
Diagram source
flowchart TB
  K["KEYLIT"]
  Kids["KEYLIT Kids"]
  Studio["KEYLIT Studio"]
  KidsES["KEYLIT Kids ES"]
  Tutor["Junior Music Tutor"]
  K -->|DERIVED_FROM| Kids
  K -->|DERIVED_FROM| Studio
  Kids -->|DERIVED_FROM| KidsES
  KidsES -->|RECOMBINED_FROM| Tutor
  Studio -->|RECOMBINED_FROM| Tutor
  KidsES -->|PROPOSED_TO| K

Edge types

Stroke style is a second encoding beside the type name, so a greyscale print still distinguishes a proposal from a descent. Colour is never the only channel.

Lineage edge types, verbs, stroke styles and seeded counts
TypeVerbStrokeIn seed
DERIVED_FROMinheritssolid3
RECOMBINED_FROMrecombinesdouble2
MUTATED_FROMspecialisessolid3
TRANSFERRED_FROMacquired laterallydashed1
ADOPTED_FROMadoptedsolid1
REJECTED_FROMdeclineddotted2
PROPOSED_TOproposes todashed3

An edge is a record

The seeded family currently holds 15 edges. A typical descent looks like this — field names taken from lineageEdgeSchema, values taken from the fixtures.

{
  "id": "e-keylit-kids",
  "type": "DERIVED_FROM",
  "from": "CAGENOME:01JKIDS0R4M",
  "to": "CAGENOME:01JKEYLIT7H2",
  "source": {
    "provider": "github",
    "parentCommit": "82c134bd1f",
    "childInitialCommit": "a04c81de29"
  },
  "assertion": "verified",
  "attestation": "sha256:117ad2c9e4b1",
  "evidence": [
    "CAEV:901"
  ],
  "confidence": 1,
  "createdAt": "2026-11-02",
  "label": "inherits"
}