Rafa's words, verbatim:
"Are all the pieces inside fastened correctly? we obsviously don't want it to break if we shake it?"
"In terms of fastening, it's also ok to make the case slightly larger and make it all "screwed in" if that makes sense"
"The reason I chose screw every board is that for the prototype we will likely need to build and unbuild it multiple times as the build evolves after physical testing"
"I assume in your analysis you are considering also that the case is malleable as its 3D printed right?"
"For the nuts and screws you can change the purchase to be a kit of them, I have a kit of M2.5 from amazon so we can do something similar in the documentation"
An audit of the assembly guide against every part in the layout found:
Of the options put to Rafa (screw what matters, screw every board, tape and checks), Rafa chose "Screw every board", and then:
BOARD_HOLES in pebble_layout.py): the vendor STEP models measured as through-holes, and Adafruit's .brd for the PCF8523 (four Ø3.0 mm).battery_deck.stl).p_plan 3.2 → 3.6) so the tail holds the tag and the icon LED. Spec: T 37, L 160, W 79. The width is 1 mm over today's 78; that was the packer's only full fit within the budget.RING_LEDS). The tail gap widens instead.Rafa asked: "If you were me and considering ordering all the parts (assume they are available) and building the kit, what checks would you do to make sure the kit was actually buildable? Run those in iterations". buildability.py walks the build. Its first run found four things, now fixed:
shell_of): 18 wires cross the seam, not 14.It also checks for components under a screw head, with nothing added to the head's 2.25 mm radius: the closest, on the secure element, clears it by 0.03 mm. Three parts must come off in order in a rebuild; the assembly guide lists them (§8.6).
New in review_geometry.py: "Every board screwed down", "Screw tips stay in the plastic", "Bosses hold their nuts". "Keep-outs and fasteners clear of parts" now covers each owner's bosses, heads and strap.
# ADR-0018: Every board screwed down, for a prototype that is rebuilt often
- **Status:** accepted (2026-10-14)
- **Date:** 2026-10-14
- **Requirements touched:** D-01 (survives a 1.2 m drop), the kit's buildability
- **Builds on:** ADR-0015 (board posts, buildable shell), ADR-0016 (flared roots), ADR-0017 (inserts to the datasheet, fasteners in the model)
## Context
Rafa's words, verbatim:
> "Are all the pieces inside fastened correctly? we obsviously don't want it to break if we shake it?"
> "In terms of fastening, it's also ok to make the case slightly larger and make it all "screwed in" if that makes sense"
> "The reason I chose screw every board is that for the prototype we will likely need to build and unbuild it multiple times as the build evolves after physical testing"
> "I assume in your analysis you are considering also that the case is malleable as its 3D printed right?"
> "For the nuts and screws you can change the purchase to be a kit of them, I have a kit of M2.5 from amazon so we can do something similar in the documentation"
An audit of the assembly guide against every part in the layout found:
- the 74 g cell held down by nothing;
- the charger, secure element and motor taped onto the cell;
- the USB-C port held only by CA;
- every plug held by friction alone;
- 27 thin wires untacked;
- two boards with no stated retention at all.
Of the options put to Rafa (screw what matters, screw every board, tape and checks), Rafa chose "Screw every board", and then:
- "Remove it (Recommended)" for the charger's unused DC jack;
- "Up to ~37 × 160 mm (Recommended)" for the size budget.
## Decision
1. **Captive nuts, one screw.**
- Every board stands on bosses that hold an M2.5 hex nut (5.0 mm across flats, 2.0 mm; ISO 4032 / DIN 934). The nut slides in through a side slot, with a 0.8 mm PETG cap between nut and board.
- The thread is metal on metal, so it survives any number of rebuilds. Thread-forming screws were ruled out: CNC Kitchen notes the plastic "gets plastically deformed at the threads".
- One screw everywhere: M2.5 × 6. Bosses are 3.5 mm minimum, Ø8.4 mm, with a flared root (ADR-0016).
- Screw holes are blind, and a check keeps ≥ 0.5 mm of plastic past every screw tip.
2. **Boards with no usable holes are strapped.** A printed strap crosses the board, screwed to two bosses beside it, and presses it down through a 1 mm foam pad.
- **Holes of record:**
- Boost U3V40F5 and Pololu 2810: their dimension PDFs show only Ø1.02 mm pin holes.
- NeoPixel Mini 1612 (the icon LED): no holes, from its photos.
- LM66200 (5830): two Ø2.5 mm plated holes, which an M2.5 thread won't pass.
- **The ERM motor disc** has no holes either.
- **The icon LED's strap** runs across its light path, with its bosses outside the path.
3. **Mounting holes come from the boards' own files** (`BOARD_HOLES` in `pebble_layout.py`): the vendor STEP models measured as through-holes, and Adafruit's `.brd` for the PCF8523 (four Ø3.0 mm).
4. **A battery deck** (`battery_deck.stl`).
- A printed plate on the cell (a foam pad between) clamps it. The cell sits on double-sided foam tape below.
- Four tabs screw into heat-set inserts in floor posts just off the cell's ends, so the deck, and the cell, come out with four screws.
- Boards stand on the deck's own bosses. A screw tip stops above the deck's underside, never at the cell.
5. **Mixed supports.** A board's bosses each stand on what is under them, deck or floor. A board may bridge over a lower part on taller bosses, or hang under a higher one.
6. **The charger's unused DC jack comes off** (assembly step 2). The charger then hangs flat from the roof on four screws.
7. **Port tubes for the mics.** Screwed to the roof, each mic hangs at least 3.5 mm down. A printed tube runs from its pin-hole to 0.7 mm above the mic, and a 1.0 mm foam ring seals it.
8. **The case grows**, inside Rafa's budget.
- **Size:** 158 × 79 × 37 mm as built (was 152 × 78 × 33), with a fuller plan at the tips (`p_plan` 3.2 → 3.6) so the tail holds the tag and the icon LED. Spec: T 37, L 160, W 79. The width is 1 mm over today's 78; that was the packer's only full fit within the budget.
- **Mass:** about 247 g (was 207).
- **The slide switches** ended 51 mm apart (was 31). They're easier to tell apart, and "Power and mic switches told apart" still passes.
9. **The heat stack's top pad is 3 mm** (two 1.5 mm pieces). The taller case would otherwise have needed a 2.2 mm PETG boss over the SoC, and gap pad conducts far better than PETG.
10. **Ring:** the seam is longer, but the CAD keeps 50 LEDs, the number the firmware and site drive (`RING_LEDS`). The tail gap widens instead.
11. **The fasteners are bought as a kit.** The BOM asks for an M2.5 assortment with at least 40 × M2.5 × 6 and 35 nuts of the right size. The checked 3DJake packs are a fallback. 37 screws are used: 30 into nuts, 4 into the deck's inserts, 3 into the board posts. Seven heat-set inserts in all.
## What the checks caught on the way
- The tag hung from bosses at the tail, it left the cavity, and its antenna moved away from the phone. The first fix strapped it up to the roof. That took the icon LED's spot, so the final layout puts the LED first and screws the tag below it, near the tail.
- The greedy packer depended on order. Fixed-position parts now go first (mics, icon, tag), then the holed boards, then the strapped ones.
- The coin-slot cut was refused, and the band appeared to lose three quarters of its volume. Both were OCC volume-integration error on the band's spline faces, not bad geometry. The meshes were right: 4.18 cm³, watertight. Cuts are now judged by intersection, and masses come from the meshes.
- The lip lead-in's check now probes the printed mesh round the lip, instead of a ratio I had picked.
## Not done
- **Connectors still hold by friction:** JST-PH, STEMMA QT and PicoBlade alike. Kapton over each plug for now; a printed plug clamp is B-54.
- **The packer is greedy.** A 1 mm change in width can flip a part from fitting to failing; the size sweep shows it. B-55 is a search that is less fragile, and faster: a pack takes about 43 s.
- **The shake test is a bring-up step** (7b), not yet a measured result.
## Amended 2026-10-14: the buildability walk
Rafa asked: "If you were me and considering ordering all the parts (assume they are available) and building the kit, what checks would you do to make sure the kit was actually buildable? Run those in iterations". `buildability.py` walks the build. Its first run found four things, now fixed:
- **Wrong seam test.** The router judged which shell a wire's end was in by height, so the deck's boards counted as top-shell parts. Shells are now decided by how a part is mounted (`shell_of`): 18 wires cross the seam, not 14.
- **Two cables too short.** The clock now sits between two top-shell boards, so both of its STEMMA QT cables cross the seam:
- secure element → clock: 100 mm (was 50);
- clock → NFC tag: 200 mm (was 100; Adafruit 4401).
- **Nut slots blocked.** Four of the mics' slots pointed at their own port tubes, and one at the heat-stack boss. Each slot now takes the freest of eight directions, and the check tests the slot as printed.
- **Supports not named.** The top shell's print notes now name the 18 bosses that hang from the roof and need supports.
It also checks for components under a screw head, with nothing added to the head's 2.25 mm radius: the closest, on the secure element, clears it by 0.03 mm. Three parts must come off in order in a rebuild; the assembly guide lists them (§8.6).
## Checks
New in `review_geometry.py`: "Every board screwed down", "Screw tips stay in the plastic", "Bosses hold their nuts". "Keep-outs and fasteners clear of parts" now covers each owner's bosses, heads and strap.