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

7.0 KiB
Raw Blame History

Codex targeted re-audit (RV4, 2026-10-12)

Audited 86d0d3830f9a, read-only. Statuses include concrete regressions in the repaired paths. “Resolved” means the previous gap is closed with no remaining defect identified in this targeted check.

Rust locations below abbreviate crates/ghostty-<crate>/src/ as <crate>/.

Previous Zig row Status now What remains
Surface.zig still partial Flatpak cwd still reaches D-Bus as encoded text rather than original bytes: os/flatpak.rs:363. Screen-file creation now preserves temporary-directory bytes, but its returned filename remains lossy: core/surface/binding.rs:444. Windows field/import fixes are present.
global.zig resolved —
os/file.zig resolved —
renderer/shadertoy.zig still partial Overload selection and directly indexed uniform reads are fixed. Whole-array loads/copies remain unadapted: the patch changes the uniform member’s wrapper type but only rewrites .member.inner[index] accesses: renderer/shadertoy.rs:449, 461.
main_ghostty.zig resolved —
cli/args.zig still partial Unix byte handling is fixed. The non-Unix OS-string encoder does not escape literal U+FDD0, although decoding interprets it as an escape. For example, U+FDD0 followed by U+00FF does not round-trip through the Windows config-argument path: os/osbytes.rs:103, os/args.rs:66.
config/Config.zig still partial CLI loading/path expansion is fixed, but default-template creation passes encoded paths directly to create_dir_all and write. A non-UTF-8 HOME/XDG path therefore creates the template at the wrong pathname: config/config.rs:3945.
main_c.zig resolved —
config/CApi.zig resolved —
apprt/embedded.zig resolved —
apprt/gtk/class/surface.zig still partial File-drop bytes are preserved, but confirmation now decodes every paste as encoded text, including ordinary UTF-8 passed unencoded by paste(). Confirming text containing U+FDD0 followed by U+00FF changes it to byte FF: apprt-gtk/class/surface.rs:2625, 2692.
os/env.zig resolved —
os/homedir.zig resolved —
os/path.zig resolved —
os/passwd.zig resolved —
os/resourcesdir.zig still partial Discovery preserves bytes, but consumers still use encoded resource strings directly: child GHOSTTY_RESOURCES_DIR, terminfo lookup/export, and gettext directory binding: termio/exec.rs:794, 814, os/i18n.rs:45.
config/path.zig still partial Canonicalization preserves bytes, but custom-shader loading still constructs Path::new from the encoded string. A symlink resolving to a non-UTF-8 shader filename still fails: renderer/shadertoy.rs:127.
cli/validate_config.zig resolved —
cli/list_themes.zig still partial Listing/loading preserves bytes, but preview hyperlinks percent-encode the escape representation instead of the original pathname: cli/list_themes.rs:79.
lib/allocator.zig still partial The OSC storage object itself remains globally allocated through Box::new, and parser payload copies still allocate global Vecs. Caller allocator control is incomplete: vt-capi/osc.rs:75, vt/osc/mod.rs:566.
terminal/c/osc.zig still partial Payload storage and returned title use the C allocator, but ghostty_osc_end first constructs globally allocated command payload copies. Caller limits/failure behavior do not govern those allocations: vt-capi/osc.rs:134, vt/osc/mod.rs:566.
os/i18n.zig resolved —
crash/sentry.zig still partial Darwin still discards signal/machine context and writes an event without native capture: crash/signal.rs:217. New Linux code also accesses nonexistent AArch64 mcontext_t.fpregs, a compilation regression: crash/minidump.rs:97.
build_config.zig resolved —
termio/Exec.zig resolved —
termio/stream_handler.zig resolved —
apprt/gtk/class/window.zig resolved —
os/cgroup.zig resolved —
benchmark/Benchmark.zig resolved —
terminal/kitty/graphics_image.zig resolved —
tripwire.zig still partial Named injection, hit counts, and trip verification now exist. The associated selection-string map allocation-failure injection/test remains absent; its explicit skip remains: terminal/screen/tests/p5.rs:688.
Previous artifact/distribution row Status now What remains
build/GhosttyWebdata.zig — three MDX outputs resolved —
build/GhosttyXCFramework.zig / build/GhosttyLib.zig — universal library/XCFramework resolved —
build/GhosttyLib.zig — native library/header installation resolved —
build/GhosttyLibVt.zig — native VT distribution still partial Installation permits an unversioned SONAME when patchelf is absent, despite installing versioned filenames. The build still emits libghostty-vt.so: vt-capi/build.rs:6; optional correction: scripts/install-lib.sh:48.
build/GhosttyResources.zig — Linux desktop/D-Bus identity resolved —
build/GhosttyI18n.zig — extraction/POT/PO merging resolved —
build/GhosttyDist.zig — versioned source distribution resolved —
build/GhosttyExe.zig — Windows executable resources resolved —
Scope Resolved Still partial Still missing Total
Source rows 19 12 0 31
Artifact/distribution rows 7 1 0 8
Overall 26 13 0 39

The byte codec itself round-trips bytes and leaves valid UTF-8 without U+FDD0 unchanged. 30 selected tests passed using existing binaries: 6 byte-codec, 19 in-memory shader, and 5 tripwire tests. Packaging was inspected statically; scripts passed syntax checks, and all three Windows resource files match Zig’s copies. No files were modified; the working tree remains clean.