DualActiveInbound

data class DualActiveInbound(val group: GroupId) : LedgerConflict

A group with two or more live inbound generations — two inbound edges that are each Lifecycle.ACTIVE or Lifecycle.CLOSING (a still-draining closing edge counts; it can still carry entitlement). This is the topology fork the design forbids resolving by last-writer-wins on a parent pointer (§5.2, §10.11). It arises when two replicas concurrently attach a different inbound edge for the same child — e.g. one activates e2 while another has e1 active or closing; the lifecycle max-register keeps both live, so every replica folds the merged state into the same report rather than silently picking a winner. The child's whole lineage is quarantined — EntitlementLedger.holdings returns zero at or below it — and no new entitlement may be delegated across either contested edge (EntitlementLedger.delegate returns null). This predicate is exactly the one EntitlementLedger quarantines on, so quarantine and report always coincide (§10.11).

Resolution is a control-plane (H5) concern, not an in-ledger operation. A quarantined generation has holdings 0, so it cannot be drained — the naive "close-drain-retire all but one" recipe deadlocks (a closing edge with zero holdings can neither spend nor release). Resolving a genuine fork means the control plane decides which generation is canonical and retires-and-abandons the loser's edge (accepting any entitlement stranded on it), not draining it. H2 surfaces the fork; it does not resolve it.

Constructors

Link copied to clipboard
constructor(group: GroupId)

Properties

Link copied to clipboard
Link copied to clipboard
open override val order: Int

The stable ordering rank of this conflict kind (kinds are grouped in the sorted report).

Functions

Link copied to clipboard
open operator override fun compareTo(other: LedgerConflict): Int