CultNet: refuse hop edges whose citer is a variant; withdraw a refused hop subscription

An edge carries the reference payload of its citer's resolved document, and the
citer is never a selected row under `cited`, so a variant citer slipped past the
selected-row refusal. Edges are now checked by the same rule (typed
NotSupportedException naming the variant), on the paged and the whole-set paths.

Reconcile refused a hop subscriber whose selection selected a variant without
withdrawing it, so it was told again on every store change. It withdraws as the
subscribe path does.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-29 09:20:48 +02:00
commit a0baa542d0
3 changed files with 113 additions and 13 deletions

View file

@ -358,8 +358,10 @@ namespace GameCult.Networking
}
catch (NotSupportedException refusal)
{
// Q6: the selection selects a variant, which CultNet cannot carry. This subscriber is told, by key, and keeps what
// it was delivered; a change never throws out of the change handler.
// Q6: the selection selects a variant, which CultNet cannot carry. Refused as the subscribe path refuses it: the
// subscription is withdrawn, so the peer is told once, not once per store change; a change never throws out of
// the change handler.
Withdraw(key, sendRemovals: false, forgetRequest: true);
key.Peer.SendCultNet(new CultNetErrorMessage { Error = refusal.Message });
return;
}