Skip to content

fix(tui): the wave blooms from the center, the figure stops blinking [spec 10] - #116

Merged
wine-fall merged 1 commit into
mainfrom
zachg-0810--sky-wave-fixes
Aug 10, 2026
Merged

fix(tui): the wave blooms from the center, the figure stops blinking [spec 10]#116
wine-fall merged 1 commit into
mainfrom
zachg-0810--sky-wave-fixes

Conversation

@wine-fall

Copy link
Copy Markdown
Owner

Implements specs/spec10/10-tui.md (§3.6 visualizer, §6.1 quiet-constellation).

Two by-eye reports from the first real Ghostty session after #115.

Wave direction

The spectrum bins were laid left-to-right across the arc, so bin 0 — the
bass, which is almost always breathing — anchored the left arm and the wave
read as growing from the left edge. waveBinAt now mirrors the spectrum
from the arc's middle outward: bass rises at the center, treble frays toward
both arms, and the wave blooms symmetrically. Unit-tested for mirror
symmetry and for a bass-only frame lighting only the center.

Start-of-broadcast flash

The raster figure's placement effect depended on the pose, so the first
spoken line (greeting -> talk) tore the effect down: deleteFigures, then a
600ms resettle before the repaint — the figure blanked visibly on every
state change. The pose now rides a ref and swaps the next transmitted frame
in place under the same kitty image id; PNGs are encoded per pose on first
use, a shared clock advances each pose at its own fps, and identical frames
are not retransmitted. Only a real relayout (resize, breakpoint, settings)
tears the placement down.

Acceptance

Wide-pty harness (200x50, ghostty env, STUB): 73 in-place frame
retransmissions across a 22s run spanning the greeting->talk transition,
zero a=d deletes before shutdown — the flash's byte signature is gone.
Full suite 688 green; typecheck and lint clean.

Peer review (codex gpt-5.5 xhigh): 0 findings.

AI coding brief

  • Original request: two visual defects from a real listening session —
    the figure flashes once when the radio's first line arrives, and the wave
    always grows from the left instead of emanating from the center.
  • Manual interventions: none this round; both root causes were readable
    from the code, no added logging needed.
  • Retro: effect dependency lists are where TUI flicker hides — anything
    that deletes a terminal-side artifact on re-run must depend only on real
    layout inputs, with content swaps riding refs.

🤖 Generated with Claude Code

…[spec 10]

Two by-eye reports from the first real Ghostty session after #115:

- The spectrum was pinned bin 0 -> left arm, so the ever-breathing bass made
  the wave read as marching left-to-right. waveBinAt now mirrors the bins
  from the arc's middle outward — bass at the center, treble fraying toward
  both arms (unit-tested for symmetry and for a bass-only frame lighting
  the center alone).
- The raster figure blanked for over half a second at the first spoken line:
  the placement effect depended on the pose, so every state change ran
  deleteFigures and waited out the 600ms resettle. The pose now rides a ref
  and swaps the next transmitted frame in place under the same image id;
  only a real relayout tears the placement down. Verified in the pty
  harness: 73 in-place retransmissions across a run spanning the
  greeting->talk transition, zero deletes before shutdown.

Peer review (codex gpt-5.5 xhigh): 0 findings.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@wine-fall
wine-fall merged commit 10a8e8c into main Aug 10, 2026
3 checks passed
@wine-fall
wine-fall deleted the zachg-0810--sky-wave-fixes branch August 10, 2026 08:46
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