Cleanup left behind by #285. src/workers/fetch_facts.py carries a one-time migration that renames the pre-#285 bare watcher consumer group to watcher.blobs:
LEGACY_CONSUMER_GROUP = "watcher"
migrate_legacy_group() and its _group_text / _stream_position helpers
- the call site in
run_blobs_consumer, before ensure_group
TestLegacyGroupMigration in tests/workers/test_fetch_facts.py
It ran on the live broker on 2026-09-03 and is a permanent no-op since — every boot takes the no_legacy_group path.
Why it is not deletable yet
The broker relocation (#282, CannObserv/broker#1) can stand up a node from an RDB that still carries the old watcher group. If it does, the migration is exactly what keeps that harmless: without it, a Watcher whose constant already says watcher.blobs calls ensure_group(start_id="$"), mints at the tail, and drops every fact published in the gap with no error, no PEL and no lag. That is the failure mode #285 wrote this code to remove, and it is live again for as long as an old-group RDB can reappear.
So: delete after CannObserv/broker#1 completes and the relocated broker is confirmed carrying watcher.blobs only. Not before.
Done when
- The four bullets above are gone.
docs/ARCHITECTURE.md → Redis and the bus loses the migrate_legacy_group paragraph but keeps the derived-group-name rule (group_name, no purpose segment) — that is the standing convention, not migration scaffolding.
- The
#285 comment on CONSUMER_GROUP stays; the one on LEGACY_CONSUMER_GROUP goes with it.
tests/test_bus_stream_kinds.py stays untouched. It enforces co-core's stream taxonomy against src/ — reader class vs. stream_kind, group_name derivation, config/state maxlen — and has nothing to do with the migration. Same for the ARCHITECTURE paragraph describing it: the trim removes the migration prose beside it, not this.
Cleanup left behind by #285.
src/workers/fetch_facts.pycarries a one-time migration that renames the pre-#285 barewatcherconsumer group towatcher.blobs:LEGACY_CONSUMER_GROUP = "watcher"migrate_legacy_group()and its_group_text/_stream_positionhelpersrun_blobs_consumer, beforeensure_groupTestLegacyGroupMigrationintests/workers/test_fetch_facts.pyIt ran on the live broker on 2026-09-03 and is a permanent no-op since — every boot takes the
no_legacy_grouppath.Why it is not deletable yet
The broker relocation (#282, CannObserv/broker#1) can stand up a node from an RDB that still carries the old
watchergroup. If it does, the migration is exactly what keeps that harmless: without it, a Watcher whose constant already sayswatcher.blobscallsensure_group(start_id="$"), mints at the tail, and drops every fact published in the gap with no error, no PEL and no lag. That is the failure mode #285 wrote this code to remove, and it is live again for as long as an old-group RDB can reappear.So: delete after CannObserv/broker#1 completes and the relocated broker is confirmed carrying
watcher.blobsonly. Not before.Done when
docs/ARCHITECTURE.md→ Redis and the bus loses themigrate_legacy_groupparagraph but keeps the derived-group-name rule (group_name, nopurposesegment) — that is the standing convention, not migration scaffolding.#285comment onCONSUMER_GROUPstays; the one onLEGACY_CONSUMER_GROUPgoes with it.tests/test_bus_stream_kinds.pystays untouched. It enforces co-core's stream taxonomy againstsrc/— reader class vs.stream_kind,group_namederivation, config/statemaxlen— and has nothing to do with the migration. Same for the ARCHITECTURE paragraph describing it: the trim removes the migration prose beside it, not this.