Files
ghostty-rs/docs/rewrite/notes/review-rv14-codex.md
T

43 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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:
1. **P2 — `+show-face` accepts oversized codepoints and can panic.** [show_face.rs:41](../../../crates/ghostty-cli/src/show_face.rs:41) uses `u32` instead of Zig’s `u21`. 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.
2. **P3 — Invalid UTF-8 in `+show-face --string` changes validation behavior.** [show_face.rs:44](../../../crates/ghostty-cli/src/show_face.rs:44) rejects it during option parsing. With `--cp=65` and a raw `0xFF` string, Ghostty prints the codepoint result, then `error.InvalidUtf8`; Rust prints only an option diagnostic. Differentially verified.
3. **P3 — `+show-face` diagnostics appear in a different order.** [show_face.rs:85](../../../crates/ghostty-cli/src/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.
4. **P3 — Windows basename fix follows the wrong Zig version.** [theme.rs:249](../../../crates/ghostty-config/src/theme.rs:249) treats multibyte characters followed by `:` as drive prefixes. Rust returns `theme` for `λ:theme`; Zig **0.15.2** returns `λ:theme`, recognizing a colon only at byte index 1. This changes theme-name rejection, including names supplied through `light:λ:theme,dark:λ:theme`. Statically verified.
5. **P3 — Windows rooted theme paths are rejected.** [theme.rs:288](../../../crates/ghostty-config/src/theme.rs:288) uses Rust’s `Path::is_absolute`, which requires a Windows prefix. Zig accepts `\theme` and `/theme` as absolute; Rust instead rejects their separators. Verified against both standard-library implementations.
6. **P3 — io_uring availability is narrower than upstream.** [xev.rs:120](../../../crates/ghostty-os/src/xev.rs:120) additionally requires `EXT_ARG` and successful opcode probing. Upstream libxev accepts a successful Zig `IoUring.init(256, 0)`. A supported ring without `EXT_ARG` therefore 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-colors` differences, 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.