Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
New Autodesk account: 3D mint fails with a raw 'NoneType has no attribute rootFolder' instead of naming the missing cloud project
3D mint fails on a fresh Autodesk account: 'NoneType' object has no attribute 'rootFolder' leaks a Python AttributeError instead of naming the cause
John moved Fusion to a new Autodesk account today. Every fusion_create_library run now fails at the bind stage, and the error is a raw Python exception rather than something a caller can act on.
Verbatim from fusion_prove_result:
"bind": {
"success": false,
"wip_urn": null,
"error": "mint failed: f3d saveAs did not produce a .f3d path: {'projErr': '2 : InternalValidationError : id.size()', 'err': \"'NoneType' object has no attribute 'rootFolder'\"}"
}
Two things are wrong here, and the second is the one that cost the time.
1. The mint needs cloud storage the new account does not have yet
rootFolder on a None means the code reached for a cloud project and got nothing back. The mint uploads an .f3d to Autodesk cloud storage, so with no project (or no hub) there is nowhere to save it and saveAs produces no path. The projErr alongside it - InternalValidationError : id.size() - is consistent with an empty/absent project id.
That is a plausible and even reasonable thing to fail on. A brand-new account has no default project until one is created.
2. The error does not say that
'NoneType' object has no attribute 'rootFolder' is an implementation detail escaping to the caller. Nothing in it names the actual problem ("this account has no cloud project"), and nothing tells the caller what to do about it. I only worked it out by reasoning about what rootFolder implies, then trying to list cloud projects to confirm.
Ask: detect the no-project / no-hub case before attempting saveAs, and return something like:
{ "success": false,
"errorCode": "no_cloud_project",
"error": "3D minting uploads an .f3d to Autodesk cloud storage, and this account has no cloud project. Create one in Fusion (or select a hub) and retry.",
"_hint": "..." }
An errorCode matters more than the prose - it lets a caller distinguish "your account is not set up" from "the mint is broken", which are completely different responses.
Environment
- Fusion
10.0-era build, ab2.0.76, fusion360 bridge1.9.132 - Inputs: gate-passing
.lbr+.stepper part (non-empty packages, everyconnectresolving, and no pre-existingpackage3d/wip_urn) - Run: 10 parts, one at a time, sweeping dialogs between parts
Also seen in the same run
Fusion exits mid-chain, repeatedly. During the run Fusion went away twice; my preflight detected it OS-side and asked the bridge to restart it. On the crash there are no recovery artifacts written (~/.adom/recovery/fusion newest entry is from 2026-08-21), so it looks like a clean exit rather than a crash. Whether that is downstream of the failed cloud save or independent, I cannot tell from outside.
Two parts returned no runId at all (ads1220irvar, rp2350b) right after a cold fusion_start, then the next part got one. So fusion_create_library can return without a runId while Fusion is still settling - a not_ready errorCode there would be better than an empty response the caller has to guess at.
Not the input data
All 10 .lbr files pass a pre-flight gate immediately before the run: non-empty <packages>, every <connect> resolving to a real pin and pad, and no package3d. Worth noting for anyone reproducing: fusion_create_library writes the minted wip_urn back into the .lbr on disk, so a second run against the same file starts with an account-scoped binding from the previous account baked in. I now restore pristine copies before every run - that is arguably worth documenting, since a .lbr that was clean when you published it will not be clean after one successful run.
Happy to re-run the 10 the moment there is something to test - it is scripted, takes about an hour unattended, and I will post the table.