PQC213 — Blanket ignore hides unresolved device addresses¶
A route ignores every event of a type that is also routed by address.
When a route matches an event type but no Thing carries the address the event names, the framework records that address as unresolved and publishes pq.event.device.unresolved on the owner. That record is the only thing standing between a commissioning engineer and a silent topology mismatch: it names the Thing type and the address, so "panel has 100 zones, PQ has 80" becomes twenty legible diagnostics instead of nothing at all.
A route that ignores everything of that type suppresses those events before the diagnostic can happen.
// reported
route.WithAddress<ZoneDevice, int>(e => e.ZoneId).Handle((zone, evt) => zone.Alarm(evt.Timestamp));
route.When(_ => true).Ignore("nothing else here is interesting");
// ^^^^^^^^^ zone 85 exists on the panel, not in PQ — and now nobody finds out
Why the build refuses this¶
The failure it hides is a configuration failure, not a code failure. It appears at commissioning, at a customer site, in an installation nobody who wrote the adapter has seen. Static review never catches it; the diagnostic is how it gets caught.
A blanket ignore outlives its reason. It is usually written to silence one noisy event kind. Every event added to the stream afterwards — including ones that matter — is silenced too, and nothing announces it.
How to fix it¶
Name what you are suppressing. Every Ignore in the adapters that pass this rule states its subject in the predicate:
route.When(e => e.Kind is GxyEventId.DeactivatedTooSoon or GxyEventId.FrFobDeleted)
.Ignore("suppressed non-auditable history event");
An event kind you did not enumerate falls through to the normal path, where an unmatched event is visible and an unresolved address is diagnosable.
If the address-less events really are a different thing, give them a different type. Panel-level and system-wide events that never carry a zone belong on their own event type, routed by their own routes. Then a fallback for that type is address-less by construction and this rule has nothing to say about it.
What is not reported¶
A predicate that names its events. Anything narrower than always-true is left alone — that is the compliant shape.
An always-true route on a type with no address-bound routes at all. Nothing to hide: no route resolves a Thing by address, so no unresolved-address diagnostic exists to suppress.
An always-true route that does not ignore. AfterDispatch, Unhandled, SkipReplayed and MapGroup do not suppress the event.
Why there is no handler in the violation example¶
A handler cannot be registered without an address: every Handle overload lives on a route that has already bound an address, a person, or a credential. The framework makes the address-less handler unrepresentable, so a blanket Ignore is the one way left to swallow an address-bearing event.
If you disagree with a report¶
Do not suppress it. A wrong report is a bug in the check — report it with the code that triggered it.