ME: Ok, let's simply diagnose the PROBLEM (with certainty) in
jjui... by reading the code. Don't say what the solution is yet.
Diagnosis with certainty, from reading the code:
1. The cursor in the inline description editor is a software-painted, blinking cell, not the terminal's hardware cursor.
internal/ui/operations/describe/describe.go:33 declares input textarea.Model (from charm.land/bubbles/v2/textarea). The textarea component uses bubbles/v2/cursor internally — confirmed by line 81 handling cursor.BlinkMsg. That component renders the cursor by styling one cell in its View() string and toggling visibility on a timer. The styled output is then drawn into jjui's display via dl.AddDraw(rect, input.View(), 0) at line 150. Nothing about this involves the terminal's hardware cursor.
2. jjui never positions the terminal's hardware cursor.
Searched the entire repo: no tea.NewCursor, no assignment to v.Cursor on the tea.View returned from View(). The only Cursor() methods present (revisions.go:121, oplog/operation_log.go:55, evolog_operation.go:68) return int row indices for selection, not *tea.Cursor. The tea.View constructed in internal/ui/ui.go:755-769 sets AltScreen, ReportFocus, and MouseMode, but leaves Cursor unset — so Bubble Tea hides the hardware cursor.
3. jjui does receive focus events but does nothing with blur, and on focus it only refreshes data.
internal/ui/ui.go:764 enables v.ReportFocus = true. internal/ui/ui.go:127-131 handles tea.FocusMsg by issuing RefreshAndKeepSelections. There is no tea.BlurMsg case anywhere in the codebase.
The certain explanation of the bug:
When you Cmd-Tab away, the terminal stops drawing the application's output buffer in the foreground and there is no hardware cursor to fall back on (jjui hid it implicitly by never positioning one). The only cursor was the software-painted cell inside the textarea's View() string, which only appears as part of the rendered frame — and the terminal isn't actively redrawing that frame while the window is in the background or at the moment of focus loss. So the cursor visually disappears.
When you Cmd-Tab back, tea.FocusMsg fires and triggers RefreshAndKeepSelections, which refreshes data — but the description editor's cached frame (w.cachedFrame at ui.go:756) is reused unless w.render is true, and the textarea's blink state may now be in the "off" half of its cycle. Either way, no code path forces an immediate re-render with the cursor cell on. The cursor returns only when the next blink tick fires or the next keystroke triggers a re-render.