I don't really understand why this test failed: there is no obvious log line with a failure:
❌ TestSpoofedEventSenderHandling/rust/SpoofedMXIDSenderGivesRedShield (2.73s)
client.go:860: [CSAPI] POST hs1/_matrix/client/v3/register => 200 OK (15.172058ms)
client.go:860: [CSAPI] POST hs1/_matrix/client/v3/register => 200 OK (11.24619ms)
client.go:860: [CSAPI] POST hs1/_matrix/client/v3/register => 200 OK (10.613909ms)
rust.go:87: NewRustClient[@user-89-alice:hs1][YPYQFODVUF] creating...
rust.go:148: NewRustClient[@user-89-alice:hs1] created client storage=./rust_storage/user-89-alice_hs1_YPYQFODVUF
room_keys_test.go:531: [@user-89-alice:hs1](rust) Login {BaseURL:http://127.0.0.1:32817/ UserID:@user-89-alice:hs1 Password:complement-crypto-password SlidingSyncURL: DeviceID:YPYQFODVUF PersistentStorage:false ExtraOpts:map[] AccessToken:}
rust.go:87: NewRustClient[@user-90-bob:hs1][AYDFXHYIFK] creating...
rust.go:148: NewRustClient[@user-90-bob:hs1] created client storage=./rust_storage/user-90-bob_hs1_AYDFXHYIFK
room_keys_test.go:531: [@user-90-bob:hs1](rust) Login {BaseURL:http://127.0.0.1:32817/ UserID:@user-90-bob:hs1 Password:complement-crypto-password SlidingSyncURL: DeviceID:AYDFXHYIFK PersistentStorage:false ExtraOpts:map[] AccessToken:}
rust.go:87: NewRustClient[@user-91-charlie:hs1][MIAJAXLKBT] creating...
rust.go:148: NewRustClient[@user-91-charlie:hs1] created client storage=./rust_storage/user-91-charlie_hs1_MIAJAXLKBT
room_keys_test.go:531: [@user-91-charlie:hs1](rust) Login {BaseURL:http://127.0.0.1:32817/ UserID:@user-91-charlie:hs1 Password:complement-crypto-password SlidingSyncURL: DeviceID:MIAJAXLKBT PersistentStorage:false ExtraOpts:map[] AccessToken:}
room_keys_test.go:531: [@user-89-alice:hs1](rust) StartSyncing starting to sync
room_keys_test.go:531: [@user-89-alice:hs1](rust) StartSyncing now syncing
room_keys_test.go:531: [@user-90-bob:hs1](rust) StartSyncing starting to sync
room_keys_test.go:531: [@user-90-bob:hs1](rust) StartSyncing now syncing
room_keys_test.go:531: [@user-91-charlie:hs1](rust) StartSyncing starting to sync
room_keys_test.go:531: [@user-91-charlie:hs1](rust) StartSyncing now syncing
client.go:860: [CSAPI] POST hs1/_matrix/client/v3/createRoom => 200 OK (211.99461ms)
client.go:860: [CSAPI] POST hs1/_matrix/client/v3/join/!MUKojreNJDMTDSbdlK:hs1 => 200 OK (46.649715ms)
client.go:860: [CSAPI] POST hs1/_matrix/client/v3/join/!MUKojreNJDMTDSbdlK:hs1 => 200 OK (58.787069ms)
room_keys_test.go:540: [@user-89-alice:hs1](rust) WaitUntilEventInRoom !MUKojreNJDMTDSbdlK:hs1
room_keys_test.go:540: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1]
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=1
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: <nil>
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$KPiaaLS1ZSuDn3KBadCtBIaC4KDO6PfALcVIM_dZrQ4 Text: Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$JvxIwnJBLovagbeQ5bzCvTc5hENc_k4bBOidiZ-vsn0 Text: Sender:@user-89-alice:hs1 Target:@user-90-bob:hs1 Membership:invite FailedToDecrypt:false}
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$_XLTcFNHs9w8pNmvMDD8gH7B5LvkGrToBNF4tgIg1sA Text: Sender:@user-89-alice:hs1 Target:@user-91-charlie:hs1 Membership:invite FailedToDecrypt:false}
room_keys_test.go:540: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] set up
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=2
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$1Hrx_TjnzJbVodlfVUrXtBPOETuE7VIKU8QGdXr1lx0 Text: Sender:@user-90-bob:hs1 Target:@user-90-bob:hs1 Membership:join FailedToDecrypt:false}
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: <nil>
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=1
rust.go:941: @user-89-alice:hs1: Wait[!MUKojreNJDMTDSbdlK:hs1]: event exists in the timeline
room_keys_test.go:544: [@user-90-bob:hs1](rust) WaitUntilEventInRoom !MUKojreNJDMTDSbdlK:hs1
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$-RtnSom3YSiJzCC1JzPJNuH9TUQW6NIa25BIzE-MJDQ Text: Sender:@user-91-charlie:hs1 Target:@user-91-charlie:hs1 Membership:join FailedToDecrypt:false}
room_keys_test.go:544: [@user-90-bob:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1]
rust.go:813: [@user-90-bob:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=1
rust.go:881: [@user-90-bob:hs1]TimelineDiff change: <nil>
rust.go:881: [@user-90-bob:hs1]TimelineDiff change: &{ID:$1Hrx_TjnzJbVodlfVUrXtBPOETuE7VIKU8QGdXr1lx0 Text: Sender:@user-90-bob:hs1 Target:@user-90-bob:hs1 Membership:join FailedToDecrypt:false}
rust.go:881: [@user-90-bob:hs1]TimelineDiff change: <nil>
rust.go:881: [@user-90-bob:hs1]TimelineDiff change: &{ID:$-RtnSom3YSiJzCC1JzPJNuH9TUQW6NIa25BIzE-MJDQ Text: Sender:@user-91-charlie:hs1 Target:@user-91-charlie:hs1 Membership:join FailedToDecrypt:false}
room_keys_test.go:544: [@user-90-bob:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] set up
room_keys_test.go:545: [@user-91-charlie:hs1](rust) WaitUntilEventInRoom !MUKojreNJDMTDSbdlK:hs1
room_keys_test.go:545: [@user-91-charlie:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1]
rust.go:813: [@user-91-charlie:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=1
rust.go:881: [@user-91-charlie:hs1]TimelineDiff change: <nil>
rust.go:881: [@user-91-charlie:hs1]TimelineDiff change: &{ID:$-RtnSom3YSiJzCC1JzPJNuH9TUQW6NIa25BIzE-MJDQ Text: Sender:@user-91-charlie:hs1 Target:@user-91-charlie:hs1 Membership:join FailedToDecrypt:false}
room_keys_test.go:545: [@user-91-charlie:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] set up
room_keys_test.go:546: [@user-89-alice:hs1](rust) SendMessage !MUKojreNJDMTDSbdlK:hs1 => Test Message
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=1
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID: Text:Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=1
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$C-GEK69Glnx4FXedYAsDFoxpzBqE0nBbeR3Zt424WLg Text:Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
room_keys_test.go:546: [@user-89-alice:hs1](rust) SendMessage !MUKojreNJDMTDSbdlK:hs1 => $C-GEK69Glnx4FXedYAsDFoxpzBqE0nBbeR3Zt424WLg %!s(<nil>)
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=2
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$C-GEK69Glnx4FXedYAsDFoxpzBqE0nBbeR3Zt424WLg Text:Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=2
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$C-GEK69Glnx4FXedYAsDFoxpzBqE0nBbeR3Zt424WLg Text:Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
rust.go:813: [@user-90-bob:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=1
rust.go:941: @user-90-bob:hs1: Wait[!MUKojreNJDMTDSbdlK:hs1]: event exists in the timeline
rust.go:881: [@user-90-bob:hs1]TimelineDiff change: &{ID:$C-GEK69Glnx4FXedYAsDFoxpzBqE0nBbeR3Zt424WLg Text:Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
rust.go:813: [@user-91-charlie:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=2
rust.go:941: @user-91-charlie:hs1: Wait[!MUKojreNJDMTDSbdlK:hs1]: event exists in the timeline
room_keys_test.go:557: [@user-90-bob:hs1](rust) CurrentAccessToken => syt_dXNlci05MC1ib2I_UIDLWAVsoNtLfpjxiXRV_0zFels
client.go:60: lockOptions: {"options":{"callback":{"callback_response_url":"http://host.docker.internal:41887/response","filter":" ~u .*/sync.* ~hq syt_dXNlci05MC1ib2I_UIDLWAVsoNtLfpjxiXRV_0zFels"}}}
rust.go:881: [@user-91-charlie:hs1]TimelineDiff change: &{ID:$C-GEK69Glnx4FXedYAsDFoxpzBqE0nBbeR3Zt424WLg Text:Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
rust.go:881: [@user-91-charlie:hs1]TimelineDiff change: <nil>
callback_addon.go:90: CallbackServer[TestSpoofedEventSenderHandling/rust/SpoofedMXIDSenderGivesRedShield]user-90-bob: 2026-06-22 22:21:15.724101604 +0000 UTC m=+341.874906002 POST http://hs1:8008/_matrix/client/v3/keys/upload (token=syt_dXNlci05MC1ib2I_UIDLWAVsoNtLfpjxiXRV_0zFels) req_len=258 => HTTP 200
room_keys_test.go:639: Unknown sync endpoint: http://hs1:8008/_matrix/client/v3/keys/upload
room_keys_test.go:560: [@user-91-charlie:hs1](rust) WaitUntilEventInRoom !MUKojreNJDMTDSbdlK:hs1
callback_addon.go:90: CallbackServer[TestSpoofedEventSenderHandling/rust/SpoofedMXIDSenderGivesRedShield]user-91-charlie: 2026-06-22 22:21:15.725644554 +0000 UTC m=+341.876448960 POST http://hs1:8008/_matrix/client/v3/keys/upload (token=syt_dXNlci05MS1jaGFybGll_YQMzqpwjewkuNXxSDFTt_30AJJZ) req_len=262 => HTTP 200
room_keys_test.go:639: Unknown sync endpoint: http://hs1:8008/_matrix/client/v3/keys/upload
room_keys_test.go:561: [@user-89-alice:hs1](rust) SendMessage !MUKojreNJDMTDSbdlK:hs1 => Another Test Message
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=1
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID: Text:Another Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
callback_addon.go:90: CallbackServer[TestSpoofedEventSenderHandling/rust/SpoofedMXIDSenderGivesRedShield]user-90-bob: 2026-06-22 22:21:15.777968682 +0000 UTC m=+341.928773075 POST http://hs1:8008/_matrix/client/unstable/org.matrix.simplified_msc3575/sync?pos=0%2Fs519_111_4_1_27_1_59_361_0_1&timeout=30000 (token=syt_dXNlci05MC1ib2I_UIDLWAVsoNtLfpjxiXRV_0zFels) req_len=115 => HTTP 200
{"respond_body":{"pos":"0/s520_111_4_1_27_1_59_361_0_1","rooms":{},"extensions":{"to_device":{"next_batch":"59","events":[]},"e2ee":{"device_one_time_keys_count":{"signed_curve25519":51},"device_unused_fallback_key_types":["signed_curve25519"],"device_lists":{"changed":[],"left":[]}}}}}
callback_addon.go:90: CallbackServer[TestSpoofedEventSenderHandling/rust/SpoofedMXIDSenderGivesRedShield]user-90-bob: 2026-06-22 22:21:15.792139773 +0000 UTC m=+341.942944176 POST http://hs1:8008/_matrix/client/unstable/org.matrix.simplified_msc3575/sync?pos=50%2Fs519_111_4_1_27_1_59_361_0_1&timeout=30000 (token=syt_dXNlci05MC1ib2I_UIDLWAVsoNtLfpjxiXRV_0zFels) req_len=742 => HTTP 200
room_keys_test.go:613: Rewriting event $Poz4xX_OUPtpEEuNjIeFc9ZT4SFuObDjU7IYBUJ3w-Q from @user-89-alice:hs1 to have sender of @user-91-charlie:hs1
{"respond_body":{"pos":"50/s520_111_4_1_27_1_59_361_0_1","lists":{"all_rooms":{"count":1,"ops":[{"op":"SYNC","range":[0,0],"room_ids":["!MUKojreNJDMTDSbdlK:hs1"]}]}},"rooms":{"!MUKojreNJDMTDSbdlK:hs1":{"notification_count":0,"highlight_count":0,"bump_stamp":520,"timeline":[{"type":"m.room.encrypted","sender":"@user-91-charlie:hs1","content":{"algorithm":"m.megolm.v1.aes-sha2","ciphertext":"AwgBEtABAUA4ihlwPf+1NIbZBB9ruwvEfKFqKD6dg16xve3pfHxHEytVzE0gC1Hbgxuu7qZXYSGkrGh7K6oZHrp9gskrUWeY74pkTSnur11SFWvj011cA/H/Vrs2LqpKRmPBgIbPq6by+dnWaD+hBP2/vkW1UltzJvQNlvn0bqyn1SQkbOcIZLJsaBfQoXxLWLWV4uOkOb2aemckPdol5VLxYNNI+OyF8XAcpGopNmchV3aFAzK6zGBpAQV0tne4yvzZIbNLf8FbtS7vRxTwTpgzttI/wr/n1mz9pci2I913Nl0S2VSkUm9U/InYheHAZ9fz4CvMjgOPygNCnSsnZK3RetWa7+MzaLxaTUZMnXGGSwvKa/TRBMTg4n5rDA","device_id":"YPYQFODVUF","sender_key":"/NTSoUnd5bF2VihyGalGPwYhVP6UV+eXnh+2SsmQi2k","session_id":"gaJ88kfn+aQVexbXYlfP3etTEzF9XZNSgdZsgmL9YeY"},"origin_server_ts":1782166875762,"unsigned":{"membership":"join","age":13},"event_id":"$Poz4xX_OUPtpEEu
NjIeFc9ZT4SFuObDjU7IYBUJ3w-Q"}],"limited":false,"prev_batch":"s519_111_4_1_27_1_59_361_0_1","num_live":1}},"extensions":{"account_data":{"global":[],"rooms":{}},"receipts":{"rooms":{}},"typing":{"rooms":{}}}}}
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=1
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$Poz4xX_OUPtpEEuNjIeFc9ZT4SFuObDjU7IYBUJ3w-Q Text:Another Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
room_keys_test.go:561: [@user-89-alice:hs1](rust) SendMessage !MUKojreNJDMTDSbdlK:hs1 => $Poz4xX_OUPtpEEuNjIeFc9ZT4SFuObDjU7IYBUJ3w-Q %!s(<nil>)
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=2
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$Poz4xX_OUPtpEEuNjIeFc9ZT4SFuObDjU7IYBUJ3w-Q Text:Another Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
rust.go:813: [@user-91-charlie:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=2
rust.go:941: @user-91-charlie:hs1: Wait[!MUKojreNJDMTDSbdlK:hs1]: event exists in the timeline
rust.go:881: [@user-91-charlie:hs1]TimelineDiff change: &{ID:$C-GEK69Glnx4FXedYAsDFoxpzBqE0nBbeR3Zt424WLg Text:Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
rust.go:881: [@user-91-charlie:hs1]TimelineDiff change: &{ID:$Poz4xX_OUPtpEEuNjIeFc9ZT4SFuObDjU7IYBUJ3w-Q Text:Another Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
rust.go:813: [@user-89-alice:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=2
rust.go:881: [@user-89-alice:hs1]TimelineDiff change: &{ID:$Poz4xX_OUPtpEEuNjIeFc9ZT4SFuObDjU7IYBUJ3w-Q Text:Another Test Message Sender:@user-89-alice:hs1 Target: Membership: FailedToDecrypt:false}
rust.go:813: [@user-90-bob:hs1]AddTimelineListener[!MUKojreNJDMTDSbdlK:hs1] TimelineDiff len=2
rust.go:881: [@user-90-bob:hs1]TimelineDiff change: &{ID:$-RtnSom3YSiJzCC1JzPJNuH9TUQW6NIa25BIzE-MJDQ Text: Sender:@user-91-charlie:hs1 Target:@user-91-charlie:hs1 Membership:join FailedToDecrypt:false}
rust.go:881: [@user-90-bob:hs1]TimelineDiff change: &{ID:$Poz4xX_OUPtpEEuNjIeFc9ZT4SFuObDjU7IYBUJ3w-Q Text:Another Test Message Sender:@user-91-charlie:hs1 Target: Membership: FailedToDecrypt:false}
client.go:85: unlockOptions
rust.go:522: @user-91-charlie:hs1: Stopping sync service
rust.go:522: @user-90-bob:hs1: Stopping sync service
rust.go:522: @user-89-alice:hs1: Stopping sync service
room_keys_test.go:531: [@user-91-charlie:hs1](rust) Close
room_keys_test.go:531: [@user-90-bob:hs1](rust) Close
I don't really understand why this test failed: there is no obvious log line with a failure:
https://github.com/matrix-org/complement-crypto/actions/runs/27986954546/job/82830614316