Expand description
Conversation lineage, derived from .fur/threads/.
§Assertions, not records
parents and children are independent claims. A holds “B is my child”
and B holds “A is my parent”; either can exist without the other, because
one of them may have been imported from a registry without the other. The
traversal graph is therefore the union of every claim in the project, and
an edge asserted from one side only is a real edge.
The raw claims are kept alongside the union, because the union deliberately erases which side made the claim — and that is exactly what asymmetry detection needs.
§Cycles are data, not errors
Nothing here rejects a cycle. fur link refuses to create one locally, but
two people can independently publish A→B and B→A and the cycle only exists
once both land in one archive. Every walk carries a visited set — which it
needs for diamonds regardless — so a node reached twice is emitted once and
flagged, never expanded again.