Skip to content

Headband routing handover for Astra — 2026-10-27

Historical handover: the approved manual reset is now the current routing and GPIO record. It retains the manual buck/USB blocks and locked poses, with the remaining routing rebuilt without an autorouter. The earlier power-path revision has since been applied after checking the crash/recovery state. It preserves all locked poses and interfaces, replaces the rejected power feeds without KRT, and passes independent saved-state DRC/connectivity checks. The text, counts and hashes below describe the earlier rejected checkpoint, not the current PCB.

Current monitor and current-path update for the next cleanup

Applied: the INA232/signal cleanup now implements this circuit, its library assets and revised board routes. The requirements below describe the handoff before that implementation; the 1.25A physical qualification remains open.

Selected 2026-10-27 after the power-path revision: replace the two INA701s with INA232AIDDFR / C5447660, each sensing a Milliohm HoYH0603-1/2W-10mR-1%-TCR50 / C2912774 (10mΩ, 0603, ±1%, 500mW, ±50ppm/°C). This supersedes the INA701-primary/INA745A-fallback plan. The saved design at 692d0f3 still contains INA701 U106/U203. This handoff adds requirements only; no schematic, PCB or library substitution has been made.

  • Use local 3.3V supply/100nF bypass and separate Kelvin pickoffs at the shunt pads. Keep load-current copper out of the sense traces and use the actual manufacturer land patterns. Right logic/LDO draw stays upstream of its shunt.
  • Both monitors stay on I2C1, polled with ALERT unused. INA232A A0→GND_L is 0x40 left; A0→VS/3V3_R is 0x41 right, replacing 0x54/0x55.
  • ADCRANGE=1, configuration 0x00 bit 12, gives nominal ±20.48mV / ±2.048A and 625nV / 62.5µA per shunt count. Set calibration register 0x05 to 0x0800 (2048) for CURRENT_LSB=62.5µA; calculated power then uses 2mW/count. Reload calibration after power-up/reset. The canonical range/scaling contract includes pin assignments, signedness, register addresses and the equations.
  • Replace the old 750mA path target with 1.25A continuous per complete ear supply/return path, about 20% above 1.035A full RGB plus sensing. Review headband/flex copper, pad/via neck-downs, connector/FFC limits and sharing, joined-test links and the shared input path for both ears plus band loads. The 1.25A target is not yet qualified; ±2.048A is a measurement range, not an operating allowance or hardware current limiter.
  • Reconcile shared symbols/footprints, BOM identity, standalone/parent netlists, I2C address docs and fresh ERC/DRC/parity/mask/paste checks after the actual substitution. Preserve the fixed connector/module/BX/button poses. Firmware remains read-only; this selection does not implement or verify a driver.

The remaining sections retain historical counts, hashes and the earlier 750mA target. They do not override this update or prove the higher current capacity.

Request and acceptance status

Andi wants a visual/electrical review and revision of the headband layout. The current routing is WIP requiring revision, despite passing connectivity and clearance checks. She identified the absurd serpentine 5V trunk and noted that quite a lot of the routing looks unhinged. Do not treat the previous DRC result, or the earlier description of a complete routing pass, as layout approval.

KiCad subsequently crashed. Stop source mutations until its recovery state has been inspected. The crash cause is unknown. The last live readback before the crash matched the saved PCB, and a read-only hash check afterwards still matched the verified saved snapshot. No power cleanup was applied after Andi's critique; the current source still contains the offending trace.

Read AGENTS.md, PLAN.md, the design reference and layout record. The firmware workspace /Users/aholmes/src/espurr remains strictly read-only.

Recovery points and actual source

Repository: /Users/aholmes/Documents/KiCad/projects/espurr-hw, branch main.

Recovery point Contents / intended use
6f5ad7c Signed checkpoint of the complete manual working tree before this implementation, including the pre-existing ear/parent/library work
b43538a Signed geometry, footprint-mask and GPIO/interface changes, before the bulk routing pass; useful starting point for rerouting
Current WIP checkpoint containing this handover Initial routed board plus documentation; retain as review/recovery evidence, not an accepted final layout
codex/headband-manual-20261026-2156 at 288930d Earlier independent recovery snapshot; superseded by the complete manual checkpoint above

The editable band source is espurr/espurr-band/espurr-band.kicad_pcb with its standalone schematic and four child sheets in the same directory. Parent project and shared libraries remain under espurr/; preserve the hierarchy and library names. Shared footprints are in espurr/footprints.pretty, symbols in espurr/symbols.kicad_sym. Do not create band-specific replacement libraries.

Saved routed-PCB SHA-256 at handover:

6d32a4c5b512a9c8e5be9b251d3a03b13767f15d3802f9c6d8e80736f588ddef

Inspect Git and recovered editor state before using this hash as authority. Never restore a checkpoint over newer manual work. If starting from b43538a, use an isolated working copy rather than resetting the shared checkout. Concurrent web-rendering changes in scripts/espurr_hw/web/render.py and web/render-settings.json appeared during handover and were left untouched, outside this checkpoint. Preserve them when inspecting the checkout.

Changes to retain unless a review finds an actual problem

  • Left main remains the 37.5 × 45mm broad-foot outline. Right main was shortened from the actual manual 16 × 28mm outline to 16 × 22mm, top edge y=70, bottom y=92. The older 20 × 30mm documentation was a stale concept.
  • Right U201 is at (107.6,72.0)mm, C201 (110.9,72.0), C202 (104.5,72.95). The regulator/caps may be refined further if justified. Right connector and INA positions were retained.
  • The bridge slot is 2mm wide, x=107.975–109.975mm, y=91.4–100.6mm, between the fixed FFC and power sockets. All six signal jumpers are on the left offcut, at x=101.2/102.4/103.6/104.8/106.0/107.2, y=96. Power/GND jumpers remain at x=112.1/114.1. Eighteen 0.5mm NPTH mousebites form rows at y=92/100. All eight links are pre-bridged copper jumpers, independently cuttable and re-solderable. Preserve their net-tie groups and separate L/R net names.
  • The fracture web permits only the deliberate F.Cu links: no pours, vias, bottom or inner-layer routing. This is not a V-score design. Mechanical separation and supplier acceptance remain open.
  • Shared FH34 footprint contact masks now belong to pads 1–10, with F.Cu/F.Mask, +0.05mm mask expansion and 0.15mm local pad clearance. Standalone F.Mask polygons were removed; the existing separate F.Paste graphics were retained. Native mask plots preserve each 0.4 × 0.9mm aperture envelope, with 0.05mm rounded corners. All six band instances were refreshed; the ear PCB was not.
  • U103's schematic footprint now agrees with the manual PCB's standard Package_TO_SOT_SMD:SOT-23-5; retain SY8089A1AAC, 100kΩ/22kΩ and 22pF. The local Olimex Rev B reference is /Users/aholmes/Documents/KiCad/projects/olimex/ESP32-S3-DevKit-LiPo/HARDWARE/ESP32-S3-DevKit-LiPo_Rev_B.

Fourteen fixed footprints: J101/J102/J103/J104/J105, J202/J203/J204/J205, U101 ESP32-S3, U104 BX and SW101/SW102/SW103. Their poses are unchanged and all are locked. Other parts, including HUSB320, may move in small justified groups. Preserve the useful manual buck arrangement; a small whole-block move was allowed if routing genuinely needs it.

Applied GPIO and cable contract

The following is applied to both saved schematics and PCB, but not firmware:

Function GPIO Module pad
Left outer / inner LED 14 / 15 18 / 19
Right outer / inner LED 12 / 13 16 / 17
I2C0 SDA / SCL 16 / 17 20 / 21
I2C1 SDA / SCL 8 / 9 12 / 13
HUSB320 INT_N 18 22
Stereo PDM CLK / DATA 10 / 11 14 / 15
BX BCLK / WCLK / DATA 47 / 48 / 21 27 / 30 / 25
BX INT1 / INT2 38 / 39 34 / 35
App buttons 1 / 2 41 / 42 37 / 38
USB D− / D+ 19 / 20 23 / 24
UART0 TX / RX 43 / 44 39 / 40

BOOT remains GPIO0/module pad4 with the open screwdriver-bridge jumper; RESET uses EN/pad45. GPIO1/2/4–7/40 are spare. Respect strap and module flash/PSRAM reservations. GPIO reassignment was allowed for routing, but any further change must reconcile schematic, PCB and docs while leaving firmware untouched.

  • Both ear links now assume 1→1, same-way-up sockets with one 90° fold. Physical continuity is still unverified. Contacts: 1 outer LED, 2–4 GND, 5 inner LED, 6 SCL, 7 SDA, 8–10 monitored EAR_5V. Both band sockets were corrected on 6/7 without changing power/LED contacts or connector poses.
  • Cross-band J104↔J204 remains 1↔10 reversing; the preassembled Molex power jumper is 1↔2. The right main has its installed orientation.
  • Reversible ten-way mic order is 3V3,GND,DATA,CLK,SEL,SEL,CLK,DATA,GND,3V3. SEL pulls live on the mains; retain separate source-side 100Ω clock resistors and shared PDM DATA.
  • BX is directly on the rigid left main; preserve full BX audio alongside stereo PDM. No separate BX flex or socket. Right logic uses XC6206.
  • I2C membership/addresses remain in the canonical table: left BX/ALS/HUSB on I2C0; both INAs and right ALS on I2C1; each ear's AW96105 defaults to 0x12 on its corresponding bus. Poll ALS/INA; their alert pins are unused.

Routing provenance and specific defects

Bulk fanout used KiCadRoutingTools (KRT) through its installed CLI:

/Users/aholmes/Documents/KiCad/10.0/3rdparty/plugins/com_github_drandyhaas_kicadroutingtools/py_router/route.py

This is the Rust A* single-ended router, including its power/plane repair passes. The bridge, BX audio corridor and buck local connections were hand-directed; that does not exempt them from review. The final route combines KRT fanout, a focused local repair pass and native manual fixes. Do not rerun it wholesale and accept another DRC-clean output as the revision.

The work used KICAD_INRUN_FLOOR_SYNC=0, --no-fix-drc-settings, escalation off, retained thermals and original project rules, plus a 0.15mm same-net pad/paste exclusion for new router vias. Initial via-in-paste trials were rejected. KRT --strict-sizes exited nonzero for necked power/ground widths; independent DRC passed the authored minimum rules, but those summaries still need engineering review. In particular, the INA input necks include short 0.1524mm segments rather than a deliberate high-current entry.

Highest-priority visual fixes:

  1. Left 5V trunk: the highlighted noodle runs from J105.2 at (112.4,105.475) towards C113.1 at (111.475,122.875), with an INA feed branch. It is mostly 0.75mm F.Cu, with needless reversals and many tiny segments. Replace it with a deliberate trunk/branch arrangement; move small passives and local signal escapes rather than preserving this obstacle-hugging path. R130 currently sits at (110.4,111.2), 180°, with its ground via at (109.2,111.8). Read-only inspection found a near-straight x≈110mm corridor mostly obstructed by that pull/ground connection. This is a lead, not an implemented or validated replacement layout.
  2. HUSB VBUS_DET feed: a 0.75mm 5V_L path loops down around the USB region to y≈140.85 before returning to U102.4. This is a low-current sense feed. It should be a short tap, not another large supply trunk. Existing 5V vias at (119.2,132.2), (119.0,133.725) and the main front trunk x=112.5 may help.
  3. Right 5V branch: F.Cu from (107.1,84.4) to J205.1 at (112.4,86.525) takes an unnecessary zigzag through y≈85.2/86.1. The longer B.Cu feed towards the top-side INA also deserves review; it was a manual workaround around the I2C escapes, not a preferred finished power layout.
  4. Remaining fanout: review gratuitous layer changes, small stair steps, narrow power entries, ground detours and decoupling connections. Do not assume the unmentioned signal routes are visually or electrically accepted.

Each ear path is designed for 750mA, with the full USB/power budget still a qualification task. Keep upstream 5V separate from each INA's measured EAR_5V output. Preserve the local monitored ear pours and verify the INA pin escape.

The original manual all-front USB pair was preserved, at 0.219mm width / 0.127mm gap on the standard 7628 stack. Avoid gratuitously disturbing it. BX clocks/data currently use front module escapes and bottom runs below the buck, with L3 reshaped to retain ground beneath the main audio corridor. Keep return paths intentional when reworking power. The saved design has neither D101 nor D102, no fuse/inrush limiter and no external LED-data pulldowns; preserve those manual decisions rather than resurrecting older instructions.

Checks already performed and their limits

The last verified saved snapshot has 86 footprints, 80 nets, 1030 track segments and 167 vias. Under the original project rules:

  • Source refilled DRC: 0 errors, 0 unconnected items, 0 schematic parity.
  • Seven remaining warnings: four USB/module silk-edge clips and three 0.8mm button-label heights. No dangling copper findings remain in this snapshot.
  • Standalone and parent ERC: 0 findings.
  • All numbered PCB pad nets match the fresh XML netlist; fourteen fixed poses match the pre-implementation snapshot.
  • Native source/live serialisations agreed except the saved-only 3D model-path property. Native final via/paste shape checks found zero intersections.
  • Source project/rule files were preserved; no firmware or ear-source edits were made during this routing pass.

These are connectivity/geometry observations, not routing-quality acceptance or proof of assembly, RF/audio/current/thermal or worn operation. The mask and source checks are useful evidence; the visual review was insufficient.

Local evidence: build/headband-implementation-20261026-221353/. Useful outputs under exports/ include source-routed-drc.json, final-band-erc.json, final-parent-erc.json, final-verification.json, final-paste-check.json, current.xml, final-front.png, final-back.png, native SVGs in final-routes/, and routing/repair logs. The reported screenshot is retained there as reported-power-trunk.png. Earlier failed and superseded trials are retained; the final source hash above identifies the actual checkpoint. Do not blindly execute the saved one-off build scripts: many assert a particular historical preimage or reconstruct an obsolete trial.

Workflow for the revision

Inspect KiCad recovery and current Git state first. Preserve newer manual work and keep one mutation owner. Follow the repo's Konnect-first workflow; authorised native KiCad IPC/Python/UI fallback is allowed for unsupported operations, with saved/live readback and independent checks. Never text-patch KiCad files.

Re-establish the power paths and local placement before filling the remaining space with signals. Review actual native plots at useful scale between bounded passes. Retain the fixed poses, cable contract and shared footprint repairs; work on guarded copies for experiments. Finish with fresh netlist/ERC, full refilled DRC/parity, paste/mask review and a clear list of unresolved physical gates. If KRT is used again, both rule-preservation controls in the routing guide remain mandatory.