classifies

open fun classifies(bytes: ByteArray): Boolean

Whether bytes is a frame of this family, by the family's own real classifier.

This is the predicate SeamRoom.dispatchIncoming actually dispatches on, and it is the one to use for any "which family is this?" question. matches answers the strictly weaker question "does this claim the byte?", and for two families the two answers differ: Channel additionally requires a 3-byte header, and Heartbeat requires the whole "kuilt.heartbeat.ping"/"…pong" string.

Why the registry carries the predicate rather than the byte alone. A caller that asks "is this payload spoken for?" by folding matches over entries gets a different answer from the dispatcher for exactly those two families — and the disagreement is silent. #1994's relay allow-list was written that way and dropped a spoke's "keepalive" broadcast (byte 0x6b) that the direct path delivers as ordinary application data. Registering each family's real classifier here makes the two planes agree by construction, while keeping the property that a new family must claim a byte — and so is excluded from the allow-list by default — rather than having to be remembered at every call site.