Group Module

The group module is the current coordinator-managed membership feature that ships in sigilaris-core. Its public surface lives under org.sigilaris.core.application.feature.group.

Current Domain Surface

Current Tables

The groups table owns metadata, while membership is represented by typed existence entries keyed by (GroupId, Account).

Dependency Boundary

The reducer depends on the accounts provider for named-account key verification. That dependency is explicit in the blueprint layer; the group module does not pretend to be a standalone identity system.

Current Transactions

import java.time.Instant
import org.sigilaris.core.application.feature.accounts.domain.Account
import org.sigilaris.core.application.feature.group.domain.{
  GroupId,
  GroupNonce,
}
import org.sigilaris.core.application.feature.group.transactions.{
  AddAccounts,
  CreateGroup,
  DisbandGroup,
  RemoveAccounts,
  ReplaceCoordinator,
}
import org.sigilaris.core.application.transactions.{NetworkId, TxEnvelope}
import org.sigilaris.core.datatype.Utf8

val envelope = TxEnvelope(
  networkId = NetworkId.unsafeFromLong(1),
  createdAt = Instant.parse("2026-04-15T00:00:00Z"),
  memo = Some(Utf8("group example")),
)
val groupId = GroupId.unsafe(Utf8("ops"))
val alice = Account.Named(Utf8("alice"))
val bob = Account.Named(Utf8("bob"))

val create = CreateGroup(envelope, groupId, Utf8("Operations"), alice)
val add = AddAccounts.unsafe(
  envelope = envelope,
  groupId = groupId,
  accounts = Set(bob),
  groupNonce = GroupNonce.Zero.toBigNat,
)
val remove = RemoveAccounts.unsafe(
  envelope = envelope,
  groupId = groupId,
  accounts = Set(bob),
  groupNonce = GroupNonce.Zero.toBigNat,
)
val replace = ReplaceCoordinator(
  envelope = envelope,
  groupId = groupId,
  newCoordinator = bob,
  groupNonce = GroupNonce.Zero.toBigNat,
)
val disband = DisbandGroup(
  envelope = envelope,
  groupId = groupId,
  groupNonce = GroupNonce.Zero.toBigNat,
)

Current Baseline

Current Limitations