Entry 63. First Field Crash-Test on Arch Linux: Investigating the Omni-Search Freeze & GitHub MCP Integration
⏱️ Timestamp: October 10, 2026, 23:10 — October 11, 2026, 01:15 (~2 hours)1. Motivation: A Family Bug Report from the Arch Linux Ecosystem
The most exacting and constructive testers are often family members, especially when they are passionate Linux power users. My son installed the latest build of Shellit onto his Arch Linux workstation running the Hyprland Wayland compositor, and shortly after opened our very first public GitHub Issue:
“[Bug]: Split layout freeze / OpenGL frame timeout via Omni-search Ctrl+K in Linux GTK/OpenGL”
The reproduction step was succinct: summon the Omni-search palette via Ctrl+K, swiftly type a split layout command (such as split 2x2 or split horizontal), and press Enter. If pressed rapidly or followed by a fast secondary keystroke, the terminal canvas froze entirely, outputting GTK warnings: glXSwapBuffers timeout / eglSwapBuffers failure and Flutter engine frame request timed out waiting for OpenGL fence.
In addition, he shared sharp ergonomic feedback from daily use:
- When opening a local terminal from the welcome screen, the shell would sometimes launch in
shand sometimes inbash, even though the system’s login shell was configured aszsh. The shell dropdown selector listed duplicate entries (ZSHandZSH). - Custom Fonts: Standard monospace fonts without Nerd Font patches failed to render file glyphs when using modern CLI tools like
ezaorstarship. - Future feature request: Terminal graphics protocols (Kitty Graphics / Sixel) for in-console image previews.
2. Connecting GitHub MCP & Investigating BUG-056
We first integrated our AI environment directly with GitHub via the Model Context Protocol (MCP). The assistant can now track repository issues, discussions, and pull requests in real time, respond to threads, and maintain issue lifecycles. We fetched Issue #1, logged BUG-056 (P0) into our tracking system, and performed an architectural root-cause diagnosis.
Three interconnected factors caused the freeze:
- Cascading State Mutation During Modal Dismissal:
Inomni_search_modal.dart, submitting an action synchronously triggeredaction.onSelect(), which immediately mutated Riverpod state (updateSplitLayout()) beforeNavigator.of(context).pop(). In Wayland/OpenGL GTK environments, dismissing a popup window initiates graphics buffer synchronization. Simultaneously triggering a full layout rebuild caused conflicting surface redraws, provoking an OpenGL fence timeout. - Subtree Teardown from
ValueKeyOver-Specification:
Inshellit_app_shell.dart,SplitMatrixViewwas keyed withValueKey('${tab.id}-${tab.splitLayout.name}'). Because the layout name was embedded into the key, switching split modes destroyed the entire terminal widget subtree and rebuilt it from scratch rather than invoking standarddidUpdateWidgetlifecycle transitions. - PTY Window Resize Bursts:
Insideterminal_screen.dart, rapid layout recomputations triggered bursts ofonResizecallbacks (4–6 per frame), spamming resize control packets to the PTY socket.
3. Engineering Decisions: Graphic Pipeline Stabilization & Linux Shell Hygiene
We deployed comprehensive fixes across the codebase:
- Single-Shot Action Guard & Deferred Invocation:
Introduced an atomic_isExecutingActionboolean flag inOmniSearchModal. On Enter, subsequent submissions are immediately rejected, focus is retracted, the modal dismisses viaNavigator.of(context).pop(), and Riverpod state updates are deferred to the following frame usingWidgetsBinding.instance.addPostFrameCallback. - Stable Split Matrix Keying:
BoundSplitMatrixViewkeys solely to the tab identifier:ValueKey('split-${tab.id}'). Transitioning between single view, horizontal/vertical splits, and 2x2 matrix now cleanly flows throughdidUpdateWidget, preserving terminal memory and controllers. - Terminal Resize Memoization:
Added_safeResizeTerminalwith memoized_lastSyncedColsand_lastSyncedRows, eliminating redundant resize packets when dimensions have not changed. - Symlink Resolution & Fallback Shell Discovery on Linux:
UpdatedLocalShellDetectorwithresolveSymbolicLinksSync(). On/usr-mergesystems like Arch Linux,/bin/zshand/usr/bin/zshcanonicalize to the identical binary, removing duplicate entries. When launched from Wayland app drawers where$SHELLis unset, the detector reads the user’s shell from/etc/passwdand applies clean priority:user_shell > zsh > bash > fish > sh.
4. Verification & Conclusion
- Resolved defect
BUG-056, validated with an automated regression test inomni_bar_shortcut_test.dart. - All 203 tests across
packages/terminal_uiand 61 tests inapps/shellitpassed cleanly. - Added
.nojekylland cleaned up Astro frontmatter comments to safeguard GitHub Actions Pages builds. - Registered backlog initiatives
IDEA-037(Nerd Fonts & custom typography) andIDEA-038(Kitty/Sixel graphics protocols). - Posted an exhaustive diagnostic report to GitHub Issue #1.