12 KiB
Codex (gpt-6-astra) completeness audit (2026-10-12)
The rewrite is not yet complete. The static audit accounts for 354 in-scope Zig files: 319 full, 28 partial, 7 missing. Another 107 files fall under the requested exclusions.
“Full” means the in-scope functionality has a corresponding implementation; it does not certify identical behavior under every input. I checked implementation code against the architecture and port notes. No files were modified, and no builds or tests were run.
References below use Z = ghostty/src, and R/crate = ghostty-rs/crates/ghostty-<crate>/src. Grouped rows count each named Zig file separately.
Partial and missing source files
| Zig file:line | Corresponding Rust module:line | Status | Verified gap | Importance |
|---|---|---|---|---|
termio/Exec.zig:1226; os/flatpak.zig:154,225 |
R/termio/exec.rs:211,1088; R/os/flatpak.rs:206 |
Partial ×2 | Starting the Flatpak exit watcher consumes the command object. Closing the surface subsequently cannot send the upstream SIGHUP to the host process group; Rust explicitly logs that the watcher took the handle. | High |
apprt/gtk/class/surface.zig:1563,1592,1615 |
R/apprt-gtk/class/surface.rs:966 |
Partial | filterSnapPaths is absent: Snap variables and Snap-prefixed path components are not removed before launching children. Additionally, std::env::vars() cannot preserve arbitrary Linux environment bytes and panics on non-UTF-8 entries; Zig uses a byte-preserving environment map. |
Medium |
main_ghostty.zig:26 → global.zig:99 |
Root src/main.rs:17 |
Partial | Startup collects std::env::args() into strings, panicking on non-UTF-8 arguments before dispatch. Upstream argument processing accepts byte strings. The Rust OS argument helper correctly uses args_os(), but this entrypoint bypasses it. |
Medium |
os/uri.zig:21 |
R/os/uri.rs:71,90 |
Partial | Percent-decoding uses String::from_utf8_lossy, changing non-UTF-8 filename bytes into replacement characters. This reaches OSC 7 working-directory handling through R/termio/stream_handler.rs:988. |
Medium |
input/Binding.zig:1921 |
R/input/binding/mod.rs:500 |
Partial | Full Unicode case-folding is replaced by single-character lowercase conversion plus three special cases. Other case-fold equivalences and multi-codepoint folds are missing from keybinding comparison/hashing. | Medium |
terminal/StringMap.zig:55 |
R/terminal/string_map.rs:54 |
Partial | Upstream sets a whole-search regex retry limit. Rust sets only a per-match retry limit, losing the aggregate search-work bound. | Medium |
renderer/shadertoy.zig:161 |
R/renderer/shadertoy.rs:201,252 |
Partial | glslang compilation is replaced by Naga’s narrower GLSL frontend. The adapter rewrites the supplied iChannel0 declaration, but not arbitrary combined-sampler types—for example, a user helper taking a sampler2D parameter. Those shaders lack the upstream compilation path. |
Medium |
apprt/gtk/winproto/wayland.zig:150,200 |
R/apprt-gtk/winproto/wayland.rs:531 |
Partial | Registry-global additions/removals after initialization are ignored. Upstream binds newly advertised supported globals and clears removed ones. Rust’s registry event handler is empty. | Low |
terminal/osc/parsers/osc9.zig:16,205 |
R/vt/osc/parsers/osc9.rs:13; R/vt/osc/mod.rs:432 |
Partial | Rust applies the NUL-reservation capacity check before identifying the command. It therefore rejects full-buffer ConEmu control commands that upstream accepts without appending a NUL. | Low |
cli/list_themes.zig:306,522,683,1011 |
R/cli/list_themes/preview.rs:228,824,1183 |
Partial | Interactive preview omits OSC 8 hyperlinks, terminal color-scheme query/update handling, and distinct double/dotted/dashed/curly underline previews. | Low |
build_config.zig:17,21,24 |
R/cli/build_info.rs:50; root src/main.rs:86 |
Partial | Build metadata is not derived from the actual build: version defaults to 1.3.1, commit is absent, channel is always stable, and build-mode/backend descriptions are fixed approximations. |
Low |
apprt/gtk/gtk_version.zig:14; apprt/gtk/adw_version.zig:15 |
R/apprt-gtk/gtk_version.rs:12; adw_version.rs:6 |
Partial ×2 | Compile-time library versions are hardcoded to GTK 4.14.0/libadwaita 1.5.0 instead of being obtained from the build headers. Runtime version queries are implemented. | Low |
apprt/gtk/class/application.zig:1247 |
R/apprt-gtk/css.rs:40 |
Partial | CSS error logging omits the offending source bytes available through the upstream GTK ≥4.16 diagnostic branch; location and error text remain. | Low |
apprt/gtk/class/dialog.zig:21,39 |
R/apprt-gtk/class/dialog.rs:22 |
Partial | Older-libadwaita MessageDialog presentation/closing fallback is absent; only AlertDialog remains. |
Low |
apprt/gtk/class/clipboard_confirmation_dialog.zig:17,301 |
R/apprt-gtk/class/clipboard_confirmation_dialog.rs:35 |
Partial | Older template/capability branch without SwitchRow is absent; the 1.4 template is selected unconditionally. |
Low |
apprt/gtk/class/debug_warning.zig:14,42 |
R/apprt-gtk/class/debug_warning.rs:11 |
Partial | Pre-Banner gtk.Box/1.2-template fallback is absent. |
Low |
apprt/gtk/class/surface_child_exited.zig:15,211 |
R/apprt-gtk/class/surface_child_exited.rs |
Partial | Pre-Banner compatibility implementation is absent. | Low |
apprt/gtk/class/window.zig:1762,1780 |
R/apprt-gtk/class/window.rs:1630 |
Partial | Older-library GTK about-dialog fallback is absent. These five compatibility omissions accompany Rust’s explicit GTK 4.14/libadwaita 1.5 minimum. | Low |
benchmark/CodepointWidth.zig:107,133 |
R/bench/benches.rs:297 |
Partial | wcwidth mode logs a warning and exits without benchmarking libc. SIMD/table modes also share the same lookup implementation rather than measuring separate implementations. |
Low |
benchmark/IsSymbol.zig:93,128 |
R/bench/benches.rs:383 |
Partial | uucode and table modes use the same table backend; the independent uucode comparison is missing. |
Low |
helpgen.zig:75,121,140 |
R/config/macros.rs; R/cli/ghostty.rs:122; R/input/binding/action.rs:1229 |
Partial | Configuration help is derived from Rust field documentation. CLI help and keybinding-action help instead use checked-in text/manual tables; the corresponding source-documentation generators are absent. | Low |
crash/main.zig:8,16 |
R/cli/crash_report.rs |
Partial | Report-directory/listing functionality exists; crash initialization, teardown, and envelope integration do not. | Low |
crash/sentry.zig:50,81,172,259 |
— | Missing | Crash-handler initialization, thread/surface metadata enrichment, crash filtering, and writing local .ghosttycrash reports are absent. |
Low¹ |
crash/sentry_envelope.zig:38,221,331,377 |
— | Missing | Envelope parsing/serialization, item decoding, and attachment encoding/decoding are absent. | Low¹ |
Surface.zig:6355; global.zig:146,189; renderer/Thread.zig:218; termio/Thread.zig:247 |
R/core/surface/*; R/core/global.rs; R/renderer/thread.rs; R/termio/thread.rs |
Partial ×4 | Their normal functionality is implemented, but crash-context construction, initialization/teardown, and thread-context hooks are omitted. termio/Exec.zig:1260 also loses its read-thread crash context, in addition to its Flatpak gap above. |
Low¹ |
extra/bash.zig:19,33; extra/zsh.zig:12,26; extra/fish.zig:12,26 |
— | Missing ×3 | Shell-completion generators and their generated/installable completion files are absent. | Medium |
extra/vim.zig:5,6,16,42,60 |
— | Missing | Vim/Neovim syntax, file detection, filetype plugin, and compiler integration are absent. | Low |
extra/sublime.zig:35,50 |
— | Missing | Generated Sublime syntax and the same syntax installed for bat are absent. | Low |
¹ Sentry is optional and disabled by default on Linux upstream, explicitly documented in Z/build/Config.zig:158. These omissions do not remove crash collection from the default Linux build.
Assets, documentation, and installation
These findings are separate from the source-file counts; requested generation/install behavior is included even where its Zig implementation lives under excluded src/build.
| Item | Status | Verified result / missing functionality | Importance |
|---|---|---|---|
| Man pages and generated documentation | Missing | The Rust build/install path does not produce or install ghostty.1 or ghostty.5. There is no counterpart to Z/build/mdgen/main_ghostty_1.zig:4, main_ghostty_5.zig:4, or mdgen.zig:21,51,86. Upstream Z/build/GhosttyDocs.zig:18 also generates Markdown/HTML; those generation/install steps are absent. Rust’s install recipe contains none of these outputs. |
Medium |
| Translations | Missing | Upstream’s 29 .po catalogs and translation template are absent. No equivalent of Z/build/GhosttyI18n.zig:24 compiles and installs .mo files. Rust gettext lookup exists, but its standalone installation supplies no translated catalogs. |
Medium |
| Shell completions | Missing | No bash/zsh/fish completion artifacts or install rules corresponding to Z/build/GhosttyResources.zig:141,156,171. Shell-integration scripts do not replace completions. |
Medium |
| Editor syntax | Missing | No Vim/Neovim or bat installation corresponding to Z/build/GhosttyResources.zig:186,226; no Sublime syntax artifact. |
Low |
| Terminfo distribution | Partial | Both compiled entries, ghostty and xterm-ghostty, exist and decode successfully with infocmp. Source generation and tic regeneration exist. Installation omits the textual ghostty.terminfo and ghostty.termcap outputs provided by Z/build/GhosttyResources.zig:45,69. |
Low |
| Linux distribution/install modes | Partial | All seven dist/linux files are byte-identical. However, installation always selects ordinary D-Bus activation and share/systemd/user; it does not select the Flatpak service template, omit systemd for Flatpak, or select lib/systemd/user for system-package mode as Z/build/GhosttyResources.zig:305,333 does. |
Medium |
The following asset checks passed:
- Shell integration: all 8/8 files byte-identical, including hidden files; installation is wired.
- Themes: all 463/463 upstream themes byte-identical against the pinned Zig dependency.
- GTK: all 18/18 in-scope UI blueprints and 4/4 CSS files byte-identical; Blueprint/GResource compilation is wired. Inspector assets were excluded.
- Rendering/fonts/icons: all 10/10 GLSL files, all production embedded fonts, and all 7/7 installed icon source images match their upstream sources.
- Configuration documentation: all 202 public configuration keys are present; their documentation matches after whitespace normalization. The configuration-file template is byte-identical. Runtime configuration help exists despite the missing man-page pipeline.
CLI action coverage
All 15 runtime ghostty + actions have Rust dispatch and implementations matching the list in Z/cli/ghostty.zig:26:
version, help, list-fonts, list-keybinds, list-themes, list-colors, list-actions, ssh-cache, edit-config, show-config, validate-config, show-face, crash-report, boo, new-window.
The qualifications are the theme-preview and version-metadata gaps above. Upstream +crash-report itself only lists reports, so its absent view/send functionality is not a Rust regression. Completion/syntax generation actions belong to upstream’s build-data helper, not this runtime action list.