3a5f8f9119
Both @callboy and @librarian duplicated the reactive plumbing (poll/say/read/loop/ addressing/since-offset). Lifted it into lib/bullpen_worker.py (bw.run(nick, dispatch)); a worker is now just a dispatch(msg)->reply function. No behavior change — both verified live after the swap. Adding a 3rd worker is now ~15 lines. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>