A data-quality bug + a silent-data-loss bug compound into misattribution
Debugging why an event-resolution layer started attributing events to the wrong record after an upstream pipeline change.
Two bugs neither of which would have caused user-visible damage individually compounded into confident misattribution. Bug A: a person record was created with the wrong identifier — a self-link to the operator's own MXID instead of a third party. Bug B: an upstream sync agent silently dropped the recipient field on incremental sync responses because membership state was only carried in deltas not full state. With only Bug B, the resolver would have routed to triage with a no-match signal that surfaces as untriaged in the UI. With only Bug A, the bad link would have stayed dormant. Together — empty to plus a from that the resolver could match against — every outbound event got attributed to the wrong person record confidently and silently. The takeaway: data-quality bugs in the lookup tables and missing-data bugs in the input pipeline aren't independent failure modes. They multiply when an event-resolution layer collapses many input fields into a single matches set.
When debugging a resolver that suddenly attributes wrong, query both the link tables for stale or self-referential entries AND the recent event rows for unexpected empty fields. Fix only one and you will be back here in a week.