Lessons · CoScad

Lessons from the first prints

What went wrong between the first .assemble file and a finished part on the bed, and what fixed it. Dates are late September 2026; the printers were a Bambu Lab A1 with an AMS Lite and a P1S with a single spool. The fixes live in the code, so this page is the reasoning behind them.

Slicing with Bambu Studio's CLI

Presets did not apply. BambuStudio --load-settings ... --load-filaments accepts Bambu's own preset files but does not resolve the inherits chain inside them, so a filament preset loaded raw sliced with density 0, a flow limit of 2 mm³/s and a 200 °C nozzle. A bracket estimated at 17 minutes took 11 with the real profile. scripts/bambu-slice.py flattens the chain before loading.

The head moved but nothing came out. The printer's start, end, filament-change, layer-change and timelapse gcode are not in the machine preset either: Bambu ships them as <printer> template <key>.json files next to it and the GUI merges them in. Without them the sliced file ran a generic placeholder start sequence that never loads filament. The first ball print was cancelled at layer 9 for this. The script now merges the template files, with a fallback to the 0.4-nozzle templates for other nozzle sizes.

The printer asked for filament to be pushed in. The start command was not told which spool to use, so the A1 targeted the external holder, and loading from there with an AMS Lite present is a manual step: it unloads, then waits for a hand. Both scripts take --spool external|ams0..ams3 and the run script defaults to whatever is loaded, then the single AMS slot holding the right material.

Calibration was skipped. The start command's flow_cali and layer_inspect flags default to off in a hand-written command and on in Bambu Studio's print dialog. They are on now.

Talking to the printer

The manual host (mac mini)

OpenSCAD launched by a launchd job blocked for half an hour per render inside open(): BOSL2 lived under ~/Documents, macOS asks each new process for Documents access, and nobody was at the screen to answer. The library now lives at ~/srv/BOSL2 with COSCAD_BOSL2 pointing at it. A stack sample (sample <pid>) is what showed the blocked open().

The planner meeting real assemblies

Each new assembly broke an assumption in coscad plan; the fixes are in 2026-09-25-PLAN.md, the reasons are here.

Designing for the printer

Checking

coscad check splits each part's render into bodies by connectivity, so two instances of a part that touch face to face (the ball's shells at the equator) count as one. The pairs it does test are still exact; only the count is off.