fix: emit late tuples as DetachedTuple in WindowedBoltExecutor

The late tuple stream emitted the original TupleImpl as a value of the
outgoing tuple. TupleImpl references the topology context, which cannot
be serialized, so any consumer of the late tuple stream running in a
different worker failed with a KryoException. Emit a DetachedTuple copy
instead, which survives serialization while still exposing the Tuple
interface to consumers.
3 files changed