Skip to content

Harden launchers, configure initial layouts, and fix visible Git tab focus - #6

Merged
Crokily merged 5 commits into
mainfrom
Colin/maintenance-reliability-layout
Sep 14, 2026
Merged

Crokily merged 5 commits into
mainfrom
Colin/maintenance-reliability-layout

Conversation

@Crokily

@Crokily Crokily commented Sep 14, 2026 •

Copy link
Copy Markdown
Owner

Opening Git could silently stall on a held launcher lock, and Herdr 0.9 could create or reuse a Git tab without switching the visible client. New tabs also inherited the compact sidebar layout, hiding the diff.

This change bounds launcher operations and reports failures, makes new tabs expanded by default, and explicitly switches the client to created or reused Git tabs. Reused panes preserve their layout and placement; consecutive U presses now reload the actual lazygit layout.

Changes

  • Share a non-inherited launcher lock per user/server/workspace, preserve invocation targets, and avoid retrying mutations with unknown outcomes.
  • Add independent initial split/tab layout settings, geometry deadlines, and the Herdr 0.7.0 resize fallback without recreating terminals.
  • Fix visible tab switching and consecutive layout toggles; retain canonical repository/worktree identity and handle bootstrap path aliases.
  • Update private lazygit/fzf to 0.65.0/0.74.4 and handle conflicting plugin keybindings without disabling native actions.
  • Add real client rendering regressions and a four-version Ubuntu/macOS CI matrix. Update both READMEs, changelog, design, runtime notices, and validation records; include Windows contribution review and a staged CI plan.

Validation

  • All nine hermetic suites passed locally, including 18 launcher behavior tests and six geometry tests.
  • Real Linux ARM64 clients passed with Herdr 0.7.0, 0.7.5, 0.8.2 and 0.9.0, lazygit 0.65.0 and fzf 0.74.4. Assertions cover visible diff rendering, five consecutive layout toggles, and actual prefix+shift+g switching/reuse.
  • Negative controls restoring the old launcher or toggle fail at the new rendering assertions.
  • Three terminal screen adapter regressions cover partial wide-character repaints, intact wide/combining characters and cleared diff content. The initial macOS/Herdr 0.7.0 CI failure was a pyte screen-reader IndexError; its captured ANSI output replays successfully with the fix, including byte-by-byte input.
  • Maintainer confirmed the follow-up fixes work in the reported macOS/Ghostty + Herdr 0.9.0 environment.
  • Shell/Python syntax, workflow YAML and diff whitespace checks passed; all eight runtime archive digests were verified. All 10 hosted CI jobs passed on follow-up commit c147c52: workflow run.

Compatibility boundaries

Herdr 0.9 public tab focus is session-wide and can switch other attached clients. Strictly client-local routing requires upstream support. Remote reconnect and simultaneous-client UI behavior remain manual checks. Windows support is not claimed; the plugin version and minimum Herdr version remain unchanged.

The reported nested-shell deadlock chain was not reproduced; this PR fixes the demonstrated lock inheritance, unbounded waiting and silent failure behavior without claiming that exact root cause.

Refs #4, #5.

Explicitly focus created or reused Git tabs while retaining workspace targets and bounded operations. Send paired focus events so consecutive layout toggles reload in an already-focused lazygit.

Assert actual rendered diff and client keybinding behavior, cover focus timeout reuse and canonical paths, and document the session-wide focus boundary.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-14T01:10:52.952679Z d0ea6be PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d0ea6be1ef

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

# overrides and lazygit runtime upgrades.
printf '# keys: %s %s %s | lazygit: %s\n' \
"$k_commit" "$k_zoom" "$k_settings" "$LAZYGIT_VERSION"
printf '%s\n' "$marker"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Avoid caching unresolved fallback bindings

When free-keys.py resolve transiently exits with status 2, generation substitutes the default keys but still writes this requested-key marker. The next launch sees the marker and unchanged mtimes and exits before retrying analysis, so a configured key can remain silently replaced even after the runtime recovers. Only cache the generated layer after successful analysis, or include the fallback/unresolved state in a marker that forces a later retry.

Useful? React with 👍 / 👎.

DRIVER = """
import launcher
launcher.COMMAND_TIMEOUT = 1.0
launcher.LOCK_TIMEOUT = 0.3

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Give concurrent launchers enough time to acquire the test lock

The concurrent-reuse test requires both launchers to succeed, but every test driver allows a waiter only 300 ms while the first launcher performs several subprocess calls under the lock. On this checkout, the test failed on all three direct runs because the second process reached the busy-lock error after about 0.52 seconds; similarly loaded CI runners can therefore fail nondeterministically. Use a materially larger lock timeout here or synchronize the fake command so the test does not depend on sub-300-ms scheduling.

Useful? React with 👍 / 👎.

@Crokily
Crokily merged commit e631dc5 into main Sep 14, 2026
10 checks passed
@Crokily
Crokily deleted the Colin/maintenance-reliability-layout branch September 14, 2026 01:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant