--- model: claude-fable-5[1m] service: claude timestamp: 2026-06-10T17:11:05Z git_ref: datad_service diff_cmd: git log -1 -p --follow -- ai/prompt-io/claude/20260610T171105Z_bc6e18d7_prompt_io.md --- NOTE: diff-ref mode entry (code committed in the same commit as this log); backfilled from the live dev session transcript per the `/prompt-io` skill rules. > `git log -1 -p --follow -- piker/data/validate.py` Generated: `get_eps(mod, kind) -> dict[str, Callable]` returning the daemon-kind's ep funcs defined by a backend mod, keyed by ep name, missing eps excluded; sourced from the existing `_eps` grouping table (`'middleware' | 'datad' | 'brokerd'`). > `git log -1 -p --follow -- piker/brokers/kraken/__init__.py` > `git log -1 -p --follow -- piker/brokers/binance/__init__.py` > `git log -1 -p --follow -- piker/brokers/deribit/__init__.py` > `git log -1 -p --follow -- piker/brokers/ib/__init__.py` > `git log -1 -p --follow -- piker/brokers/kraken/broker.py` Key exploration findings driving the design (from the planning phase, 3 parallel explore agents + 1 architect agent): - the codebase already anticipated this split: `validate._eps` groups eps into 'datad' vs 'brokerd' kinds and `ib/__init__.py` already declared `_brokerd_mods`/`_datad_mods`; `brokers/_daemon.py` carried the literal TODO "rename the daemon to datad prolly once we split up broker vs. data tasks into separate actors?". - the feared kraken feed<->broker "shared ws state" hazard is mild: `NoBsWs`/`open_autorecon_ws` originate in `piker.data._web_bs` (re-exported via `.kraken.feed`); only `stream_messages` is feed-local and it's a pure parser — in-process imports only, each actor opens its own ws conn. - `enable_modules` gates RPC entry, NOT python imports, so backend trading mods may keep importing feed-side helpers in-process post-split.