LatticeLawHarness
constructor(initial: S, alphabet: List<LatticeOp<S>>, serializer: KSerializer<S>, criticalShapes: List<List<String>> = defaultCriticalShapes(alphabet), floors: VacuityFloors = VacuityFloors.DEFAULT, replicaCount: Int = 3, opsPerReplica: Int = 8)
constructor(initial: S, gen: OperationGenerator<S>, serializer: KSerializer<S>, replicaCount: Int = 3, opsPerReplica: Int = 8)
Bind a type that has not declared an alphabet yet.
The generator becomes a one-op alphabet named undeclared, and the binding gets no critical shapes — there are no op names for a shape to be a word over. That is the honest reading, not a degradation to route around: an undeclared binding also declares no OpKind.RETIRE op, so it reads as non-retiring to anything that measures retirement, which is what an undeclared binding should read as. Prefer the primary constructor.