The working list of everything known to be open. Each round of work updates it; BUILD-LOG.md records which round last did. Each item has a priority, an area, a definition of done, and where it came from. The site's Specification renders this table; edit it here.
| ID | Priority | Area | Item | Done when | Source |
|---|---|---|---|---|---|
| B-01 | P0 | Sourcing | Done 2026-10-13: EREMIT 4000 mAh (in stock in DE, ADR-0014); bay 91 × 61 × 9.3 mm, foam under the cell only | A cell in stock in the EU, fit check passing | v01/bom.csv |
| B-02 | P0 | Sourcing | Find a Radxa ZERO 3E 4 GB in stock (Arace sold out; no EU stock found) | Order placed, or an alternative board with the same keep-out | v01/bom.csv |
| B-03 | P0 | Sourcing | Done 2026-10-12: Adafruit PCF8523 (5189), STEMMA QT plug-in, own CR1220 cell | An equivalent I²C RTC board with a backup cell, 3.3 V pull-ups | v01/bom.csv |
| B-04 | P0 | Sourcing | Order the SparkFun ST25DV64KC tag (US stock only) or an EU equivalent | Part in hand | v01/bom.csv |
| B-05 | P0 | Hardware | Done 2026-10-12: obsolete: the read button is gone (ADR-0013); the eye button uses a 6 × 6 × 4.3 mm DTS-61K, checked by the geometric review | Datasheet height entered in the layout; review passes | review_geometry.py |
| B-06 | P0 | Print a light-band sample in natural TPU over a 3-LED strip offcut | Colours readable at 2 m in daylight and under office light | ADR-0009 | |
| B-07 | P0 | Sourcing | Source 1 mm foam tape and 1 mm / 2 mm closed-cell foam (mic seals, battery pads) | Product links in the BOM | v01/bom.csv |
| B-08 | P1 | Firmware | Write the SPI ring encoder (ring.py): ring frames → SK6812 bits, 35 % hard brightness cap |
Bench test lights the 50-LED ring + icon from display.ring_frame |
v01/README.md |
| B-09 | P1 | Firmware | Audio pipeline: I²S capture → VAD → keyword spotter → streaming ASR on the RK3566 | Real-time factor < 1 on the board; lowering phrases detected in < 1 s | 05-firmware |
| B-10 | P1 | Firmware | Measure power on the real board (listen, ASR, distil) and replace the simulation's Radxa bounds | sim/power_sim.py uses measured figures |
sim/power_report.json |
| B-11 | P1 | Firmware | Speaker-turn separation in RAM only; measure the command-attribution error rate | Error rate reported; uncertain speakers lower the room (ADR-0008) | ADR-0008 |
| B-12 | P1 | Firmware | NFC hand-off on the real tag: arm for 10 s by holding the eye, phone reads the note | Android and iPhone read a note end to end | ADR-0007 |
| B-13 | P1 | Firmware | Desk config (config.toml): default level, forgetting curve, owner name |
Assembly step 1 works without code edits | v01/assembly.md |
| B-14 | P1 | Hardware | Assemble the first kit; check strip solder joints at the nose and tail bends | Geometric and electrical checks repeated on the real unit | ADR-0009 |
| B-15 | P1 | Research | Ring cold-read test: can strangers read their own segment and level? | ≥ 8 of 10 strangers read level and owner correctly | open-questions #7 |
| B-16 | P1 | Research | Collect lowering phrases from real people in English and Spanish | ≥ 200 phrases in the corpus; parser recall reported | open-questions #3 |
| B-17 | P1 | Site | Mobile microphone doesn't record on Rafa's phone | Root cause found (needs phone, browser and status box) | conversation 2026-10-12 |
| B-18 | P1 | Accessibility | A non-visual signal for blind participants (haptic pulse on lowering? a tone is excluded) | Decision record | open-questions #8 |
| B-19 | P1 | Legal | Counsel review: all-party-consent states, GDPR Art. 9 voice, BIPA, AI Act Art. 5(1)(f) | Written opinion; default-on policy decided | v01/research/market.md §3 |
| B-20 | P1 | Decision | How long outcomes (R1) last; whether anything can ever be copied off | ADRs written | open-questions #10, #14 |
| B-21 | P2 | Architecture | v02 low-power capture: an audio MCU/DSP for capture + keyword spotting (≈ 30–60 mW); transcription only while charging | 72 h on ≤ 4 Wh in simulation, then on a dev board | sim/power_report.json |
| B-22 | P2 | Hardware | v02 custom PCB: consolidate the breakouts; target ≈ 100 × 44 × 18 mm | EVT board brought up | site §7 Production |
| B-23 | P2 | Protocol | Publish the Resolution Protocol draft: phrase grammar, levels, decay schedule, ring semantics, test suite | Public spec + conformance tests | market.md §6 option A |
| B-24 | P2 | Business | Find one anchor partner (a conference, newsroom, law firm, or a wearable maker) for a pilot | Letter of intent | market.md §6 |
| B-25 | P2 | Sources | Recover the Claude.ai Goldfish discussions into 00-sources/ |
Export imported, quotes traced | ROADMAP.md phase 0 |
| B-26 | P1 | Store | Per-voice erasure on Goldfish: per-voice data keys wrapped under the chain keys, with a revocation counter in the ATECC608 | erase makes one voice's words unrecoverable while others' stay readable |
ADR-0010 |
| B-27 | P2 | Protocol | External review of RP 0.1 by privacy engineers, one meeting-software team and one wearable maker | Written comments resolved into RP 0.2 | protocol/SPEC.md |
| B-28 | P0 | Hardware | Done 2026-10-12: no SMD left: C&K OS102011MA1QN1 through-hole slide switches and a DTS-61K tactile switch (ADR-0013) | Switches mounted behind their slots without flying SMD leads | v01/bom.csv A3 |
| B-29 | P2 | Firmware | Claiming extension on Goldfish: keep consented voice features in the secure store, re-identify claimed voices, apply their standing preference (RP §11.2, App. A.2) | A claimed voice is recognised in a later session; forget of everything withdraws the claim |
ADR-0010, ADR-0012 |
| B-30 | P1 | Store | Hold provisional-window content under a key destroyed on objection, session end or reboot, and promoted on confirmation (RP §6.3 point 7) | A reboot inside the window leaves only pre-raise content | RP 0.2 |
| B-31 | P1 | Firmware | Done in simulation 2026-10-14: firmware/tools/ring_test.py (battery gauge, each segment, the room-off glow, the icon LED first in the chain; --sim on a laptop). Still to run on the kit |
Assembly step 7b runs it on the kit | v01/assembly.md |
| B-32 | P1 | Hardware | Measure the standby drain with the power switch off (Pololu 2810 off-state current is not published) | Measured µA in sim/design.json; shelf life stated |
sim/power_report.json |
| B-33 | P1 | Hardware | Eye-button feel: force (DTS-61K 1 N vs 61N 1.6 N; an edge press needs ≈ 0.6× the switch force), travel, the 0.05 mm preload. Accidental presses are accepted (Rafa, 2026-10-13): a press can only take the room off | 10 people press it on purpose and handle it without pressing it; switch force chosen (DTS-61K 1 N or 61N 1.6 N) | ADR-0013 |
| B-34 | P1 | Power | Done 2026-10-13: a 4000 mAh cell and the bq24074 charger (ADR-0014): 3.1 h typical, 2.7 h worst case, and continuous on a USB-C charger | Simulation passes the 3 h typical / 2 h worst targets | ADR-0014 |
| B-35 | P1 | Firmware | OS recipe: Radxa image, device-tree overlays for I²S3, SPI and I²C3, pinned ASR/LLM model versions, a WAV-in pipeline script that runs without the kit | A newcomer runs the pipeline on a laptop and on the board from the README | builder simulation (firmware engineer) |
| B-36 | P2 | Protocol | Resume policy option in profiles: back on the record by anyone (today), by whoever lowered it, or by everyone | Profile field, vectors, both implementations | builder simulation (meeting-software adopter) |
| B-37 | P2 | Protocol | Cloud profile: deletion across storage tiers and backups, serialisable sessions, regeneration of derived artefacts after a lowering | Draft appendix and vectors | builder simulation (meeting-software adopter) |
| B-38 | P2 | Protocol | Session serialisation format, a UI-intent API note and an interop transport for exchanges | Documented and covered by vectors | builder simulation (meeting-software adopter) |
| B-39 | P2 | Hardware | Validate the first-pixel level shift (icon LED on a 1N4148) across battery and temperature; 74AHCT125 as the fallback | No data errors from 0–40 °C on the bench | sim/power_report.json |
| B-40 | P1 | Hardware | Measure heat on a 4 h plugged-in recording: RK3566 thermal zone, a thermocouple on the cell and on the shell; check the pad + spreader path and set the firmware's thermal budget | Measured °C in sim/design.json; the shell stays ≤ 45 °C in a 25 °C room |
ADR-0014 |
| B-41 | P1 | Research | Model energy efficiency as a research track: joules per transcribed minute and per summary for candidate ASR and LLM models on the RK3566 (quantisation, NPU vs CPU, streaming vs burst, keyword spotter on one core) | A published table of J/min and accuracy per model, and the v01 default chosen from it | Rafa, 2026-10-13 |
| B-42 | P2 | Sourcing | Soldered 333288 (5000 mAh, 75 × 55 × 10 mm) as a drop-in upgrade when back in stock; a narrower pebble if a 40 mm-wide 4000 mAh cell appears in EU stock | Cell fitted, simulation rerun | ADR-0014 |
| B-43 | P1 | Hardware | Drop test: 1.2 m onto hardwood and concrete on every face (D-01). At 266 g a 1 m drop is ≈ 2.6 J; the old 1.5 J geometry line was retired. Look at the board posts' flared roots (ADR-0016) and the eye cradle's three pins, which are not flared, after each drop; and the inserts (ADR-0017) for pull-out | Three prints survive 10 drops each with the band on; the shells stay closed | ADR-0015 |
| B-44 | P1 | Hardware | Sense the power slide on a GPIO and hold power with a keep-alive until a clean shutdown, so a bumped switch can't lose the meeting's buffer or corrupt the card Firmware state machine done in simulation (goldfish/power.py, 2026-10-14); needs two lines on the kit: the spare throw of SW1 to a GPIO with pull-up (proposed pin 22), and a second PN2222A holding the 2810's control on (proposed pin 15, 4.7 kΩ base, 100 kΩ to GND) |
Switch off mid-recording: the note is written, the card stays clean | ADR-0015 (owner simulation) |
| B-45 | P2 | Hardware | A third microphone (or a better direction estimate) so each person gets one arc on their own side instead of two mirrored arcs | Two people at mirrored seats get separate arcs | ADR-0015 |
| B-46 | P1 | Hardware | Open and close a printed pair 50 times: the snaps (now 0.10 mm interference) shouldn't whiten; if they do, add two M2.5 screws from the belly into the thick tips | No whitening after 50 cycles | ADR-0015 (mechanical review) |
| B-47 | P2 | Hardware | Done 2026-10-14 (ADR-0018): the battery deck, screwed to four floor posts, clamps the cell and carries boards; the cell comes out with four screws | Cell swapped without unsticking anything | ADR-0015 (builder simulation) |
| B-48 | P1 | Hardware | Done 2026-10-14 (ADR-0020): every board in the bottom shell; the lid joins it through one latched 12-way plug (Harwin Gecko G125): the 6 wire runs across the seam all end at it (ADR-0021: 6 runs, 12 wires, one per contact), and the lid comes off completely | The shells separate fully with one unplug | ADR-0020 |
| B-49 | P2 | Accessibility | Localise the reader page (lang from the note), raise the tail icon 1 mm, and charging / low-battery cues on the ring and the motor | Spanish note reads in Spanish; a charging cue shows | ADR-0015 (accessibility simulation) |
| B-50 | P1 | Firmware | Haptic patterns (display.HAPTIC) on the real ERM: can people tell "off", "still off", "back on" and "battery" apart without looking? |
8 of 10 people name each pattern | ADR-0015 |
| B-51 | P1 | Hardware | Print the test coupon (test_coupons.stl, assembly step 1.0) on the kit's reference printer and record which insert bore, tongue fit, icon skin and cap socket win; set INSERT_HOLE, FIT, the skin and the socket from it |
Coupon results in BUILD-LOG.md; constants set; shells printed from them |
ADR-0017 |
| B-52 | P1 | Sourcing | A flexible contact adhesive for the TPU foot (E6000 or similar) with an opened EU shop link and stock status | BOM row with a checked link | ADR-0017 |
| B-53 | P2 | Tooling | Generated meshes are tracked in git (≈ 63 MB of out_pebble/ and site/web/; .git is 210 MB), and each CAD change rewrites ≈ 6 MB of STL in five places. Choose: Git LFS, or untrack and build in CI. The owner decides: it changes the history and the deploy |
A decision, and the repo follows it | ADR-0017 review |
| B-54 | P1 | Hardware | A printed clamp over each friction-lock plug (JST-PH battery lead, STEMMA QT, PicoBlade): every series in the kit is "Friction lock" only (JST's own pages), and Kapton is a stopgap | A plug survives the shake test (7b) and comes off without tools | ADR-0018 |
| B-55 | P2 | Tooling | The packer is greedy and fragile: a 1 mm change in width moves a part from fitting to failing, and a pack takes ≈ 43 s (validation reruns it). A search that tries orders (or a small solver), and a spatial index for the overlap tests | The size sweep is monotonic; a pack in under 10 s | ADR-0018 |
| B-56 | P1 | Firmware | A fuel gauge. Nothing measures the battery: the gauge on the ring, the 3.0 V shutdown in wiring.md and the low-battery cue have no input. Candidate: MAX17048 (STEMMA QT, I²C 0x36), not yet checked | The gauge reads the real cell on the kit | firmware hardware layer (2026-10-14) |
| B-57 | P1 | Protocol | A panicked triple tap brings the room back on: presses at 1.0, 1.2 and 1.4 s give lowered, still-off, provisional. The resume rule only checks that the previous press found the room already off. Needs an ADR: e.g. a double press resumes only after a pause since the last "off" | Decided; vectors and both implementations follow | firmware hardware layer (2026-10-14) |
| B-58 | P2 | Firmware | Smaller firmware findings, reported not fixed: eye_down returns "applied" where HAPTIC names "lowered"; handoff.fit's dropped-section text still says "Hold the eye again later" (stale since ADR-0015; mirrored in JS); a 10 min session gap ends an "off" room and the next meeting starts on the record; st25dv.handoff() (the old hold-and-wipe flow) is marked superseded |
Each fixed in Python and JS, or ruled intended | firmware hardware layer (2026-10-14) |
| B-59 | P1 | Firmware | VERIFY items in the hardware layer, on the kit: GPIO lines (eye pin 16, motor pin 18), /dev/spidev3.0 and /dev/i2c-3 overlays, SPI 6.4 MHz bit patterns and GRB order for both LED parts, a 1704-byte frame within spidev's buffer, DTS-61K bounce < 20 ms, ST25DV registers and write timing, SPH0645 at 16 kHz |
Each item checked on the kit; VERIFY marks removed |
firmware hardware layer (2026-10-14) |
| B-60 | P1 | Sourcing | The M2.5 screw and nut kit: Rafa's Amazon assortment as the example link (opened, with counts: ≥ 40 × M2.5 × 6, ≥ 35 nuts of 5.0 mm across flats); and the 3DJake M2.5 nut pack's stock, which its page doesn't show | BOM row with a checked link and stock | ADR-0018 |
| B-61 | P2 | Tooling | The top shell's STEP export grew from 84 MB to 1.2 GB with the bosses (the bottom shell's to 202 MB); the STLs are fine at 0.01 mm. STEP isn't tracked or published, but a 1.2 GB file is useless to a CAD user. Find which features blow it up (likely the revolved flares or the many small cuts), and simplify | Top shell STEP under 100 MB | ADR-0018 |
| B-62 | P1 | Protocol | In a round-robin meeting, side_conversations can split one table into groups. The site's 20 lines run through the protocol 4 s apart linked Ada–Bruno–Chiara and Dmitri–Esi (each pair twice within reply_window), so Bruno's "Between us" took only Ada, Bruno and Chiara off the record. At the site's own timing it covered all five. A five-person round-robin is the normal case, not a side conversation |
Decided (an ADR: e.g. a split needs a pair to exclude the others, not only reply to each other); vectors and both implementations follow | firmware flow (2026-10-14) |
| B-63 | P1 | Protocol | A room lowering inside an objection window undoes the raise retroactively (SPEC §6.3), so everything said on the record since the resume is lowered with it. In the browser, a double-press resume, four ordinary lines, then Bruno's "Between us" 20 s later erased those four lines from the note. Rafa's rule is "lowering beats raising"; whether a lowering should also count as an objection to everything since the resume is a separate question | Decided in an ADR; vectors follow | firmware flow (2026-10-14) |
| B-64 | P1 | Firmware | Haptic patterns are switched from the 30 Hz main loop, so every edge lands up to one pass (33 ms) late: the flow test measures "provisional" 80/120/80 ms as 83/133/67 ms, and a 40 ms "battery" pulse can last 33–73 ms, the same as a 60 ms "still-off". Give the motor its own timer (a thread, or wake the loop at the next switch time) | The flow test's haptic slack drops from one pass to 5 ms | firmware flow (2026-10-14) |
| B-65 | P1 | Firmware | Writing the note blocks the main loop: st25dv.write_image sleeps 6 ms per 4-byte page, so the 1.2 KB note froze the ring and the eye for 1.8 s, and a full 8 KB tag would take about 12 s. Presses aren't lost (edges keep their time) but are answered late. Write the tag in a thread, or a few pages per pass |
The ring keeps breathing and a press is answered within one pass during a tag write | firmware flow (2026-10-14) |
| B-66 | P2 | Site | The Device tab still runs the JS preview (goldfish.js); the Meeting tab runs the firmware (ADR-0019). Move the Device tab to SimRun too: the microphone and typed lines as hear(), its memory view from the session's records |
The Device tab says "Engine: firmware (Python)" once loaded; "Light ring parity" then covers only the offline fallback | ADR-0019 |
| B-67 | P1 | Sourcing | The lid connector pair (Harwin G125-MC11205L4-0150L + G125-FC11205L0-0450L, the 450 mm socket since ADR-0021) costs ≈ €92 ex VAT and DigiKey lists a 15-week standard lead time (the plug had 16 in stock on 2026-10-14). Order early, or find a cheaper latched wire-to-wire 12-way with ready-made leads | Two kits' worth in hand, or a checked cheaper part | ADR-0020 |
| B-68 | P2 | Hardware | The body grew to 182 mm to fit the 41 × 33 mm charger in the bottom shell. A smaller power-path charger (ideally with the 5 V boost on board) would take it back toward 160 mm and drop the boost board | A checked part that passes the electrical simulation and packs shorter | ADR-0020 |
| B-69 | P2 | Bring-up | Four pad facts come from photos or are open (ADR-0021): the NeoPixel Mini's back pads (2 columns 4.0 mm apart, rows 2.0 mm), which of the 2969's three cut-line pads is +5V, DIN or GND, and how the 5830's VIN 2 and On pins are tied. Check each on the boards in hand and correct board_pads.py and wiring.md |
The three rows say "checked on the board" with a date | ADR-0021 |
| B-70 | P3 | Model | The Pololu 2810's box is 15.2 × 15.2 × 3.5 mm; Pololu's STEP is 2.4 mm tall with its slide actuator 0.9 mm past one edge. The box is safe (taller) but leaves out the actuator, which must face open space so its switch can be set to OFF | The box and an actuator keep-out from Pololu's STEP | ADR-0021 |
| B-71 | P3 | Model | The mic is drawn from a proxy (Adafruit 6049's STEP, can on top, turned over). The real 3421 carries its mic on its underside (its .brd); pads are placed for the real board. Build a model from the 3421 .brd, as for the secure element | The site draws the 3421 from its own board file | ADR-0021 |
| B-72 | P2 | Bring-up | The slide switches lie on their backs with their pins trimmed to 1.5 mm (ADR-0021). Check on the first build that a 30 AWG joint on a trimmed pin holds, that the wires rise behind the switch without touching the cell, and that the printed cap still drives the actuator through its 2.0 mm travel | Done on the first build, with a photo | ADR-0021 |
| B-73 | P2 | Sourcing | The vertical switch (OS102011MS2QN1) and both 450 mm Harwin pigtails were priced from DigiKey search listings only; open each product page and record the link, stock and date in the BOM | Three product links opened and dated | ADR-0021 |
| B-75 | P1 | Firmware | The note on the NFC tag never ages: midnight never rewrites it (SPEC §5.4), and any phone that touches the tail can read the last note (ADR-0015). Age the tag's copy with the store, or clear it after a set time | The tag holds only what the store can still read; a test covers day 4 and day 31 | 01-concept/landing/privacy-review.md, 2026-10-15 |
| B-76 | P2 | Site | The launch sign-up sends nothing. Add POST /goldfish/presale to the rafa-inbox Worker (D1 + Telegram, honeypot _hp, allow npc.here.now), set how long sign-ups are kept, and wire the form |
A test sign-up reaches Telegram; the form's notice states the retention | ADR-0022; deploying the Worker is Rafa's call |
| B-77 | P2 | Site | The landing page uses free stock photos. Shoot real facilitators in real sessions (bright, people over 55 too, people building the kit together) | The stock photos are replaced; releases on file | ADR-0022 |
| B-79 | Done | Site | "Listen in" on the landing page's 3D model uses the browser's own voices. Generate natural voices with site/landing_voices.py (OpenAI or ElevenLabs; key in ~/.config/goldfish/openai.key or elevenlabs.key, never in the repo), rebuild and deploy |
site/landing/voices/manifest.json and nine audio files are live; the page says the voices are computer-generated |
Rafa, 2026-10-15 Done 2026-10-15 with Fish Audio in the browser (Free plan: internal demo only; a public launch needs a paid plan or other voices). |
| B-78 | P2 | Site | "See it on GitHub" links a private repository | The repository is public, or the link points at the source zip | ADR-0022; making the repo public is Rafa's call |
| B-80 | P2 | Funding | Apply to the Prototype Fund, Class 03 ("Innovation" track, up to €47,500 for six months, software only): the protocol's conformance suite, a forgetting-store library and spec v0.3. Deadline 30 Nov 2026, 15:00 CET. Rafa writes the answers himself (the fund wants no machine-conceived ideas) from the outline | Application submitted on the Prototype Fund platform before the deadline; confirmation email kept | 11-grants/README.md, 11-grants/01-prototype-fund.md; Rafa, 2026-10-16. Needs B-78 decided first |
| B-81 | P2 | Mods | Mod framework: a pack is a signed file installed over USB-C; the secure element checks the signature and an offline licence tied to the serial number; a pack declares its memory and compute needs | A signed sample pack installs on the sim board; an unsigned, wrongly licensed or too-heavy pack is refused | ADR-0023; Rafa, 2026-10-16 |
| B-82 | P2 | Mods | The "only lower" check: a hostile test pack tries to raise a level, override a person's choice, extend retention and add an output | A check in validate.py refuses every attempt; the rule tests cover it |
ADR-0023; Rafa, 2026-10-16 |
| B-83 | P2 | Mods | The note names the active mods: a mods: front-matter field with each pack and version |
v01/note-format.md, daemon.py and goldfish.js agree; parity check passes |
ADR-0023; Rafa, 2026-10-16 |
| B-84 | P2 | Mods | German pack: a speech model and the spoken-request phrases in German (the works-council segment) | Parser recall on ≥ 200 real German phrases reported; speech recognition real-time on the board | ADR-0023; Rafa, 2026-10-16 |
| B-85 | P2 | Mods | Research pack: personal details removed by default, insight tags against a codebook, for UX and qualitative research | Tested on consented sample sessions; reviewed by one university ethics board | ADR-0023; Rafa, 2026-10-16 |
| B-86 | P2 | Mods | Facilitator pack: a talk-time balance light (who hasn't spoken), decision capture, a parking lot for side topics; structure only, no emotion or sentiment | Cold-read test of the balance light (≥ 8 of 10 read it); used in 3 facilitators' sessions | ADR-0023; Rafa, 2026-10-16 |
| B-87 | P1 | Outreach | Design-partner program: about 10 organisations across works councils, researchers and facilitators; kits on loan, a consent script, a session plan and a debrief after each session | 10 partners signed up; the first 5 sessions debriefed against the questions in ROADMAP.md | ROADMAP.md (customer outreach); Rafa, 2026-10-16 |
| B-88 | P1 | Outreach | Paperwork that removes the blocker: a one-page privacy sheet for IT, and a draft works agreement for works councils | Both reviewed by counsel (with B-19) and shared with the design partners | ROADMAP.md (customer outreach); Rafa, 2026-10-16 |
| B-89 | P2 | Outreach | Segment the waitlist by the sign-up's "What kind of sessions do you run?" answer; landing-page variants for works councils, researchers and facilitators | Variants live; each sign-up tagged with a segment (needs the live sign-up, B-76) | ROADMAP.md (customer outreach); Rafa, 2026-10-16 |
| B-90 | P2 | Outreach | Talk to Cortico and the MIT Center for Constructive Communication, the closest neighbour, about the protocol and shared rituals for in-person circles | A first conversation held and written up | 01-concept/market-comparison.md; Rafa, 2026-10-16 |
# Backlog
The working list of everything known to be open. Each round of work updates it; `BUILD-LOG.md` records which round last did. Each item has a priority, an area, a definition of done, and where it came from. The site's Specification renders this table; edit it here.
- **P0:** blocks building or ordering the v01 kit.
- **P1:** needed before the v01 field test.
- **P2:** needed for v02 or the business.
| ID | Priority | Area | Item | Done when | Source |
|---|---|---|---|---|---|
| B-01 | P0 | Sourcing | **Done 2026-10-13:** EREMIT 4000 mAh (in stock in DE, ADR-0014); bay 91 × 61 × 9.3 mm, foam under the cell only | A cell in stock in the EU, fit check passing | v01/bom.csv |
| B-02 | P0 | Sourcing | Find a Radxa ZERO 3E 4 GB in stock (Arace sold out; no EU stock found) | Order placed, or an alternative board with the same keep-out | v01/bom.csv |
| B-03 | P0 | Sourcing | **Done 2026-10-12:** Adafruit PCF8523 (5189), STEMMA QT plug-in, own CR1220 cell | An equivalent I²C RTC board with a backup cell, 3.3 V pull-ups | v01/bom.csv |
| B-04 | P0 | Sourcing | Order the SparkFun ST25DV64KC tag (US stock only) or an EU equivalent | Part in hand | v01/bom.csv |
| B-05 | P0 | Hardware | **Done 2026-10-12:** obsolete: the read button is gone (ADR-0013); the eye button uses a 6 × 6 × 4.3 mm DTS-61K, checked by the geometric review | Datasheet height entered in the layout; review passes | review_geometry.py |
| B-06 | P0 | Print | Print a light-band sample in natural TPU over a 3-LED strip offcut | Colours readable at 2 m in daylight and under office light | ADR-0009 |
| B-07 | P0 | Sourcing | Source 1 mm foam tape and 1 mm / 2 mm closed-cell foam (mic seals, battery pads) | Product links in the BOM | v01/bom.csv |
| B-08 | P1 | Firmware | Write the SPI ring encoder (`ring.py`): ring frames → SK6812 bits, 35 % hard brightness cap | Bench test lights the 50-LED ring + icon from `display.ring_frame` | v01/README.md |
| B-09 | P1 | Firmware | Audio pipeline: I²S capture → VAD → keyword spotter → streaming ASR on the RK3566 | Real-time factor < 1 on the board; lowering phrases detected in < 1 s | 05-firmware |
| B-10 | P1 | Firmware | Measure power on the real board (listen, ASR, distil) and replace the simulation's Radxa bounds | `sim/power_sim.py` uses measured figures | sim/power_report.json |
| B-11 | P1 | Firmware | Speaker-turn separation in RAM only; measure the command-attribution error rate | Error rate reported; uncertain speakers lower the room (ADR-0008) | ADR-0008 |
| B-12 | P1 | Firmware | NFC hand-off on the real tag: arm for 10 s by holding the eye, phone reads the note | Android and iPhone read a note end to end | ADR-0007 |
| B-13 | P1 | Firmware | Desk config (`config.toml`): default level, forgetting curve, owner name | Assembly step 1 works without code edits | v01/assembly.md |
| B-14 | P1 | Hardware | Assemble the first kit; check strip solder joints at the nose and tail bends | Geometric and electrical checks repeated on the real unit | ADR-0009 |
| B-15 | P1 | Research | Ring cold-read test: can strangers read their own segment and level? | ≥ 8 of 10 strangers read level and owner correctly | open-questions #7 |
| B-16 | P1 | Research | Collect lowering phrases from real people in English and Spanish | ≥ 200 phrases in the corpus; parser recall reported | open-questions #3 |
| B-17 | P1 | Site | Mobile microphone doesn't record on Rafa's phone | Root cause found (needs phone, browser and status box) | conversation 2026-10-12 |
| B-18 | P1 | Accessibility | A non-visual signal for blind participants (haptic pulse on lowering? a tone is excluded) | Decision record | open-questions #8 |
| B-19 | P1 | Legal | Counsel review: all-party-consent states, GDPR Art. 9 voice, BIPA, AI Act Art. 5(1)(f) | Written opinion; default-on policy decided | v01/research/market.md §3 |
| B-20 | P1 | Decision | How long outcomes (R1) last; whether anything can ever be copied off | ADRs written | open-questions #10, #14 |
| B-21 | P2 | Architecture | v02 low-power capture: an audio MCU/DSP for capture + keyword spotting (≈ 30–60 mW); transcription only while charging | 72 h on ≤ 4 Wh in simulation, then on a dev board | sim/power_report.json |
| B-22 | P2 | Hardware | v02 custom PCB: consolidate the breakouts; target ≈ 100 × 44 × 18 mm | EVT board brought up | site §7 Production |
| B-23 | P2 | Protocol | Publish the Resolution Protocol draft: phrase grammar, levels, decay schedule, ring semantics, test suite | Public spec + conformance tests | market.md §6 option A |
| B-24 | P2 | Business | Find one anchor partner (a conference, newsroom, law firm, or a wearable maker) for a pilot | Letter of intent | market.md §6 |
| B-25 | P2 | Sources | Recover the Claude.ai Goldfish discussions into `00-sources/` | Export imported, quotes traced | ROADMAP.md phase 0 |
| B-26 | P1 | Store | Per-voice erasure on Goldfish: per-voice data keys wrapped under the chain keys, with a revocation counter in the ATECC608 | `erase` makes one voice's words unrecoverable while others' stay readable | ADR-0010 |
| B-27 | P2 | Protocol | External review of RP 0.1 by privacy engineers, one meeting-software team and one wearable maker | Written comments resolved into RP 0.2 | protocol/SPEC.md |
| B-28 | P0 | Hardware | **Done 2026-10-12:** no SMD left: C&K OS102011MA1QN1 through-hole slide switches and a DTS-61K tactile switch (ADR-0013) | Switches mounted behind their slots without flying SMD leads | v01/bom.csv A3 |
| B-29 | P2 | Firmware | Claiming extension on Goldfish: keep consented voice features in the secure store, re-identify claimed voices, apply their standing preference (RP §11.2, App. A.2) | A claimed voice is recognised in a later session; `forget` of everything withdraws the claim | ADR-0010, ADR-0012 |
| B-30 | P1 | Store | Hold provisional-window content under a key destroyed on objection, session end or reboot, and promoted on confirmation (RP §6.3 point 7) | A reboot inside the window leaves only pre-raise content | RP 0.2 |
| B-31 | P1 | Firmware | **Done in simulation 2026-10-14:** `firmware/tools/ring_test.py` (battery gauge, each segment, the room-off glow, the icon LED first in the chain; `--sim` on a laptop). Still to run on the kit | Assembly step 7b runs it on the kit | v01/assembly.md |
| B-32 | P1 | Hardware | Measure the standby drain with the power switch off (Pololu 2810 off-state current is not published) | Measured µA in `sim/design.json`; shelf life stated | sim/power_report.json |
| B-33 | P1 | Hardware | Eye-button feel: force (DTS-61K 1 N vs 61N 1.6 N; an edge press needs ≈ 0.6× the switch force), travel, the 0.05 mm preload. Accidental presses are accepted (Rafa, 2026-10-13): a press can only take the room off | 10 people press it on purpose and handle it without pressing it; switch force chosen (DTS-61K 1 N or 61N 1.6 N) | ADR-0013 |
| B-34 | P1 | Power | **Done 2026-10-13:** a 4000 mAh cell and the bq24074 charger (ADR-0014): 3.1 h typical, 2.7 h worst case, and continuous on a USB-C charger | Simulation passes the 3 h typical / 2 h worst targets | ADR-0014 |
| B-35 | P1 | Firmware | OS recipe: Radxa image, device-tree overlays for I²S3, SPI and I²C3, pinned ASR/LLM model versions, a WAV-in pipeline script that runs without the kit | A newcomer runs the pipeline on a laptop and on the board from the README | builder simulation (firmware engineer) |
| B-36 | P2 | Protocol | Resume policy option in profiles: back on the record by anyone (today), by whoever lowered it, or by everyone | Profile field, vectors, both implementations | builder simulation (meeting-software adopter) |
| B-37 | P2 | Protocol | Cloud profile: deletion across storage tiers and backups, serialisable sessions, regeneration of derived artefacts after a lowering | Draft appendix and vectors | builder simulation (meeting-software adopter) |
| B-38 | P2 | Protocol | Session serialisation format, a UI-intent API note and an interop transport for exchanges | Documented and covered by vectors | builder simulation (meeting-software adopter) |
| B-39 | P2 | Hardware | Validate the first-pixel level shift (icon LED on a 1N4148) across battery and temperature; 74AHCT125 as the fallback | No data errors from 0–40 °C on the bench | sim/power_report.json |
| B-40 | P1 | Hardware | Measure heat on a 4 h plugged-in recording: RK3566 thermal zone, a thermocouple on the cell and on the shell; check the pad + spreader path and set the firmware's thermal budget | Measured °C in `sim/design.json`; the shell stays ≤ 45 °C in a 25 °C room | ADR-0014 |
| B-41 | P1 | Research | **Model energy efficiency** as a research track: joules per transcribed minute and per summary for candidate ASR and LLM models on the RK3566 (quantisation, NPU vs CPU, streaming vs burst, keyword spotter on one core) | A published table of J/min and accuracy per model, and the v01 default chosen from it | Rafa, 2026-10-13 |
| B-42 | P2 | Sourcing | Soldered 333288 (5000 mAh, 75 × 55 × 10 mm) as a drop-in upgrade when back in stock; a narrower pebble if a 40 mm-wide 4000 mAh cell appears in EU stock | Cell fitted, simulation rerun | ADR-0014 |
| B-43 | P1 | Hardware | Drop test: 1.2 m onto hardwood and concrete on every face (D-01). At 266 g a 1 m drop is ≈ 2.6 J; the old 1.5 J geometry line was retired. Look at the board posts' flared roots (ADR-0016) and the eye cradle's three pins, which are not flared, after each drop; and the inserts (ADR-0017) for pull-out | Three prints survive 10 drops each with the band on; the shells stay closed | ADR-0015 |
| B-44 | P1 | Hardware | Sense the power slide on a GPIO and hold power with a keep-alive until a clean shutdown, so a bumped switch can't lose the meeting's buffer or corrupt the card Firmware state machine done in simulation (`goldfish/power.py`, 2026-10-14); needs two lines on the kit: the spare throw of SW1 to a GPIO with pull-up (proposed pin 22), and a second PN2222A holding the 2810's control on (proposed pin 15, 4.7 kΩ base, 100 kΩ to GND) | Switch off mid-recording: the note is written, the card stays clean | ADR-0015 (owner simulation) |
| B-45 | P2 | Hardware | A third microphone (or a better direction estimate) so each person gets one arc on their own side instead of two mirrored arcs | Two people at mirrored seats get separate arcs | ADR-0015 |
| B-46 | P1 | Hardware | Open and close a printed pair 50 times: the snaps (now 0.10 mm interference) shouldn't whiten; if they do, add two M2.5 screws from the belly into the thick tips | No whitening after 50 cycles | ADR-0015 (mechanical review) |
| B-47 | P2 | Hardware | **Done 2026-10-14 (ADR-0018):** the battery deck, screwed to four floor posts, clamps the cell and carries boards; the cell comes out with four screws | Cell swapped without unsticking anything | ADR-0015 (builder simulation) |
| B-48 | P1 | Hardware | **Done 2026-10-14 (ADR-0020):** every board in the bottom shell; the lid joins it through one latched 12-way plug (Harwin Gecko G125): the 6 wire runs across the seam all end at it (ADR-0021: 6 runs, 12 wires, one per contact), and the lid comes off completely | The shells separate fully with one unplug | ADR-0020 |
| B-49 | P2 | Accessibility | Localise the reader page (lang from the note), raise the tail icon 1 mm, and charging / low-battery cues on the ring and the motor | Spanish note reads in Spanish; a charging cue shows | ADR-0015 (accessibility simulation) |
| B-50 | P1 | Firmware | Haptic patterns (`display.HAPTIC`) on the real ERM: can people tell "off", "still off", "back on" and "battery" apart without looking? | 8 of 10 people name each pattern | ADR-0015 |
| B-51 | P1 | Hardware | Print the test coupon (`test_coupons.stl`, assembly step 1.0) on the kit's reference printer and record which insert bore, tongue fit, icon skin and cap socket win; set `INSERT_HOLE`, `FIT`, the skin and the socket from it | Coupon results in `BUILD-LOG.md`; constants set; shells printed from them | ADR-0017 |
| B-52 | P1 | Sourcing | A flexible contact adhesive for the TPU foot (E6000 or similar) with an opened EU shop link and stock status | BOM row with a checked link | ADR-0017 |
| B-53 | P2 | Tooling | Generated meshes are tracked in git (≈ 63 MB of `out_pebble/` and `site/web/`; `.git` is 210 MB), and each CAD change rewrites ≈ 6 MB of STL in five places. Choose: Git LFS, or untrack and build in CI. The owner decides: it changes the history and the deploy | A decision, and the repo follows it | ADR-0017 review |
| B-54 | P1 | Hardware | A printed clamp over each friction-lock plug (JST-PH battery lead, STEMMA QT, PicoBlade): every series in the kit is "Friction lock" only (JST's own pages), and Kapton is a stopgap | A plug survives the shake test (7b) and comes off without tools | ADR-0018 |
| B-55 | P2 | Tooling | The packer is greedy and fragile: a 1 mm change in width moves a part from fitting to failing, and a pack takes ≈ 43 s (validation reruns it). A search that tries orders (or a small solver), and a spatial index for the overlap tests | The size sweep is monotonic; a pack in under 10 s | ADR-0018 |
| B-56 | P1 | Firmware | A fuel gauge. Nothing measures the battery: the gauge on the ring, the 3.0 V shutdown in wiring.md and the low-battery cue have no input. Candidate: MAX17048 (STEMMA QT, I²C 0x36), not yet checked | The gauge reads the real cell on the kit | firmware hardware layer (2026-10-14) |
| B-57 | P1 | Protocol | A panicked triple tap brings the room back on: presses at 1.0, 1.2 and 1.4 s give lowered, still-off, provisional. The resume rule only checks that the previous press found the room already off. Needs an ADR: e.g. a double press resumes only after a pause since the last "off" | Decided; vectors and both implementations follow | firmware hardware layer (2026-10-14) |
| B-58 | P2 | Firmware | Smaller firmware findings, reported not fixed: `eye_down` returns "applied" where `HAPTIC` names "lowered"; `handoff.fit`'s dropped-section text still says "Hold the eye again later" (stale since ADR-0015; mirrored in JS); a 10 min session gap ends an "off" room and the next meeting starts on the record; `st25dv.handoff()` (the old hold-and-wipe flow) is marked superseded | Each fixed in Python and JS, or ruled intended | firmware hardware layer (2026-10-14) |
| B-59 | P1 | Firmware | VERIFY items in the hardware layer, on the kit: GPIO lines (eye pin 16, motor pin 18), `/dev/spidev3.0` and `/dev/i2c-3` overlays, SPI 6.4 MHz bit patterns and GRB order for both LED parts, a 1704-byte frame within spidev's buffer, DTS-61K bounce < 20 ms, ST25DV registers and write timing, SPH0645 at 16 kHz | Each item checked on the kit; `VERIFY` marks removed | firmware hardware layer (2026-10-14) |
| B-60 | P1 | Sourcing | The M2.5 screw and nut kit: Rafa's Amazon assortment as the example link (opened, with counts: ≥ 40 × M2.5 × 6, ≥ 35 nuts of 5.0 mm across flats); and the 3DJake M2.5 nut pack's stock, which its page doesn't show | BOM row with a checked link and stock | ADR-0018 |
| B-61 | P2 | Tooling | The top shell's STEP export grew from 84 MB to 1.2 GB with the bosses (the bottom shell's to 202 MB); the STLs are fine at 0.01 mm. STEP isn't tracked or published, but a 1.2 GB file is useless to a CAD user. Find which features blow it up (likely the revolved flares or the many small cuts), and simplify | Top shell STEP under 100 MB | ADR-0018 |
| B-62 | P1 | Protocol | In a round-robin meeting, `side_conversations` can split one table into groups. The site's 20 lines run through the protocol 4 s apart linked Ada–Bruno–Chiara and Dmitri–Esi (each pair twice within `reply_window`), so Bruno's "Between us" took only Ada, Bruno and Chiara off the record. At the site's own timing it covered all five. A five-person round-robin is the normal case, not a side conversation | Decided (an ADR: e.g. a split needs a pair to exclude the others, not only reply to each other); vectors and both implementations follow | firmware flow (2026-10-14) |
| B-63 | P1 | Protocol | A room lowering inside an objection window undoes the raise retroactively (SPEC §6.3), so everything said on the record since the resume is lowered with it. In the browser, a double-press resume, four ordinary lines, then Bruno's "Between us" 20 s later erased those four lines from the note. Rafa's rule is "lowering beats raising"; whether a lowering should also count as an objection to everything since the resume is a separate question | Decided in an ADR; vectors follow | firmware flow (2026-10-14) |
| B-64 | P1 | Firmware | Haptic patterns are switched from the 30 Hz main loop, so every edge lands up to one pass (33 ms) late: the flow test measures "provisional" 80/120/80 ms as 83/133/67 ms, and a 40 ms "battery" pulse can last 33–73 ms, the same as a 60 ms "still-off". Give the motor its own timer (a thread, or wake the loop at the next switch time) | The flow test's haptic slack drops from one pass to 5 ms | firmware flow (2026-10-14) |
| B-65 | P1 | Firmware | Writing the note blocks the main loop: `st25dv.write_image` sleeps 6 ms per 4-byte page, so the 1.2 KB note froze the ring and the eye for 1.8 s, and a full 8 KB tag would take about 12 s. Presses aren't lost (edges keep their time) but are answered late. Write the tag in a thread, or a few pages per pass | The ring keeps breathing and a press is answered within one pass during a tag write | firmware flow (2026-10-14) |
| B-66 | P2 | Site | The Device tab still runs the JS preview (`goldfish.js`); the Meeting tab runs the firmware (ADR-0019). Move the Device tab to `SimRun` too: the microphone and typed lines as `hear()`, its memory view from the session's records | The Device tab says "Engine: firmware (Python)" once loaded; "Light ring parity" then covers only the offline fallback | ADR-0019 |
| B-67 | P1 | Sourcing | The lid connector pair (Harwin G125-MC11205L4-0150L + G125-FC11205L0-0450L, the 450 mm socket since ADR-0021) costs ≈ €92 ex VAT and DigiKey lists a 15-week standard lead time (the plug had 16 in stock on 2026-10-14). Order early, or find a cheaper latched wire-to-wire 12-way with ready-made leads | Two kits' worth in hand, or a checked cheaper part | ADR-0020 |
| B-68 | P2 | Hardware | The body grew to 182 mm to fit the 41 × 33 mm charger in the bottom shell. A smaller power-path charger (ideally with the 5 V boost on board) would take it back toward 160 mm and drop the boost board | A checked part that passes the electrical simulation and packs shorter | ADR-0020 |
| B-69 | P2 | Bring-up | Four pad facts come from photos or are open (ADR-0021): the NeoPixel Mini's back pads (2 columns 4.0 mm apart, rows 2.0 mm), which of the 2969's three cut-line pads is +5V, DIN or GND, and how the 5830's VIN 2 and On pins are tied. Check each on the boards in hand and correct `board_pads.py` and `wiring.md` | The three rows say "checked on the board" with a date | ADR-0021 |
| B-70 | P3 | Model | The Pololu 2810's box is 15.2 × 15.2 × 3.5 mm; Pololu's STEP is 2.4 mm tall with its slide actuator 0.9 mm past one edge. The box is safe (taller) but leaves out the actuator, which must face open space so its switch can be set to OFF | The box and an actuator keep-out from Pololu's STEP | ADR-0021 |
| B-71 | P3 | Model | The mic is drawn from a proxy (Adafruit 6049's STEP, can on top, turned over). The real 3421 carries its mic on its underside (its .brd); pads are placed for the real board. Build a model from the 3421 .brd, as for the secure element | The site draws the 3421 from its own board file | ADR-0021 |
| B-72 | P2 | Bring-up | The slide switches lie on their backs with their pins trimmed to 1.5 mm (ADR-0021). Check on the first build that a 30 AWG joint on a trimmed pin holds, that the wires rise behind the switch without touching the cell, and that the printed cap still drives the actuator through its 2.0 mm travel | Done on the first build, with a photo | ADR-0021 |
| B-73 | P2 | Sourcing | The vertical switch (OS102011MS2QN1) and both 450 mm Harwin pigtails were priced from DigiKey search listings only; open each product page and record the link, stock and date in the BOM | Three product links opened and dated | ADR-0021 |
| B-75 | P1 | Firmware | The note on the NFC tag never ages: midnight never rewrites it (SPEC §5.4), and any phone that touches the tail can read the last note (ADR-0015). Age the tag's copy with the store, or clear it after a set time | The tag holds only what the store can still read; a test covers day 4 and day 31 | `01-concept/landing/privacy-review.md`, 2026-10-15 |
| B-76 | P2 | Site | The launch sign-up sends nothing. Add `POST /goldfish/presale` to the rafa-inbox Worker (D1 + Telegram, honeypot `_hp`, allow npc.here.now), set how long sign-ups are kept, and wire the form | A test sign-up reaches Telegram; the form's notice states the retention | ADR-0022; deploying the Worker is Rafa's call |
| B-77 | P2 | Site | The landing page uses free stock photos. Shoot real facilitators in real sessions (bright, people over 55 too, people building the kit together) | The stock photos are replaced; releases on file | ADR-0022 |
| B-79 | Done | Site | "Listen in" on the landing page's 3D model uses the browser's own voices. Generate natural voices with `site/landing_voices.py` (OpenAI or ElevenLabs; key in `~/.config/goldfish/openai.key` or `elevenlabs.key`, never in the repo), rebuild and deploy | `site/landing/voices/manifest.json` and nine audio files are live; the page says the voices are computer-generated | Rafa, 2026-10-15 Done 2026-10-15 with Fish Audio in the browser (Free plan: internal demo only; a public launch needs a paid plan or other voices). |
| B-78 | P2 | Site | "See it on GitHub" links a private repository | The repository is public, or the link points at the source zip | ADR-0022; making the repo public is Rafa's call |
| B-80 | P2 | Funding | Apply to the Prototype Fund, Class 03 ("Innovation" track, up to €47,500 for six months, software only): the protocol's conformance suite, a forgetting-store library and spec v0.3. Deadline 30 Nov 2026, 15:00 CET. Rafa writes the answers himself (the fund wants no machine-conceived ideas) from the outline | Application submitted on the Prototype Fund platform before the deadline; confirmation email kept | `11-grants/README.md`, `11-grants/01-prototype-fund.md`; Rafa, 2026-10-16. Needs B-78 decided first |
| B-81 | P2 | Mods | Mod framework: a pack is a signed file installed over USB-C; the secure element checks the signature and an offline licence tied to the serial number; a pack declares its memory and compute needs | A signed sample pack installs on the sim board; an unsigned, wrongly licensed or too-heavy pack is refused | ADR-0023; Rafa, 2026-10-16 |
| B-82 | P2 | Mods | The "only lower" check: a hostile test pack tries to raise a level, override a person's choice, extend retention and add an output | A check in `validate.py` refuses every attempt; the rule tests cover it | ADR-0023; Rafa, 2026-10-16 |
| B-83 | P2 | Mods | The note names the active mods: a `mods:` front-matter field with each pack and version | `v01/note-format.md`, `daemon.py` and `goldfish.js` agree; parity check passes | ADR-0023; Rafa, 2026-10-16 |
| B-84 | P2 | Mods | German pack: a speech model and the spoken-request phrases in German (the works-council segment) | Parser recall on ≥ 200 real German phrases reported; speech recognition real-time on the board | ADR-0023; Rafa, 2026-10-16 |
| B-85 | P2 | Mods | Research pack: personal details removed by default, insight tags against a codebook, for UX and qualitative research | Tested on consented sample sessions; reviewed by one university ethics board | ADR-0023; Rafa, 2026-10-16 |
| B-86 | P2 | Mods | Facilitator pack: a talk-time balance light (who hasn't spoken), decision capture, a parking lot for side topics; structure only, no emotion or sentiment | Cold-read test of the balance light (≥ 8 of 10 read it); used in 3 facilitators' sessions | ADR-0023; Rafa, 2026-10-16 |
| B-87 | P1 | Outreach | Design-partner program: about 10 organisations across works councils, researchers and facilitators; kits on loan, a consent script, a session plan and a debrief after each session | 10 partners signed up; the first 5 sessions debriefed against the questions in ROADMAP.md | ROADMAP.md (customer outreach); Rafa, 2026-10-16 |
| B-88 | P1 | Outreach | Paperwork that removes the blocker: a one-page privacy sheet for IT, and a draft works agreement for works councils | Both reviewed by counsel (with B-19) and shared with the design partners | ROADMAP.md (customer outreach); Rafa, 2026-10-16 |
| B-89 | P2 | Outreach | Segment the waitlist by the sign-up's "What kind of sessions do you run?" answer; landing-page variants for works councils, researchers and facilitators | Variants live; each sign-up tagged with a segment (needs the live sign-up, B-76) | ROADMAP.md (customer outreach); Rafa, 2026-10-16 |
| B-90 | P2 | Outreach | Talk to Cortico and the MIT Center for Constructive Communication, the closest neighbour, about the protocol and shared rituals for in-person circles | A first conversation held and written up | 01-concept/market-comparison.md; Rafa, 2026-10-16 |