---
model: claude-fable-5[1m]
service: claude
session: 32d15f9a-b2d3-4c26-bdc9-190219141a25
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
scope: code
substantive: true
raw_file: 20260610T171105Z_bc6e18d7_prompt_io.raw.md
---

## Prompt

Same session-initiating `brokerd`-split instruction (see
`20260610T170859Z_75cefe10_prompt_io.md`); this is the
approved plan's "stage 0" prep. Plan-shaping user
decisions captured via in-session Q&A:

- `datad.<broker>` topology: sibling of
  `brokerd.<broker>` under `pikerd` (vs. child
  subactor).
- migration: hard cutover, staged by layer (no
  dual-mode runtime flag).
- post-split `brokerd` scope: trading-only +
  EMS-lazy-spawned (charts/CLI never touch it).

## Response summary

Declare per-daemon-kind backend submod groups
(`_datad_mods`/`_brokerd_mods`) in the split-style
backends, keyed to the pre-existing
`piker.data.validate._eps` contract; add a
`validate.get_eps()` introspection helper; ws-import
hygiene in `.kraken.broker`. Zero behavior change
(`__enable_modules__` unions unchanged).

## Files changed

- `piker/data/validate.py` — add `get_eps()`
- `piker/brokers/kraken/__init__.py` — mod groups
- `piker/brokers/binance/__init__.py` — mod groups
  (note: no `symbols.py`; search eps live in `.feed`)
- `piker/brokers/deribit/__init__.py` — datad-only
  groups (no `broker.py` yet)
- `piker/brokers/ib/__init__.py` — add `'api'` to the
  pre-existing `_datad_mods`
- `piker/brokers/kraken/broker.py` — import
  `NoBsWs`/`open_autorecon_ws` from
  `piker.data._web_bs` directly

## Human edits

None — committed as generated.
