10 KiB
Codex final verification (RV6, 2026-10-12)
Verified 847a16f65c88, read-only. 12 of 13 RV5 rows are resolved; crash handling remains partial. All 10 previous sweep findings are resolved. Six additional gap groups remain.
“Resolved” below refers to the reported defect, not complete parity of the entire module. Paths abbreviate crates/ghostty-<crate>/src/ as <crate>/.
| RV5 row | Status | Current-code verification |
|---|---|---|
Surface.zig |
Resolved | Screen-file copy/paste preserve pathname bytes. os::open accepts &OsStr; regex links encode plain text, while OSC8 links retain raw bytes. binding.rs:630, open.rs:33 |
renderer/shadertoy.zig |
Resolved | Plain-array reconstruction preserves padded uniform layout and whole-array use. shadertoy.rs:265 |
cli/args.zig |
Resolved | Windows conversions use WTF-8/WTF-16 and preserve lone surrogates; literal escape characters round-trip. osbytes.rs:74 |
config/Config.zig |
Resolved | Template creation decodes paths; substitution uses original bytes. config.rs:3953 |
apprt/gtk/class/surface.zig |
Resolved | Confirmation decodes only explicitly encoded byte pastes. surface.rs:2680 |
os/resourcesdir.zig |
Resolved | Windows resource exports decode through to_os(); TERMINFO uses an OS pathname. exec_windows.rs:604 |
config/path.zig |
Resolved | Custom-shader paths become decoded PathBufs before loading. generic.rs:248 |
cli/list_themes.zig |
Resolved | Hyperlinks percent-encode decoded pathname bytes. list_themes.rs:74 |
lib/allocator.zig |
Resolved | Color records use parser auxiliary storage backed by the caller’s allocator. X11 lookup no longer allocates. color.rs:85 |
terminal/c/osc.zig |
Resolved | C parser supplies caller-allocated auxiliary storage; growth and allocation refusal are handled there. osc.rs:82 |
crash/sentry.zig |
Partial | Suspension is now balanced before returning; SIGABRT handoff exists. Remaining defects detailed below. |
tripwire.zig |
Resolved | CopyMap failure injection and cleanup/recovery are implemented. screen.rs:2619 |
build/GhosttyLibVt.zig |
Resolved | Linker emits the versioned SONAME. Existing ELF reports libghostty-vt.so.0. build.rs:23 |
The remaining crash gap group has two concrete defects:
- SIGABRT receive failures are treated as success.
request_abort_dumpignores the timedmach_msgreceive result and unconditionally returnstrue, suppressing the signal-path fallback even on timeout/error. mach_handler.rs:464, signal.rs:257. - SIGABRT’s signal-number subcode is discarded from the minidump context.
from_signalsupplies it, butExceptionInfo.subcoderetains subcodes only forEXC_BAD_ACCESS, excludingEXC_SOFTWARE/EXC_SOFT_SIGNAL. The event retains the signal; the minidump exception information does not. mach_handler.rs:511.
| Previous sweep finding | Status | Verified boundary |
|---|---|---|
| 1. GUI Open Config | Resolved | Decoded candidates and file creation: config/edit.rs:24 |
| 2. Background image | Resolved | Decode before loading: renderer/generic.rs:863 |
| 3. Crash directory | Resolved | XDG path decoded: crash/dir.rs:24 |
| 4. SSH cache directory | Resolved | XDG path decoded: cli/ssh_cache/disk_cache.rs:62 |
| 5. Executable directory / child PATH | Resolved | Native OS strings on Unix and Windows: termio/exec.rs:1193, exec_windows.rs:866 |
| 6. Fontconfig filenames | Resolved | Raw filename passed to face loader: font/deferred_face.rs:75 |
| 7. Relative links / OSC8 | Resolved | Cwd decoded from bytes; OSC8 URI stays bytes: core/surface/mouse.rs:406, mouse.rs:1617 |
| 8. Kitty temporary directory | Resolved | Raw OsString and byte comparisons: terminal/kitty/graphics_image.rs:568 |
9. macOS .hushlogin |
Resolved | Passwd home decoded before lookup: termio/exec.rs:1445 |
| 10. Benchmark C arguments | Resolved | Raw argument splitting and PathBuf data paths: lib/benchmark.rs:65 |
The new sweep found six additional concrete gap groups:
-
Default
SHELLloses OS-string fidelity.std::env::var("SHELL")rejects non-UTF-8 paths/lone surrogates. Valid text containing literal U+FDD0 is stored without encoding and subsequently decoded as encoded command text, potentially changing executable bytes. Zig retains the environment bytes. config/config.rs:4621. -
macOS executable search mishandles
PATH. A non-UTF-8PATHis discarded in favor of the default search path. A literal U+FDD0 sequence in valid UTF-8PATHcan also be wrongly decoded when constructing candidates. termio/command.rs:298. -
Windows config environment overrides are not decoded.
RepeatableStringMapcontains encoded strings, but Windows inserts keys and values directly intoEnvMap. Literal U+FDD0 and encoded surrogate values therefore reach the child incorrectly. The Unix implementation decodes both. termio/exec_windows.rs:690. -
Windows environment-key comparison can overwrite a different variable. Lossy conversion makes distinct lone-surrogate keys compare equal;
insertthen replaces the existing key’s value. ASCII-only uppercasing also misses Windows’ non-ASCII case equivalences. This affects storage, not merely display. os/env.rs:31, env.rs:44. -
+show-configdoes not round-trip escaped OS data. Path formatting emitsas_encoded(), and stdout writes that UTF-8 unchanged. Reloading encodes the escape characters again. For example, an original pathname byteFFbecomes literal U+FDD0/U+00FF after export and reload. config/path.rs:213, cli/show_config.rs:64, config/cli_args.rs:811. -
Non-Apple C API initialization still lacks locale setup.
ghostty_init → global::init_libreaches the no-opensure_locale; it never performs Zig’ssetlocaleand fallback behavior. The standalone GTK executable compensates separately, but the C API does not. os/locale.rs:34, lib/main_c.rs:127.
Other inspected stub markers were implemented elsewhere, unsupported cases shared with Zig, or upstream TODOs—including the unimplemented dynamic/special-color operations.
Verdict: in-scope parity remains partial.
| Count | Result |
|---|---|
| RV5 rows resolved / partial | 12 / 1 |
| Previous sweep groups resolved / partial | 10 / 0 |
| New OS-data/encoding gap groups | 5 |
| New functional-stub gap groups | 1 |
| Total remaining verified gap groups, including crash | 7 |
| Selected existing-binary tests passed / failed | 47 / 0 |
No rebuild or native macOS/Windows/WASM execution was performed. Findings are source-verified; passing tests cover selected behavior, not exhaustive parity. No files changed; working tree remains clean.