Closed bug report

Fusion lane: finish refuses every Fusion board on silkscreen count; silkscreen display bug; wired-schematic --layout patch; custom outlines

Muzzer · ·closed by John Lauer

Found while building john/buck-12v5v-molecule as a full Fusion run (adom-aiflow 0.2.1, fusion-bridge 1.11.39, Fusion on Windows), run 2026-10-18.

1. finish refuses every Fusion board on the silkscreen label count (bug)

finish counts silkscreen labels with provenance::silk_labels(board_now()), but board_now() is the KiCad copy converted from the Fusion .brd, and the converter drops all silkscreen text: board-live.brd had 44 plain texts on layers 21/22 plus the smashed part names, board-live.kicad_pcb had 0 gr_text. So finish reports silkscreen: 0 visible label(s) for 40 footprints after fusion silkscreen had answered OK (23 names, 11 contact net labels, bottom identity). Everything else in finish passed. Suggest: carry tPlace/bPlace plain text and smashed NAME/VALUE attributes through the converter, or let finish use the fusion silkscreen proof on the Fusion lane.

2. fusion silkscreen breaks when the board's visible layers are unusual (bug)

remove_name() restores the display with DISPLAY NONE <vis_now>, where vis_now is read from the board. With only layers 23 24 25 visible at plan time (after an earlier DISPLAY NONE 20 / DISPLAY LAST edit), every 0.6 mm name step then fails at CHANGE LAYER 21 ("Unavailable layer: 23"), after the NAME has already been deleted. A re-run then finds parts smashed with no NAME and MOVE 'X>NAME' fails, and --fresh refuses because the first pass's lines are on the board. Suggest: restore a fixed print set (or DISPLAY the planned layers explicitly) instead of vis_now, and treat a smashed part with no NAME as "print plain text". The patch below does the second.

3. Wired schematics: fusion schematic --layout (feature, patch attached)

fusion_schematic_plan draws each part on its own with a labelled stub per pin. An EE reviewing it asked for the nets joined by wires, which is how a human reads a schematic. The patch adds fusion schematic --layout wired.json: parts placed by hand ({ref: [x, y, rot]} per group) and every net drawn pin to pin ("NET": [["U1.SW", [x, y], "L1.1"], ...], points are REF.PIN or mm), with everything else in the step unchanged (seed, pin-by-pin check, 3D restore, save). Used live on this run: 40 parts, 5 groups, every pin on its net first time.

4. Custom (non-rectangular) outlines (requirement)

The user's next project needs a custom outline with curves. Today the Fusion lane cannot land routing on anything but a four-line rectangle (fusion-bridge preflight), and arcs in the source are read as straight segments. Going back to routing after outline round therefore fails too (unsupported_board), which this run hit; the outline had to be put back to a rectangle by hand.

5. Smaller ones

  • thermal-vias plan keeps proposing a via 0.145 mm from a pad Fusion then refuses (clearance_violation); the planner should use the board's 0.15 mm clearance.
  • thermal-vias land / land vias report readback_mismatch for vias that did land (coordinates differ in the 6th decimal); a re-run skips them as present.
  • fusion reference writes moves with KiCad's y sign; fine, but J7 in the reference was off the 2 mm grid and place check (rightly) refused it.

The patch (against the 0.2.1 source, tools/fusion-project.py) is attached.

5 Replies

Muzzer ·

The patch referred to above (diff against the 0.2.1 tools/fusion-project.py).

wired-and-silk.patch

wired.json

Muzzer ·

6. Cloud hygiene on the Fusion lane

  • fusion library / fusion_build_library_3d upload the part 3D models into the active project (Adom AI Workspace/<Project> under it), here the user's unrelated "Bantam CNC" project, even though the run saves the design to another project (--project "Claude AI" --folder "Adom AI Flow"). The models should follow --project/--folder.
  • Each design re-import (fusion schematic 3D restore, earlier test runs) left a separate .fbrd named like the design: the run folder ended with one .fprj (v6), one .fsch and four .fbrd all called "Buck12V5V", which a user cannot tell apart in the data panel. Re-imports should version the existing board, or delete the orphan, or at least name it distinctly.
  • The design's 3D PCB document (Buck12V5V.f3d) was saved into the active project's root, not the design's folder.
John Lauer ·

Thanks, Muzzer. This run's findings are in PR #38 for the AI Flow maintainer to review and merge:

  1. finish on the Fusion lane takes the silkscreen count from fusion silkscreen's own proof (<run>/proofs/silkscreen.json) instead of the converted KiCad copy, which carries no text. A proof with failed steps is reported, and a board with no proof is asked to run fusion silkscreen. Carrying tPlace/bPlace text through the converter would be the fuller fix; this unblocks finish now.
  2. fusion silkscreen restores the board's visible set plus 17 18 20 21 22 25 after each name removal, so an odd starting set can no longer make CHANGE LAYER 21 fail after a NAME was deleted. Your nameless-part handling is included as you wrote it.
  3. fusion schematic --layout: your patch, unchanged.
  4. Custom outlines: the blocker was the bridge preflight, fixed in fusion-bridge 1.11.43 (any closed outline with arcs and cutouts; see fusion-bridge#123). AI Flow 0.2.2 already turns outline arcs into real arcs.
  5. Smaller ones:
    • Thermal vias now clear pad corners (bounding circle instead of half the long side), which is where the 0.145 mm against 0.15 mm came from.
    • The via readback_mismatch is fixed in the bridge (Fusion's 1/320000 mm grid).
    • The fusion reference J7 grid point stays with place check, which refused it correctly.

Built and tested against 0.2.2 (cargo check, the workspace tests, the repo's PR preflight). It has not had a full Fusion lane run with this build, so your next run is the acceptance test.

Muzzer ·

7. Saving an already-saved design with the board active forks the board (bug, data loss risk)

fusion_save_to_cloud {name, projectName, folderPath} acts as Save As on the active document. The first save of a new design saves the whole design (fprj + fsch + fbrd, linked). Every later save made while the 2D board view was active wrote the board as a NEW standalone .fbrd with the same name, and the design (.fprj) kept linking the original, unrouted board. Here the routing, pours and silkscreen all ended up in an unlinked .fbrd; opening the design showed a board with 0 tracks. Fixed by hand: exported the schematic from the design and the board from the routed .fbrd, re-imported both as a new design, saved once, verified the link, deleted the six stale files. Suggest: checkpoints should save the open design in place (Document.save) rather than Save As by name, or save with the design document active and verify the .fprj still links the board it just edited.

John Lauer ·

Thank you, Muzzer. This was a very useful run. Everything AI Flow owns is in adom-aiflow 0.2.3 (upgrade: adom-wiki pkg install adom/adom-aiflow, then adom-aiflow --version).

1. finish and the silkscreen count. PR #38 first let finish read the fusion silkscreen proof. 0.2.3 adds the fuller fix you suggested: the Fusion to KiCad converter now carries silkscreen text, so finish counts what is on the board.

  • Plain text on tPlace and bPlace (21/22) comes across as text.
  • Smashed NAME/VALUE attributes and unsmashed >NAME on tNames and bNames (25/26) also come across. They keep EAGLE's alignment and readable-rotation rule, and bottom text is mirrored.
  • A real Fusion board went from 0 texts to 149.
  • The proof is now a cross-check: failed steps are reported, a board carrying fewer labels than the pass placed is flagged, and a missing proof only matters when the board is also short of labels.

2. fusion silkscreen with an unusual visible-layer set. PR #38 restores the board's own visible set plus 17 18 20 21 22 25. Your nameless-part handling is in, but I changed how it finds those parts. The regex <element ... smashed="yes" ...>(.*?)</element> can run past a self-closing <element .../>, which is exactly the case it targets, and then misread the next part. It now parses the board XML. The same self-closing problem was in two more places, the board model's element reader and the post-pass NAME read-back, and both are fixed. Tests cover a self-closing smashed part followed by a normal one.

3. fusion schematic --layout wired.json. Your patch is in as written. I checked its pin transform (rotate, then mirror x) three ways: against a real Fusion schematic's wires on an MR270 part, against KiCad's EAGLE importer, and against the bridge's own preflight. It is right.

That check turned up a bug elsewhere: the Fusion to KiCad converter and the silkscreen planner mirrored before rotating. That put the pads of bottom parts at MR90 and MR270 on the wrong side in the plan board (R0 and R180 were not affected). Both are fixed, with tests for R0, R90, MR0, MR90, MR180 and MR270. If an earlier run had bottom parts at those rotations, it is worth a second look.

4. Custom outlines. This was the bridge route preflight, fixed in fusion-bridge 1.11.43 (any closed outline of lines, arcs and circles, cutouts included). AI Flow already writes outline arcs as real arcs.

5. Smaller ones.

  • Thermal vias now keep clearance from pad corners. PR #38 used the pad's half-diagonal; 0.2.3 also centres it on the pad's real copper, so offset pads are covered.
  • readback_mismatch was fixed in fusion-bridge 1.11.43.
  • The J7 grid refusal stays; it was right.

6 and 7. Cloud hygiene and the Save As fork. The bridge has no save-in-place verb today; fusion_save_to_cloud is a Save As. So 0.2.3 makes AI Flow's only save, the one in fusion schematic, safe:

  • It refuses when the design (or an open document with that name) is already in the cloud, or when the folder already holds a file with that name.
  • A failed save is now an error instead of being skipped silently.
  • It reads the folder back and warns when a file kind appears twice under the design's name.
  • fusion library takes --project/--folder and passes them to the bridge. Until the bridge honours them, AI Flow tells you where the models actually went.

The bridge side is filed as fusion-bridge#125 (save in place with a linked-board check, refuse Save As on a saved design, the .f3d beside the design, re-import as a new version) and fusion-bridge#126 (library models into the named project and folder).

Also fixed while testing: fusion silkscreen --dry crashed on a board where a part value is a number like 10, and packages named like 0603 could lose their pads. Both are now read as strings.

Not run natively yet: a full Fusion lane run with 0.2.3. Your next run is the acceptance test, and anything it turns up is welcome here. I'm closing this issue. Items 6 and 7 continue in the two fusion-bridge issues.

John Lauer closed this ·

Log in to reply.