matrix-axon

Demo Coverage

A human-maintained tracker for one recurring failure mode: a capability that took a milestone to build never reaches a demo, so it is invisible twice — it does not appear in the videos anyone evaluating the project watches, and it is never exercised by the demo drivers that would notice it breaking.

This is the mitigation ADR 0086 names for the fact that the videos are regenerated by hand and can therefore go stale. It is review discipline, not an enforced check. If it proves leaky, the ADR’s cheapest escalation is a CI check that a PR touching a client render path also touches this table.

This doc is not auto-generated, and it is not docs/client-parity.md. Parity answers “does this client expose the capability at all?”; this answers “does a demo actually show it, and does a driver actually walk it?” A row can be Done in parity and not covered here.

How to maintain this

Legend: scene name = covered · n/a = the client has no such capability (see docs/client-parity.md) · not covered = the client has it and no demo shows it.

Coverage

Capability TUI (axon-demo-tui) Web desktop Web mobile
Room list, with names and topics rooms rooms rooms
Incoming invite inbox (Accept/Reject) n/a not covered — demo corpus joins invitees through the appservice, so there is no standing-invite scene not covered
Room list sort (ADR 0042) rooms rooms not covered
Room list filter: all / DMs / groups rooms rooms not covered
Live room-name filter (Alt-/) rooms rooms not covered
DM title derived from the other member rooms rooms rooms
Timeline text, sender names, day separators timeline timeline timeline
Formatted (HTML) messages with links timeline timeline timeline
Bundled URL preview text/image cards (MSC4095) n/a not covered — demo corpus has no bundled preview metadata not covered
Reactions (seeded badges render) timeline timeline send
React to a message, then withdraw it react send not covered
Custom reaction images (MSC4027) not covered not covered not covered
Standalone sticker selection and sending not covered not covered not covered
Custom emoji packs and /react completion not covered not covered not covered
Reaction badge updating live from another user’s react not covered not covered not covered
Replies timeline timeline send
Edits (m.replace, applied in place) threads threads not covered
Redactions ([redacted] tombstone) threads threads not covered
In-timeline find (Ctrl-F, n/N) threads n/a n/a
Threads: open panel, read replies threads threads threads
Inline images (Sixel / Kitty / iTerm2) media n/a n/a
Attachment card previews and downloads n/a not covered — no recorded attachment-preview scene not covered
Full-size image preview media media media
Image galleries (adjacency grouping, ADR 0081) n/a media media
Lightbox paging across a gallery run n/a media media
Upright thumbnail of an EXIF-rotated photo not covered not covered — no corpus photo carries an orientation tag or a sender thumbnail not covered
Full-text search across rooms (Tantivy) search search search
Search field filters (room:, all:true) search search search
Search hit as a deep link into a room not covered search search
Jump to a date in history jump not covered not covered
Sending a message send send send
Deleting one’s own message not covered send send
Shortcuts and help popups shortcuts shortcuts n/a
Spaces: picker, filtering, hierarchy (ADR 0084) not covered spaces rooms
Single-pane navigation and Back (ADR 0062) n/a n/a rooms
Room information panel not covered rooms timeline
User information panel n/a not covered — no demo scene opens a timeline sender not covered
Unread thread picker (Alt-T) not covered not covered not covered
Search result sort / group / edit toggles not covered not covered not covered
Sending media not covered not covered not covered
Message actions: edit, redact, reply not covered not covered not covered
Room actions: invite, leave, pin (M19) not covered not covered not covered
Room settings: name, topic, avatar (M19-W6, ADR 0100) n/a not covered not covered
Device verification (SAS) not covered not covered — web UI exists; corpus has no second device not covered
Megolm key backup snapshot and enable (ADR 0098) not covered not covered — /accounts is not a demo scene not covered
Matrix OAuth QR account acquisition n/a not covered — demo stack has no MAS or second trusted device not covered
Matrix OAuth QR device authorization n/a not covered — demo stack has no MAS or second client to authorize not covered
Matrix OAuth browser sign-in n/a not covered — demo stack has no MAS, and the approval happens on its page not covered
Native Sign in with Apple (iOS shell, ADR 0054) n/a not covered — the web recordings run in a browser, not the iOS shell not covered
Typing indicators and read receipts (M18) not covered not covered not covered
Inline image whose terminal encode failed (placeholder) not covered n/a n/a
Debug overlay diagnostics (display.debug) not covered n/a n/a
Room list loading state during startup not covered not covered not covered
State-event notices (ADR 0083) not covered not covered not covered

Why the uncovered rows are uncovered

Findings the demo scenes pinned

Things that are true of the clients, discovered by scripting them, and which a scene now depends on:

TUI

Web

The web custom emoji picker is covered by clients/web/e2e/custom-emoji-picker.spec.ts, including personal and room packs, image previews, sends, withdrawals, and mobile safe-area and keyboard viewport containment in both room and thread pickers. A recorded demo scene for pack selection remains outstanding; the existing react scene continues to demonstrate Unicode reactions.

Standalone sticker selection is covered by clients/web/e2e/stickers.spec.ts, including personal and room packs, room/thread sends, draft preservation, original image rendering, keyboard dismissal, and narrow viewport containment. It is not yet shown in the recorded demo.

Standalone sticker shortcodes and discovery-error Unicode fallback are covered by clients/web/e2e/sticker-shortcodes.spec.ts in room and thread composers; the recorded demo does not yet show this path.

Case-insensitive sticker matching and shortcode autocomplete are covered in clients/web/e2e/sticker-shortcodes.spec.ts; no recorded demo scene covers them yet.

Bundled link images are covered by clients/web/e2e/link-preview-images.spec.ts in room and thread/caption timelines, with plain and encrypted descriptors, authenticated downloads, stable loading geometry, text/error fallback, transient-failure retry/reconnect, large plain-source thumbnails, and hostile URL/encrypted-dimension rejection. Run the chromium and webkit-iphone projects for desktop and phone geometry evidence. The recorded demo remains uncovered because the corpus has no bundled-preview events; image cards do not imply preview authoring, automatic generation, or native sharing support.

Attachment card layout and activation are covered by clients/web/e2e/attachment-cards.spec.ts in room and thread timelines on desktop Chromium and iPhone/WebKit. The checks cover full-width caption geometry, top-right 44-pixel download targets, on-demand preview dialogs, keyboard dismissal/focus restoration, independent caption links/downloads/spoilers, desktop text selection without message actions, and swipe/hold arbitration for file, audio, video, and PDF cards. Viewer download errors remaining visible on the card after close have component-test coverage; native image/gallery taps with double-tap disabled are covered by clients/web/e2e/message-gestures.spec.ts on iPhone/WebKit. The existing media recording still demonstrates image galleries; a recorded audio/text/PDF/video attachment-card scene remains outstanding.