Dogfood evidence (2026-07-24): the ambient jellyfish currently renders as JELLY_BELL = "o*" plus a single width-1 tentacle cycling ["|", ":", "|", "."] (crates/tui/src/tui/ambient_life.rs). A circle + * + one | does not read as a jellyfish — it reads as a parenthetical blob on a string.
Jellyfish have multiple tentacles. Redesign the sprite so the bell dome and 2–3 lagging tentacle columns sway out of phase, keeping:
- the existing pulse/lag timing model (
JELLY_PULSE_MS, JELLY_TENTACLE_LAG_MS) — extend per-tentacle phase offsets
- the ASCII-safe / low-motion tiers (each tier gets a silhouette that still reads)
- width handling in the draw loop (bell is no longer width-2/1 — update the
area.width clamp and per-column drawing)
- brightness floors and depth ordering unchanged
Add unit tests asserting the frame tables (widths, tentacle count ≥ 2, phase offsets differ per tentacle) and extend water_holds_only_fish_bubbles_and_jellyfish-style coverage if the glyph set changes.
Surfaced by Hunter while dogfooding v0.9.2.
Dogfood evidence (2026-07-24): the ambient jellyfish currently renders as
JELLY_BELL = "o*"plus a single width-1 tentacle cycling["|", ":", "|", "."](crates/tui/src/tui/ambient_life.rs). A circle +*+ one|does not read as a jellyfish — it reads as a parenthetical blob on a string.Jellyfish have multiple tentacles. Redesign the sprite so the bell dome and 2–3 lagging tentacle columns sway out of phase, keeping:
JELLY_PULSE_MS,JELLY_TENTACLE_LAG_MS) — extend per-tentacle phase offsetsarea.widthclamp and per-column drawing)Add unit tests asserting the frame tables (widths, tentacle count ≥ 2, phase offsets differ per tentacle) and extend
water_holds_only_fish_bubbles_and_jellyfish-style coverage if the glyph set changes.Surfaced by Hunter while dogfooding v0.9.2.