Skip to content

docs: record display-sleep surface spike - #745

Merged
onevcat merged 4 commits into
mainfrom
docs/display-sleep-surface-spike
Aug 30, 2026
Merged

docs: record display-sleep surface spike#745
onevcat merged 4 commits into
mainfrom
docs/display-sleep-surface-spike

Conversation

@onevcat

@onevcat onevcat commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • record the display-sleep investigation under the existing 063 workflow series
  • preserve both spike rounds: Swift-side ordering did not help, while disabling the eager CoreVideo display link proved surface creation itself can work with zero active displays
  • record Create Ghostty surfaces while the display is asleep #746 as the final fix: the upstream Ghostty lazy/non-fatal DisplayLink behavior is backported into the pinned GhosttyKit
  • withdraw both proposed product fallbacks for this issue: no Prowl-side window-vsync override and no interactive-to-headless/fail policy remain planned
  • keep honest ordinary tab/split creation failure propagation only as optional generic hardening, independent of display sleep and R2a
  • update the 063 and release ledgers to mark Wire the workflow runner into TCA and the CLI (063 B3) #744 merged and C1 next

Verification

  • stable display-off runs used a CoreGraphics/CoreVideo probe (active=0 throughout) and prowl send --capture health checks during the dark interval and after wake
  • Create Ghostty surfaces while the display is asleep #746 repeated the same protocol with the rebuilt GhosttyKit: tab, pane, and Profile launches succeeded while dark and recovered DisplayLink after wake
  • local Markdown link targets resolve
  • git diff --check
  • documentation-only correction after the prior make build-app result (0 errors, 0 warnings)

A second spike round falsified the first-round conclusion that no Ghostty
surface can be created while the display sleeps. The failure is the pinned
GhosttyKit's eager CoreVideo display link under `window-vsync = true`;
with `window-vsync = false` (including a runtime `reload_config` toggle)
tabs, splits, and Profile launches succeed while dark and render after
wake. Upstream ghostty #13639 removed the precondition on 2026-08-05.

Record the round-2 experiments and probe data, keep the typed
display-unavailable and honest tab/split follow-ups, replace the
headless-or-fail policy with a display-aware creation override and an
upstream backport, and note the GhosttyKit rebuild toolchain gap.

Claude-Session: https://claude.ai/code/session_01B6Fca3LQgFuUEJh3C3bEwR
@onevcat

onevcat commented Aug 30, 2026

Copy link
Copy Markdown
Owner Author

Second spike round pushed in 9fd061b — it falsifies the first-round conclusion.

  • Cause: pinned GhosttyKit v1.3.1 does if (config.vsync) try DisplayLink.createWithActiveCGDisplays() in renderer init; with zero active displays that fails (-6661, logged as error.OutOfMemory) and aborts ghostty_surface_new.
  • Verified live: with window-vsync = false the same binary creates working tabs, splits, and Profile panes while dark (shell answers captured inside the display-off interval), and they render after wake. A runtime reload_config toggle is enough; the choice is per surface at creation time.
  • Upstream ghostty #13639 (2026-08-05) makes display-link creation lazy and non-fatal; not in a tagged release yet, and the fork cannot currently rebuild GhosttyKit (zig 0.15.2 build runner fails to link under Xcode 26.6).
  • Recommendation now: display-aware creation override in Prowl (R2a-sized), typed DISPLAY_UNAVAILABLE, honest tab/split creation, upstream backport later; headless-or-fail policy withdrawn.

@onevcat
onevcat merged commit 1095ff0 into main Aug 30, 2026
1 check passed
@onevcat
onevcat deleted the docs/display-sleep-surface-spike branch August 30, 2026 14:38
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