One bus on the mesh. A service publishes on its own stream, and each reader acknowledges on its own group.
There is one Redis bus for the whole mesh. Streams are named for their owner, kalt.{owner}, and a stream name does not carry a workspace id. A workspace node uses that same bus.
The owning service is the only publisher. ch.pub appends the stream entry and writes the owner’s ledger row in the same call. The message type is domain or source, and it has to match the stream. A private stream is that same service publishing and reading its own apply commands.
A service names each stream it reads with subscribe_to. That call creates the group kalt-{service} on the owner’s stream. A new reader starts at the newest entry. A reader that must apply history starts at the beginning. The follow loop reads, applies, and acknowledges. A failed apply stays pending. The owner’s group and each reader’s group acknowledge on their own.