SpanLink
data class SpanLink(val fromSpanId: ByteString, val linkedTraceId: ByteString, val linkedSpanId: ByteString, val attributes: Map<String, String> = mapOf("kuilt.causality" to "potential"))
A derived causal edge: span fromSpanId could have been caused by the predecessor span identified by linkedTraceId / linkedSpanId.
This maps directly onto an OTLP Span.Link. The kuilt.causality=potential attribute is non-negotiable: a link records happens-before, which is a superset of true causality — it says "could have caused," never "did."