Per-socket outbound bundle threaded through the :after_render and
:after_serialize transform stages (Musubi.Lifecycle).
A frame groups one store socket's render output with the push events
(Musubi.Event) it queued this cycle. :after_render sees the
Elixir-form frame (render native, events empty — events are drained at the
server aggregation phase); :after_serialize sees the wire-form frame
(render serialized, events wire-encoded) and is where render / event
validation runs. A hook returns {:cont | :halt, frame, socket} and may
rewrite render or events.
Summary
Types
@type t() :: %Musubi.Page.Frame{ events: [Musubi.Event.event()], render: Musubi.Page.StoreTable.Entry.resolved_state() | Musubi.Page.StoreTable.Entry.wire_state() | nil }