docs(bus): document campaign.> family + identity.campaign.assigned

2026-04-26 09:03:41 -04:00
parent b14822e782
commit 8bdda0d9e6

@@ -155,6 +155,11 @@ Current topic families:
| `identity.observation.linked` | _reserved (clusterer)_ | `{identity_uuid, observation_uuid, confidence_after}` — observation attached / re-attached to an identity |
| `identity.merged` | _reserved (clusterer)_ | `{winner_uuid, loser_uuid, observation_uuids: [...], confidence_after}` — two identities collapsed; subscribers re-key cached references to the winner |
| `identity.unmerged` | _reserved (clusterer)_ | `{resurrected_uuid, former_winner_uuid, observation_uuids: [...], reason}` — revocable-merge undo: contradicting evidence cleared `merged_into_uuid`; subscribers should re-split cached references back to the resurrected side |
| `identity.campaign.assigned` | Campaign clusterer | `{identity_uuid, campaign_uuid, prior_campaign_uuid?}` — cross-family signal so `identity.>` subscribers (e.g. IdentityDetail SSE) see the campaign-id change without needing to subscribe to `campaign.>` |
| `campaign.formed` | Campaign clusterer | `{campaign_uuid, identity_uuids: [...], confidence, first_seen_at}` — clusterer creates a new campaign from one or more identities |
| `campaign.identity.assigned` | Campaign clusterer | `{campaign_uuid, identity_uuid}` — identity attached / re-attached to a campaign |
| `campaign.merged` | Campaign clusterer | `{winner_uuid, loser_uuid, identity_uuids: [...]}` — two campaigns collapsed; subscribers re-key cached references to the winner |
| `campaign.unmerged` | Campaign clusterer | `{resurrected_uuid, former_winner_uuid, identity_uuids: [...]}` — revocable-merge undo at the campaign layer |
| `system.log` | _reserved_ | — |
| `system.bus.health` | Bus worker heartbeat | `{ts, uptime_s}` |