
Row 1 · ESP32-S3 camera board qty 1
Thumb-sized board (21 x 17.8 mm) with a USB-C socket, plus a small clip-on camera board and a stick-on antenna in the bag.
Progress is saved on this phone.

11 stages, 174 steps and 68 parts to find, in strict order. Each stage unlocks only when every check in the stage before it is ticked. (est.) = estimate. Tap any picture to enlarge it.
Not sure a part is the right one? Every part and tool has a Check my part button: take a photo, compare it with the reference picture, then send it to Orrin in your Grok Bot chat. Photos never leave your phone unless you share them.


assembly.html the next stage stays greyed out and locked until you tick the STOP box (and the STOP box only unlocks when every step in that stage is ticked).(est.) means estimate: a number that is not written in the repo files (times, temperatures, cure times, voltage ranges, torques). Follow the label on the product if it disagrees.basket_liner frame. Row 50 asks for a 2nd frame, but only one was printed.| What | Value | Source |
|---|---|---|
| Battery (1 cell LiPo) | 3.0 V empty (protection) / 3.7 V nominal / 4.2 V full | bom.csv row 4 |
| Firmware refuses to start below | 3.65 V (deep sleep) | skimmer_logic.h resume_mv |
| Firmware 'low' warning (fast LED blink) | 3.55 V | low_mv |
| Firmware cutoff (motors off, sleep) | 3.30 V for 4 s | cutoff_mv, debounce_ms |
| Drive pattern | 5 s wait, 20 s forward at 80 %, 2.5 s pivot turn at 70 %, turns alternate L/R | DriveConfig |
| Solar panel, open circuit in sun | about 6-7 V | bom.csv row 16, PLAN.md sec. 1 |
| DRV8833 motor supply (VM) | 2.7-10.8 V allowed; here = cell voltage | bom.csv row 3 |
| Finished boat mass limit | 471 g (60 % of 785.6 g) | DEVLOG / buoyancy.py |
| Waterline / freeboard | 28.9 mm up the hull side / 21.6 mm to the deck top (+-2.5 mm) | DESIGN_WL, DEVLOG |
| Trim / heel limits | bow vs stern within 2 mm / under 1 deg | CLAUDE.md |
| Leak test pass | gains no more than 1 g after 30 min | old ASSEMBLY.md |
Goal: Find every part, check nothing is damaged, and write down anything missing. No tools, no glue.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.
Clear a table. Open one box at a time and put each vendor's parts in its own tray or bag, labelled with the vendor.
Tick Found when you have the part (the full quantity), or Missing if you can't find it. Rows with qty 0 were not bought: tick Found to mean 'noted, nothing to find'.

Thumb-sized board (21 x 17.8 mm) with a USB-C socket, plus a small clip-on camera board and a stick-on antenna in the bag.

Two small metal gearmotors, about 10 x 12 x 25 mm, a 3 mm D-shaped shaft at one end and two bare metal tabs at the other (no wires).

Small board about 26 x 18 mm printed DRV8833, with a loose header strip.

Flat silver pouch 34 x 62 x 5 mm, red + black wires, white 2-pin JST plug. MUST be flat: puffy, dented or punctured = do not use.

Heavy metal push button, 16 mm thread, red LED ring, nut + rubber washer, solder tabs on the back. (bom.csv says 'lid mounted'; in v0.1 it goes in the deck.)

Black/grey plastic gland: body with thread, dome nut, lock nut. These are the Adafruit #762 (4 came in the Adafruit order).
Oct 26: these Adafruit glands are the ones USED (not spares).

Not bought as listed (RS PRO NBR). The Oct 22 Amazon order had Mr O-Ring 2 mm silicone cord, 25 ft (B00QVB0Z70) instead: a coil of 2 mm round cord.
Oct 26: the red silicone O-ring cord shipped from Amazon. This is the seal.

Bag of 100 small knurled brass sleeves, M3 thread inside, 5.7 mm long.

Stainless M3 x 10 mm hex-socket screws (6 needed).
Oct 26: the M3 304 stainless screw kit shipped.

Stainless M3 x 8 mm hex-socket screws (8 needed: 4 motor mounts, 2 pod, 2 spare).
DROPPED (qty 0): not bought, nothing to find.

J-B Weld PlasticBonder, 25 ml double syringe.

Paper strip of small tan resistors, colour bands brown-black-yellow-gold (100k). Pack of 25.




GTSE 4 in zip ties (Amazon B0862FSL2K); Sopoby adhesive-lined heat-shrink kit (Amazon B0CB5P1PHJ); 26 AWG silicone wire in BLUE (#1878) and BLACK (#1881). No red wire: blue is used for +.

The printed parts (16 pieces, listed below). Printed by Craftcloud (order 521379933180), not Slant 3D.

Square 65.5 x 65.5 mm panel with a glossy ETFE face, two solder pads on the back.

DROPPED (qty 0): not bought.

Small board with a USB-C socket, a round DC barrel jack, a white 2-pin battery socket and two small LEDs. Printed bq24074.
Small black cylinder with a grey/white stripe at one end and a wire out of each end (2 came).

Round panel-mount USB-C socket (socket on both ends), big nut, tethered rubber dust cap.

Very short (75 mm) USB-C to USB-C cable with one right-angle plug.

Small board 25.5 x 17.7 mm, a tiny black sensor in the middle, two small white 4-pin sockets (STEMMA QT).

4-wire cable (red, black, blue, yellow), tiny white plug on both ends, 200 mm.

Same cable type, 100 mm long.

Same Adafruit #762 glands as row 6 (4 in total). Kept as spares: the IP68 glands (row 43) are used instead.
Oct 26: these Adafruit glands are the ones USED (not spares).
Shop stock: any 1 mm clear plastic offcut (clear packaging works), cut to 14 x 11 mm.

J-B Weld ClearWeld 5-minute epoxy (double syringe).


3M VHB 5952 tape, 1/2 in x 15 ft (black foam tape) + Permatex 80050 clear RTV silicone tube.

Pack of 12 stainless rods, 2 mm x 100 mm.

Qty 0: same bag as row 8, nothing extra to find.

Two stainless M3 x 20 mm socket screws.

Two M3 nuts with a nylon ring inside.

Four M3 flat washers.

Paper strip of tan resistors, bands brown-black-orange-gold (10k). Pack of 25.
Small bead-shaped ceramic capacitor with two legs, marked 105 (2 came).

3 more from the same 100k pack as row 13 (nothing extra to find).

Roll of 6 mm wide copper tape.

Black 3 mm carbon rods, 300 mm long.
Shop stock: orange ripstop or orange duct tape, 50 x 35 mm.
250 um strainer bag from Home Depot. Not in any recorded order: probably NOT here. The 25 um sheet (row 50) replaces it.
NOT BOUGHT (qty 0, replaced by 419D). If a TEquipment box did arrive, it is this pen: keep it as a spare.

MG Chemicals 419D bottle, 55 mL, with brushes. Flammable liquid.
Oct 26: shipped.
Bag of 10 black nylon glands (Anyinn), each with a rubber seal, dome nut and lock nut. 4 are used.
Oct 26: the black Amazon glands are SPARES only.

Sheet of 64 round white 20 mm sticky filter discs.
Oct 26: shipped.

Bag of 100 small 1 g silica gel packets.
Oct 26: shipped.

Permatex 81150 dielectric grease, small 0.33 oz tube.
Oct 26: shipped.

NOT BOUGHT (qty 0). If an OringsAndMore packet did arrive, it is red 2 mm silicone cord: fine to use as the gasket.

Coil of 2 mm black solid rubber cord (MECCANIXITY). Measure it: must be 2.0 mm.
Oct 26: the red silicone cord is the seal; this black cord is not needed (Missing is fine).

NOT BOUGHT (qty 0): replaced by the 25 um sheet.

1 m x 1 m sheet of very fine white nylon mesh (feels like thin fabric).

Add-on, qty 0: not bought.

Add-on, qty 0: not bought.
DROPPED (qty 0): not needed.

Grid-walled box 64 x 69 x 65.5 mm with a handle on the back and two cheeks at the front.

Small U-shaped frame with 4 legs, 24 x 48 x 30 mm.

Thin 74 x 85 mm plate with ears, a groove on one face, a 5 mm hole in a shallow recess.

Two small 20 mm rollers with a centre hole.

Small plug 9 x 9 x 16 mm: a head and a 4 mm stem.

Flat 150 x 150 mm plate with a big rectangular hole (bay opening), port holes and a raised round USB pad.

Biggest part, an open-top square tub 150 x 152 x 48 mm with two side pockets for the wheels.

Thin curved strip 66 mm long.

Flat ring with a tab, 38 x 26 x 3 mm.

Saddle 32 x 29 x 15 mm with a face plate (left-hand).

Mirror image of the left saddle.

75 mm wheel with 6 paddles and a hub with a D-shaped hole (left-hand).

Mirror image of the left wheel.

Small angled box 33 x 24 x 35 mm, open at one end, a window recess on the sloped face, 2 screw tabs.

Small closed hollow bar 12 x 23 x 45.5 mm with a hole in each end (blind).

Lay the battery on the table. Look along it from the side.
Pass: Flat, no bulge, no dents or cuts, wires intact. Puffy or damaged: put it on the tile outside and don't use it (Missing).
Don't do yet: Don't plug the battery into anything yet.


Look at each printed part for cracks, holes, gaps between layers and warped corners. Look hardest at the hull floor, the walls and the weir flap (it must be a sealed hollow box).
Pass: No cracks or holes; parts sit flat; the weir flap has no holes except the two small end bores.


Bag and label: inserts, M3x8, M3x10, M3x20, nylocs, washers, 100k, 10k, 1N5817, 1 uF.
| Symptom | Likely cause | Fix |
|---|---|---|
| Can't find screws of one length | They're in the HVAZI M3 kit (Amazon), not a Bolt Depot bag | Look in the sorted kit box; check the length with calipers |
| Can't find 'shop stock' items (window, flag) | They were never ordered | Clear packaging plastic and orange duct tape work; mark them found when you have them |
| Battery is puffy | Damaged in transit | Don't use it. Outside on concrete. Adafruit return. Ask before buying another |
| A print is cracked or the flap has a hole | Print or shipping damage | Photo it, mark Missing, contact Craftcloud about the existing order |
🔒 Locked: tick every check in Stage 0 first (including its STOP box). You can read ahead.
Goal: Have every tool on the table, a safe soldering and charging setup, and a computer that builds the firmware.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.










































Put them on a heat-proof mat. Set the iron to about 330 C (est.).

Turn it to the beep setting and touch the two probe tips together.
Pass: It beeps. On DC volts it reads 0.00 with the probes apart.


Lay them out. The hacksaw/rotary tool is only for the 2 mm stainless rod and the carbon rod (Stage 8).


A hair dryer is not hot enough for the adhesive-lined heat shrink.


The 0.1 g scale matters: the leak test and the mass check need it.
Pass: All here, or written on a shopping list for you to decide on.


Good light, fan blowing across the table (away from you), iron stand at the back, nothing flammable near it, no kids or pets in the room.
Put the tile somewhere you'll be nearby, away from curtains and paper, with a working smoke alarm in the room. All charging in this guide happens here, attended.
1) Slide a 20 mm piece of heat shrink onto one wire first. 2) Strip 6 mm (est.) off both ends. 3) Twist them together in a line. 4) Heat with the iron and feed solder until it flows through (2-3 s). 5) Cool, slide the shrink over the joint, heat until it grips.
Pass: Pulling the two wires firmly doesn't break the joint; no bare copper shows.
cd ~/Documents/Claude/pool-skimmer/firmware ../.venv/bin/pio test -e native ../.venv/bin/pio run
If .venv is missing, run the Setup lines in CLAUDE.md first.
Pass: pio test ends with 6 test cases passed (0 failed); pio run ends with SUCCESS.


The data cable connects the XIAO to the computer. The power source charges the boat.
pio test -e native: 6 passed. pio run: SUCCESS.| Symptom | Likely cause | Fix |
|---|---|---|
pio: command not found or no .venv | Python setup not done on this Mac | Run the two Setup lines in CLAUDE.md, then retry |
pio run stuck on downloading | First build fetches the ESP32 toolchain (~1 GB) | Wait; needs internet once |
| Multimeter doesn't beep | Wrong dial setting or flat meter battery | Turn to the speaker/diode symbol; replace its battery |
| Solder balls up instead of flowing | Dirty tip or wire not hot enough | Clean and re-tin the tip; hold the iron on the wire 1 s before adding solder |
🔒 Locked: tick every check in Stage 1 first (including its STOP box). You can read ahead.
Goal: Prove every printed part fits before anything is permanent. The only glue in this stage is on a scrap test piece.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.
out/previews/callouts.png (every feature numbered), assembly_iso.png, assembly_no_deck.png.

Cut away from your hand. Keep two brim offcuts from the hull for the glue test (step 2.21).
Pass: Every edge is clean; parts sit flat.
Expected (CAD): hull_lower 147, hull_deck 50, bay_lid 20, basket 24, wheels 11 each, pod 9, flap 7, mounts 3.6 each, liner 2, rollers 1.8 each, mast_ring 1.3, bail 0.6, gland_blank 0.4 g. About 293 g total.
Pass: Total within about 10 % of 293 g (est.). Write the numbers in DEVLOG.md (Claude uses them to re-run buoyancy.py).

Weigh it. Hold it fully under water for 5 minutes. Dry it, weigh again.
Pass: No bubbles come out, and it gains no weight (it's a sealed float).
Don't do yet: Don't fit the flap pins yet (Stage 8).

Shine the torch inside, look at the outside in the dark (and the reverse) for pinholes of light, especially the floor-to-wall corners and around the wheel pockets. Circle any with a marker.
Pass: No light shows through.


Lower the deck on. The lip under the deck drops inside the walls; notches clear the bulkheads.
Pass: It sits flat all round with no rocking; any gap at the seam is under 0.5 mm (est.).
Don't do yet: Don't glue. Ports must go into the deck first (Stage 4).


Measure a few of the 14 blind holes in the deck top: 6 lid (round the bay opening), 4 motor-mount, 2 pod (left front), 2 rollers (front corners).
Pass: About 4.0 mm across and clean inside.
Don't do yet: Don't fit the inserts yet (Stage 4).

Screw the gland body into each of the 4 x 12.6 mm holes from the top (2 behind the wheels, 1 left of the bay, 1 right-stern corner); see the layout drawing in Stage 4. Unscrew it again.
Oct 26: the Adafruit #762 glands are the ones used (the black IP68 glands are spares). Test-fit a #762.
Pass: Goes in by hand without forcing. Tight: a few strokes of the round file, then re-try.

Push the switch body through the 16.2 mm hole at the left stern corner. Remove it.
Pass: Slides in without forcing.

Push it through the 16 mm hole in the raised round pad (right side, beside the bay). Thread the nut on from below by hand.
Pass: The nut gets at least 2 full turns of thread (the pad + deck are 4.0 mm thick). If not, write it down: the pad can be sanded thinner in Stage 4 (ask first).

Lay the lid on the deck, groove side down. Drop two screws through any lid holes into the insert holes, no turning.
Pass: All 6 lid holes line up with the 6 deck holes; the lid lies flat.

Measure the cord: 2.0 mm. Press a short piece into the groove on the lid underside and measure how far it stands out.
Oct 26: use the red silicone cord (shipped Oct 26) as the seal.
Pass: Cord 1.9-2.1 mm (est.); stands about 0.5 mm proud of the lid (CAD: 1.5 mm deep groove).
Don't do yet: Don't cut the full gasket length yet (Stage 7).


Drop the motor into the saddle, shaft through the face plate hole. Thread 2 zip ties through the slots (don't pull).
Pass: Motor sits straight; shaft sticks out of the face plate; zip ties pass through the 2 x 5 mm slots.

Same as the left side, mirrored.
Pass: Same as left.

Set each mount on its pontoon with its two screw holes over the deck insert holes; the shaft points into the wheel pocket.
Pass: Holes line up; the shaft is centred in the pocket.

Line up the D-flat and push the wheel on by hand about 3 mm (est.) only. Pull it straight off again.
Pass: It needs a firm push and doesn't wobble. Loose: it'll get a drop of CA in Stage 7. Won't go on: ask before reaming.
Don't do yet: Don't push it all the way on (hard to remove).

Drop the basket into the well; lift it out by the finger hole on its rear wall.
Pass: Goes in and lifts straight out without catching.

Hold the flap between the two cheeks at the front of the basket. Measure the rod: 2.0 mm. Push the rod end into a cheek hole (should be snug) and into a flap end bore (should be loose).
Pass: About 1.5 mm gap each side; rod snug in the cheek, free in the flap.

Drop the frame in the basket body, open side facing forward (towards the flap).
Pass: It sits on the floor behind the flap's swing.

Set the bail into the slots at the front of the funnel guide walls, bowed edge forward.
Pass: Both ends sit in their slots.


Slide the board into the pod's open (back) end, sensor towards the window aperture. Slide it out.
Pass: Board slides in; the tiny black sensor lines up with the aperture.

Sand both scraps, wipe with IPA, glue them overlapped with PlasticBonder, clamp with tape. Label it with the date and time. It cures while you do Stage 3.
Pass: Done; you test it at the start of Stage 4.
Don't do yet: Don't glue any real part. PlasticBonder isn't listed for PETG; this test decides if we use it.



Rollers spin freely on an M3x20 screw. The carbon rod slides into the deck socket (right stern) and into the ring. The gland_blank stem fits in a gland.
Pass: All fit by hand.
| Symptom | Likely cause | Fix |
|---|---|---|
| Gland/switch/USB hole too tight | Print shrinkage | Round file, a few strokes, re-try. Don't open it more than needed |
| Deck rocks on the hull | Brim left on the lip, or a warped corner | Remove brim remnants; sand high spots on the lip; check the bulkhead tops |
| Flap bubbles or gains weight | Pinhole in the float | Mark the spot; tell Claude (a thin epoxy dab is possible but adds mass) |
| Wheel won't go on the shaft | Bore printed small | Don't force it. Ask; a 3 mm drill bit turned by hand can ease it |
| USB-C nut gets less than 2 turns | Coupler thread shorter than the 4.0 mm clamp | Note it; sanding the pad is decided in Stage 4 |
🔒 Locked: tick every check in Stage 2 first (including its STOP box). You can read ahead.
Goal: Test one subsystem at a time on the table: battery, charger, USB-C, solar, switch, each motor, then the XIAO + driver with the real firmware.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.
Touch the red probe to the metal contact of the red wire (from the back of the white plug) and the black probe to the black wire's contact.
Pass: 3.6-4.2 V (est.), positive (no minus sign). Below 3.0 V: don't use it, set it aside on the tile.

On the board, find the charge-current jumpers (two tiny pads joined by a thin copper line, labelled with currents). Scratch through the 1.0 A link with the knife; check with the beep test that it no longer beeps. Bridge the 0.5 A pads with a small blob of solder; check it beeps. (firmware/PLAN.md section 2: gentler on the 1200 mAh cell.)
Pass: 1.0 A link open (no beep), 0.5 A link closed (beep). Labels not as described: skip this step and ask.
Don't do yet: Don't connect the battery before this step is done.


Push the battery's white JST plug into the bq24074's battery socket (it only fits one way). Board on the tile.
Pass: Nothing gets warm (touch the board after 30 s).
Red probe on OUT, black probe on GND.
Pass: Within 0.2 V (est.) of the battery voltage from step 3.1. This OUT is what will feed the motors (VM) through the switch.

Plug the power source into the bq24074's own USB-C socket.
Pass: The charge LED lights (and the power-good LED if fitted) within a few seconds. Full battery: charge LED may stay off; that's fine.
Leave it charging on the tile while you're nearby. Check it's not warm every 30 minutes.
Pass: Charge LED goes out. Battery reads 4.1-4.2 V (est.). Unplug USB.
Don't do yet: Don't leave the house or sleep while it charges.

Power source > your USB-C cable > coupler outside socket. Coupler inside socket > 75 mm right-angle cable > bq24074 USB-C. Watch the charge/power LED. Then unplug the outside plug, flip it over (180 deg) and plug in again.
Pass: LED lights in both directions (the listing has pin-orientation complaints). Only one way: mark it Missing/faulty and ask.
Panel face down on a soft cloth. Blue to the + pad, black to the - pad. Quick joints (2-3 s each) so the panel doesn't overheat.
Pass: Joints shiny and firm; label the blue wire 'PANEL +'.
Don't do yet: Don't stick the panel to the lid yet (Stage 7).
Panel in direct sun, nothing connected. Red probe on blue, black on black.
Pass: About 6-7 V (repo: 'about 6 V', '7 V open circuit'). Cloud or shade reads lower: retry in full sun.
Cut the blue panel lead about 50 mm (est.) from the panel end. Diode end without the stripe to the panel side, striped end towards the charger. Slide heat shrink on first, solder, shrink it over the diode.
Pass: Stripe points away from the panel (towards the charger).
Red probe on the blue wire at the panel side of the diode, black probe on the blue wire past the stripe (panel in shade). Then swap the probes.
Pass: One way reads about 0.15-0.35 V (est.); the other way reads OL (open).
Blue (after the diode) to the bq24074 DC input + ; black to its DC input - / GND. Panel in sun.
Pass: The power-good LED lights (the charge LED too unless the battery is full). Remove the clips.
Solder one blue lead to the tab marked C (common) and one to NO (normally open). Leave the NC and LED tabs empty. Label them 'SW C' and 'SW NO'.
Pass: Button out (OFF): C to NO no beep. Pressed in and latched (ON): beep.
Each motor: blue to one tab, black to the other (motors have no polarity mark). Mark the blue tab with a marker dot. Label the leads 'MOTOR L' and 'MOTOR R'. Stick a small tape flag on each shaft so you can see it turn.
Pass: Tabs not bent; joints firm.
Clip the motor's blue lead to OUT and black to GND for 2 s, then unclip. Swap the clips for 2 s. Repeat with the other motor.
Pass: Each motor spins smoothly both ways, no grinding.
Don't do yet: Don't hold a motor on for long or stall it with your fingers.
Solder directly to the pads (no header pins). Unclip the small camera board from the XIAO first if it's in the way, and clip it back after.
Wiring:
| XIAO pad | DRV8833 pad | Wire |
|---|---|---|
| D1 | AIN1 | blue |
| D2 | AIN2 | blue |
| D3 | BIN1 | blue |
| D7 | BIN2 | blue |
| D6 | SLP | blue |
| GND | GND | black |
Pass: 6 wires, each pad to the right pad (check against the table twice).
Blue pigtails on D0, D4, D5, D8, D9, D10 and 3V3; one black on a second GND point if your XIAO has one (otherwise share the GND pad). Label each. Tape over the bare tips until they're used.
Pass: 7-8 labelled pigtails, no solder bridges between neighbouring pads (check with a magnifier).
Don't do yet: Don't connect anything to the XIAO's BAT pads yet (Stage 5).
VM (blue, 120 mm, label 'VM'), a second black GND (120 mm, 'DRV GND'), AOUT1, AOUT2, BOUT1, BOUT2 (blue, 50 mm each, labelled).
Pass: All labelled.
Don't do yet: Don't solder to the Asen/Bsen pads and don't bridge any jumper on the back (Stage 5).
Solder the two 100k resistors end to end. Solder the D0 pigtail to the middle joint. Add a 100 mm blue lead to one free end ('DIV TOP') and a black lead to the other ('DIV GND'). Heat shrink over everything.
Pass: Meter on ohms: DIV TOP to DIV GND about 200k; middle to either end about 100k.
Check each row of the 3.16 table beeps. Then check VM to GND, 3V3 to GND and D0 to GND.
Pass: Every table row beeps. VM-GND, 3V3-GND and D0-GND do not beep continuously.
computer ==USB-C data cable==> XIAO (powered by USB only; its BAT pads NOT connected) XIAO D1/D2/D3/D7/D6/GND --(short wires, soldered)--> DRV8833 AIN1/AIN2/BIN1/BIN2/SLP/GND battery JST ==> bq24074 bq24074 OUT ---clip---> DRV8833 VM bq24074 GND ---clip---> DRV8833 GND bq24074 BAT ---clip---> divider top divider bottom ---clip---> GND divider middle ---------(soldered)--------> XIAO D0 DRV AOUT1/AOUT2 ---clips---> left motor DRV BOUT1/BOUT2 ---clips---> right motor
The XIAO's BAT pads stay empty. Motors taped to the table, shafts free.
Pass: Matches the drawing; no clip touches another.
Red probe on the DRV8833 VM pad, black on its GND. This is the real supply path: cell > bq24074 > OUT > (switch later) > VM. The DRV8833 works from 2.7 V; a DRV8871 (6.5 V+) would not run here, which is why it isn't used.
Pass: Same as the battery voltage: 3.6-4.2 V (est.).


Plug the cable into the XIAO's USB-C socket. The XIAO is powered by the computer only.
Pass: A small LED on the XIAO lights. (A flickering charge LED with nothing on BAT is normal (est.).)
cd ~/Documents/Claude/pool-skimmer/firmware ../.venv/bin/pio run -t upload
Won't connect: unplug, hold the XIAO's tiny B (BOOT) button while plugging it back in, release, run the command again.
Pass: Ends with SUCCESS. Motors may twitch once at reset; that's normal.
../.venv/bin/pio device monitor
Then press the XIAO's tiny R (RESET) button. Expected (numbers differ):
# Skimmer v0 boot. Battery 4105 mV # USB host detected: bench mode, motors idle. Send 'g' to run, 's' to stop. t_ms,phase,turns,vbat_mv,battery,left,right 2001,stopped,0,4104,ok,0.00,0.00
If the monitor reconnects late you may miss the first lines; the CSV line every second is enough. If it didn't see the computer at boot it starts driving after 5 s by itself: keep fingers clear, type s.
Pass: vbat_mv is within 100 mV (est.) of your meter reading of the battery, and battery says ok.
In the monitor, press the g key (no Enter needed). Expected: # go (serial), then 5 s wait, then # phase start_delay -> forward: both motors spin (left, right show 0.80) for 20 s; then # phase forward -> turn: for 2.5 s the LEFT motor runs backwards and the RIGHT forwards (left -0.70, right 0.70); then forward again; the next turn is the other way round.
Pass: Timings match (5 s / 20 s / 2.5 s); both motors spin in forward; the turn reverses one motor.
During 'forward', look at each shaft end (shaft pointing at you). Needed when mounted: left motor turns anticlockwise, right motor turns clockwise (so the top of each wheel moves towards the bow).
Pass: Write 'OK' or 'SWAP' on each motor's tape flag. SWAP = that motor's two leads get swapped when they're joined to AOUT/BOUT in Stage 5 (or set LEFT_SIGN/RIGHT_SIGN to -1 in firmware/include/config.h).
Press s.
Pass: # stop (serial) and both motors stop at once.
Cut the plug off one end of the 200 mm cable, strip 4 mm (est.) of each wire. Plug the other end into the ToF board. Clip: red to the XIAO 3V3 pigtail, black to GND, blue to D4, yellow to D5 (XIAO still on USB).
Pass: Red to black at the cut end reads 3.2-3.4 V (est.). (The v0 firmware doesn't read the ToF yet, so this is a power check only.)
Close the monitor (Ctrl+C), unplug the XIAO's USB, unplug the battery from the bq24074, remove all clips. Battery back on the tile.
Pass: Battery unplugged; no clips left on.
| Symptom | Likely cause | Fix |
|---|---|---|
| Battery reads 0 V | Protection circuit tripped | Plug it into the bq24074 with USB power for a few minutes; if still 0 V don't use it |
| No charge LED with USB | Battery already full, charge-only cable, or a power bank that turns off at low current | Try a phone charger; check the battery voltage |
| Coupler only works one way | Faulty coupler (known listing complaint) | Mark it; ask before buying anything |
| Upload fails / no port | Charge-only cable, or the XIAO needs boot mode | Use a data cable; hold B while plugging in; close any open monitor |
# SHUTDOWN: battery below resume threshold at boot | D0 divider not connected, or battery under 3.65 V | Check the DIV TOP clip is on the bq24074 BAT pin and DIV GND on GND; charge the battery |
| Log shows 0.80 but motors don't spin | VM or GND clip missing, or SLP wire broken | Re-measure VM (step 3.22); beep-test D6 to SLP |
| XIAO resets when the motors start | Loose GND clip or a flat battery | Firm the GND clip; recharge |
| Garbage characters in the monitor | Wrong speed | platformio.ini sets 115200; restart the monitor |
🔒 Locked: tick every check in Stage 3 first (including its STOP box). You can read ahead.
Goal: Fit the ports into the deck, bond the deck (the pontoons get sealed for good), leak-test the empty hull, then put the parts in place. The bay, lid and boards stay unsealed and removable.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Bend and twist the two scraps apart as hard as you can.
Pass: The plastic breaks or bends before the glue lets go.
Don't do yet: If the glue peels off cleanly, STOP: don't bond the deck. Ask Claude about another adhesive.

Deck top face up on a flat board. Set an insert on its hole, press straight down with the hot iron tip until it is flush (5-10 s (est.)), lift straight off. 6 round the bay opening, 4 motor-mount, 2 pod (left front), 2 rollers (bow corners).
Pass: All 14 flush and straight: an M3 screw goes in straight by hand in each.
Don't do yet: Don't push through: the holes are blind so the pontoons stay sealed.

Float the open hull (it floats high). Push it down gently to about 40 mm (est.) for 10 minutes. Wipe the inside with dry paper towel.
Pass: Inside stays dry. A wet spot: mark it, dry it, seal it from inside with a thin dab of ClearWeld epoxy, re-test.
Don't do yet: Don't do a full epoxy seal coat (mass); spot-seal only.

Towel off, leave it upside down to drain and dry.
Pass: No water anywhere.
Gland body from the top with its rubber washer under the flange, a thin smear of RTV round the hole under the washer, lock nut from below. Hand tight + 1/4 turn (est.). Holes: left motor, right motor, ToF (left of the bay), expansion (right stern corner).
Oct 26: fit the 4 Adafruit #762 glands (black IP68 ones are spares). Same hole, same steps.
Pass: Glands don't turn when you twist the domes.
Don't do yet: Leave the dome nuts loose and empty; cables go in later.
Feed the leads down through the 16.2 mm hole (left stern corner). Rubber washer under the bezel plus a bead of RTV under it (the #916 has no IP rating). Nut from below over the leads; tighten (cloth on the bezel to avoid scratches).
Pass: Switch doesn't turn; leads hang inside; it still clicks ON/OFF.

Coupler from the top onto the raised pad with a smear of RTV under the flange; nut from below. Plug the 75 mm right-angle cable into its inside socket now and tape the free end under the deck where you can reach it through the bay opening. Tie the dust-cap lanyard through the printed eyelet behind it. Cap on.
Pass: Coupler is tight; cap closes; cable plugged in underneath.

Deck upside down: a small bead of RTV round every nut where it meets the deck, smoothed.
Pass: Every port has a continuous ring of RTV underneath.

Lower the deck on (wait for the RTV to skin over, about 1 h (est.)).
Pass: The notches clear the port nuts; deck still sits flat.

Sand the top of the hull walls, the bulkhead tops, the bay front wall top and the deck's lip and underside where they meet. Wipe with IPA.
Pass: All bond faces are dull and clean.

A continuous bead on the top of the outer walls, both bulkhead tops (lengthwise and crosswise) and the bay front wall. Lower the deck on, press, wipe squeeze-out, weigh it down evenly. Leave it 24 h (est.; the package lists its own times).
Pass: Deck flat and even all round the seam.
Don't do yet: Don't move it or put anything in it until the cure time is up.

A thin bead of RTV all round the outside seam, smoothed with a wet finger.
Pass: Continuous bead, no gaps.
(a) Weigh it dry. (b) Put weights in a bag in the bay and push it down so the water is 2-3 mm below the deck top (the bay is open; don't let water in over the deck) for 30 minutes. (c) Towel off, wait 10 minutes, weigh again.
Pass: Gains no more than 1 g. More: re-float in warm water (about 45 C) and look for bubbles; seal from outside with RTV; re-test.
Don't do yet: Don't fit any electronics until this passes.

Each mount: 2 screws into the deck inserts. Snug, not hard (finger tight on the short end of the key (est.)).
Pass: Mounts don't move.

On each motor's lead pair, slide a 25 mm (est.) piece of adhesive-lined heat shrink to about 55-95 mm (est.) from the motor (where it'll sit in the gland) and shrink it. Two layers if it ends up under 3 mm across. Keep the heat gun away from printed parts.
Oct 26: with the Adafruit #762 glands the round section must be 3.0-4.3 mm across (bom.csv row 6), not 3-6.5 mm. One layer of sleeve is usually enough; measure with calipers.
Pass: A round section 3-6 mm across (the IP68 gland range is 3-6.5 mm).
Shaft through the face-plate hole into the pocket, leads towards the middle. Two zip ties through the slots, pulled snug, tails trimmed.
Pass: Motor doesn't move when you wiggle it; shaft centred in the hole.

Left wheel on the left. Line up the D-flat, push until it stops. Spin by hand.
Pass: Turns freely, doesn't rub the pocket walls or the rub rails.
Don't do yet: No glue yet (Stage 7, and only if loose).
Left motor leads down through the left motor gland, right through the right. The sleeve sits in the gland seal. Dome loose.
Oct 26: Adafruit #762 glands (3.0-4.3 mm cable).
Pass: Leads reach into the bay with at least 100 mm (est.) spare.

Slide the board into the pod (sensor to the window). Screw the pod to the left deck (2 screws). Sleeve the cable where the ToF gland will grip (as for the motors), route it inboard behind the motor saddle along the deck and down through the ToF gland. Zip-tie it to the saddle rail.
Pass: Cut end of the cable reaches the XIAO position with slack.
Don't do yet: Don't fit the window or pot the pod yet (Stage 7).

Clean the floor with IPA. Two strips of VHB on the floor. Battery flat, long side front-to-back, pushed against the back (stern) wall, its centre 10 mm right of the middle (CAD: BATTERY_Y = -10, it balances the heel). Plug stays unplugged and taped.
Pass: Battery flat and doesn't slide.
Don't do yet: Never pry it off with a blade later: warm the tape and peel slowly.
Right wing room, behind the bulkhead near the USB-C coupler (see the drawing). Plug the 75 mm cable into its USB-C.
Pass: Board fixed; cable plugged in; battery socket reachable.
Cut a 20 mm and a 12 mm strip side by side, or a single 12 x 20 mm pad. Solder the blue lead to one corner before sticking (so you never solder on the plastic). Stick it flat on the right wing-room floor about 27 mm behind the front of the bay and 42 mm right of the middle (CAD: TOUCH_PAD). Label the lead 'D10'.
Pass: Pad flat; lead free; nothing else touches the pad.

Lay the XIAO (right) and DRV8833 (left) on top of the battery, XIAO's USB-C pointing back (est.) so a cable reaches it through the opening.
Pass: Both sit there and the pigtails reach.
Don't do yet: Don't stick them down yet: you'll lift them out to solder in Stage 5.

Feed the panel's two leads down through the 5 mm hole in the lid's shallow recess. The panel just rests on the lid.
Pass: Leads come out under the lid.
Don't do yet: Don't stick the panel down and don't pot the hole (Stage 7).
| Symptom | Likely cause | Fix |
|---|---|---|
| Insert went in crooked | Iron not held straight | Reheat it and straighten with the iron tip, or pull it out hot with pliers and re-do |
| Insert won't go in | Iron too cool | Let it heat 1 more minute; press gently, don't force |
| Deck won't sit flat after bonding starts | A port nut or RTV blob hitting the lip | Lift straight off at once, clear it, re-glue |
| Leak test gains more than 1 g | Pinhole in a pontoon or the seam | Warm-water bubble test; RTV from the outside; dry 24 h; re-test |
| Wheel rubs the pocket | Pushed on too far / mount not straight | Pull the wheel out 0.5 mm; loosen and re-seat the mount |
| Gland won't grip the lead | Sleeve under 3 mm | Add another layer of heat shrink |
🔒 Locked: tick every check in Stage 4 first (including its STOP box). You can read ahead.
Goal: Make every remaining connection from the pin table, then check for shorts before any power goes on.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.
| # | From | To | Wire | Notes |
|---|---|---|---|---|
| P1 | LiPo JST plug | bq24074 battery socket | (plug) | Fits one way only |
| P2 | bq24074 OUT | Switch C | blue | Battery-side power |
| P3 | Switch NO | DRV8833 VM | blue | VM = cell voltage 3.0-4.2 V; DRV8833 allows 2.7-10.8 V |
| P4 | Switch NO | XIAO BAT+ pad (underside) | blue | Never USB into the XIAO with the switch ON |
| P5 | XIAO BAT- pad | GND (bq24074 GND) | black | |
| P6 | XIAO GND | DRV8833 GND | black | All GNDs joined |
| C1 | Panel + | 1N5817 (no stripe) > stripe > bq24074 DC input + | blue | Diode stops USB and panel feeding each other (shared VBUS) |
| C2 | Panel - | bq24074 DC input - / GND | black | |
| C3 | USB-C bulkhead (inside) | bq24074 USB-C | 75 mm C-C cable | |
| M1 | XIAO D1 (GPIO2) | DRV8833 AIN1 | blue | PIN_AIN1, left motor PWM |
| M2 | XIAO D2 (GPIO3) | DRV8833 AIN2 | blue | PIN_AIN2 |
| M3 | XIAO D3 (GPIO4) | DRV8833 BIN1 | blue | PIN_BIN1, right motor PWM |
| M4 | XIAO D7 (GPIO44) | DRV8833 BIN2 | blue | PIN_BIN2 |
| M5 | XIAO D6 (GPIO43) | DRV8833 SLP | blue | PIN_SLEEP, LOW = driver off |
| M6 | DRV8833 AOUT1 / AOUT2 | Left motor tabs | blue / black | Swap if the Stage 3 flag says SWAP |
| M7 | DRV8833 BOUT1 / BOUT2 | Right motor tabs | blue / black | Swap if the flag says SWAP |
| S1 | bq24074 BAT (cell +) | 100k > node > 100k > GND; node > XIAO D0 | blue | PIN_VBAT; reads half the cell; firmware needs it to start |
| S2 | Panel + (before the diode) | 100k > 100k > node > 100k > GND; node > XIAO D9 | blue | Panel volts (v0.1, not read by v0 firmware) |
| S3 | DRV8833 Asen and Bsen | each 10k > node; node > 1 uF > GND; node > XIAO D8 | blue | Motor current (v0.1); don't bridge the sense jumpers |
| S4 | Copper pad | XIAO D10 | blue | Water sense (v0.1); untested through 2.4 mm PETG |
| I1 | XIAO 3V3 | ToF + expansion cable RED | STEMMA red | |
| I2 | XIAO GND | ToF + expansion cable BLACK | STEMMA black | |
| I3 | XIAO D4 (SDA) | ToF + expansion cable BLUE | STEMMA blue | I2C data |
| I4 | XIAO D5 (SCL) | ToF + expansion cable YELLOW | STEMMA yellow | I2C clock |
Cut the 'SW C' lead to length with some slack and solder it to the bq24074 OUT pad.
Pass: Joint firm; label 'OUT-C'.
Heat shrink on first. Join the NO lead, the DRV8833 'VM' pigtail and a new blue wire (label 'BAT+') in one splice.
Pass: Three wires in one insulated joint.
The BAT+ / BAT- pads are on the underside of the XIAO (unclip the camera board if it covers them, then clip it back). BAT+ wire to BAT+, new black wire to BAT-.
Pass: No bridge between the two pads (beep test: BAT+ to BAT- doesn't beep continuously).
Don't do yet: From now on, never plug USB into the XIAO while the switch is ON (its own charger would push into the bq24074 OUT).
Splice the XIAO BAT- wire and the 'DRV GND' pigtail together with a short black wire to the bq24074 GND pad.
Pass: Beep test: XIAO GND, DRV GND and bq24074 GND all beep to each other.
DIV TOP to the bq24074 BAT pin (the battery + side, before the switch: PLAN.md says the divider reads the cell itself). DIV GND to GND.
Pass: Beep: DIV TOP to BAT pin; DIV GND to GND.
Blue to AOUT1, black to AOUT2, unless its flag says SWAP (then blue to AOUT2, black to AOUT1).
Pass: Two insulated splices.
Blue to BOUT1, black to BOUT2, unless its flag says SWAP.
Pass: Two insulated splices.
Blue (striped end of the diode) to the bq24074 DC input +. Black to the DC input - / GND. Leave about 150 mm (est.) so the lid can be lifted off and set beside the hull.
Pass: Joints firm; the lid can lie next to the hull with the leads attached.
Panel + (on the panel side of the diode, before the stripe) > 100k > 100k > middle point > 100k > GND. D9 pigtail to the middle point.
Pass: In sun, D9 middle point to GND reads about 1/3 of the panel voltage (about 2.0-2.3 V (est.)).
One 10k from the DRV8833 Asen pad, one 10k from the Bsen pad; join their free ends (the node). 1 uF from the node to GND (either way round). D8 pigtail to the node.
Pass: On ohms, node to GND settles near 5k (the two 10k go to GND through the sense resistors) (est.); no dead short.
Don't do yet: Don't bridge the sense jumpers on the back of the DRV8833: that would short out its 0.2 ohm sense resistors.
Splice them. Keep this wire away from the other wires where you can.
Pass: Insulated splice.
Red > 3V3 pigtail, black > GND, blue > D4 (SDA), yellow > D5 (SCL). Leave each splice open-ended for one more wire (next step).
Pass: Colours match exactly.
Cut the plug off one end, feed that cut end down through the expansion gland (right stern) from outside. Join red/black/blue/yellow into the same four splices as the ToF cable. Put the outside plug in a small bag taped shut for now.
Pass: Both cables share 3V3, GND, D4 and D5.

Check every splice is fully covered by heat shrink and every pad has no stray strands.
Pass: No bare copper anywhere.
Switch OFF and ON in turn. Check: OUT to GND; VM to GND; 3V3 to GND; BAT pin to GND; D0, D8, D9, D10 to GND.
Pass: None of them beeps continuously (a short chirp as capacitors charge is normal (est.)). Switch ON: OUT beeps to VM; switch OFF: it doesn't.

D8-D10 are shared with the Sense board's microSD slot (PLAN.md).
Pass: Slot empty.

Each board: a square of VHB on a patch of masking tape stuck to the battery top (so it can come off later). Zip-tie the wire bundles loosely; nothing pulls on a solder joint; wires off the copper pad.
Pass: Boards fixed; the XIAO USB-C socket is reachable; the lid can sit flat.
| Symptom | Likely cause | Fix |
|---|---|---|
| A pin beeps to GND | Solder bridge or a strand touching | Find it with the magnifier, remove with wick, re-test |
| OUT beeps to VM with the switch OFF | Leads on C and NC instead of NO | Move the lead from NC to NO |
| Not sure which bq24074 pad is BAT / DC in | Board labels vary | Stop; check Adafruit's #4755 pinout or ask Claude with a photo |
| Heat shrink forgotten on a splice | Common slip | Wrap it with 2 layers of electrical tape, or cut and redo |
🔒 Locked: tick every check in Stage 5 first (including its STOP box). You can read ahead.
Goal: Everything together, in the hull, on the table: boot, battery reading, drive pattern, turns, charging, sensor power.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Set it so both wheels clear the table.
Pass: Both wheels spin freely by hand.

Switch button out (OFF). Plug the battery JST in.
Pass: No smell, no heat after 30 s (touch each board).
OUT to GND, then DRV8833 VM to GND.
Pass: OUT = battery voltage; VM = 0 V (switch OFF).
cd ~/Documents/Claude/pool-skimmer/firmware ../.venv/bin/pio device monitor
Press R on the XIAO.
Pass: # Skimmer v0 boot. Battery ... within 100 mV (est.) of your meter; bench mode line; CSV battery 'ok'.
Don't do yet: Do NOT press the switch ON while the USB is in the XIAO.
ToF cable red to black at a splice: 3.2-3.4 V (est.). D0 to GND: half the battery. D9 to GND in sun: about 1/3 of the panel voltage. D8 to GND: about 0 V.
Pass: All four readings as described. (v0 firmware doesn't use D8/D9/D10/ToF yet.)

Ctrl+C, then unplug.
Pass: USB out of the XIAO.
Press the switch ON. Watch the XIAO's small LED and the wheels.
Pass: LED blinks about once a second. After about 5 s both wheels turn forward (top of each wheel moving towards the bow) for about 20 s, then a 2.5 s pivot (first turn: left wheel back, right wheel forward), then forward again, next turn the other way.
DRV8833 VM to GND during a forward phase.
Pass: At least 3.4 V (est.); doesn't flicker below that.

Press the switch.
Pass: Wheels stop at once; LED goes off.
Only if a wheel turned backwards in 'forward': swap that motor's two splices, or set LEFT_SIGN / RIGHT_SIGN to (-1) in firmware/include/config.h and re-upload (switch OFF, USB in, ../.venv/bin/pio run -t upload). Re-run step 6.7.
Pass: Both wheels forward in 'forward' (or nothing needed fixing).
Cap off, plug the USB power source into the outside of the coupler.
Pass: bq24074 charge LED lights (unless full). Unplug and cap on.

Set the lid with the panel on top of the hull in direct sun.
Pass: bq24074 power-good LED lights.

Switch ON, lid resting on top, let it cycle 10 minutes. Switch OFF. Touch each board.
Pass: Warm at most; you can hold a finger on every board. No rubbing noise from the wheels.
Everything fitted so far, lid and screws on top, battery in.
Pass: Write it down. Remaining add-ons (flap, liner, rollers, mast, bail, gel) add about 20 g (est.); the finished limit is 471 g.
| Symptom | Likely cause | Fix |
|---|---|---|
| Switch ON, nothing happens | Battery under 3.65 V (firmware sleeps), or switch wiring | LED blinks 6 times fast then stops = low battery: charge it. No LED at all: re-check OUT-C and NO-BAT+ |
| LED blinks but wheels don't turn | VM, SLP or GND | Measure VM during forward; beep D6 to SLP |
| LED blinks fast (5 per second) | Battery 'low' (under 3.55 V) | Charge it |
| XIAO restarts when the wheels start | Battery low or a bad GND joint | Charge; re-do the GND splice |
| One wheel backwards | Motor leads swapped | Step 6.10 |
| A board gets hot | Short circuit | Switch OFF, unplug the battery, re-do the Stage 5 beep test |
🔒 Locked: tick every check in Stage 6 first (including its STOP box). You can read ahead.
Goal: Coat the boards, seal the ToF pod, fix the panel, fit the gasket, close the glands, then re-test.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Switch OFF, unplug the JST, tape the plug.
Pass: Battery disconnected.
XIAO: USB-C socket, B and R buttons, the whole camera module and lens, the antenna connector, the microSD slot. bq24074: USB-C socket, DC barrel jack, battery socket. Press the tape edges down.
Pass: Every connector, button and the camera covered.

Thin coat over the XIAO top and edges, the bq24074, the DRV8833 (both sides you can reach) and the bare joints at the pads. No puddles, no bubbles.
Pass: Even wet film; nothing on the masked parts.
Don't do yet: Don't coat the ToF board (it gets potted) or the copper pad.

Wait until tack-free (est. 15 min), then a second thin coat.
Pass: Two coats, glossy, no runs.
Once dry to the touch (about 1 h (est.)), peel the tape slowly.
Pass: Connectors clean.

Ventilated room, lid off, battery unplugged. Do the pod and panel steps below while it cures.
Pass: 24 h passed (est.).

Potting is permanent and v0 firmware can't read the ToF yet (Stage 3 only checked its power). If you want proof it reads distances first, ask Claude for a short test sketch before potting. Otherwise continue.
Pass: Decision made (write it in DEVLOG).

Cut the window, clean both faces with IPA, thin bead of RTV in the window recess, press the window in, wipe excess. Keep the inner face spotless.
Pass: Window flat and sealed all round; clear in the middle.

Unscrew the pod, loosen the ToF gland dome for slack, stand the pod on its front end. Push a thick blob of RTV into the open end around the cable as a dam (it doesn't flow onto the sensor); after it skins (est. 1 h), cover it with a 2-3 mm cap of mixed ClearWeld. Screw the pod back on.
Pass: Back end fully closed round the cable; no epoxy on the window.

Clean the lid top and panel back with IPA. VHB strips on the lid (avoid the recess, keep the 6 screw holes clear: 2 in front, 4 in the ears). Panel centred, flush with the lid's rear edge (it overhangs the sides about 3 mm). Press 30 s. Bead of clear RTV round the panel edge. (ORDER_PLAN: the VHB is 1.1 mm thick, the CAD allowed 0.5 mm: check the panel sits flat.)
Pass: Panel flat, all 6 lid holes uncovered.


From the lid underside, fill the 5 mm hole around the two leads with mixed epoxy.
Pass: Hole fully filled; leads fixed.

Press the cord into the groove all the way round (about 230 mm), cut it so the ends butt, join with a drop of CA. Thin film of dielectric grease (row 46) on the cord.
Oct 26: the cord is the red silicone O-ring cord (the seal that shipped).
Pass: Cord stands about 0.5 mm proud all round; ends join with no gap.

The CAD has no vent hole (bom.csv row 44 says it does). If you want one: drill 3 mm through the deck over the left wing room about 40 mm behind the bulkheads and 55 mm left of the middle (est.; clear of the ToF gland, lid ears and the add-on space). Vacuum the chips. Stick the disc under the deck over the hole from inside.
Pass: Disc flat with no wrinkles over the hole, or step skipped (write which in DEVLOG).

Smear of grease on each gland seal, sleeve centred in the seal, tighten the dome by hand + 1/4 turn (est.).
Oct 26: Adafruit #762 glands: the sleeve must be 3.0-4.3 mm across to seal.
Pass: A firm pull on each cable doesn't move it.

Tighten its gland on its sleeved cable. Cap the outside plug in a closed-end piece of heat shrink with a dab of RTV inside. (Alternative: pull the cable and push the gland_blank into the gland, then tighten the dome.)
Pass: Plug sealed; gland tight.
If a wheel slides on its shaft: pull it off, one tiny drop of CA on the D-flat away from the gearbox, push on within 5 s, spin to check it clears.
Pass: Both wheels firm on their shafts and free to spin.

Coat fully cured. Switch OFF. Plug the battery in. One silica gel packet in the stern, away from the copper pad. Lid on, screws tightened a little at a time in a cross pattern until the lid sits evenly (snug, not hard (est.)).
Pass: Lid flat on the deck all round; gasket squeezed evenly.
Don't do yet: Don't overtighten: the inserts are in plastic.
Wheels in the air. Switch ON. Watch two forward/turn cycles (about 50 s). Switch OFF.
Pass: Same as Stage 6: 5 s wait, forward, 2.5 s turn, alternating; switch OFF stops it.
| Symptom | Likely cause | Fix |
|---|---|---|
| Coat went into a connector | Masking lifted | Let it dry; clean the contacts with IPA on a cotton bud; re-test that connector |
| Nothing runs after coating | Coat in the battery socket, or a joint disturbed | Check OUT voltage; clean the socket; check the Stage 5 splices |
| White bloom on the coat | Damp air while drying | Cosmetic; let it cure fully |
| Lid won't sit flat | Gasket ends overlap or cord out of the groove | Re-seat the cord; trim the ends to butt |
| Panel lifts at a corner | VHB thicker than the CAD allowance | Press 1 min; add a little more RTV under that edge |
🔒 Locked: tick every check in Stage 7 first (including its STOP box). You can read ahead.
Goal: Fit the weir flap, the bail, the fine-mesh liner, the rollers and the mast, then weigh the finished boat.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Cut two 10 mm pieces. File the ends smooth and square.
Pass: Two pins 10 mm long, 2.0 mm across, no burrs.

Hold the flap between the basket cheeks. Push a pin through each cheek hole into the flap's end bore. A tiny drop of CA on the outside of the cheek only.
Pass: Flap swings freely from upright (resting on the front stop) to the 65 deg back stop and falls back.
Don't do yet: No CA near the flap: it must swing.

Into the slots at the front of the funnel guide walls, bowed edge forward.
Pass: Bail firm in both slots.

Lay the liner frame on the mesh. Trace round the U-shaped rim and the 4 legs, adding about 5 mm (est.) margin to wrap over the bars. Cut.
Pass: One piece that covers the sides and bottom of the frame with margin.
Thin RTV along the rim and legs, wrap the mesh over, press, keep it taut. The pocket opens forward (towards the flap).
Pass: Mesh taut, glued all round, no gaps over 1 mm.

Trim stray edges once cured. Weigh the liner.
Pass: About 2.5-3.4 g (est.; buoyancy.py counts 3.4 g).

Liner into the basket body behind the flap swing, opening forward. Basket into the well.
Pass: Flap still swings fully without touching the liner; basket lifts out.

Each bow corner: screw from the top through washer, roller, washer, then the nyloc as the spacer underneath. Screw into the insert until the nyloc sits on the deck, back the screw off half a turn, snug the nyloc up against the insert.
Pass: Each roller spins freely and stands about 4 mm proud of the bow chamfer.

Wrap tape round the cut line, cut slowly outdoors with the mask on, wipe the dust with a damp towel.
Pass: Clean 140 mm rod.

Glue 10 mm of the rod into the deck socket (right stern corner). Glue the ring on top (ring faces front-to-back, for the pole hook). Glue the orange flag round the rod just under the ring, flying forward.
Pass: Mast straight up; ring top about 160 mm above the deck.

Everything fitted, battery in, lid closed.
Pass: 471 g or less (60 % limit; buoyancy.py assumes 471 g). Over: take the liner out (-3.4 g) and re-weigh. Still over: stop and ask Claude to re-run buoyancy.py with your real masses.
| Symptom | Likely cause | Fix |
|---|---|---|
| Flap sticks | CA wicked into the pin bore | Work it gently; if stuck, ask before cutting the pin out |
| Liner rubs the flap | Frame too far forward | Push it back; trim the mesh margin |
| Roller won't spin | Nyloc too high / screw too tight | Back the screw off a little more, re-snug the nyloc |
| Over 471 g | Heavier glands, gel, glue or coat | Liner out; ask Claude to re-run buoyancy.py --without liner with real masses |
🔒 Locked: tick every check in Stage 8 first (including its STOP box). You can read ahead.
Goal: Waterline, trim, leak check with paper towel inside, and a timed run, all in fresh water. Pass this before the pool.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Fresh tap water.
Pass: Calm water.
Lid off, switch OFF. One dry strip along the bay floor reaching into both wing rooms. Lid back on, all 6 screws, USB cap on.
Pass: Towel bone dry, lid sealed.

Lower it gently onto the water.
Pass: Floats level with no obvious tilt; flap floats up to upright.
Water surface to the top of the deck edge: bow, stern, left, right.
Pass: All about 21.6 mm (19-24 mm). Bow vs stern differ by no more than 2 mm (trim). Left vs right differ by no more than 2.5 mm (= 1 deg heel (est.)).

Look from the side and front.
Pass: Flap upright, top just above the surface; ramp lip about 4 mm under; paddle tips dip about 8 mm.
Don't touch it.
Pass: Still level after 30 min.
Dry the outside fully first so no drips fall in, then open the lid.
Pass: Paper towel bone dry; no drops anywhere in the bay.
Don't do yet: Wet towel: don't drive it. Find the wet spot, dry everything, re-seal that port/seam, repeat from step 9.2.
Lid sealed. Switch ON and set it on the water within 5 s.
Pass: Starts driving after about 5 s.
Watch three forward/turn cycles.
Pass: Goes forward roughly straight, turns, repeats. At the tub wall the rollers or rub rails touch, not the wheels.

Drop them a hand-length ahead of the bow.
Pass: Flap tips open while it drives and floats shut when it stops; most leaves ride over the lip into the basket and stay.

Let it run. Note anything odd. (Optional: run to cutoff and note the runtime; the wheels stop and the LED blinks 6 times fast.)
Pass: Runs 30 min without stopping or listing.
Dry the outside, open the lid, check the towel, the motors and the screws.
Pass: Towel dry; no rust; no water at the glands.
Charge through the bulkhead on the tile. Write in DEVLOG.md: date, mass, freeboard x4, flap behaviour, leaves caught, runtime, any leaks.
Pass: Logged.
| Symptom | Likely cause | Fix |
|---|---|---|
| Leans to one side | Battery or boards off-centre | Note which side and by how much; ask Claude (battery y position is the heel lever) |
| Bow or stern low | Trim off | Note the numbers; battery x is the trim lever (ask before moving it) |
| Wet towel | Gland, switch bezel, USB cap or lid gasket | Find the wet spot; re-seat/grease the gasket; re-tighten that gland; RTV under the switch bezel |
| Drives in circles | One motor stronger | Lower the stronger side's LEFT_TRIM/RIGHT_TRIM in config.h (e.g. 0.95), re-upload with the lid off, switch OFF, USB in |
| Flap won't open while driving | Too buoyant | Glue a 0.3-0.5 g stainless washer on its top; check it still floats shut |
| Pushes leaves away | Bow wave at 80 % duty | Ask Claude about a slower forward_duty (PLAN.md suggests about 60 %) |
🔒 Locked: tick every check in Stage 9 first (including its STOP box). You can read ahead.
Goal: A short supervised first run in the pool, safe retrieval, then rinse, dry out and recharge.
The 3D model loads when you scroll here.
Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.
No shock or chemical dose within its label's wait time (24 h if unsure (est.)). Cover off, no floater nearby.
Pass: OK to go.
First run only (est.), so the skimmer mouth and cleaner can't grab it.
Pass: Water calm.

No storm, light wind (buoyancy.py: 2.9 deg heel at 5 m/s wind).
Pass: Light wind, no thunder.
Battery fully charged (charge LED went out), lid screws snug, USB cap on, glands tight, fresh silica gel, basket and liner in, flap swings, mast on. Retrieval tool ready: pool net or a pole hook (the mast ring is for this).
Pass: All ticked.

Switch ON and set it on the water within 5 s, away from the steps and the skimmer mouth.
Pass: Drives off after about 5 s.

Watch: roughly straight runs, turns, wall touches on the rollers, flap opening, debris going into the basket, never stuck.
Pass: Nothing worrying. Stuck, listing or slowing: retrieve it now.

Hook the mast ring or net it. Switch OFF straight away.
Pass: Out and OFF.

Lift the basket by its handle; tip the catch out; rinse the liner gently.
Pass: Basket back in.

Rinse off the chlorine (the screws and pins are 304 stainless). Towel dry, especially round the USB cap and lid edge.
Pass: Clean and dry outside.

Look for any damp. Swap or dry the silica gel packet. If damp, leave the lid off 1 h (est.).
Pass: Dry inside.
Make sure the USB port is completely dry first. Charge through the bulkhead on the tile, attended (or in the sun on the panel, switch OFF). Never leave it baking on hot paving when not in use.
Pass: Charge LED goes out.

Date, run time, what it caught, any problems, inside dry or not.
Pass: Logged.
| Symptom | Likely cause | Fix |
|---|---|---|
| Stuck in a corner | v0 firmware has no escape logic yet | Retrieve; escape/wall-follow is in PLAN.md sections 7-8 |
| Stops early | Battery cutoff (3.3 V) or a not-full charge | Recharge fully; note the runtime |
| Hair or string round a wheel | Debris | Switch OFF, unwind it, check the wheel still spins |
| Damp inside afterwards | Gasket or a gland | Dry it, re-grease the gasket, re-tighten the glands, repeat the Stage 9 towel test |
| Lists after a while | Water getting in | Retrieve at once; switch OFF; open and dry; find the leak |
Generated by tools/guide_v2.py from tools/assembly_guide.py. Nothing on this page loads from the internet and no photo is uploaded anywhere: Check my part only shares a photo when you tap Send.