KiCad (component library repo)¶
Repo: ~/Documents/GitHub/KiCad — symbols/, footprints/, 3dmodels/, blocks/, template/.
Facts¶
- Field conventions: kicad-symbol-fields
- ~8,660 symbols; ~8,300 carry an MPN but under 5 field names: "Manufacturer Part Number" (8339), "Manufacturer_Part_Number" (95), "Manufacturer Product Number" (77, +8 with trailing space), "Part Number" (12), "Part_Number" (11). ~8,190 carry a "JLCPCB" LCSC number.
- Bulk is Yageo passives (5,557), Panasonic (622), onsemi (538), Bourns (457).
- Schematic house-style tools live in the repo,
scripting/schematic/(README there):kicad-overlap-check,kicad-tidy,kicad-tidy-check;kicad-pcb-from-netlist(scripting/pcb/) is a headless Update PCB from Schematic plus first placement. Hellen boards build withscripting/hellen/hellen-create-board. All are symlinks in~/.local/bin. Procedure: SOP-021 step 8. - Generic passives carry no IPN (SOP-008 section 7): numbers go on the placed instances at BOM time. The Panasonic 1206 1% and the 0805/1206 5% libraries have LCSC blank by design (the JLC part is an ERP substitute), so do not hand-fill LCSC there.
Open¶
<<<<<<< Updated upstream - [ ] Rendered overlap, later: (2) symbol check in library CI, (3) sch_gen auto-nudges fields. Decide if KiCad's DNP cross over a field counts (Mounting-Hole_3mm: 8 hits). - [ ] Run kicad-check on the server after the 2026-10-30 merges (#5 BLE54 parts, #6 title block 006): not run before merging; expect 2 missing 3D models (QFN-48-1EP_6x6mm_P0.4mm_EP4.6x4.6mm, Crystal_SMD_2012-2Pin_2.0x1.2mm) per SOP-008 step 40. ======= - [ ] ERP part EE-C-0241 (Taiyo Yuden LBMF1608T100M): repoint its Symbol to EmbeddedEra:L_10uH_0603_80mA (renamed 2026-11-01 merge; L_10uH_0603 is now the Murata LQM18DN100M70L). - [ ] Run kicad-check on the server after the 2026-10-30 merges (#5 BLE54 parts, #6 title block 006) and the 2026-10-31/11-01 merges of #10, #9, #11 (b047dad, 4a2757c, 734cb8c): not run before merging; expect 2 missing 3D models (QFN-48-1EP_6x6mm_P0.4mm_EP4.6x4.6mm, Crystal_SMD_2012-2Pin_2.0x1.2mm) per SOP-008 step 40.
Stashed changes - [ ] Walk SOP-045 (KiCad design blocks) on a real board and flip it to active: place a block with layout as a group, Update PCB with "Group footprints based on symbol groups", Apply Design Block Layout. Then add layouts to the 19 schematic-only blocks in
blocks/EmbeddedEra.kicad_blocks/(most reused first: Stm32g0b1c_48pin, Can, RS3485, USB_C_2) and retire the oldblocks/<name>/project folders (SOP-008 step 35). SOP-045 was written on the Mac and is not yet published: runsop-deployon the server. - [ ] Optional, on or after 2026-11-05: delete the AFEX pre-purge backups in~/precious(*-pre-afex-purge-20261006.git,Robot-Cow-004B-A-fab.pre-afex-purge-20261006.zip,afex-commit-maps-20261006/). Owner 2026-10-06: only the KiCad libraries mattered; the other AFEX follow-ups (GitHub support ticket, Universal_Tester, local resync, ~/precious hits) are dropped. - [ ] STI-2004 parts (branchsti2004-parts, now fully in master via garage-door-parts, c110c74; both missing models added 2026-10-29): runkicad-erp-sync auditandpull(dry run, then --yes) for the new non-generic parts (SOP-008 steps 5-9), theninstall-kicad-libs.sh. - [x] (kicad-erp-sync fixed 2026-10-30, ops-scripts ac257ed: KICAD_LIB_REPO)kicad-adopt(line 17) andkicad-erp-sync(line 20) hard-code REPO=~/kicad-lib, so they cannot work on a branch worktree; SOP-008 step 39 says to work on a branch. Add a --repo option (or honour $EMBEDDEDERA_DIR). - [ ] JK-nSMD005 manufacturer name "Jinrui" is from LCSC only (not at Digi-Key/Mouser/Nexar): confirm before the ERP part is created. - [ ] Own-libraries rule leftovers (2026-10-06, branchown-libsof ~/kicad-lib, not merged becausekicad-checkfails 8 library items, 118 errors = 110 + 8). No 3D model source:LED_WS2812B-2020_PLCC4_2.0x2.0mm(EE-C-0133; KiCad's own footprint points at a STEP its repo does not have),LED_Kingbright_KPA-3010_3x2x1mm,nucleo32, and the YAAJ BluePill/BlackPill footprints (5 files, WindowsD:/.wrl paths). Add STEP files to3dmodels/(vendor download), then mergeown-libs.XDCR_AT-1127-ST-2-Rwas linked to the existingAT-1127-ST-2-R.STEPwith zero offset/rotation: check it in 3D. - [ ] Apply the ERP Symbol/Footprint change list in one approved step:~/Notes/projects/kicad-erp-own-libs-change-list.csv(82 parts, 70 active; templates 1 and 2). Until thenkicad-erp-sync auditshows 74 non-EmbeddedEra references and about 90 field mismatches (symbols already moved, ERP not). Mergeown-libsfirst. - [ ] Design projects still on stock libraries (report only, not edited): 1789 schematic/board files in 560 folders referencepower:,Device:,Neoden_YY1_PNP:,Resistor_SMD:etc. and non-EmbeddedEra 3D models; most are copies under ~/engineering, ~/precious. Migrate each when next edited (SOP-008 step 41).power:symbols (23,932 refs) have no EmbeddedEra copy yet;Neoden_YY1_PNP.kicad_symstays beside its EmbeddedEra copy until designs move.
See ~/Notes/tasks.md — this section is now generated from the task register.
- Ask GitHub support to purge cached views and old commit SHAs of EmbeddedEra/KiCad (sensitive-data removal): force-push does not remove old commits from direct SHA URLs. (Same request covers Cow_Robot_Board: its refs/pull/1..14 still hold the old commits; see the 2026-10-06 Cow_Robot_Board purge entry.)
- Redraw if ever needed (no stock equivalent, blanked Footprint field in Bourns_output / Onsemi_Diodes_output*): D_SOD-123FL, D_SOD-123FA, D_SOD-123HE, D_SOD-323HE, D_SMA-FL, D_SOD-523F, D_SOD-723, D_SOD-923F, D_SOT-723, D_SOT-1123, D_SC-59, and 28 Bourns SRN inductor footprints (SRN1060 and SRN8040TA exist in stock but without a STEP model).
- ERP part EE-C-0144 still carries footprint
AFEX Library:D_SOD-123F; kicad-erp-sync audit now shows 92 field mismatches (was 34) because KiCad symbols point at EmbeddedEra_Library names and the ERP still has stock names. Repoint ERP footprints via the sandbox first (SOP-008). - Review and merge (or delete) the
rescue/mac-2026-10-12/*branches pushed from Angel's MacBook Air when its pre-purge clones were retired: Cow_Remote (master, turning-control, remote-tester), cricket (main, main-wip, low-power), BuzzBand (fix-sound-light-sleep, fix-sound-light-sleep-wip), Cow_LCD (Frequency_Hopping), Universal_Tester, Robot_Link, git-ai-commit, codex-personal (main/master-wip), The_Real_Cow_Configurator (Organization-stash). Each starts from the clean GitHub commit its local work was built on, so it may need rebasing onto today's branch. - MacBook Air
~/Documents/GitHub/Server/*.md(HOW_TO_ACCESS_PLEX_SERVER, SAMBA_DOCKER_SETUP) hold the Plex/Samba password in plain text, and it is weak. Change it, keep it only in Vaultwarden, redact the docs; only then push the folder to a private repo (upload was refused for that reason on 2026-10-12).
Handoff (2026-10-31): roll the schematic rules out to existing product repos¶
- Done and merged today: EmbeddedEra/KiCad#12 (rendered overlap check, rotate-then-mirror fix, template 0 overlaps,
scripting/schematic/sch_overlap_precommit.py), #13 (blocks 0 overlaps), EmbeddedEra/Project_Template#3 (tracked.githooks/pre-commit, CI overlap check with--base, AGENTS.md/CLAUDE.md rules, fresh board-1). SOP-021 1.19 and SOP-022 1.2 deployed.~/.local/bin/kicad-overlap-precommitis now a shim to the library script (ops). Proof after merge: fresh clone of Project_Template main, overlap commit refused by the repo hook (library found via kicad_common.json) and by the shim. - Not yet checked: the template's own CI run on GitHub after merge (the Project_Template repo may lack the
KICAD_LIB_TOKENsecret; look at the Actions run for adfb7b5 before trusting it). - Next action: OpenPulse (
~/Documents/GitHub/OpenPulse, branch board-scaffold) gets the template's.githooks/pre-commit,.github/scripts/kicad_checks.py, the kicad-checks.yml changes (fetch-depth 0, safe.directory,--basestep,hardware/_kicad_reports/), and the AGENTS.md hardware section + CLAUDE.md; replace its.git/hooks/pre-commitwithcore.hooksPath .githooks. Then the other template-made repos (gh repo list EmbeddedEra+ check for product.yml). Proof per repo: overlap commit refused, CI script--baseexits 1 on a changed sheet.
Handoff (2026-11-02 21:00 EST): design blocks moved to cloud sessions¶
- Branch
design-blockspushed to EmbeddedEra/KiCad (11d3334). Has GATE.md (headless apply test works: IPC applyDesignBlockLayout, 0 um), first blockldo-xc6206-3v3+_2sneeds_review (ERC/DRC/overlap 0, apply pass), andblocks-run/(CLOUD.md rules, cloud-setup.sh, blocks.tsv = 79 blocks tiers A/B/C, SOP copies). Server copy: worktree ~/kicad-blocks-run/main. - Server driver stopped (it billed Max; gate cost $10.32). The $228 cloud credit (expires 2026-11-05 02:59 EST) is spent only by anthropic_cloud sessions; the eeroute cloud session also draws on it.
- Cloud probe (session_016XHSEQspyujhPwFJFPhLpA): KiCad 10.0.8 via PPA ~30 s, ERC/DRC run, pcbnew+IPC under Xvfb works after clicking the first-run wizard; no docker; ti.com ok, st.com/digikey blocked for curl.
- Owner runs 3 cloud sessions (tiers A, B, C) on branches blocks-A/B/C; each writes blocks-run/REPORT-
.md. - Next: merge blocks-A/B/C into design-blocks; review new_parts for ERP sync (SOP-008), symbols/EmbeddedEra_Blocks_
.kicad_sym merge into one lib; draft PR design-blocks -> master was not opened (permission denied), open it then.
Log¶
-
2026-11-04 task #150 closed: PR #49 merged (a40e7041), main checkout pulled and clean. Numerical reference in docs/PCB-DESIGN-RULES.md; three generic profiles corrected and natively probed; 80 unit tests and hosted quality gate pass. SOP-021v1.21 published. Generic impedance policy is complete; real products require stackup-specific calculation/order evidence. Details: project-template.
-
2026-11-04: task #150 rule inventory: latest master ae5ca35d pulled; source-based numerical reference and Hellen profile caveats proposed in PR #49, commit e159fe73. Nine class rows / three profile rows verified, metadata check zero blockers. Default numerical rules preserved. Owning investigation/state: project-template. <<<<<<< Updated upstream
- 2026-10-31: Block overlaps to 0 (draft EmbeddedEra/KiCad#13): Mounting-Hole_3mm fields moved off the DNP cross (both copies), USB_C_2 U6 fields clear of the R7/R8 GND. The 4 "wire under GND stem" hits (Can, RS3485, Serial) were a checker bug:
xformmirrored before rotating; KiCad rotates, then mirrors on the sheet (proof: KiCad netlist puts Eeprom C1 pin 2 on GND only under the new order). Fixed on #12 (09eb9cd) with a test; sch_tidy uses the same xform, so its pin positions for rotated+mirrored symbols were wrong before too. Node sets and ERC unchanged; OpenPulse still 0. - 2026-10-31: Schematic rules in the product template (Angel's order). Draft EmbeddedEra/Project_Template#3 (branch schematic-rules): tracked
.githooks/pre-commit(README step 4git config core.hooksPath .githooks) runs the library's newscripting/schematic/sch_overlap_precommit.py;kicad_checks.pyadds the rendered overlap check per root sheet (--base origin/$GITHUB_BASE_REFon PRs: changed sheets errors) and stops ERC'ing sub-sheets alone; workflow fetch-depth 0 + safe.directory, report path fixed; root AGENTS.md/CLAUDE.md and template AGENTS.md carry 7 schematic rules;hardware/board-1was a stale flat copy, re-copied fromtemplate/EmbeddedEra_Project; fab.yml rule_file was the JLCPCB file, now the default. Library template: 5 overlaps fixed on #12 (9b41810, 2c7b252: SWD labels at wire ends, J1 moved 20.32 mm left; 47 node sets identical; PTS810 LCSC lib mismatch fixed). kicad-check: board-1 is a fragment like CI (ops 26aab00). Proof on a fresh clone: clean commit passes, overlap refused; CI script --base HEAD~1 exit 1 (error), --base HEAD warning exit 0, master library notice exit 0, hook without library warns exit 0. Template: kicad-check ERC 0e, DRC 0/0, overlaps 0; same 0 on the 10.0.5 container (CI's version); board-1 node sets identical to the library template (rename kept annotation). Hook also finds the library via KiCad's kicad_common.json EMBEDDEDERA_DIR and kicad-cli in KiCad.app (the Mac has neither on the shell; tested with a Mac-style fake HOME). SOP-022 1.2 (hooksPath in step 1.1) and SOP-021 1.19 row/step 8 edited, not deployed. -
2026-10-31: Rendered overlap gate (handoff steps 1 and 4).
kicad-overlap-check ROOT --rendered(PR EmbeddedEra/KiCad#12, branch rendered-overlap-check, worktree ~/kicad-lib-overlap) measures stroked-text ink in kicad-cli's SVG vs other text and every drawn line. kicad-check (ops 4114b1b) runs it per root sheet in the container,--base REF= errors on changed sheets, else warnings; newkicad-overlap-precommit. Proof: OpenPulse c03d1dc 21 overlaps (all doc-check's), HEAD 0 text/text but 4 real text/line; same on 10.0.5 container and 10.0.7 AppImage. Library: 42 sheets, 22 warnings in 4 (all real). SOP-021 1.19 step 8 edited, sop-deploy after merge. Gotchas: KiCad SVG plots symbol fields twice (dedupe); hiddenlayer omits pin names; pdftotext boxes for vertical text are inflated (doc-check's GPIO0/GND hits were artefacts, the real one is VDD/GND).¶ - 2026-11-01: Owner: PRs #9 and #11 reopened and merged to master (#9 4a2757c, #11 734cb8c) after merging master into each. #9: gen_ble54_models.py now builds both the CC2340 QFN24 and 1612 crystal models. #11: both sides had added L_10uH_0603 as different parts; master's Murata LQM18DN100M70L (300 mA, CC2340 DC/DC) keeps the name, OpenPulse's Taiyo Yuden LBMF1608T100M (80 mA, IPN EE-C-0241) renamed L_10uH_0603_80mA. Scripting tests 25 pass (esp32 model test needs LFS). kicad-check not run. No open PRs.
- 2026-10-31: PR #10 merged to master (b047dad) on owner's OK, without #9: rebased onto master (after #13), conflict in scripting/gen_ble54_models.py resolved by dropping xtal1612(); 8 new symbols, all footprints present, RGE0024B STEP pulls from LFS. kicad-check NOT run (server unreachable from the Mac session). #9 (nRF 0201 + 1612 crystal) still open, unmerged.
Stashed changes
- 2026-10-31: PR #10 (cc2340r52-parts, stacked on #9): CC2340R52E0RGER symbol (2 units as TI U1A/U1B), RGE0024B footprint (EP 2.45, stock has only 2.7/2.1), 48 MHz TZ3908AAAO43 crystal, TI-BOM reference parts; owner decided nRF54L15 -> CC2340R52 today. Netlist in BLE_Module/hardware/BLE54_Module/ti_reference_circuit.md. Open: Murata MLCCs stock 0 at DK/Mouser; IPNs from the sync.
- 2026-10-31: PR #9 (ble54-0201-1612-parts): 4 caps + 120R bead 0201 + Crystal_32MHz_1612_8pF (ABM12W-...-8-D1X-T3) and a new 1612 footprint/STEP. Open: ABM12W worst-case ESR 80 ohm / C0 2 pF is ~10 ohm over Nordic's CL=8 line (typical passes); owner to accept or choose another crystal. IPNs still to come from the sync (server).
- 2026-10-16: Autorouter plugin research and plan (Freerouting + KiCadRoutingTools + KiCad 11 API): kicad-autorouter. Proposal, nothing built.
- 2026-10-12: MacBook Air local clones retired (Mac had never run afex-local-resync.sh). Local-only work found by message+date match against origin (rewritten repos showed "ahead N, behind N" but held the same commits): pushed to
rescue/mac-2026-10-12/*branches built on the clean GitHub twin commit (cherry-pick / diff apply), every one scanned for AFEX (only base64/binary false positives). New private repos: EmbeddedEra/5k, Garage_Opener, Pacer, Zebra-Labels, Bike-Computer.~/Documents/GitHub/KiCad(KiCad's EMBEDDEDERA_DIR on the Mac) replaced by a fresh clone (650 MB, 0 AFEX, nordic-lib-kicad copied over); old 3.4 GB pre-purge copy and 31 other clones moved to Trash. Kept on the Mac: KiCad, KiCAD-MCP-Server (Codex MCP), Server, Website, Portable_Meter. - 2026-10-06: AFEX purge, second batch (owner order, verbatim "Rewrite history and force-push to remove AFEX from Cow_Remote, PSU, Boost_Gauge, Remote_Universal, Universal_Tester_003, Universal_Tester, safe-updi, ops-scripts and git-ai-commit. Backups first."). Same recipe as Cow_Robot_Board: backup mirror (0700, fsck clean) in ~/precious, open-PR check, tip fixed by a normal commit (KiCad:
AFEX Library:->EmbeddedEra_Library,AFEX:->EmbeddedEra; kicad-check ERC/DRC per-file counts identical before/after on Cow_Remote, PSU, Boost_Gauge, Remote_Universal, Universal_Tester_003; text repos reworded; git-ai-commit appId/publish owner/author now neutral EmbeddedEra values,npm test133 tests, same 130 pass / 2 fail as before the edit (the 2 are a .env fixture that fails in this environment)), git-filter-repo (paths, replace-text, messages, zips repacked via blob-callback), force-push --all and --tags. Fresh-mirror check on branches+tags:-S,-G,--grep, path search,git grepper revision and zip-content scan all 0 for the 8 repos done. SKIPPED: Universal_Tester (open PR #12). refs/pull still resolve old SHAs: Cow_Remote 1-4, Remote_Universal 1 (Cow_Robot_Board 1-14, earlier); only GitHub support can drop them. ExpressLRS fork: false positive only (lowercaseafexinside base64 image data of Doc/200428E-1501384.pdf and bytes of two VS Code .BROWSE DB files); not rewritten. Cow_Robot_Board release hw/Robot-Cow-004B/A: only the schematic PDF in Robot-Cow-004B-A-fab.zip replaced (AFEX sat in two JS annotations; kicad-cli from the tag's purged commit, 1 page, text identical, the other 32 members byte-identical, sha256 64d96ad4...), re-uploaded with --clobber; original kept as ~/precious/Robot-Cow-004B-A-fab.pre-afex-purge-20261006.zip. The Cow_Remote 006/A and finger-003/A fab zips were already clean. ~/.local/bin (ops-scripts) pushed first, then reset to the purged origin/main. Support text: ~/Notes/projects/afex-github-support-request.md. Local-clone resync: ~/Notes/projects/afex-local-resync.sh (dry-run done, real run not run). Old-SHA lists and commit-maps: ~/precious/afex-commit-maps-20261006/. - 2026-10-06: AFEX purge of EmbeddedEra/Cow_Robot_Board (owner "Ok"). First fixed the current files on main (0de0895): dropped the
AFEX Librarypinned lib from both .kicad_pro, repointedAFEX Library:footprints to EmbeddedEra_Library andAFEX:symbol nicknames to EmbeddedEra in sch/pcb/fp-info-cache; kicad-cli 10.0.5 loads both, ERC 288 and DRC 120 (with parity) identical before and after. Backup~/precious/Cow_Robot_Board-pre-afex-purge-20261006.git(0700). git-filter-repo on a fresh mirror: paths matching afex removed, replace-text AFEX -> EmbeddedEra_Library:/REMOVED, messages scrubbed, plus a blob-callback that repacked 41 KiCad backup zips with the same text replacement (compressed content is invisible to -S). Force-pushed 11 branches and 8 tags. Fresh-mirror check on branches and tags:-S afex,--grep, path search and git grep over every revision all 0. Not removable by us: refs/pull/1..14 (still resolve old SHAs) and one release asset PDF. PRs were 12 merged/closed, none open. Other EmbeddedEra repos scanned (48): clean except the ones listed under Open. Local:~/Cow_Robot_Boardresynced; the rest blocked, owner commands (per repo R, with commit-map from the purge in /tmp/claude-1000/.../scratchpad/crbf/filter-repo/commit-map):git -C R fetch --prune --force --tags origin,git -C R reset --hard origin/mainin each checked-out worktree,git -C R branch -f <b> origin/<b>for the other branches (sandbox/robot-cow-production maps via the commit-map to 0de0895-era descendants; if unsure reclone), thengit -C R reflog expire --expire=now --all && git -C R gc --prune=now. Non-git copies with AFEX (regenerable, untouched): ~/engineering/cache/{Universal_Tester,Cow_Robot_Board,Cow_Remote}, ~/engineering/site/docs and docs.prev, ~/engineering/codex-test/task148/{site,candidate-site,baseline-html,candidate-html,cache,board}, ~/.local/state/engineering-backups/task148/cache; git clones of other repos with AFEX: ~/engineering/repos/{Boost_Gauge,Universal_Tester_003,Remote_Universal,PSU,Cow_Remote}, ~/engineering/cow-remote-*. ~/precious list: /tmp/claude-1000/precious_afex.txt (154 files). - 2026-10-06: Own-libraries-only rule (kicad-own-libraries-only) applied on branch
own-libs:kicad-checkgained an "EmbeddedEra libraries only" check (symbol Footprint outside EmbeddedEra_Library, footprint model missing/outside 3dmodels/,board_featuretag as the only no-model marker),kicad-erp-sync auditlists ERP Symbol/Footprint outside EmbeddedEra, newkicad-adoptcopies a stock footprint+STEP or symbol in (49 footprints, 40 models,EmbeddedEra_GenericR/C/LED/D_Zener/FerriteBead,EmbeddedEra_Neoden_YY1_PNP; 78 symbol Footprint fields repointed; 20 board-feature footprints tagged). Proposal Sheet repointed (old values in columns O-P). SOP-008 2.4 section 10. Check: 118 errors = 110 + 8 missing-model library items, so not merged. - 2026-09-18: Added the first manufacturer-neutral EmbeddedEra passive pilot:
EmbeddedEra_Resistors_0603.kicad_sym, 799 one-percent E24/E96 values generated deterministically from the existing Yageo library. Standard Manufacturer/MPN fields remain the preferred exact Yageo part for BOM/ERP compatibility; AVL fields approve Vishay CRCW0603 e3 and KOA RK73H1J across the source range, plus Panasonic ERJ-3EK only from 10 ohm through 1 Mohm. Boundary supplier lookups caught and prevented a false blanket Panasonic approval. Generator, regression test and policy are underscripting/; KiCad 10 parses the complete output. Merged/pushed asa79138f. Capacitors deliberately wait for a separate dielectric/voltage/DC-bias policy. - 2026-09-18: Made the generic passive AVL directly editable at
scripting/generic_passives_avl.json; adding, removing, reordering, or range-limiting an approved alternate there regenerates all 799 symbols. Validation rejects incomplete, duplicate, or inverted-range entries. Tests and KiCad parse passed; pushed as5f82de5. - 2026-09-18: Completed task #1 with
scripting/fill_from_cache.py: exact-MPN-only Mouser cache mapping for Manufacturer, Description, and Datasheet; existing non-empty metadata is never overwritten and writes are atomic. The initial cache had 116 exact MPNs covering 76 symbols; it preserved curated fields and filled two blank datasheets. Another 8,500 MPN-bearing symbols await exact cached responses and will be filled safely on later reruns. Offline regression, idempotence check, and KiCad parse passed; pushed as0e66b3a. - 2026-09-18: Completed task #4's Panasonic 1206 audit. The original file was systemically corrupt: only 684 parseable symbols, 79 blank MPNs, and all 605 populated MPNs were Yageo
RC1206JR5% parts under a Panasonic manufacturer label. Rebuilt all 799 E24/E96 values deterministically with active Panasonic ERJ-U08F (1 ohm–1 Mohm, 0.25 W) and ERJ-PM8F (>1 Mohm–10 Mohm, 0.66 W) MPNs; exact boundary parts were checked through the configured supplier APIs. Generator, regression test, and full audit record are underscripting/; KiCad 10 parses the output. Merged/pushed ase75aae0. - 2026-09-18: Fixed task #147:
ESP32-C6-LCD-1.47now references the trackedEmbeddedEra_Library:ESP32-C6-LCD-1.47footprint instead of the machine-localAngel_Library. KiCad 10 exported the symbol successfully; pushed commit974975c. - 2026-09-09 Researched KiCost for lifecycle/cost. KiCost v1.1.20 (Mar 2025) is BOM-oriented, leans on Octopart (now paid) plus scrapers; it does flag obsolete/NRND but is the wrong shape for a library scan. Plan: use official
digikey-apiv4(ProductStatus, datasheet, pricing) +mouserPyPI for dual-source, key on the MPN field; normalise the 5 MPN field names first. For symbol generation: easyeda2kicad (LCSC) / kandle (SnapEDA, Ultra Librarian ZIPs); no free tool generates symbols straight from the Digi-Key API. Parser: kiutils is stale; a symbol-only s-expression pass is enough. - 2026-09-09 Wrote
scripting/normalize_mpn.py(unified 5 MPN field names → "Manufacturer Part Number", 204 renames, 1 dup dropped; preserves CRLF) andscripting/lifecycle_scan.py(Mouser part-number search, stdlib only, full raw JSON cached inscripting/.cache/mouser.json, 30-day refresh, CSV report). 6,814 unique MPNs → ~7 days at Mouser's 1,000/day quota. Key lives in~/.config/kicad-libsync.env. - 2026-09-09 Decision: sourcing fields on every symbol are exactly Description, Manufacturer, Manufacturer Part Number, Datasheet, LCSC (not JLCPCB; LCSC is what kicad-jlcpcb-tools/easyeda2kicad read by default).
scripting/standardize_fields.pyenforces it: renamed JLCPCB/JLCPCB Part #/Part#/Alt, stripped whitespace, dropped stray Field6/KLC_*/PARTREV, added empty hidden placeholders. All 8,661 symbols now pass; kicad-cli parses all 26 libs. Three odd-indent single-symbol libs were reformatted withkicad-cli sym upgrade --force. Run order: normalize_mpn.py then standardize_fields.py. Uncommitted in working tree. - 2026-09-09 Digi-Key Product Information v4 wired into
scripting/lifecycle_scan.py(client-credentials OAuth, no callback; token lives 10 min).--source mouser|digikey, caches inscripting/.cache/<source>.json. Digi-KeyDescription.ProductDescriptionis the uppercase catalogue style for kicad-symbol-fields;DetailedDescriptionis the long one. Both quotas 1,000/day; run each daily with--limit 950. -
2026-09-09 Built
part-lookupCLI: sourcescripting/partlookup.py, shim~/.local/bin/part-lookup, subcommands get / search / lib. Permanent per-part raw cache at~/.local/share/part-cache/<source>/, shared withlifecycle_scan.py(old .cache/*.json migrated, 1,905 entries). Global skill~/.claude/skills/part-lookup/SKILL.md+ pointer in~/.claude/CLAUDE.mdso every project uses it instead of browsing. Gotchas: Mouser returns prices as "$0.10" strings and stock as strings; Digi-Key QuantityAvailable can be null with stock only in ProductVariations. Digi-Key keyword search returns reel-variant MPNs (RC0402FR-13…), solibmust be checked by value, not by the search result MPN. -
2026-10-06: Post-ERP-clean-up library pass (ffc1cd7): 151 symbol Descriptions synced to the ERP ALL-CAPS text (audit: 0 description mismatches, 0 IPN problems, 0 conflicts), IPN repointed 0092->0163, 0104->0105, 0114->0113 (two kept because designs use them; SOP-008 step 15 allows several symbols per number). Retirement of 19 unused symbols was blocked pending owner OK; see Open item in embeddedera-app.
- 2026-10-13: Shared schematic tools added (64ef5b9): overlap check now models KiCad's field-justification flip and counts power-symbol arrows (it had missed 28 overlaps on rusefi-sti-2004); house-style tidy ported from KiCad's autoplace_fields.cpp. USBLC6-2SC6 and HRO USB-C got LCSC numbers on branch sti2004-parts; NCV8401BDTRKG added there.
- 2026-10-13: Gotchas: one malformed constraint in a .kicad_dru makes KiCad ignore the whole file with no message (test: add a 5 mm clearance rule and see DRC explode). Board Setup minimums are floors custom rules cannot relax: keep them at fab capability and tighten with rules.
min_resolved_spokestakes a bare number, not (min n). - 2026-10-13: pcbnew Python gotchas (KiCad 10.0.5): board.Remove() of footprints/vias/zones corrupts the heap (later segfault, often while printing an unrelated exception: run with -u -X faulthandler and print exceptions without importing traceback); SaveBoard of a board loaded without its .kicad_pro writes KiCad defaults over the project file; LoadBoard twice on one path returns the cached board; call BuildConnectivity() before ZONE_FILLER or every island is dropped. PCB_VIA has no SetUnconnectedLayerMode (use Padstack()).
- 2026-10-13 (moved from memory
kicad-schematic-automation, 2026-10-19): schematic-scripting lessons from rusefi-sti-2004. The tools list and the pcbnew/DRC/routing traps already live in~/kicad-lib/scripting/README.md("Known traps"; outside the vault, so not edited from here). Not yet there: (1) kicad-cli has no autoplace and no schematic API, so edit the .kicad_sch text surgically (small diffs) and re-check. (2) When KiCad behaviour is unknown, measure it: build a tiny schematic with every case,kicad-cli sch export pdf, read positions withpdftotext -bbox(how the field-justification flip rule was found; pinned intest_sch_tools.py). (3) After any wire/symbol edit compare netlists by node sets (kicad-cli sch export netlist --format kicadsexpr); it caught a wire end on mid-wire not connecting (needs a junction), a dropped stub disconnecting shield pins, and a helper that silently discarded its own move. (4) A tidy step must not trade overlaps: keep a running score that only goes down. (5) The checker has blind spots each time (rotated fields, power arrows, own text inside small bodies): render and zoom dense areas too, and when a render shows a problem the checker misses, fix the checker first. (6) kinet2pcb (community) builds a PCB from a netlist but drops symbol paths and the board outline;kicad-pcb-from-netlistkeeps both. KiCad 10 has no CLI autoplacer: placement = fixed/centred parts + grid arrays + pull-to-connected-pads, checked by DRC (courtyards, schematic parity). (7) Hellen boards are 4-layer (modules carry In1/In2); default all parts on top for one-pass JLC assembly. (8) Routing reports must check unrouted connections per net, not the DRC error count (one run "passed" with two power nets missing).
Checks — kicad-cli, KiCad 10 (2026-09-13)¶
kicad-cli is installed as a wrapper (since 2026-10-13 around the KiCad 10.0.7 AppImage; KICAD_IMAGE=kicad/kicad:<tag> forces a container) — originally around the pinned kicad/kicad:10.0.5 container
(~/.local/bin/kicad-cli) — no sudo apt, and a pinned version means a check that passes
here passes the same way in CI. kicad-check runs ERC and DRC over every schematic and
board in a repo and prints, or emits JSON for the audit.
Three things it had to learn before its numbers meant anything:
- It generates the library tables itself. There is no
fp-lib-tableorsym-lib-tablein the repo, so a fresh clone cannot resolve our libraries and reports thirty "footprint library not configured" warnings. Generated from the repo's own.prettyand.kicad_symfiles, the same everywhere. - A block is a fragment, not a design. Unconnected pins and undriven power rails are
the point of a reusable block — the parent design provides them. Counting them gave 227
"errors" across 44 projects, nearly all meaningless. Anything under
blocks/ortemplate/is exempt from that class. - A dangling label in a fragment is downgraded, not exempt. It is often the interface to the parent, and it is also exactly how a typo looks — so it is a warning for a person to judge once, not a guess by the tool.
Version matters more than it looks. The first run used KiCad 9 and reported 21 errors;
10.0.5 reports 57 across 22 projects. The repo is mixed — block schematics are still the
v9 format (20250114) while the symbol library is already v10 (20251024) — so the older
CLI was reading a newer library. Design happens in 10, so 10 is what the checks use.
The real findings are mostly manufacturing: usb_c and USB_C carry 16 DRC errors each
(clearance, one at 0.1984 mm against a 0.2 mm rule; hole clearance; an invalid outline).
Next: wire kicad-check --json into sop-audit as a SOP-008 check so the count lands on the
board and stays visible, and see engineering-portal for the pages built on top.
kicad-ibom — the BOM you use at the bench (2026-09-14)¶
kicad-ibom board.kicad_pcb writes a single self-contained HTML file: click a BOM line and
the part highlights on the board, front and back. It is a production tool, not a
drawing — it is what belongs on a tablet while populating a board.
- InteractiveHtmlBom 2.12, vendored at
~/.local/share/ibom, run inside the pinned KiCad container because it needspcbnew. - Headless works via
INTERACTIVE_HTML_BOM_NO_DISPLAY=1; without it the tool wants an X server and the container has none (there is no xvfb in the image either). - Verified self-contained: no external CSS, JS or fonts, so it opens from a USB stick or an offline tablet. 325 kB for the JLCPCB template board.
It refuses a board with nothing on Edge.Cuts, and that refusal is correct rather than a
bug: blocks/usb_c and several other blocks have no outline, which is the same thing DRC
reports as invalid_outline. A block that is only ever dropped into a parent board may not
need one — but then it does not get an interactive BOM either, and that is the honest answer.
Next: generate one per board in CI and publish it, which is what engineering-portal shows.
- 2026-09-16: Gotcha: .gitattributes in EmbeddedEra/KiCad tracked *.STEP and *.stp in LFS but not lowercase *.step, so 66 models were LFS pointers on every clone (the shop server included) and every render showed a bare board. Fixed in commit c85a79d (*.step, *.wrl added). The server has git-lfs 3.8 user-space at ~/.local/bin/git-lfs; git lfs pull in ~/kicad-lib after cloning. CI checks out the library with lfs: true.
- 2026-09-28: Every EmbeddedEra footprint model now lives in 3dmodels/ and is referenced as ${EMBEDDEDERA_DIR}/3dmodels/<file> (25 KiCad stock models copied in so a KiCad upgrade cannot change them). CI step .github/scripts/check_model_paths.py enforces it. Removed the stale EmbeddedEra_Library.pretty.zip and a tracked JLCPCB backup zip; README variable renamed to EMBEDDEDERA_DIR. Pushed as 3740c9f. Still missing models (allowlisted in the check): YAAJ Blue/Black Pill .wrl (5 footprints), 850-10-005-10-003000.STEP (PROGRAMMER_1x05), SolderWire-0.5sqmm_1x05 and the 0.1sqmm SolderWires (need Connector_Wire.3dshapes from kicad-packages3D). Local KiCad 10 sym/fp lib tables now register all repo libraries; legacy .lib symbols (YAAJ, digikey-symbols) and 10 loose .kicad_mod files in footprints/ are not registered.
- 2026-09-28: Added install/ (double-click installer: Install-KiCad-Libs.command / .bat / install-kicad-libs.sh, backing script install_kicad_libs.py) that registers every repo symbol/footprint/block library and the EMBEDDEDERA_* path variables in KiCad 9 and 10 config; refuses to run while KiCad is open (KiCad rewrites the tables on exit and erased hand-added entries once). Windows/Linux paths untested. Added EmbeddedEra_Resistors_0402/0805/1206 (799 x 1% E24/E96 each) from one generator scripting/generate_generic_resistors.py; AVL per package in generic_passives_avl.json (series verified through part-lookup; 1206 has no alternates above 1 Mohm because ERJ-PM8F is 0.66 W). 0805 Yageo source had one stray duplicate 60.4 ohm, dropped. Not built: 0201, 1210, 2010, 2512 (2512 Yageo source corrupt), 5% variants. Local commits 29e7c46..5f088ab, not yet pushed.
- 2026-09-28: Added EmbeddedEra_Resistors_0201/1210/2010/2512 (799 x 1% each) from the same generator; no source symbols exist for these sizes, so the Yageo MPN comes from yageo_code() (reproduces all 799 existing MPNs for 0402/0603/0805). 2010 and 2512 use series RC2010FK/RC2512FK (the FR code is not found at either distributor). Spot-checked by part-lookup, not every value: many values show 0 stock and a few are Mouser-only. Panasonic alternates: ERJ-1GNF (0201), ERJ-P14 (1210), ERJ-1TYF (2512); none active for 2010. Stock footprints and models for these sizes copied into the repo. Still not built: 5% variants. Local commits ahead of origin, not pushed.
- 2026-09-28: KiCad 9 support dropped; repo files upgraded to KiCad 10 format with kicad-cli (27 sch/blocks, 11 boards, 16 symbol libs, 324 footprints), 60+117 stock 3D refs repointed to ${KICAD10_3DMODEL_DIR} (.wrl -> .step), installer is KiCad-10-only. ERC 601 / DRC 240 identical before and after. GOTCHA: kicad-cli sym upgrade keeps only the LAST entry per repeated symbol name, silently dropping distinct MPNs (0603_Cap_Yageo 586->313, 1206_Cap_Yageo 331->205, Bourns_output 413->316); those three were restored to pre-upgrade content and stay old format (fix later by making symbol names unique). Also footprints/PCB_USBC.pretty was a read-only dir that broke git merges (chmod u+w). Added 5% resistor libs (EmbeddedEra_Resistors_<size>_5pct, 169 each, all 8 sizes; 2010/2512 use RC..JK/FK series) and EmbeddedEra_Capacitors_0402/0603/0805/1206 (689 symbols: C0G + X7R<=1uF, 6.3-100 V, one lib per size, series-level AVL; generator scripting/generate_generic_capacitors.py). All 16 resistor + 4 capacitor libs are KiCad 10 format and fixed points of sym upgrade. Pushed. Open: 5 AFEX footprints with .wrl models that have no .step in KiCad 10 stock; capacitors 0201/1210/2010, X5R policy, Murata GRM188/21/31 codes unverified; the Panasonic 1206 source still references AFEX footprint.
- 2026-09-28: Template refresh (template/EmbeddedEra_Project): passives moved from Neoden_YY1_PNP to generic EmbeddedEra_Resistors_0603 / EmbeddedEra_Capacitors_0603 (100n 50V X7R, 1u 16V X7R, 10K 1%), embedded symbols refreshed (ERC 55 -> 44, lib_symbol_mismatch 0), nets identical (47), FB1 footprint now EmbeddedEra_Library:FB_0603_1608Metric, Customer text variable added beside Costumer, legacy template/default and JLCPCB_Multilayer removed. Open: FB1 (220R) and SW1/SW2 (PTS810) still on Neoden_YY1_PNP (no EmbeddedEra symbol); generic R/C libs carry no IPN yet; U1/J1 have IPN but blank Manufacturer/MPN; stale (project "") instance entries in the schematic; the 39 pin_not_connected/3 power_pin_not_driven ERC items need no-connect flags/power flags.
- 2026-09-28: Removed the routed "SENSOR READER 003" board from template/JLCPCB_1-2Layer (it was a product board with no schematic, not a template). A local copy was made in its own repo and then deleted at Angel's request; the only copy is now git history in this repo, last present at aa877f9. template/ holds only EmbeddedEra_Project plus the worksheets.
- 2026-09-28: Added FerriteBead_220OHM_0603 (INPAQ MHC1608S221NBPDG) and SW_Push_PTS810 (C&K PTS810SJM250SMTR LFS) to EmbeddedEra.kicad_sym (IPN blank, sync assigns). Removed Preferred/Alternate/Sourcing Policy fields from all 20 generic libs and the template (alternates live in the ERP BOM per bom-alternates; the AVL JSON stays as the source that feeds the ERP step). Template now uses only EmbeddedEra libs (Neoden refs gone; FB1 Value is now "220OHM"). SOP-008 2.0 draft (steps 21-26) covers generic passives; kicad-erp-sync bom-resolve is still to build on the server. Rollback tag rollback/before-alternates-strip (983e55f). Pushed.
- 2026-10-06: Library clean-up finished (f04b153): deleted 19 unused symbols (165 to 146); stripped IPN from board features (EE-M-0001, EE-C-0127, 0116, 0118, excluded from BOM) and programming pads (0065 STM32 SWD 1.27 mm, 0067 UPDI 1.27 mm: excluded, footprint-only, 3D model removed from PROGRAMMER_1x05_P1.27mm_Vertical); IPN stripped from placeholders 0010, 0094, 0103, 0041; 0098 repointed to EE-C-0196 (0196 extends 0098, so 0098 stays as the base drawing).
kicad-erp-sync auditaccepts a blank IPN when the ERP part is archived. SOP-008 2.3 steps 35 to 37. kicad-check unchanged at 87 projects, 110 errors. - 2026-10-06: Library clean-up f04b153 broke loading (deleted REG_APE8865N parent of XC6206 derived symbols); fixed in 22780df, which also restored the 2.54 mm PIC/STM32 programming pads as footprint-only (owner uses 2.54 mm). kicad-check now fails if a symbol library won't load.
-
2026-10-06: ERP-as-KiCad-library phases 1-2 done on the SANDBOX ERP only (kicad-erp-library-plan). Plugin 2.1.0 installed and read; production already runs 2.0.4 with templates, categories, 141 parameterised parts and a LAN httplib (the plan had not noticed). Demo:
erp-library/httplib_check.py(brancherp-httplibin kicad-lib, commit 747f323, unpushed) lists 175 parts, resolves a resistor and an STM32,kicad-cliBOM and netlist carry IPN, Footprint, Value, MPN, and the BOM exports with the ERP stopped. Proposal Sheet (189 parts): https://docs.google.com/spreadsheets/d/1zQM6SUKdlRZvnzNmMWaYzbCdJu_AKqzXe0CEH4hv3Hw/edit . Cloudflare bypass script prepared, not applied:~/assistant-sandbox/scripts/erp-kicad-public-path.py; blocker is the forgedCf-Access-Authenticated-User-Emailheader (production trusts it), strip it in the ERP Caddyfile first. SOP-008 2.2 draft section 8. Sandbox stopped. -
2026-10-06: AFEX purge (owner: no AFEX in our GitHub libraries, delete history). Backup mirror
~/precious/kicad-repo-pre-afex-purge-20261006.git. Commit 590cb1f deletedfootprints/AFEX Library.pretty(260), both AFEX symbol libs, repointed ~6,200 Footprint fields to EmbeddedEra_Library (stock-derived; pad geometry equals KiCad stock except old AFEX 0402/0603/0805/1206 caps and D_SOD-323F, which differed by <=0.05 mm), blanked 477 with no equivalent. Then git-filter-repo on a fresh clone (paths matching afex removed, text AFEX -> REMOVED, messages scrubbed) and force-pushed all 6 branches and the tag; new master 8f6ff32; no PRs. Verified on a fresh mirror:git log --all -i -S afex,--grep, andgit grep -i afexover every revision are all empty. own-libs merged into master. kicad-check not worse per project. - 2026-10-13: Installed ~/kicad-lib (master) into the server's KiCad 10.0 GUI via install/install_kicad_libs.py: 46 symbol, 6 footprint, 2 design-block libs + EMBEDDEDERA_* vars in ~/.config/kicad/10.0. EmbeddedEra libs only (no KiCad stock tables), per kicad-own-libraries-only; so no power: symbols until an EmbeddedEra power lib exists. Re-run the installer after a pull adds libs.
- 2026-10-13: Branch cleanup: deleted merged own-libs, generic-0603, fix-panasonic-1206 (local + worktrees ~/kicad-lib-ownlibs, ~/kicad-generic, ~/kicad-panasonic) and e-branch-1, fix/kicad-check-errors on GitHub. Left: cow-yy1-rotate (1 commit, kicad_to_yy1 --rotate + Robot Cow feeder slots; merges clean, tests 6 pass/1 skip on py3.12) and erp-httplib (local only, unpushed).
-
2026-10-13: PR #2 merged (8d8d95e): kicad_to_yy1 --rotate, specific-footprint feeder match, Robot Cow YY1 slots. Branch cow-yy1-rotate deleted. erp-httplib pushed to GitHub (placeholder token only), not merged. CI failure on #2 is the pre-existing 21 errors, not this change (script/toml only).
-
2026-10-13: The 21 CI errors were all DRC
invalid_outlineon design-block .kicad_pcb (no Edge.Cuts, correct for a block).kicad-checkalready exempted it for fragments; CI's copy had drifted. PR #3 adds it to CI FRAGMENT_EXEMPT; reproduced in kicad/kicad:10.0.5: 21 -> 0 errors. -
2026-10-13: Owner: checks run on our server, not GitHub (kicad-checks-on-server). Pre-push hook in ~/kicad-lib gates master on
kicad-check(89 projects, 0 errors, ~2 min; tested refusing on failure). GitHub stays as storage. SOP-021 1.4. -
2026-10-13: GitHub Actions removed from master (1a31bc2), pushed through the kicad-check pre-push gate; PR #3 closed. GitHub is storage only.
-
2026-10-13: For rusefi-sti-2004 (worker on Fable): 0 ohm jumpers added to the generic resistor generator (EE_R_
_0_5%, RC*JR-070RL, active at DK/Mouser); power symbols adopted into EmbeddedEra_Generic; new part symbols and footprints on branch sti2004-parts. JK-nSMD005 graphic slimmed to 2.0 mm so fuses stack at 2.54 mm. - 2026-10-13: Looked at rusEFI hellen-one as a model for reusable modules. It is a gerber-merge system: each module is frozen fabricated gerbers+BOM+CPL per revision, the board is a frame of placeholder footprints, and
bin/process_board.py+ gerbmerge merges them (python3.8/Docker, no licence on the repo, copper not editable, no DRC across modules). Not adopted. KiCad 10 design blocks already carry schematic + PCB layout (.kicad_pcbinside the.kicad_block); only 7 of 26 of ours have a layout (Battery_Charger_1s, Led_0603 x3, Regulator-5_3.3V, Stm32g0b1k_32pin, USB_C). Oldblocks/<name>/project folders duplicate them. - 2026-10-13: Owner wants the PCB side of blocks in use. KiCad 10 flow (manual, Design blocks): place block in schematic as group -> Update PCB with "Group footprints based on symbol groups" -> right-click group -> Apply Design Block Layout. The 7 blocks with layouts have footprint refs identical to their symbol refs. Wrote SOP-045 KiCad Design Blocks (draft).
- 2026-10-13: KiCad IPC API survey (source mirror). 10.0: board API + RunAction (any tool action by name, e.g.
pcbnew.InteractiveDrawing.applyDesignBlockLayout) + ParseAndCreateItemsFromString; schematic API empty. master/11.0 (dev, Sep 2026 commits) adds ImportNetlist (= Update PCB from Schematic), PlaceFootprintFromLibrary, schematic PlaceSymbolFromLibrary, GetSchematicNetlist, library table commands. Gap: no Place Design Block command in either. Upstream is gitlab.com/kicad/code/kicad (merge requests), not GitHub. Do not fork. - 2026-10-30: usb-hub-parts 7b8f95e: 3D model transforms fixed for RNH0030A (rotate z 90), ShouHan USB-C (offset 0 -1.3 1.63), Jing USB3-A (z -0.5), CUI UJ2 (4.11 -3.5 0, shell recoloured). KiCad model frame is y-up: board_y = -(model_y + offset_y). Boards embed model transforms, so USBHub2/USBHub3 need Update Footprints from Library. Before/after PNGs: /tmp/claude-1000/-home-angel-claude-remote/3239e64b-f3a1-4be8-8222-62c1472e0c84/scratchpad/{before,after}.
- 2026-11-02: Reviewed owner's 50-block overnight
claude -pprompt (not run). Decided: build in ~/kicad-lib on branch design-blocks from origin/master, into existing blocks/EmbeddedEra.kicad_blocks/ (not a new root lib); ~11 of the 50 map onto existing blocks, which get layouts first, not duplicates; EmbeddedEra parts + ERP IPN only (no stock KiCad libs, no invented IPNs); blocks carry no Edge.Cuts and no GND pour (dev// harness owns them); gate = applyDesignBlockLayout via IPC on Regulator-5_3.3V before fanning out; reuse scripting/ tools, no new tools/; top-only default + _2svariant only where it saves area; run on the server (docker tools + IPC harness), ≤3 parallel worktrees. Pending owner: confirm "single/double-sided" = assembly side, and the $ cap. - 2026-11-02: Owner approved: both variants for every block (
<id>top-only,<id>_2sdouble-sided), list widened to 80 blocks ranked by use in our 20 product repos (tier A = on 2+ boards). Launched~/kicad-blocks-run/run.shin tmuxblocks(19:44): per-jobclaude -pwith hard per-block $ cap, total cap $185 of the $228 credit (expires 2026-11-05 02:59 EST), no new jobs after 01:30 EST; phases gate (apply test via IPC + ldo-xc6206-3v3) -> parts (missing parts into symbols/EmbeddedEra_Blocks.kicad_sym + footprints/EmbeddedEra_Blocks.pretty, ERP sync list in PARTS.md) -> 3 slot worktrees merged into branch design-blocks (worktree ~/kicad-blocks-run/main). Rules in ~/kicad-blocks-run/RULES.md, list in blocks.tsv, spend in costs.tsv. Nothing pushed. - 2026-11-02: Gate passed on server (GATE.md, apply test automated); first block ldo-xc6206-3v3 (+_2s) needs_review. Owner chose to run everything as cloud sessions to spend the $228 cloud credit; server driver stopped; design-blocks pushed with blocks-run/ cloud kit.