--- model: claude-fable-5[1m] service: claude timestamp: 2026-06-10T17:11:42Z git_ref: datad_service diff_cmd: git log -1 -p --follow -- ai/prompt-io/claude/20260610T171142Z_119d2c04_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/_daemon.py` Generated symbols + key design decisions: - `_datad_service_mods: list[str]` — datad-always enabled mods, the data-side successor to the old `piker.brokers._daemon._data_mods` set; kept minimal per the caps-sec model. - `_setup_persistent_datad()` — `@tractor.context` lifetime fixture: console-log setup then allocates the actor-global feed bus via `feed.get_feed_bus(brokername, service_nursery)` exactly as the old brokerd fixture did, pinned open with `ctx.started()` + `sleep_forever()`. - `datad_init()` — actor name `f'datad.{brokername}'`; copies backend `_spawn_kwargs` (CRITICAL for `ib`'s `infect_asyncio=True`); builds `enable_modules` from `getattr(brokermod, '_datad_mods', getattr(brokermod, '__enable_modules__', []))` as the flat-backend fallback. - `spawn_datad()` — `Services.actor_n.start_actor()` + `Services.start_service_task()` exactly mirroring `spawn_brokerd()`; dedup-composes enable mods via `list(dict.fromkeys(...))`. - `maybe_spawn_datad()` — wraps `maybe_spawn_daemon( service_name=f'datad.{brokername}', ...)`. > `git log -1 -p --follow -- piker/service/_actor_runtime.py` > `git log -1 -p --follow -- piker/service/__init__.py` > `git log -1 -p --follow -- tests/test_services.py` Design rationale (verbatim from session): - `_root_modules` must gain `piker.data._daemon` so `pikerd_portal.run(spawn_datad, ...)` resolves in the root. - the `Services`-based impl style deliberately mirrors `spawn_brokerd()` so the eventual `tractor.hilevel` `ServiceMngr` port (see the `service_mng_to_tractor` branch's d8c21d44 prep, surfaced by the user-requested branch-overlap survey) lands symmetrically on both spawn fns. - mod placement (`piker/data/_daemon.py` vs. generalizing `piker.brokers._daemon`) follows the per-subsystem daemon-mod convention (`.clearing._ems`, `.data._sampling`) and resolves the existing TODO at `brokers/_daemon.py:49` ("move this def to the `.data` subpkg").