Rafa's request, verbatim:
"Some additional advice: add flared/filleted bases to those cylindrical standoffs or screw holes 🙂 3D prints especially will be super prone to snapping at the base otherwise"
The three board posts are 6.4 mm PETG cylinders that hang from the inner roof of the top shell. Each takes an M2.5 heat-set insert (3.6 mm bore, 6 mm deep) at its free end, and the board is screwed to them. Before this change each post met the roof at a sharp corner:
bom.csv P1), so the post's layers run across its axis. The root is where the layer bond is loaded hardest. A post snapped there can't be glued back strongly.The roof under the posts is not flat. Across a post's root it climbs by up to 2.1 mm: the post at board corner 3.5, 3.5 sits near the side wall.
Each post gets a flared root (root_flare in v01/cad/pebble_enclosure.py, POST_FLARE):
pebble_layout.pack() places a keep-out box, root flare of post …, 10.4 × 10.4 mm, from the flare's foot to the roof. The first build without it put the flare 1.7 mm into the tail microphone's board, which hangs from the roof 0.3 mm from the post at 3.5, 26.5. The new clearance check caught it. With the keep-out, the packer moves the tail mic 2.0 mm toward the head. Nothing else moves.The post at 3.5, 26.5 sits beside the NFC "tap here" icon, which is pocketed into the roof from inside. The icon's outer arc (r 9.5–10.6 mm about the icon's centre) passed 0.15 mm from the post. A full flare covered about 2 mm of that arc from inside, which would leave the middle of the arc dark when the icon lights.
"Shrink the tap icon ~25%"
The icon is now 3/4 of its first size: arcs at r 2.6 / 4.9 / 7.1 mm, 0.85 mm wide, and a dot of r 1.05 mm still centred over the LED (NFC_ICON in pebble_layout.py). The CAD and the site both read that one definition.
NFC icon light path. The "Post flares clear of parts" check and the wire router both see it.review_geometry.py gains two checks:
top_shell.stl. The check probes the printed mesh 1 mm out from each post, all the way round, just below the root. R must be ≥ half the wall (1.1 mm). That limit is a rule of thumb, not a strength test, and the check says so. The 1.2 m drop test (B-43) decides.The wire router (wire_routes.py) treats each flare at its full width up to the roof as an obstacle.
# ADR-0016: Flared roots on the board posts - **Status:** accepted (2026-10-13) - **Date:** 2026-10-13 - **Requirements touched:** D-01 (survives a 1.2 m drop) - **Builds on:** ADR-0013 (kit build), ADR-0015 (posts reach the roof; three posts) ## Context Rafa's request, verbatim: > "Some additional advice: add flared/filleted bases to those cylindrical standoffs or screw holes 🙂 > 3D prints especially will be super prone to snapping at the base otherwise" The three board posts are 6.4 mm PETG cylinders that hang from the inner roof of the top shell. Each takes an M2.5 heat-set insert (3.6 mm bore, 6 mm deep) at its free end, and the board is screwed to them. Before this change each post met the roof at a sharp corner: - **Stress:** a sharp inside corner concentrates the bending stress from a screw being tightened or from the board's inertia in a drop. The root is where the moment is largest. - **Printing:** the top shell prints dome up (`bom.csv` P1), so the post's layers run across its axis. The root is where the layer bond is loaded hardest. A post snapped there can't be glued back strongly. The roof under the posts is not flat. Across a post's root it climbs by up to 2.1 mm: the post at board corner 3.5, 3.5 sits near the side wall. ## Decision Each post gets a flared root (`root_flare` in `v01/cad/pebble_enclosure.py`, `POST_FLARE`): - **Profile:** a concave fillet of R 2.0 mm leaves the post vertically and turns to 45°. A 45° flare then runs out until the root is 2.0 mm wider than the post (r 3.2 → 5.2 mm). Total rise: 2.8 mm. - **Why 45°:** the shell prints dome up, so the flare's underside is the overhang. At 45° it prints without new supports. A full quarter-round fillet would end horizontal against the roof and need supports there. - **On a sloping roof:** the flare is anchored at the lowest point where the post meets the roof, so the fillet is whole on the downhill side. Uphill it ends in a collar of the full flare width that runs up to the roof: up to 2.1 mm tall on the post nearest the wall. The collar is solid material at the root, which is where it is wanted. - **The insert bore is unchanged.** The flare only adds material outside the 6.4 mm post. - **The packer keeps parts out of it.** `pebble_layout.pack()` places a keep-out box, `root flare of post …`, 10.4 × 10.4 mm, from the flare's foot to the roof. The first build without it put the flare 1.7 mm into the tail microphone's board, which hangs from the roof 0.3 mm from the post at 3.5, 26.5. The new clearance check caught it. With the keep-out, the packer moves the tail mic 2.0 mm toward the head. Nothing else moves. ## The tail icon shrinks to 3/4 The post at 3.5, 26.5 sits beside the NFC "tap here" icon, which is pocketed into the roof from inside. The icon's outer arc (r 9.5–10.6 mm about the icon's centre) passed 0.15 mm from the post. A full flare covered about 2 mm of that arc from inside, which would leave the middle of the arc dark when the icon lights. - **Moving the icon** toward the tail doesn't work: the roof drops there, and the icon LED would hit the NFC tag under it. - **Three ways out were put to Rafa:** trim that one flare, shrink the icon, or let the flare cover the arc. Rafa chose: > "Shrink the tap icon ~25%" The icon is now 3/4 of its first size: arcs at r 2.6 / 4.9 / 7.1 mm, 0.85 mm wide, and a dot of r 1.05 mm still centred over the LED (`NFC_ICON` in `pebble_layout.py`). The CAD and the site both read that one definition. - **Light path:** the packer now reserves the air between the icon LED and the icon's pockets as a keep-out box, `NFC icon light path`. The "Post flares clear of parts" check and the wire router both see it. - **Nothing else moves:** the LED stays where it was. ## Not changed - **The eye cradle's three pins** (Ø 2.8 mm, from the roof). Only about 1 mm of each pin shows between the roof and the top of the cradle boss that sleeves it. The boss takes the bending, so the root sees little. A flare would need a countersink in each boss, which would leave a 0.4 mm rim. If the drop test (B-43) breaks a pin at the roof, revisit. ## Checks `review_geometry.py` gains two checks: - **Post roots flared:** every post has a flare in the exported `top_shell.stl`. The check probes the printed mesh 1 mm out from each post, all the way round, just below the root. R must be ≥ half the wall (1.1 mm). That limit is a rule of thumb, not a strength test, and the check says so. The 1.2 m drop test (B-43) decides. - **Post flares clear of parts:** no part's keep-out box reaches into a flare. The wire router (`wire_routes.py`) treats each flare at its full width up to the roof as an obstacle. ## Consequences - About 50 mm³ of PETG per post, under 0.2 g in all. - Each post's root is 10.4 mm across instead of 6.4 mm, over the top 2.8 mm.