Skip to content

Tags: NotADevIAmaMeatPopsicle/YouAndEye

Tags

v0.1.0

Toggle v0.1.0's commit message
fix: let an identity profile actually reach both surfaces

A profile's colour never reached the rendered face. Four faults stacked, each
hiding the next, and all four were invisible in STATUS because it reported the
values the host had sent rather than the ones being drawn.

1. applyPreset repainted the iris base on every preset application, so a
   profile's colour survived only until the next state change. Presets now own
   geometry and an identity owns colour: applyPresetIrisBaseColor skips the
   repaint once a host has sent an explicit IRIS.

2. The SDF renderer resolves its iris through palette_for(pose->palette) and
   never reads commandState.iris*, which only the legacy raster path consumes.
   The IRIS command now claims the palette slot, and resolveIrisPalette treats
   palette 0 as "this affect has no opinion" so an identity fills it while a
   deliberate expressive palette still wins.

3. The live semantic render path took its pose straight from the motion library
   and never consulted commandState.palette at all; only the fallback branch
   did. Both poses now run through resolveIrisPalette.

4. The AMOLED mouth reads its profile from the frame's trusted context, which
   the dispatch path never populated, so it fell back to the default accent on
   every performance. express() already carried it, which is why the mouth was
   correct there and wrong in every scene.

Separately, the host cached the applied profile against the connection
generation alone, so a rebooted board silently ran its compile-time defaults
while the host reported the identity as active. STATUS now carries a per-boot
nonce and the host folds it into the applied-profile key.

Protocol change: IRIS accepts a palette name and the host sends one, so colour
knowledge belongs to the surface rather than the wire. The numeric IRIS r g b
form still works. A teal palette is added so all six host palette names map to
an exact firmware palette instead of teal colliding with azure.

STATUS also gains palette= so the effective iris index is observable rather
than inferred, which is what made these four so hard to see.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>