Source Node
data class SourceNode(val key: String, val kind: String, val display: String? = null, val uri: String? = null, val path: String? = null, val contentHash: String? = null, val connectorId: String? = null, val externalId: String? = null)
Shared graph node for a dice SourceLocator. The @NodeId is the locator's stable key(), so the same source referenced by many propositions is one node (MERGE by key) — reverse-traversable ("which propositions came from this source?") and dedup'd. The polymorphic locator is flattened to a kind discriminator + the kind's fields; reconstructed by PropositionGraphMapper.