4.7 KiB
Codex final verification (RV14, 2026-10-12, audited f9094c8)
Parity remains incomplete at f9094c8: 0 P1, 1 P2, 5 P3 verified gaps. No files were modified; the worktree remains clean.
All four original RV13 reproductions are addressed, but two fixes retain broader differences:
| RV13 finding | Verification |
|---|---|
| Default update channel | Fixed. Both binaries default to tip; explicit-value tests pass. |
Ineffective async-backend |
Selection now reaches the I/O reactor. Epoll works; availability differs in the case below. |
| Windows sharing-violation diagnostic | Fixed: AccessDenied, matching Zig 0.15.2. Source and platform-independent tests checked. |
Windows 1:theme basename |
Fixed, but the replacement introduces newer-Zig semantics described below. |
Concrete remaining gaps:
-
P2 —
+show-faceaccepts oversized codepoints and can panic. show_face.rs:41 usesu32instead of Zig’su21. With--config-default-files=false --cp=4294967295, Rust panics in the Unicode lookup and exits 101; Ghostty reports an invalid value and exits 1. Differentially verified. -
P3 — Invalid UTF-8 in
+show-face --stringchanges validation behavior. show_face.rs:44 rejects it during option parsing. With--cp=65and a raw0xFFstring, Ghostty prints the codepoint result, thenerror.InvalidUtf8; Rust prints only an option diagnostic. Differentially verified. -
P3 —
+show-facediagnostics appear in a different order. show_face.rs:85 writes both streams directly to stdout. For--cp=65 --font-size=bad, Rust prints the diagnostic first; Zig’s separate buffers put the lookup first. Differentially verified. -
P3 — Windows basename fix follows the wrong Zig version. theme.rs:249 treats multibyte characters followed by
:as drive prefixes. Rust returnsthemeforλ:theme; Zig 0.15.2 returnsλ:theme, recognizing a colon only at byte index 1. This changes theme-name rejection, including names supplied throughlight:λ:theme,dark:λ:theme. Statically verified. -
P3 — Windows rooted theme paths are rejected. theme.rs:288 uses Rust’s
Path::is_absolute, which requires a Windows prefix. Zig accepts\themeand/themeas absolute; Rust instead rejects their separators. Verified against both standard-library implementations. -
P3 — io_uring availability is narrower than upstream. xev.rs:120 additionally requires
EXT_ARGand successful opcode probing. Upstream libxev accepts a successful ZigIoUring.init(256, 0). A supported ring withoutEXT_ARGtherefore selects io_uring upstream but falls back to epoll in Rust. Statically verified; that environment was not reproduced here.
The fresh breadth sweep screened 461 Zig files: 428 non-build and 33 build files, including counterparts, public functions, config consumers, incomplete paths, and build outputs. No wholly missing counterpart was established; this does not prove exhaustive behavioral equivalence.
Fresh validation:
- 2,799 distinct tests passed, four ignored; three fixture tests were blocked by the read-only filesystem.
- 1,000 terminal differential cases matched, without aborts. The documented 390k campaign was not rerun.
- 567 broad CLI/config comparisons: 555 exact matches; three build-mode differences, two known
list-colorsdifferences, seven diagnostic-order differences. - 594 additional config probes matched after normalizing the identified output ordering.
- All 138 C/WASM declarations have source counterparts; WASM smoke test passed.
- Saved captures recomputed to zero differing pixels for all three visual scenarios and all 36 sprite sheets. No fresh captures were made.
The previously documented benign +list-colors difference remains separate: Rust flushes all 15,434 bytes; Zig omits its final flush and emits 12,297. Genuine Zig memory bugs/UB were excluded.
Inherently unavailable natively here: Apple Metal/IOSurface/CoreText, Carbon/AppKit/UIKit, Mach exception handling, and Apple packaging; Windows ConPTY, process creation, native filesystem behavior, and exception handling. Swift remains excluded.
Other coverage limits: io_uring was denied in this sandbox; 20 integration cases skipped. Fresh compositor/GPU, portal/D-Bus, interactive GTK, builds, and cross-compilation were not run. Existing binaries were reused after their build-tree Rust/Cargo sources were compared with HEAD.