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…
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| KEdge 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.
| Type | Verb | Stroke | In seed |
|---|---|---|---|
| DERIVED_FROM | inherits | solid | 3 |
| RECOMBINED_FROM | recombines | double | 2 |
| MUTATED_FROM | specialises | solid | 3 |
| TRANSFERRED_FROM | acquired laterally | dashed | 1 |
| ADOPTED_FROM | adopted | solid | 1 |
| REJECTED_FROM | declined | dotted | 2 |
| PROPOSED_TO | proposes to | dashed | 3 |
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"
}