Twelve warm dots inside a 37 mm eye can't be read from across a table. Brightness alone doesn't separate four levels, and a ring hides which side of the table each dot belongs to.
| Level | Bars | Colour |
|---|---|---|
| R0 off the record | 4 | red |
| R1 outcomes | 1 | orange |
| R2 gist | 2 | yellow |
| R3 attributed | 3 | green |
| R4/R5 verbatim/audio | 4 | blue |
room.py).At power-on, and while the read button is held, the ten columns show the charge for 3 s:
pebble_layout.py). The v01c fit is 138 × 56 × 27 mm, ≈132 g.display.py (column) and the JS lightColumn share one map; tests in tests/test_groups_display.py.The geometric review (v01/cad/review_geometry.py) found that the ten-window design couldn't be built well:
Rafa's suggestion — one strip all round, split in software — solves all three.
display.ring_frame).display.battery_frame).# ADR-0009: A light ring at the seam, one light in the eye - **Status:** accepted (Rafa, 2026-10-12); the read button is replaced by holding the eye (ADR-0013) - **Date:** 2026-10-12 - **Supersedes:** the 12-dot eye in ADR-0008; the brightness-only light language in ADR-0006. ## Rafa's direction - "More differentiation on the colors like red for off the record … another signal … like a signal of a mobile." - "Lights need to be visible around a round-table … 10 lights in a line one per person." - "Lights maybe turn stronger when one person is speaking … multiple people speak at once or two groups of three." - "More obvious where to place the phone … an icon lit up on the tail … an on-switch physically." - "The eye doesn't need the 10 lights anymore … maybe we need only one main ON light." - "Maybe an easier design for the LEDs is to put a strip all around and code diff pieces of the LED strip?" ## Context Twelve warm dots inside a 37 mm eye can't be read from across a table. Brightness alone doesn't separate four levels, and a ring hides which side of the table each dot belongs to. ## Decision ### Ten light columns on the flank - **Windows:** ten clear PETG windows, evenly spaced by arc length around the flank, just above the bumper band. They can be seen from every seat. - **Light source:** behind the windows, one Adafruit Mini Skinny NeoPixel strip (2969, 6.94 mm pitch) gives four LEDs per window. - **One column per participant:** in the order voices first speak. - **Colour and bar count give the level**, like phone signal bars: | Level | Bars | Colour | |---|---|---| | R0 off the record | 4 | red | | R1 outcomes | 1 | orange | | R2 gist | 2 | yellow | | R3 attributed | 3 | green | | R4/R5 verbatim/audio | 4 | blue | - **Speaking:** a column runs at 35 % brightness at rest and at full brightness while its owner speaks. - Several people talking over each other give several bright columns. - Two side conversations give two groups of bright columns. - The engine groups side conversations with reply links: replies within 6 s, at least 2 links. A room-wide lowering said inside a side group applies to that group (`room.py`). ### One light in the eye - A single LED sequin behind an Ø18 mm lens, powered by the microphone rail. It is lit exactly while the microphones can hear, and it can't be overridden by software. - The eye shows nothing else. ### Battery on demand At power-on, and while the read button is held, the ten columns show the charge for 3 s: - 3–4 green bars; - 2 amber; - 1 red. ### Tap here - A contactless icon (three arcs and a dot) on the tail, debossed into a 0.4 mm skin. - A NeoPixel Mini behind it, chained after the strip, lights while the NFC tag is armed. ### Power switch - A slide switch on the belly flank, below the bumper band, beside the microphone switch and the read button. ## Consequences - The 12-LED ring (6526) leaves the kit, along with its 6.7 mm height risk. - The strip bends around a tight radius at the nose and tail, so solder joints need checking after assembly. - **Fit:** the layout keeps a 1.8 mm lateral clearance band clear for the strip (`pebble_layout.py`). The v01c fit is 138 × 56 × 27 mm, ≈132 g. - **Colour-blind legibility:** bar count carries the level on its own, without colour. Red and blue both show four bars, but off the record also cuts content to nothing, and the blue level needs an explicit raise. - **Firmware:** `display.py` (`column`) and the JS `lightColumn` share one map; tests in `tests/test_groups_display.py`. ## Amendment (2026-10-12): one continuous ring instead of ten windows The geometric review (`v01/cad/review_geometry.py`) found that the ten-window design couldn't be built well: - **Shell removed:** 79 % of the shell perimeter at window height, leaving 7 mm pillars. - **Window placement:** the windows sat 32° into the domed top, which is the notch visible on the long edges. - **LED spacing:** ten 4-LED windows at the strip's fixed 6.94 mm pitch need ≥ 278 mm of flank that is close to vertical. Only the seam has that. Rafa's suggestion — one strip all round, split in software — solves all three. - **Placement:** one continuous Mini Skinny strip, 41 LEDs (≈285 mm), round the seam. It starts and ends beside the USB-C pocket, so there are no cuts or splices. - **Mounting:** the strip is glued to a land, which is the bottom shell's tongue extended to 4 mm. The land's plan outline keeps every corner at a radius of 10 mm or more, so the strip never bends sharply. - **Openings:** one 3.0 × 3.6 mm opening per LED through the land and the wall, which removes 43 % of the run. The bumper band, printed in natural (translucent) TPU, covers them. It still takes the drop, and it diffuses the light. - **Segments:** software splits the ring into one segment per participant, in order of first speech. The last LED of each segment stays dark as a divider (`display.ring_frame`). - **Fill:** a segment fills like a level meter, with each level keeping its colour: - ¼ orange: outcomes - ½ yellow: gist - ¾ green: attributed - full red: off the record - full blue: verbatim - **Steps per segment:** 3 people get 12 lit steps each; 5 get 7; 10 get 3. - **Battery:** the whole ring becomes a gauge for 3 s (`display.battery_frame`). - **Ring supply:** switched VSYS behind a 0.5 A polyfuse, with brightness capped at 35 % in the encoder.