Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions specs/STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ _This file is a **card, not a ledger**: an entry that is done and no longer
guides the work gets **deleted**, not archived. History lives in git and PR
bodies; measured facts live in the spec they verify._

_Last updated: 2026-08-07 (spec 10 §6.1 art direction landed: the
quiet-constellation skin — night-ground palette, wide-terminal sky panel with
braille mist + floating pet, narrow fallback unchanged; by-eye tuning stays
issue #79)_
_Last updated: 2026-08-07 (spec 10 §6.1 refined per first by-eye feedback:
the pet is now the logo whisper-figure, the mist floor is an arc with the
figure in its hollow, and the palette is sampled from the concept mockup;
remaining tuning stays issue #79)_

## Where we are

Expand Down
19 changes: 13 additions & 6 deletions specs/spec10/10-tui.md
Original file line number Diff line number Diff line change
Expand Up @@ -418,8 +418,10 @@ only the client — one shutdown path.
call; the feed contract is the same.)
- **As built (2026-08-07, §6.1)**: the bar strip is the narrow composition;
wide terminals re-render the SAME feed as the constellation mist —
braille-cell particles climbing from a floating baseline, density following
the bin level, a sparse fallout drifting below it. The sky paints on the
braille-cell particles climbing from an **arced floor** (high at the panel's
edges, dipping at the center, the figure floating in the hollow), density
following the bin level, jittered so cells stay fine-grained, fading out at
the panel's side walls, a sparse fallout drifting below. The sky paints on the
client's own 12fps clock and viz frames only feed the smoother, so stars
twinkle and the pet animates even when the engine is silent. All of it is
client-side arithmetic (`tui/src/constellation.ts`); the feed contract is
Expand Down Expand Up @@ -615,7 +617,12 @@ the skin is `04-quiet-constellation`.** Its terms:
(02 — per-scene hand art, cost without a daily payoff), the zine poster
(03 — display type has no CJK form and no small-terminal degradation).

Still open, still this session's property: the pet's **identity** (the
whisper-figure logo motif and the stitched texture of concept 03 are the
reference material; today's creature holds the slot), and the by-eye tuning
of all of the above in a real terminal (issue #79).
**The pet's identity is the murmur logo (decided 2026-08-07):** the
whisper-figure in profile, rendered in the solid-fill cross-stitch reading —
hair as the dim accent mass, skin as the bright mass, dark seams carrying
the closed eye, mouth, and finger gaps. The committed sprites are generated
over a downscale of `assets/murmur-logo.svg`; whisper sparkles and drifting
notes are the pose overlays. Still open: the by-eye tuning of all of the
above in a real terminal (issue #79) — mist arc/density/fade, star density,
twinkle, figure size and placement, per-scene accents (sampled from the
concept mockup; values in `tui/src/palette.ts`).
31 changes: 30 additions & 1 deletion test/tui-constellation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import { describe, expect, it } from 'vitest'

import { Constellation, panelWidth, WIDE_MIN } from '../tui/src/constellation.ts'
import { Constellation, hash01, panelWidth, WIDE_MIN } from '../tui/src/constellation.ts'
import { accentFor } from '../tui/src/palette.ts'

const ACCENT = accentFor('late-night')
Expand Down Expand Up @@ -101,6 +101,23 @@ describe('Constellation (§6.1: starfield + particle mist)', () => {
expect(withPet.length).toBeGreaterThan(0)
})

it('bows the mist floor into an arc — edge columns bottom out higher than center ones', () => {
const rows = new Constellation(48, 20, 7).frame(Array.from({ length: 24 }, () => 0.6), ACCENT, null)
const deepestBraille = (fromCol: number, toCol: number): number => {
let deepest = -1
rows.forEach((row, y) => {
const chars = [...rowText(row)]
for (let x = fromCol; x < toCol; x++) {
if (isBraille(chars[x] ?? ' ')) deepest = Math.max(deepest, y)
}
})
return deepest
}
const edge = Math.max(deepestBraille(0, 6), deepestBraille(42, 48))
const center = deepestBraille(21, 27)
expect(center).toBeGreaterThan(edge)
})

it('survives hostile bins and degenerate panels', () => {
const sky = new Constellation(2, 2, 7)
for (const frame of [[], [Number.NaN], [2, -1], [0.5]]) {
Expand All @@ -111,6 +128,18 @@ describe('Constellation (§6.1: starfield + particle mist)', () => {
})
})

describe('hash01 (the survival dice behind every density knob)', () => {
it('stays inside 0..1 — a signed hash passes every threshold and defeats the knobs', () => {
for (let x = 0; x < 200; x++) {
for (const [y, tick] of [[0, 0], [7, 3], [-5, 11], [1000, 999]]) {
const roll = hash01(x, y!, tick!)
expect(roll).toBeGreaterThanOrEqual(0)
expect(roll).toBeLessThan(1)
}
}
})
})

describe('panelWidth (the one §6.1 breakpoint)', () => {
it('declines a panel below the wide minimum', () => {
expect(panelWidth(WIDE_MIN - 1)).toBeNull()
Expand Down
37 changes: 20 additions & 17 deletions tui/assets/pet/doze.pix
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
............
............
..oooooooo..
..obbbbbbo..
..obobbobo..
..obbbbbbo..
...obbbbo...
....oooo....

............
............
............
..oooooooo..
..obobbobo..
..obbbbbbo..
...obbbbo...
....oooo....
..................
.......bbbbbb.....
......bbbbbbbb....
.....bbbbbbbbbb...
....bbbbbbbbbbb...
....bbbbbbbbbbbb..
...bmmmbbbbbbbbb..
...mmmmbbbbbbbbb..
..mmmmmbbbbbbbbb..
..meemmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
..memmmmbbbbbbbb..
..mmemmemmbbbbbb..
..mmemmemmbbbbb...
..mmmmmmmmbbbb....
..mmmmmmmmm.......
..mmmmmmmm........
...mmmmmm.........
..................
56 changes: 40 additions & 16 deletions tui/assets/pet/idle.pix
Original file line number Diff line number Diff line change
@@ -1,17 +1,41 @@
...o....o...
..obo..obo..
..oobbbboo..
..obbbbbbo..
..obebbebo..
..obbbbbbo..
...obmmbo...
....oooo....
..................
.......bbbbbb.....
......bbbbbbbb....
.....bbbbbbbbbb...
....bbbbbbbbbbb...
....bbbbbbbbbbbb..
...bmmmbbbbbbbbb..
...mmmmbbbbbbbbb..
..mmmmmbbbbbbbbb..
..meemmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
..memmmmbbbbbbbb..
..mmemmemmbbbbbb..
..mmemmemmbbbbb...
..mmmmmmmmbbbb....
..mmmmmmmmm.......
..mmmmmmmm........
...mmmmmm.........
..................

............
..ooo..ooo..
..oobbbboo..
..obbbbbbo..
..obobbobo..
..obbbbbbo..
...obmmbo...
....oooo....
..................
.......bbbbbb.....
......bbbbbbbb....
.....bbbbbbbbbb...
....bbbbbbbbbbb...
....bbbbbbbbbbbb..
...bmmmbbbbbbbbb..
...mmmmbbbbbbbbb..
..mmmmmbbbbbbbbb..
m.meemmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
..memmmmbbbbbbbb..
..mmemmemmbbbbbb..
..mmemmemmbbbbb...
..mmmmmmmmbbbb....
..mmmmmmmmm.......
..mmmmmmmm........
...mmmmmm.........
..................
56 changes: 40 additions & 16 deletions tui/assets/pet/music.pix
Original file line number Diff line number Diff line change
@@ -1,17 +1,41 @@
..o....o....
.obo..obo...
.oobbbboo...
.obbbbbbo...
.obebbebo...
.obbbbbbo...
..obmmbo....
...oooo.....
..................
.......bbbbbb.....
......bbbbbbbb....
..b..bbbbbbbbbb...
....bbbbbbbbbbb...
....bbbbbbbbbbbb..
.m.bmmmbbbbbbbbb..
...mmmmbbbbbbbbb..
..mmmmmbbbbbbbbb..
..meemmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
..memmmmbbbbbbbb..
..mmemmemmbbbbbb..
..mmemmemmbbbbb...
..mmmmmmmmbbbb....
..mmmmmmmmm.......
..mmmmmmmm........
...mmmmmm.........
..................

....o....o..
...obo..obo.
...oobbbboo.
...obbbbbbo.
...obebbebo.
...obbbbbbo.
....obmmbo..
.....oooo...
..................
.......bbbbbb.....
...m..bbbbbbbb....
.....bbbbbbbbbb...
.b..bbbbbbbbbbb...
....bbbbbbbbbbbb..
...bmmmbbbbbbbbb..
...mmmmbbbbbbbbb..
..mmmmmbbbbbbbbb..
..meemmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
..memmmmbbbbbbbb..
..mmemmemmbbbbbb..
..mmemmemmbbbbb...
..mmmmmmmmbbbb....
..mmmmmmmmm.......
..mmmmmmmm........
...mmmmmm.........
..................
77 changes: 61 additions & 16 deletions tui/assets/pet/talk.pix
Original file line number Diff line number Diff line change
@@ -1,17 +1,62 @@
...o....o...
..obo..obo..
..oobbbboo..
..obbbbbbo..
..obebbebo..
..obbbbbbo..
...obmmbo...
....oooo....
..................
.......bbbbbb.....
......bbbbbbbb....
.....bbbbbbbbbb...
....bbbbbbbbbbb...
....bbbbbbbbbbbb..
...bmmmbbbbbbbbb..
...mmmmbbbbbbbbb..
..mmmmmbbbbbbbbb..
m.meemmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
..memmmmbbbbbbbb..
..mmemmemmbbbbbb..
..mmemmemmbbbbb...
..mmmmmmmmbbbb....
..mmmmmmmmm.......
..mmmmmmmm........
...mmmmmm.........
..................

...o....o...
..obo..obo..
..oobbbboo..
..obbbbbbo..
..obebbebo..
..obbbbbbo..
...obbbbo...
....oooo....
..................
.......bbbbbb.....
......bbbbbbbb....
.....bbbbbbbbbb...
....bbbbbbbbbbb...
....bbbbbbbbbbbb..
...bmmmbbbbbbbbb..
...mmmmbbbbbbbbb..
..mmmmmbbbbbbbbb..
m.meemmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
m.memmmmbbbbbbbb..
..mmemmemmbbbbbb..
..mmemmemmbbbbb...
..mmmmmmmmbbbb....
..mmmmmmmmm.......
..mmmmmmmm........
...mmmmmm.........
..................

..................
.......bbbbbb.....
......bbbbbbbb....
.....bbbbbbbbbb...
....bbbbbbbbbbb...
....bbbbbbbbbbbb..
...bmmmbbbbbbbbb..
.b.mmmmbbbbbbbbb..
..mmmmmbbbbbbbbb..
m.meemmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
m.memmmmbbbbbbbb..
..mmemmemmbbbbbb..
m.mmemmemmbbbbb...
..mmmmmmmmbbbb....
..mmmmmmmmm.......
..mmmmmmmm........
...mmmmmm.........
..................
28 changes: 20 additions & 8 deletions tui/assets/pet/wake.pix
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
..o......o..
..obo..obo..
..oobbbboo..
..obbbbbbo..
..oeebbeeo..
..obbbbbbo..
...obmmbo...
....oooo....
..................
.......bbbbbb.....
......bbbbbbbb....
.....bbbbbbbbbb...
....bbbbbbbbbbb...
....bbbbbbbbbbbb..
...bmmmbbbbbbbbb..
.b.mmmmbbbbbbbbb..
..mmmmmbbbbbbbbb..
m.meemmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
.mmmmmmmbbbbbbbb..
m.memmmmbbbbbbbb..
..mmemmemmbbbbbb..
m.mmemmemmbbbbb...
..mmmmmmmmbbbb....
..mmmmmmmmm.......
..mmmmmmmm........
...mmmmmm.........
..................
Loading
Loading