Skip to content

Latest commit

 

History

History
497 lines (408 loc) · 33.2 KB

File metadata and controls

497 lines (408 loc) · 33.2 KB

v0.3.0 Cross-Platform Regression Matrix

This document defines the manual / scripted regression matrix used to validate the eframe + egui 0.28 → 0.34.2 upgrade path for v0.3.0 across all supported platforms. Task 58 covered the 0.28 → 0.31.1 jump; Task 89 added the 0.31 → 0.34.2 delta (see §8 below). Migration notes: eframe-egui-031-upgrade.md, eframe-egui-034-upgrade.md.

Scope: Only test cases that are materially affected by an egui 0.31 API change, a Wayland/X11/macOS winit pipeline change, or a known platform-specific subsystem (borderless window, portals, IME). Generic regression coverage of unchanged subsystems lives in v0.2.8-manual-test-suite.md. Run this matrix after the v0.2.8 suite, not as a replacement.


1. How to read the matrix

  • Test IDs are stable (LAU-1, IME-3, …) so a v0.3.1 run can reuse the same IDs and diff results.
  • Each test case lists the egui 0.31 API change or platform subsystem it exercises — that is the reason the test exists. Drop a test only when the underlying API change is also dropped.
  • Cells use:
    • — passed
    • — failed (link to issue in the Issues Found table at the bottom)
    • ⚠️ — passed with caveats (note required)
    • — not applicable on this platform
    • blank — not yet executed
  • "macOS-AS" = Apple Silicon, "macOS-Intel" = x86_64. Both must be tested because Intel hit a separate idle-repaint regression in v0.2.x (intel-mac-cpu-issue-analysis.md) and the egui 0.31 bump touches the same render pipeline.

2. Target platforms & build setup

Platform OS / WM Build command Smoke command
Win11 Windows 11 (any edition, x64) cargo build --release target\release\ferrite.exe
macOS-AS macOS 14 Sonoma, Apple Silicon cargo build --release then cargo bundle --release (macos-app-bundle-ci.md) open target/release/bundle/osx/Ferrite.app
macOS-Intel macOS 14 Sonoma, x86_64 same as above on Intel runner same
Linux-X11 Ubuntu 24.04 (GNOME on Xorg) and a tiling WM (Sway/Hyprland) for portal coverage cargo build --release ./target/release/ferrite
Linux-Wayland Ubuntu 24.04 (GNOME/Mutter Wayland) without the v0.2.x WAYLAND_DISPLAY= workaround same ./target/release/ferrite

Pre-flight on every platform:

  1. Run cargo build --release and verify the build completes with zero errors.
  2. Run cargo test — must report 0 failed. (v0.3.0 baseline: 1487 passed.)
  3. Verify the egui crate version: cargo tree -i egui — confirm 0.34.2 (v0.3.0 ships 0.34, not 0.31).
  4. Rust: rustc --version1.92.x (rust-toolchain.toml).
  5. On Linux, check the desktop's portal stack (linux-portal-dialogs.md): pgrep -a xdg-desktop-portal should list the matching backend (xdg-desktop-portal-gnome / -kde / -wlr / -hyprland).

3. Test categories

Each section maps test cases to the egui 0.31 risk surface listed in eframe-egui-031-upgrade.md. The matrix table at the end of each section is the execution log.

3.1 Launch & lifecycle

Validates eframe::App::update plumbing and the per-theme Visuals slot fix (0.31's biggest behavioural change for us — see Per-theme Visuals slots in the upgrade doc).

ID Test case Why it matters Steps
LAU-1 Cold start with empty session Generic boot path Delete .ferrite/session.json, launch, app shows Welcome page within 3s
LAU-2 First-frame theme correct (System) set_visuals_of per-theme slot fix in theme/manager.rs::apply Set OS theme to Light, set Ferrite theme to System, restart — every panel must be light on the first frame (no half-themed UI)
LAU-3 Toggling System ↔ Light ↔ Dark per-theme slot fix Settings → Appearance → cycle theme three times, no panel stays in the wrong palette
LAU-4 Single-instance forwarding OS-level IPC (single-instance.md) Launch app, then open a .md from file manager — opens as a tab in the existing window
LAU-5 Session restore (5 tabs) eframe storage path Open 5 tabs, quit, relaunch — tabs and active tab restored within 5s
LAU-6 Crash recovery dialog Lock-file flow Kill process, relaunch — recovery dialog offers to restore unsaved buffers
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
LAU-1
LAU-2
LAU-3
LAU-4
LAU-5
LAU-6

3.2 File loading

ID Test case Why it matters Steps
FILE-1 Open small .md (< 100 KB) Synchronous load path Open README.md, renders in raw view immediately
FILE-2 Open large file (> 5 MB) — background load Tab.tab_content Loading→Ready transitions, polled in update() (egui frame loop) Open a 10 MB+ file, progress bar visible, UI stays at 60fps, content correct after
FILE-3 Open 100K+ line file Uniform-height path, line cache Open big file, scroll top→bottom — smooth, no stutter, line numbers correct
FILE-4 Multi-encoding open chardetng, unchanged by egui upgrade but must keep working Open Shift-JIS, Latin-1 files — characters render correctly
FILE-5 Per file type viewers All viewers go through the same update() loop Open one of each: .csv, .json, .yaml, .toml, .pdf, .png — each opens in its viewer tab without panics
FILE-6 Cancel large load Background thread cleanup Open 10 MB+ file, close tab while loading — no crash, no leaked thread (verify in task manager / top)
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
FILE-1
FILE-2
FILE-3
FILE-4 ⚠️
FILE-5
FILE-6

3.3 Keyboard input & shortcuts

The winit input pipeline was rewritten between 0.29 (egui 0.28) and 0.31 (egui 0.31). This is the single biggest reason for the upgrade — fixes #106 (Wayland) and #111 (macOS Sonoma).

ID Test case Why it matters Steps
KBD-1 Type ASCII Baseline input Open empty buffer, type "the quick brown fox" — characters appear
KBD-2 Modifier combos winit modifier reporting Test Ctrl/Cmd+A, +C, +V, +X, +Z, +Y, +S, +F
KBD-3 Alt + key (Win/Linux) / Option + key (macOS) Modifier mapping Alt+Up/Down moves a line (move-line.md)
KBD-4 Shift + arrow selection Modifier + key event combination Place cursor mid-line, Shift+End selects to end
KBD-5 Ctrl/Cmd+F find Find panel (find-replace.md) Find "fox", Enter cycles matches, Esc closes panel
KBD-6 Ctrl+Shift+P / Alt+Space command palette Custom shortcut + Win11 system-menu suppression Palette opens; on Win11, Alt+Space must NOT open the OS system menu
KBD-7 Ctrl+P quick switcher Workspace shortcut Opens the quick switcher; finds files in collapsed folders once the background index has run; mouse hover works
KBD-8 Ubuntu Wayland: typing works without WAYLAND_DISPLAY= The whole reason for the egui 0.31 upgrade (#106) Launch ferrite from a normal Wayland session, click in the editor, type — keys must register
KBD-9 macOS Sonoma: typing works #111 Launch on macOS 14, click editor, type — keys must register
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
KBD-1
KBD-2
KBD-3
KBD-4
KBD-5
KBD-6
KBD-7
KBD-8
KBD-9

3.4 IME / complex text

The Memory::layer_transforms API change (now a method, not a field) directly affects how IMEOutput is reported to the OS — see windows-ime-layer-transform.md. HarfRust shaping is unchanged by the bump but lives in the same render path as the new 0.31 painter API.

ID Test case Why it matters Steps
IME-1 Japanese IME candidate box layer_transforms change (#15, #103) Switch to Japanese IME (MS-IME / Kotoeri / mozc), type nihongo → 日本語 — candidate box appears at the cursor, NOT at screen origin
IME-2 Chinese IME (Pinyin) Same Switch to Pinyin IME, type nihao → 你好 — candidate box anchored to cursor
IME-3 Korean IME composition Same Switch to Korean IME, type gks → 한 — composition shows in-place
IME-4 Arabic shaping HarfRust contextual forms Paste an Arabic sentence — letters connect (initial/medial/final forms)
IME-5 Bengali conjuncts HarfRust cluster grouping Paste Bengali text — conjuncts render as single clusters
IME-6 Devanagari shaping HarfRust Paste Hindi text — base + matra render correctly
IME-7 Hebrew text HarfRust + RTL display Paste Hebrew text — characters in correct visual order
IME-8 Grapheme-cluster cursor Independent of egui upgrade but lives next to it Place cursor before an emoji ZWJ sequence (👨‍👩‍👧), arrow-right steps over the whole sequence in one keystroke; Backspace deletes the whole cluster
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
IME-1
IME-2
IME-3
IME-4
IME-5 ⚠️
IME-6
IME-7
IME-8

3.5 Terminal

painter.rect_stroke and painter.rect gained a required StrokeKind argument in 0.31. The terminal widget and split-pane drop zones use these heavily.

ID Test case Why it matters Steps
TRM-1 Open integrated terminal PTY + VTE + new painter signatures Toggle terminal panel, prompt visible
TRM-2 Type and run a command Input pipeline through egui echo hello returns hello
TRM-3 CJK output width unicode-width, painter API (terminal-cjk-wide-chars.md) echo 你好世界 — characters render at double width, no overlap
TRM-4 Drop zone overlay (left/right/top/bottom/center) All five overlays draw via painter.rect_stroke(StrokeKind::Inside) Drag a terminal tab over another pane — each of the five drop zones must render its preview rectangle without panicking
TRM-5 Split layout horizontal Split painter Cmd: split horizontal, both panes accept input
TRM-6 Split layout vertical Split painter Cmd: split vertical, both panes accept input
TRM-7 Theme switch with terminal open ANSI color recompute Switch theme while terminal visible — colors update immediately
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
TRM-1
TRM-2
TRM-3
TRM-4
TRM-5
TRM-6
TRM-7

3.6 File dialogs

rfd is unchanged by the egui upgrade, but the dialog spawn path crosses the winit event loop, which was rewritten. Smoke-test on every supported WM/DE.

ID Test case Why it matters Steps
DLG-1 Open file dialog Native dialog round-trip File → Open, pick a .md, opens as tab
DLG-2 Save As dialog Native dialog with filter File → Save As, write .md filename, file written on disk
DLG-3 Open folder (workspace) Folder picker File → Open Folder → pick a directory, file tree appears
DLG-4 Cancel dialog No spurious error toast Open dialog, press Esc — no error message
DLG-5 GNOME (Wayland) portal xdg-desktop-portal-gnome Run on Ubuntu 24.04 GNOME Wayland, DLG-1..4 must work
DLG-6 KDE Plasma portal xdg-desktop-portal-kde Run on KDE Wayland, DLG-1..4 must work
DLG-7 Sway / wlroots portal xdg-desktop-portal-wlr (linux-portal-dialogs.md) Run on Sway, DLG-1..4 must work
DLG-8 Hyprland portal xdg-desktop-portal-hyprland Run on Hyprland, DLG-1..4 must work
DLG-9 Cinnamon (X11) xapp/gtk portal (linux-cinnamon-dialogs.md) Run on Linux Mint Cinnamon — no unnecessary portal fallback, cancellation produces no error
DLG-10 Flatpak portal path flatpak-file-dialog-portal.md If a Flatpak build is available, DLG-1..4 must work inside the sandbox
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
DLG-1
DLG-2
DLG-3
DLG-4
DLG-5
DLG-6
DLG-7
DLG-8
DLG-9
DLG-10

3.7 Borderless title bar & window resize

Heavy users of with_layer_id (deprecated in 0.31) and the new painter signatures. Fully borderless mode is Windows-specific (windows-borderless-window.md) but the title bar code path runs everywhere.

ID Test case Why it matters Steps
WIN-1 Drag window by title bar Drag-region detection in app/title_bar.rs Click + drag empty title bar area — window moves
WIN-2 Double-click title bar maximises Standard OS behaviour through eframe Double-click — toggles maximise
WIN-3 Resize from north edge (top) Position-aware resize, button-area exclusion Hover top edge outside the button cluster — cursor changes, drag resizes
WIN-4 Resize from north-east corner Button-margin geometry fix Hover NE corner — resize cursor (not Close button) — drag resizes
WIN-5 Resize from all 8 edges/corners All winit resize hit-tests Try each of 4 edges + 4 corners, each resizes
WIN-6 F10 fullscreen toggle ToggleFullscreen shortcut Press F10 — borderless fullscreen on, F10 again — restored
WIN-7 F11 zen mode App-level chrome hiding Press F11 — chrome hides, F11 again — restored
WIN-8 Borderless on Intel GPU DWM with_transparent(true) workaround (windows-borderless-transparent-fix.md) On a Win11 machine with Intel GPU — no black bars, no rendering offset
WIN-9 Linux: window drag works (no stuck pointer) Linux cursor flicker fix (linux-cursor-flicker-fix.md) Drag window on Linux — pointer doesn't stick to title bar after release
WIN-10 macOS: traffic lights present Native macOS title bar Window has standard close/min/max buttons, drag works
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
WIN-1
WIN-2
WIN-3
WIN-4
WIN-5
WIN-6
WIN-7
WIN-8
WIN-9
WIN-10

3.8 Mermaid diagrams

Every diagram renderer was touched by the painter API change (rect_stroke gained StrokeKind, Frame::roundingcorner_radius). Each renderer needs a dedicated smoke test because they live in separate modules.

ID Test case Module Steps
MMD-1 Flowchart (LR/TD/BT/RL) mermaid/flowchart/render/{nodes,edges,subgraphs}.rs Open test_md/test_flowcharts.md, all four directions render
MMD-2 Sequence diagram mermaid/sequence.rs Render a sequence diagram with loop/alt/opt blocks — boxes drawn, no panic
MMD-3 Class diagram mermaid/class_diagram.rs Render with relationships — classes and arrows visible
MMD-4 ER diagram mermaid/er_diagram.rs Render with attributes — entities and crow's-foot notation visible
MMD-5 Mindmap mermaid/mindmap.rs Render a 3-level mindmap — branches drawn
MMD-6 Journey mermaid/journey.rs Render with multiple sections — score circles drawn
MMD-7 Timeline mermaid/timeline.rs Render with events — axis and event boxes drawn
MMD-8 State diagram mermaid/state.rs Render with composite states — boundaries drawn
MMD-9 Gantt / Pie / Quadrant misc Render one of each, no panic, no garbled rectangles
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
MMD-1
MMD-2
MMD-3
MMD-4
MMD-5
MMD-6
MMD-7
MMD-8
MMD-9

3.9 Custom fonts

FontDefinitions::font_data now requires Arc<FontData> — every font insertion path was edited.

ID Test case Why it matters Steps
FNT-1 Default font (Inter) loads Arc::new(FontData::from_static(..)) path App launches, editor uses Inter
FNT-2 CJK fallback loads Lazy CJK insertion (font-system.md) Open a file with Chinese text — characters render (not tofu)
FNT-3 Complex script lazy load 11 font families Open Bengali file — Bengali font loaded on demand
FNT-4 Custom font picker System font enumeration (custom-font-selection.md) Settings → Appearance → Font, pick a system font, applied
FNT-5 Bad font crash prevention Magic-byte validation (custom-font-crash-prevention.md) Pick a .ttc collection or corrupt font — falls back to Inter with toast, no panic
FNT-6 Custom mode before pick Deferred load until combo selection (custom-font-selection.md), GitHub #133 Settings → Font → Custom: opening picker / first frame — no “Font failed…” toast; choose a font → loads
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
FNT-1
FNT-2
FNT-3
FNT-4
FNT-5
FNT-6

3.10 Theme switching

Direct exercise of the per-theme Visuals slot fix in theme/manager.rs.

ID Test case Why it matters Steps
THM-1 Light theme — every panel readable Light visuals slot Switch to Light, open Settings / Outline / Backlinks / Productivity panels — all panels show light backgrounds and readable text
THM-2 Dark theme — every panel readable Dark visuals slot Switch to Dark, repeat THM-1
THM-3 System theme follows OS ThemePreference::System + both slots populated OS in Light → app light. Change OS to Dark while app open → app dark within one frame, no half-themed flash
THM-4 First frame correct after restart The exact bug fix Quit on dark, restart on dark — first painted frame is dark, never light flash
THM-5 Syntax highlighting theme follows Theme cascade Switch between Light/Dark — code blocks use the matching syntect theme
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
THM-1
THM-2
THM-3
THM-4
THM-5

3.11 Editable markdown tables — empty cells

Validates clickable hit targets on empty table cells (EditableTable display mode in widgets.rs; issue #131; Task 84).

ID Test case Why it matters Steps
TBLE-1 Click empty cell after Add column Zero-size galley formerly broke click dispatch Rendered-only or split view: toolbar Add column, click each new empty header/body cell → TextEdit focus + caret → type → click outside table → source shows new | columns
TBLE-2 Click empty cell after Add row Same for new rows Add row; click empties across the row; type; blur table → new | lines in source
TBLE-3 Tab through consecutive empty cells pending_focus + buffer per (row,col) From a populated cell, Tab across several empties → each opens edit mode with an empty buffer; verify text lands only in the active cell
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
TBLE-1
TBLE-2
TBLE-3

3.12 Rendered edit session (RS-1…RS-7)

Validates the consolidated RenderedEditSession coordinator after the v0.3.x WYSIWYG refactor (tasks 96–105). Replaces fragmented per-widget focus/defer logic.

Architecture doc: rendered-edit-session.md
Table session integration: rendered-edit-session-tables.md (TBLE-1…3 expectations under session unchanged — §3.11)

ID Test case Why it matters Steps
RS-1 Heading → heading one-click switch Core session switch_to_ui; fixes double-click regression Doc: # Alpha, # Beta. Edit Alpha. Single-click Beta.
RS-2 Heading cursor stability Stable source_epoch widget ids (no per-keystroke remap) Click mid-word in heading; type 3+ s; caret stays put
RS-3 Formatted block exit to display formatted_editing cleared on dismiss/switch Bold list item: click → edit → click outside → styled display (not raw **)
RS-4 Formatted → formatted switch Cross-formatted switch_to_ui Two formatted items; edit first; single-click second
RS-5 Table cell → heading signal_table_force_commit on session leave Table + heading in same doc; edit cell; single-click heading; table in source
RS-6 Split raw → rendered sync source_epoch bump invalidates session Split view: edit raw left; rendered right shows update; re-open block loads new text
RS-7 Rendered commit does not bump epoch Widget id stability during rendered session Trace log: edit heading, switch away — source_epoch unchanged
ID Expected result
RS-1 Beta focused; Alpha persisted; one click only
RS-2 No cursor flash/disappear while typing
RS-3 Styled display restored; not stuck in edit mode
RS-4 Second item edit; first saved; one click
RS-5 Table committed; heading focused
RS-6 Rendered content matches raw after epoch bump
RS-7 source_epoch constant across rendered edit + commit
ID Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
RS-1
RS-2
RS-3
RS-4
RS-5
RS-6
RS-7

4. Already verified on Windows 11 (Task 57)

The following items were validated as part of the egui 0.31 upgrade itself (eframe-egui-031-upgrade.md §Validation) and do not need to be re-run for the matrix on Windows 11. They still need to be executed on macOS and Linux:

  • cargo build (default features), cargo check --no-default-features, cargo check --features async-workers, --features lsp, --all-features — all clean.
  • cargo test — 1407 passed, 0 failed, 3 ignored.
  • HarfRust shaping tests: 24/24 pass (covers IME-4, IME-5 baseline).
  • THM-4 (first-frame theme): the per-theme set_visuals_of fix has been applied and verified visually on Win11.

Windows 11 manual pass (2026-05-18): All matrix rows ticked except IME-1..3 (deferred to JP/CN/KR testers) and platform-specific rows (WIN-8 Intel GPU, Linux/macOS). FILE-4 ⚠️ (UTF-16LE). Outstanding for v0.3.0 ship: KBD-8 (Linux Wayland), KBD-9 (macOS Sonoma), and full matrix on macOS/Linux.


5. Execution log

Update this section as each platform is exercised.

Platform Tester Date Build SHA Pass / Fail / Skipped Link to result
Win10 (Win11 proxy) OlaProeis 2026-05-09 uncommitted (pre-fix) LAU-1..4 / KBD-1..7 / WIN-1..7 / DLG-1..4 / THM-1..5 / MMD-1..9 / FILE-1,5 / FNT-1..4 / IME-4/6/7 = ✅. WIN-5 = ⚠️ (I-1). TRM-3 = ⚠️ (I-2). FNT-3 / IME-5 / IME-8 (mixed-script paste) = ❌ → I-3 (S1). I-3 fix proposed in src/app/input_handling.rs::is_url + 6 regression tests; verification blocked by 2 unrelated WIP build errors (see I-3 notes). LAU-5/6, FILE-2/3/4/6, IME-1/2/3, FNT-5 still pending (need user-supplied test files / IMEs / corrupt fonts). this doc
Win10 (Win11 proxy) OlaProeis 2026-05-09 uncommitted (post-fix; build errors A/B were already resolved on disk by user) I-3 verified fixed live: the full 6-line mixed-script paste block (Hebrew / Bengali / Hindi / Arabic / CJK / emoji-ZWJ) pasted into an editor tab as a single block — no crash, process did not abort. Unit tests: 5/5 green (is_url ×3 + is_image_url ×2 in src/app/input_handling.rs). Matrix delta: IME-8 ⚠️→✅. FNT-3 unchanged (already ✅; the I-3 crash never lived in the font path). IME-5 left at ⚠️ (no-crash confirmed but isolated Bengali shaping not visually verified this run). I-1 / I-2 unchanged (S3, non-blockers). Pending on this box: LAU-5/6, FILE-2/3/4/6, IME-1/2/3, FNT-5 (still need user-supplied artefacts). this doc
Win11 (Win10 proxy) OlaProeis 2026-05-18 local dev Full Windows matrix pass except IME-1..3 (external testers). New ✅: LAU-5/6, FILE-2/3/6 (incl. 500k lines), FNT-5/6, TBLE-1..3. FILE-4 ⚠️ (UTF-16LE → I-4). WIN-5 ✅ after I-1 fix (window.rs margin + consume_clicks_in_resize_zones, status_bar.rs). Prior ✅ retained: LAU-1..4, KBD-1..7, DLG-1..4, THM-1..5, MMD-1..9, TRM-1/2/4..7, WIN-1..4/6/7, IME-4/6/7/8, FNT-1..4. Still ⚠️: TRM-3 (I-2), IME-5. Deferred: IME-1..3, WIN-8 (no Intel iGPU), all macOS/Linux. this doc
Win11
macOS-AS
macOS-Intel
Linux-X11 (GNOME Xorg)
Linux-X11 (Sway/Hyprland)
Linux-Wayland (GNOME)
Linux-Wayland (KDE)

6. Issues found

Issue # Test ID Platform Severity Blocker for v0.3.0? Notes
I-1 WIN-5 Win11 (Win10 proxy) S3 No — fixed 2026-05-18 Status-bar Help (?) overlapped the bottom-right resize grab zone; resize release could open About. Fix: consume_clicks_in_resize_zones + WindowResizeState::blocks_widget_clicks() in window.rs. WIN-5 ✅ on 2026-05-18 pass; shipped in CHANGELOG.md § 0.3.0 Fixed.
I-2 TRM-3 Win10 (proxy for Win11) S3 No — fixed CJK input on the prompt line showed ???? while shell output rendered correctly (Windows console code-page). Resolved with UTF-8 active on the shell session; TRM-3 ✅ on Windows pass. Shipped in CHANGELOG.md § 0.3.0 Fixed.
I-3 Smart-paste of mixed-script text Win11 (Win10 proxy) S1 No — fixed is_url in src/app/input_handling.rs used byte slicing past : that could split a UTF-8 codepoint → panic / abort on paste like Hebrew: שלום. Fix: s.get(colon_pos..colon_pos + 3) == Some("://"). Regression tests in input_handling.rs. Live-verified 2026-05-09; still ✅ on 2026-05-18 Windows pass.
I-4 FILE-4 Win11 S3 No UTF-16LE files rejected at open: is_binary_content treats null bytes as binary before BOM/encoding detection runs (state.rs). Shift-JIS and Latin-1 OK. UTF-16LE is listed in COMMON_ENCODINGS for save but not open. Follow-up: skip binary check when BOM indicates UTF-16, or detect UTF-16 before null-byte heuristic.

Severity legend: S1 = crash / data loss, S2 = feature broken, S3 = visual glitch, S4 = cosmetic.

A v0.3.0 release is gated on:

  1. Zero S1 issues open on any platform.
  2. Zero S2 issues on Win11 / macOS-AS / Linux-Wayland (GNOME).
  3. KBD-8 and KBD-9 must be — they are the user-visible reason for the upgrade.

Open issues should be filed in GitHub and linked back here under "Notes".


7. Scripted helpers

For now the matrix is manual. Candidates for scripting in a follow-up:

  • A small cargo xtask regression-smoke that runs cargo build + cargo test + opens a known set of fixture files and screenshots the result.
  • CI workflow gate: extend .github/workflows/ so a v0.3.0 release tag cannot publish without a green run on Win11, macOS, and Ubuntu (X11 and Wayland) runners.

8. egui 0.34 delta (Task 89 — v0.3.0)

Run sections 3–6 first, then these checks for the 0.31 → 0.34.2 bump. See eframe-egui-034-upgrade.md.

ID Test case Why (89.x) Steps Win11 macOS-AS macOS-Intel Linux-X11 Linux-Wayland
VRT-1 Borderless resize + modal overlay viewport_rect (89.3) Resize all edges; open Settings + About; overlays cover full window ✅ manual
VRT-2 Side panel scroll (no edge fade) ScrollArea fade off (89.3) File tree / outline / search — no gradient fade at scroll edges ✅ manual
POP-1 Status bar recent-files popup Popup API (89.4) Open recent-files menu; click outside dismisses; pick file closes ✅ manual
POP-2 CSV cell tooltip Tooltip::always_open (89.4) Truncated CSV cell hover shows full text at pointer ✅ manual
FNT-1 Latin + monospace editor skrifa backend (89.5) Type in raw editor; line height stable ✅ manual
FNT-2 Arabic / Bengali sample lines HarfRust + skrifa (89.6) test_md/test_complex_scripts.md; cursor + selection ✅ manual
FNT-3 Rendered click-to-cursor Galley char index (89.5) Wrapped markdown block — click mid-line ✅ manual
THR-1 Single-instance wake Mutex + repaint (89.7) Second instance with file path — tab opens, no hang ✅ manual
THR-2 Code block Run RunHandle (89.7) Run fenced Python/shell; Stop; no UI freeze ✅ manual
THR-3 Terminal + editor scroll Screen lock (89.7) Heavy terminal output while scrolling editor ✅ manual

Windows manual pass (2026-05): 89.3–89.7 smoke on Win11 dev machine — all rows ✅.

Additional v0.3.0 release gates for the 0.34 stack:

Gate Criterion Status
G-034-1 cargo test 0 failures on MSRV 1.92
G-034-2 CI green (.github/workflows/ci.yml) Pending first run
G-034-3 No new S1/S2 from 0.34 upgrade ✅ (Windows)