Skip to content

feat(tui): the raster whisper-figure, ring starfield, sampled palette [spec 10] - #114

Open
wine-fall wants to merge 2 commits into
mainfrom
zachg-0807--tui-raster-figure
Open

feat(tui): the raster whisper-figure, ring starfield, sampled palette [spec 10]#114
wine-fall wants to merge 2 commits into
mainfrom
zachg-0807--tui-raster-figure

Conversation

@wine-fall

Copy link
Copy Markdown
Owner

Implements specs/spec10/10-tui.md (section 6.1 as-built terms updated in the same change).

What this is

The third by-eye round of the quiet-constellation skin, driven by one demand: match the concept mockup's fineness. Three moves:

  1. The whisper-figure is machine-derived and raster-rendered. The designer's own figure from the 04 concept was extracted at its true 2px mesh with the open-source proper-pixel-art tool into a 42x44 two-tone .pix grid (cream fill inside a warm outline; the drifting embers lifted into pose overlay frames). On kitty-graphics terminals (Ghostty/kitty, figurePen, MURMUR_TUI_FIGURE=image|sprite override) the client encodes that grid into a PNG at runtime — integer nearest-neighbour scale chosen from the tty's real cell pixel size (TIOCGWINSZ via guarded bun:ffi) — and places it over the sky with the kitty graphics protocol; pose frames stream under one image id, doze fades the inks toward the ground, cleanup deletes placements. Character terminals and the narrow band keep the text-sprite path.
  2. The starfield became concentric ripple rings off the wave's implied circle — quasi-regular arc spacing with jitter and gaps, near-dark ring ink behind a thin free scatter, 2x2 stars reserved for warm accents.
  3. The palette is now sampled from the mockup: everything quiet is a WARM grey (QUIET replaces the blue COOL, name and value), EMBER went peach, the listener's own words are sage, and the listener's channel (input line + now-playing note) is periwinkle — the room's one cold ink. Ground is #090e17.

Plus: the octant fold keeps BOTH inks of a near-covered two-color cell (majority on the glyph, the other behind it), which un-muddied the two-tone figure's edges; and the wide composition centers past 184 columns with symmetric margins.

Verification

  • 680 vitest green, typecheck, oxlint; new unit coverage: star-ring distribution/coverage/determinism, two-tone fold, kitty APC framing (chunking, control keys, reassembly), PNG encoder geometry + fade, figurePen/figureScale.
  • Real-frame evidence: the actual TUI client run under a pty against a wire-faithful fake engine, its raw terminal bytes replayed to HTML (octant glyphs decoded to sub-pixels, kitty APC images decoded and composited) and screenshotted — the raster figure placement was captured from the real escape stream (15 placements observed = pose animation live).
  • The user reviewed successive real-frame screenshots and approved the raster direction.

Peer review

Peer review (codex gpt-5.5 xhigh): 3 findings, 3 applied, 0 dismissed — all genuine (narrow-band overflow from the 44-row asset, persona dropped from the wide composition, now-playing truncation on multi-dash labels), each fixed with a regression test in fix(tui): review fixes. The first review run aborted on a network failure; the recorded result is the completed second run.

AI coding brief

Original request. A major TUI restyle to the 04-quiet-constellation concept, iterated by-eye against the mockup: the user rejected successive rounds as too coarse (figure outline, hand, star scatter, colors) until the terminal-cell ceiling was named, then directed a search for open-source pixel-art tooling and approved the raster-figure direction.

Manual interventions. The user re-anchored the work repeatedly with screenshots of what they saw; rejected hand-transcribed sprites three times, which forced the root-cause finding (a 17px grid cannot hold a 26px design, and character cells cannot hold the design's 0.3-cell pixels at all); proposed embedding a vector/image themselves, which became the kitty-graphics path; and demanded the palette be extracted from the mockup rather than eyeballed.

Retro. Should have measured the design's pixel pitch against the terminal's character geometry in round one — five rounds of tuning character art chased a physically impossible target. The honest screenshot pipeline (real client + pty capture + byte replay) was the turning point every time: it caught a collapsed strip box, proved the figure's coarseness was the fold not the sprite, and let the user judge real frames instead of mockups. Build that pipeline first for any visual work.

🤖 Generated with Claude Code

wine-fall and others added 2 commits August 7, 2026 19:20
Third section-6.1 by-eye round, driven by "match the concept's fineness":

- The whisper-figure is machine-derived now: the designer's own figure
  extracted at its true 2px mesh by proper-pixel-art into a 42x44
  two-tone .pix grid (cream fill, warm outline, embers as overlays).
- On kitty-graphics terminals (Ghostty/kitty) the figure renders as a
  runtime-encoded PNG placed over the sky — integer nearest-neighbour
  scale from the tty's real cell pixel size, pose frames streamed under
  one image id, doze fading toward the ground. figurePen decides;
  MURMUR_TUI_FIGURE=image|sprite overrides; character terminals and the
  narrow band keep the text-sprite path.
- The starfield is concentric ripple rings off the wave's circle —
  quasi-regular arc spacing, jitter, gap-broken, near-dark — plus a thin
  free scatter; only warm accents may be 2x2.
- The palette is sampled from the mockup: warm QUIET greys (the old
  blue COOL is gone, name and value), peach EMBER, sage user ink,
  periwinkle for the listener's channel (input + note), #090e17 ground.
- A near-covered two-ink cell keeps both colors (glyph + background) in
  the octant fold, so the two-tone figure stops muddying at edges.
- The wide composition centers past 184 columns with symmetric margins.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…pec 10]

Three genuine codex findings: the 42x44 asset made the narrow band eat a
24-row terminal (the band now draws a 2x2-folded half-scale pet, sparkle
surviving the fold); the wide composition dropped the persona (it rides
the identity footer now); and the now-playing split truncated labels with
a second dash (one split at the first separator, the rest kept whole).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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