"""Live producers — Python functions that emit dashboard events.

Each producer takes an async ``publish(msg: dict) -> None`` callable so it
doesn't care whether messages go through the in-process broadcaster
(``training.dashboard.app.broadcaster.publish``) or a loopback HTTP POST
to ``/publish``. The ``_publish`` module wires up either transport.

Event contracts match the JS subscribers in
``training/dashboard/static/dashboard.js`` — see the comment block at the
top of that file. Adding a new event type requires both a producer here
and a subscriber there.
"""
