Goldfish v01 — the kit

Current shape: v01c, the pebble.

The earlier pill (v01a, cad/layout.py → cad/out/) is kept for comparison only. Legacy, outside the pipeline and the checks: cad/layout.py, cad/enclosure.py, cad/make_viewer.py, cad/viewer_template.html, cad/out/ and viewer.html; the pebble (cad/pebble*.py → cad/out_pebble/) and the workbench site replaced them.

Goldfish runs the Resolution Protocol (../protocol/), and its settings are one profile of it: profile/goldfish.profile.json.

Workbench site: ../site/ (live at https://npc.here.now/demo-goldfish/workbench/). It has the spec, the parametric CAD, the 3D model, the meeting simulation, the device simulator, print files with where to print, parts with buy links, and the checks.

A works-like and looks-like prototype: real electronics and a real enclosure, built from breakout boards rather than a custom PCB.

Open these first

File What
bom.csv Every part with an exact buy link (maker and EU shop), connectors, passives, adhesives, consumables; printed parts link their STL
assembly.md Who it is for, tools, LiPo safety, build steps, bring-up checks with expected readings
wiring.md Pad-level wiring with wire gauges, pin map, I²C chain, power switch, fuses, ring and its level shift
profile/goldfish.profile.json Goldfish's parameters and languages, as an RP profile
note-format.md The note a phone receives: Markdown with front matter, for people and language models
firmware/ Goldfish bindings: profile loader (device.py), light ring (display.py), key chains and store, NFC hand-off; tests
cad/ pebble_layout.py (fit), pebble_enclosure.py (printable parts), make_web.py (web meshes, bed-oriented print files in out_pebble/bed/), review_geometry.py, print_spec.json
sim/ power_sim.py + design.json: battery, power tree, logic levels, drivers
sourcing.json Online and Berlin print services, filament
reader/index.html The phone page that opens when you tap the tail
research/ Software stack, market, design research with sources

The kit at a glance

Block Part
Brain Radxa ZERO 3E 4 GB (RK3566, no radio), RJ45 removed
Ears 2 × SPH0645 I²S MEMS mics, behind the microphone slide switch
Light ring Mini Skinny NeoPixel strip, 50 LEDs on the tongue, on 5 V; one segment per voice; the tail icon LED first in the chain as the level shifter
Eye One LED sequin on the mic rail (lit exactly while the mics can hear), over a 6 × 6 mm tactile switch: the eye button
Memory that forgets ATECC608 secure element (forward-secure key chains) + PCF8523 RTC with its own CR1220, plugged in with STEMMA QT cables
Hand-off ST25DV64KC passive NFC tag + lit tail icon; RF off unless the eye is held
Power 4000 mAh LiPo (EREMIT, 90 × 60 × 6) with a thermistor and a 3 A polyfuse, bq24074 power-path charger (1.5 A from USB, 1 A charge), Pololu 2810 power-switch module, Pololu 5 V boost, ideal diode, tail USB-C
Heat SoC → 14 × 14 × 6 mm heatsink → 8 W/mK thermal pads → aluminium tape spreader inside the top shell; no fan
Touch ERM vibration disc on a PN2222A
Shell Yellow PETG shells, white light guide (also the button), translucent lens, natural TPU light band, TPU foot

Rough cost: about $245 in parts, plus consumables and printing (bom.csv).

Checks

~/.venvs/goldfish-cad/bin/python v01/validate.py runs everything and writes validation.json:

Known gaps

The full list is in ../BACKLOG.md.

Regenerate

The order matters; AGENTS.md has the rules. Run from the repo root.

uv venv --python 3.12 ~/.venvs/goldfish-cad && uv pip install --python ~/.venvs/goldfish-cad/bin/python build123d trimesh numpy scipy pytest rtree
PY=~/.venvs/goldfish-cad/bin/python
$PY v01/cad/pebble_enclosure.py     # fit + printable parts (STEP + STL) into out_pebble/ (5–10 min)
$PY v01/cad/wire_routes.py          # wire routes → out_pebble/wires.json and the cut list in wiring.md (≈ 10 min)
$PY v01/cad/make_web.py             # web meshes + print.json
$PY v01/validate.py                 # all checks, including the geometric review and the power simulation
python3 site/build.py && python3 site/build.py --web   # site (local file + deployable folder)
# Goldfish v01 — the kit

**Current shape: v01c, the pebble.**
- **Size:** 182 × 85 × 37 mm and about 266 g as built (`cad/out_pebble/layout.json`; the spec's nominal length in `pebble_spec.json` is 184 mm), a lofted superellipse (ADR-0014: grown round a 4000 mAh cell; palm-sized rather than pocket-sized).
- **Light ring:** 50 LEDs round the seam, behind a translucent TPU band. The whole ring glows low red while the room is off the record.
- **Eye:** one light, powered by the microphone rail. **The eye is a button** (ADR-0013, ADR-0015): a press only ever takes the room off the record; a double press while off brings it back; holding it shows the battery.
- **Controls:** power and microphone slide switches on the belly flank, 35 mm apart, with printed caps a fingertip can push (smooth with one dot for power, ridged with two dots for the mics).
- **NFC:** a lit "tap here" icon on the tail. No button: when a meeting ends the note goes into the tag, and a phone touching the tail opens it as a link.
- **Power:** one 4000 mAh cell, about 3 h of a busy meeting; plugged into any USB-C phone charger it runs indefinitely and charges at the same time.
- **Kit build:** through-hole parts and plug-in boards only. No surface-mount soldering, no hot air.

The earlier pill (v01a, `cad/layout.py` → `cad/out/`) is kept for comparison only. Legacy, outside the pipeline and the checks: `cad/layout.py`, `cad/enclosure.py`, `cad/make_viewer.py`, `cad/viewer_template.html`, `cad/out/` and `viewer.html`; the pebble (`cad/pebble*.py` → `cad/out_pebble/`) and the workbench site replaced them.

Goldfish runs the **Resolution Protocol** ([`../protocol/`](../protocol/)), and its settings are one profile of it: [`profile/goldfish.profile.json`](profile/goldfish.profile.json).
- Every voice gains an identity and its own record, and sets how much of its words is kept.
- Anyone can lower; a voice raises only itself.
- "Back on the record" is instant, and anyone can undo it within 30 s.
- The record forgets on a schedule: attributed for 3 days, gist for 30 days, outcomes for a year.

**Workbench site:** [`../site/`](../site/) (live at https://npc.here.now/demo-goldfish/workbench/). It has the spec, the parametric CAD, the 3D model, the meeting simulation, the device simulator, print files with where to print, parts with buy links, and the checks.

A **works-like and looks-like** prototype: real electronics and a real enclosure, built from breakout boards rather than a custom PCB.

## Open these first

| File | What |
|---|---|
| `bom.csv` | Every part with an exact buy link (maker and EU shop), connectors, passives, adhesives, consumables; printed parts link their STL |
| `assembly.md` | Who it is for, tools, LiPo safety, build steps, bring-up checks with expected readings |
| `wiring.md` | Pad-level wiring with wire gauges, pin map, I²C chain, power switch, fuses, ring and its level shift |
| `profile/goldfish.profile.json` | Goldfish's parameters and languages, as an RP profile |
| `note-format.md` | The note a phone receives: Markdown with front matter, for people and language models |
| `firmware/` | Goldfish bindings: profile loader (`device.py`), light ring (`display.py`), key chains and store, NFC hand-off; tests |
| `cad/` | `pebble_layout.py` (fit), `pebble_enclosure.py` (printable parts), `make_web.py` (web meshes, bed-oriented print files in `out_pebble/bed/`), `review_geometry.py`, `print_spec.json` |
| `sim/` | `power_sim.py` + `design.json`: battery, power tree, logic levels, drivers |
| `sourcing.json` | Online and Berlin print services, filament |
| `reader/index.html` | The phone page that opens when you tap the tail |
| `research/` | Software stack, market, design research with sources |

## The kit at a glance

| Block | Part |
|---|---|
| Brain | Radxa ZERO 3E 4 GB (RK3566, **no radio**), RJ45 removed |
| Ears | 2 × SPH0645 I²S MEMS mics, behind the microphone slide switch |
| Light ring | Mini Skinny NeoPixel strip, 50 LEDs on the tongue, on 5 V; one segment per voice; the tail icon LED first in the chain as the level shifter |
| Eye | One LED sequin on the mic rail (lit exactly while the mics can hear), over a 6 × 6 mm tactile switch: the eye button |
| Memory that forgets | ATECC608 secure element (forward-secure key chains) + PCF8523 RTC with its own CR1220, plugged in with STEMMA QT cables |
| Hand-off | ST25DV64KC passive NFC tag + lit tail icon; RF off unless the eye is held |
| Power | 4000 mAh LiPo (EREMIT, 90 × 60 × 6) with a thermistor and a 3 A polyfuse, bq24074 power-path charger (1.5 A from USB, 1 A charge), Pololu 2810 power-switch module, Pololu 5 V boost, ideal diode, tail USB-C |
| Heat | SoC → 14 × 14 × 6 mm heatsink → 8 W/mK thermal pads → aluminium tape spreader inside the top shell; no fan |
| Touch | ERM vibration disc on a PN2222A |
| Shell | Yellow PETG shells, white light guide (also the button), translucent lens, natural TPU light band, TPU foot |

Rough cost: **about $245 in parts**, plus consumables and printing (`bom.csv`).

## Checks

`~/.venvs/goldfish-cad/bin/python v01/validate.py` runs everything and writes `validation.json`:
- unit tests;
- protocol conformance in Python and JavaScript, plus the parity fuzz;
- fit, printable meshes, wall thickness and the geometric review;
- the electrical simulation;
- light-ring parity;
- site checks;
- docs against the data: the counts, sizes and masses this README, `BUILD-LOG.md`, `BACKLOG.md` and `AGENTS.md` state, and the ADR table in the build log.

## Known gaps

The full list is in [`../BACKLOG.md`](../BACKLOG.md).

- **Out of stock:** the Radxa ZERO 3E (B-02); the SparkFun NFC tag has no EU stock (B-04).
- **Battery and heat:** about 3.1 h of a busy meeting and 3.8 h of listening per charge at typical power, 2.7 h at worst (simulated); continuous on a USB-C charger. Heat then sets the limit: the firmware holds the Radxa to about 2.4 W on a charger (B-40). The 72-hour stream on battery alone needs a v02 architecture; model energy efficiency is its own research track (B-41).
- **Not yet measured:** speech recognition and summariser speed on the RK3566, real current draw, standby drain with the Pololu switch off (B-32), shell and cell temperature (B-40).
- **Firmware still to write:** audio pipeline, the ring's SPI encoder, the daemon, the eye-button GPIO handler (the logic is `Goldfish.press_eye`), the provisional-window key hold (B-30), per-voice erase keys (B-26), the bring-up script (B-31).

## Regenerate

The order matters; [`AGENTS.md`](../AGENTS.md) has the rules. Run from the repo root.

```sh
uv venv --python 3.12 ~/.venvs/goldfish-cad && uv pip install --python ~/.venvs/goldfish-cad/bin/python build123d trimesh numpy scipy pytest rtree
PY=~/.venvs/goldfish-cad/bin/python
$PY v01/cad/pebble_enclosure.py     # fit + printable parts (STEP + STL) into out_pebble/ (5–10 min)
$PY v01/cad/wire_routes.py          # wire routes → out_pebble/wires.json and the cut list in wiring.md (≈ 10 min)
$PY v01/cad/make_web.py             # web meshes + print.json
$PY v01/validate.py                 # all checks, including the geometric review and the power simulation
python3 site/build.py && python3 site/build.py --web   # site (local file + deployable folder)
```