e2e: DM/invite lifecycle coverage — E2EE DMs, restart races, cooldown semantics (gaps exposed by #96/#97) #99
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
dark/nether-voicebridge#99
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The first real self-serve user surfaced two DM-path failures the 20-scenario suite never exercises (#96 wrong-address stranding, #97 restart-window double-processing → auto-decline). The suite covers the happy DM path (create/greet/commands, invite-gate rejects) but only with LOCAL, PLAINTEXT, steady-state DMs. Gaps, in priority order:
helpanswered →linkflow end-to-end.Suggested order: #97 fix + its unit tests first, then the offline-invite scenario (cheap — one process-start reordering), then the E2EE actor (the real investment).
#99 implemented on
feat/99-invite-dm-scenarios— live evidence (2026-07-12, staging, compressed profile)Suite 20 → 23. Runner: clippy
-D warningsclean,cargo test --workspace --lockedgreen (331 tests).1.
mgmt_dm_e2ee— PASS 11.5 s (first try, pre-alpha.25 bridge; 10.5 s re-run post-alpha.25)New crypto actor
MatrixCryptoDmClient(full matrix-sdk client, ephemeral server-minted device, in-memory stores, logout-on-teardown). Encrypted DM → bot auto-joins → greeting decryptable →helpround-trips through encryption both ways → transport proof: everym.room.messagecrossed the wire asm.room.encrypted(TimelineEventKind::DecryptedvsPlainTextdoubles as the wire check), traffic asserted both directions.2.
mgmt_invite_offline— shipped Pass, not KnownFail (deviation from the brief, evidence-driven)Pre-fix bridge,
mgmt_cooldown_secs = 60ARMED via the newstart_with_management_optsextra-limits seam (the standing harness block leaves it unset — exactly why 20 scenarios never reproduced #97a): unexpected_pass 21.4 s — exactly ONE accept, ZERO declines, bot stayed joined (verified in artifacts). The #97a trigger needs the seconds-long federated-join redelivery window; a same-server inviter (all the harness can mint) doesn't produce it. Re-classified per the runner's ownunexpected_passrecommendation; the scenario stays as the post-fix-contract regression guard. Federation limitation documented in the testing-design doc. Post-alpha.25: pass 19.7 s.3.
mgmt_dm_pending_reap— KnownFail{#97}, still failing post-alpha.25 (see #100 comment)Pre-fix: reap reproduced deterministically — the compressed #89b sweep reaped the fresh operator-
msgDM ~100 ms after creation, before the message could even be sent (403sender's membership \leave` is not `join``); room-id-correlated in artifacts. Post-alpha.25 (3 runs): still known_fail — two residual modes, detail + mechanism posted on #100.Bonus finding while building it: the SDK's
create_dmmints operator-msgDMs encrypted, so the reap-scenario target is a crypto client — coverage of themsgoutreach path is E2EE end-to-end.4. Regression (bridge_proc seam changes)
mgmt_self_serve_linkpass 61.4 s ·room_misconfig_noticepass 29.3 s.Branch is rebased onto master
1a769f9(alpha.25), runner-green. Awaiting the operator's merge word.Merged to master with the operator's word:
d2503b6(#99 squash — suite 20 → 23) +26605c9(nightly e2e identity fix: the workflow still masqueraded the deactivated pre-#96@nether-voicebridge_bot; both env blocks now usenether-voicebridge_e2e, so tomorrow's 06:00 nightly runs with the right identity).Remaining follow-up lives on #100:
mgmt_dm_pending_reapstaysKnownFail{#97}until the alpha.25 residuals (store-lag reap race + cold-DM first-message UTD) are fixed incrates/matrix-rtc— then flip toPassand re-run live. Closing this issue: all four #99 deliverables are on master with live evidence above.