main
Colby Knox fusion-lane: the 22 cloud verbs at platform tier; since 0.31.0 on the four new verbs 5426551 8d ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235
[
 {
  "name": "bodies",
  "tier": "core",
  "summary": "Every part's 3D body as a box: its footprint rectangle on the board and its height range above the surface it sits on (a bottom part measures down from the bottom). Names the parts with no 3D body and the ones whose body is not where the board puts the part. Read only.",
  "input": {
   "filePath": "path to the board (optional; default the open board)",
   "refs": "[ref] (default every part)"
  },
  "output": {
   "bodies": "[{ref, side: top|bottom, x0, y0, x1, y1, z0, z1}]: the bodies companion (schema/companions.schema.json), mm",
   "noBody": "[ref]: parts with no 3D body, so no height",
   "suspect": "[{ref, why: [string]}]: a body off its footprint, floating above the board or sunk into it",
   "tallest": "{top: {ref, heightMm}, bottom: {ref, heightMm}}",
   "surfaceZMm": "{top, bottom}: the z of each board surface",
   "revision": "string"
  },
  "hint": "The rows are the bodies companion, which height_check, placement_check and enclosure checks read. One box per body and one box per part are both valid; checks take the union per part.",
  "pitfalls": [
   "A part whose library has no 3D model is in noBody: it has no height, not a height of 0.",
   "A body in suspect usually comes from a wrong or offset library model: fix it before trusting its height."
  ],
  "related": [
   "height_check",
   "placement_check",
   "add_body",
   "render_board_3d"
  ],
  "example": {
   "refs": [
    "U1",
    "J2"
   ]
  },
  "longRunning": false,
  "timeoutSeconds": 120,
  "proposedBy": "fusion-lane",
  "since": "0.3.0",
  "agreedBy": [
   "altium-lane"
  ]
 },
 {
  "name": "render_board_layers",
  "tier": "native",
  "summary": "Render chosen board layers to an image file without opening a window: a preset view (copper, silkscreen, solder mask, paste, outline, drill, assembly or fabrication, of either side) or a list of layers, as png or svg.",
  "input": {
   "filePath": "path to the board (optional; default the open board)",
   "preset": "all | top_copper | bottom_copper | top_silkscreen | bottom_silkscreen | top_soldermask | bottom_soldermask | top_paste | bottom_paste | outline | drill | assembly_top | assembly_bottom | fabrication (default all)",
   "layers": "[layer]: copper by its standard name (F.Cu, In1.Cu, B.Cu) or any layer by the tool's own id; overrides preset",
   "format": "png | svg (default png)",
   "dpi": "int, default 300 (png)",
   "mirror": "bool, default false: draw the board as seen from below",
   "monochrome": "bool, default false",
   "outputPath": "the image file to write (default beside the board)",
   "listPresets": "bool: answer the presets and their layers, and make no image"
  },
  "output": {
   "path": "path",
   "format": "png | svg",
   "widthPx": "int (png)",
   "heightPx": "int (png)",
   "preset": "string, or custom when layers was given",
   "layers": "[layer]: what was drawn",
   "presets": "{name: description} (listPresets)"
  },
  "hint": "Each preset is a fixed set of layers, so two bridges draw the same view. For a 3D picture use render_board_3d. The show_* verbs open a window; this one does not.",
  "pitfalls": [
   "Mirroring is never automatic: a bottom preset is drawn as seen from the top unless mirror is true.",
   "Inner copper layers appear only when listed in layers."
  ],
  "related": [
   "render_board_3d",
   "render_schematic",
   "export_gerber",
   "export_pdf"
  ],
  "example": {
   "preset": "assembly_top",
   "format": "png",
   "dpi": 300
  },
  "longRunning": false,
  "timeoutSeconds": 60,
  "proposedBy": "fusion-lane",
  "since": "0.3.0",
  "agreedBy": [
   "altium-lane"
  ]
 },
 {
  "name": "plan_route",
  "tier": "checks",
  "summary": "Plan a path for one net between two pads without changing the board: a grid search around the existing copper that keeps the clearance rules, on the allowed copper layers, with vias where they help. Answered as route_net's arguments.",
  "input": {
   "filePath": "path to the board (optional; default the open board)",
   "net": "string (required)",
   "from": "the start pad as Ref.Pad (required)",
   "to": "the end pad as Ref.Pad (required)",
   "widthMm": "track width (default the net's rule width)",
   "layers": "[F.Cu, B.Cu, ...]: the layers it may use (default the outer layers)",
   "allowVias": "bool, default true",
   "viaSizeMm": "default 0.6",
   "viaDrillMm": "default 0.3",
   "gridMm": "search grid, default 0.5",
   "viaCost": "a via costs as much as this many mm of track, default 5",
   "expectedRevision": "the revision the plan is for"
  },
  "output": {
   "found": "bool",
   "routeNet": "{net, layer, width, viaSize, viaDrill, paths}: pass it to route_net unchanged",
   "lengthMm": "number",
   "vias": "int",
   "reason": "string when found is false: no path within the search limits, a pad not on the net",
   "revision": "string: the board the plan was made on"
  },
  "hint": "Read only. Pass routeNet to route_net with expectedRevision set to revision; run_drc after the route is still the proof.",
  "pitfalls": [
   "Between dense pads a finer grid can find a path the default 0.5 mm grid misses, at a cost in time.",
   "The plan holds for the revision it read: route_net refuses it with stale_board once the board changes."
  ],
  "related": [
   "route_net",
   "route_pair",
   "run_drc",
   "routing_state"
  ],
  "example": {
   "net": "SDA",
   "from": "U1.12",
   "to": "J3.4",
   "layers": [
    "F.Cu",
    "B.Cu"
   ]
  },
  "longRunning": false,
  "timeoutSeconds": 30,
  "proposedBy": "fusion-lane",
  "since": "0.3.0",
  "agreedBy": [
   "altium-lane"
  ]
 },
 {
  "name": "generate_body",
  "tier": "core",
  "summary": "Make a part's 3D body from its package family and its datasheet dimensions (chip, SOIC, QFN, QFP, BGA, SOT-23, DFN, MELF, electrolytic can, crystal, pin header and others), to IPC-7351 proportions, optionally with a marking on its top, and write it as a STEP file.",
  "input": {
   "family": "chip | soic | qfn | qfp | bga | sot23 | dfn | melf | ecap | crystal | header and others (required; an unknown one is answered with the families the bridge supports)",
   "dimensionsMm": "{letter: mm}: the package drawing's JEDEC letters (A height, D body length, E lead span, E1 body width, b lead width, e pitch, L lead length; D2 and E2 the exposed pad's length and width, drawn when given) plus pins, always the part's total pin count for any family (a bridge converts it to its generator's own per-side or per-pair count); a missing one takes the family's default",
   "marking": "text on the top face (an MPN or a value code); a newline starts a second line",
   "markingStyle": "raised | engraved (default raised)",
   "outputPath": "the .step file to write (required)"
  },
  "output": {
   "stepPath": "path",
   "family": "string",
   "dimensionsMm": "{letter: mm}: every dimension used, defaults included",
   "bboxMm": "{x, y, z}",
   "marking": "string | null",
   "families": "[string] (when family is unknown)"
  },
  "hint": "The body is in the package's own frame (IPC-7351 zero orientation, seated on z = 0), ready for add_body. Compare bboxMm with the datasheet's body size before attaching it.",
  "pitfalls": [
   "A wrong dimension gives a plausible but wrong body: nothing checks it against a datasheet.",
   "A marking is real geometry: very small text on a small package is unreadable, which is not an error.",
   "pins is the total: QFN-32 is pins 32, not 8 per side."
  ],
  "related": [
   "add_body",
   "bodies",
   "height_check",
   "library_views"
  ],
  "example": {
   "family": "soic",
   "dimensionsMm": {
    "pins": 8,
    "D": 4.9,
    "E": 6.0,
    "E1": 3.9,
    "A": 1.75,
    "e": 1.27
   },
   "marking": "LM358",
   "outputPath": "C:/parts/LM358.step"
  },
  "longRunning": false,
  "timeoutSeconds": 120,
  "proposedBy": "fusion-lane",
  "since": "0.3.0",
  "agreedBy": [
   "altium-lane"
  ]
 },
 {
  "name": "library_views",
  "tier": "app",
  "summary": "Pictures of library parts for review, each as an image file: the schematic symbol, the footprint (pads and layers), the 3D body seated on the footprint, and the device view that maps symbol pins to pads.",
  "input": {
   "libraryPath": "path to the library (required)",
   "parts": "[part name] (required)",
   "views": "[symbol, footprint, 3d, device] (default all four)",
   "outputDir": "folder for the images (default beside the library)"
  },
  "output": {
   "captured": "[{part, view, path, ok, error?}]"
  },
  "hint": "The four pictures a reviewer checks before a part is used: the pin names on the symbol, the pad shapes, the body on its pads, and every pin mapped to a pad.",
  "pitfalls": [
   "The 3d view needs a body on the part (add_body): a part without one is reported with ok false, not drawn empty."
  ],
  "related": [
   "add_body",
   "show_3d_chip",
   "read_symbol",
   "footprint_primitives",
   "list_library"
  ],
  "example": {
   "libraryPath": "C:/libs/power.lbr",
   "parts": [
    "TPS54202"
   ],
   "views": [
    "symbol",
    "footprint",
    "3d"
   ]
  },
  "longRunning": true,
  "timeoutSeconds": 300,
  "proposedBy": "fusion-lane",
  "since": "0.3.0",
  "agreedBy": [
   "altium-lane"
  ]
 },
 {
  "name": "close_all_documents",
  "tier": "app",
  "summary": "Close every open document without a save dialog. Unsaved work is never lost by default: a document with unsaved changes stays open and is listed, unless save or discardUnsaved says what to do with it.",
  "input": {
   "save": "bool, default false: save each changed document, then close it",
   "discardUnsaved": "bool, default false: close changed documents without saving (their changes are lost)",
   "includeScratch": "bool, default false: also close never-saved scratch documents"
  },
  "output": {
   "closed": "[name]",
   "saved": "[name]",
   "keptOpen": "[{name, why: unsaved changes | scratch}]"
  },
  "hint": "Use it to start from a clean editor. keptOpen tells you what still needs a decision.",
  "pitfalls": [
   "discardUnsaved loses changes that exist nowhere else: ask the person first.",
   "A scratch document was never saved, so closing one with unsaved changes loses it entirely."
  ],
  "related": [
   "close_document",
   "save",
   "document_info"
  ],
  "example": {
   "save": true
  },
  "longRunning": false,
  "timeoutSeconds": 120,
  "proposedBy": "fusion-lane",
  "since": "0.3.0",
  "agreedBy": [
   "altium-lane"
  ]
 },
 {
  "name": "document_info",
  "tier": "app",
  "summary": "The active document: its name, what kind it is, whether it has unsaved changes, where it is saved and which version it is. Read only; opens nothing.",
  "input": {},
  "output": {
   "name": "string",
   "kind": "project | schematic | board | library | model | other",
   "saved": "bool: it exists as a file or a cloud item",
   "modified": "bool: it has unsaved changes",
   "path": "file path or cloud location | null",
   "version": "int | null: the saved version, where the tool keeps versions",
   "project": "string | null"
  },
  "hint": "Cheap. Call it before an edit verb to make sure the right document is in front.",
  "pitfalls": [
   "A schematic and a board of one design are separate documents in some tools: kind says which one is in front."
  ],
  "related": [
   "open_document",
   "close_document",
   "save",
   "status"
  ],
  "example": {},
  "longRunning": false,
  "timeoutSeconds": 20,
  "proposedBy": "fusion-lane",
  "since": "0.3.0",
  "agreedBy": [
   "altium-lane"
  ]
 },
 {
  "name": "export_3d",
  "tier": "native",
  "summary": "Export the board's 3D model in a mesh or CAD format other than STEP (export_step has STEP), through the tool's own exporter, with an optional web-optimized glb. format is an open list; each bridge answers the ones its tool writes.",
  "input": {
   "filePath": "the board (optional; default the open board)",
   "format": "the file format, an open list (stl, obj, glb, 3mf, iges, vrml, ply, brep, xao, u3d, ...); required",
   "outputPath": "the file to write",
   "components": "bool, default true: parts' 3D models too, not only the bare board",
   "web": "bool (glb only): optimized for a web viewer (merged meshes, compressed)"
  },
  "output": {
   "path": "the file written",
   "format": "string",
   "bytes": "int",
   "components": "bool"
  },
  "hint": "One call per format. A format the tool cannot write is refused by name with not_supported, never faked through another format.",
  "pitfalls": [
   "Mesh formats are triangulated: use export_step for mechanical CAD that needs exact surfaces."
  ],
  "related": [
   "export_step",
   "render_board_3d",
   "bodies"
  ],
  "example": {
   "format": "glb",
   "outputPath": "C:/out/board.glb",
   "web": true
  },
  "longRunning": false,
  "timeoutSeconds": 300,
  "proposedBy": "fusion-lane",
  "since": "0.28.1",
  "agreedBy": [
   "standard-lane",
   "kicad-lane",
   "altium-lane"
  ]
 },
 {
  "name": "import_design",
  "tier": "native",
  "summary": "Bring a design from another tool into a NEW native design with the parts instantiated: an EAGLE .sch with its paired .brd, a KiCad project, or an Altium project, through the tool's own importer.",
  "input": {
   "format": "the source tool, an open list (eagle, kicad, altium, pads, orcad, cadstar, fabmaster, pcad, ...); required",
   "filePath": "the schematic or project file (required)",
   "boardPath": "the paired board file, when the format keeps it separate",
   "name": "the new design's name"
  },
  "output": {
   "design": "the new design or project",
   "parts": "int",
   "nets": "int",
   "warnings": "[string]: what the importer could not bring over"
  },
  "hint": "The import makes a new design and never changes the source files. Check the result with schematic_review and cross_check.",
  "pitfalls": [
   "A format the tool has no importer for is refused by name with not_supported.",
   "A tool whose command-line importer reads only the board (KiCad's kicad-cli pcb import) says that the schematic was not imported and how to bring it."
  ],
  "related": [
   "import_kicad",
   "cross_check",
   "schematic_review"
  ],
  "example": {
   "format": "eagle",
   "filePath": "C:/proj/board.sch",
   "boardPath": "C:/proj/board.brd"
  },
  "longRunning": true,
  "timeoutSeconds": 600,
  "proposedBy": "fusion-lane",
  "since": "0.28.1",
  "agreedBy": [
   "standard-lane",
   "kicad-lane",
   "altium-lane"
  ]
 },
 {
  "name": "edit_pours",
  "tier": "native",
  "summary": "Change existing pours in place without redrawing them: clearance, minimum width, thermal relief (on/off, spoke width, gap), priority or rank, the net, and whether islands are kept. The copper is refilled and read back.",
  "input": {
   "pours": "[{id or net+layer, clearanceMm?, minWidthMm?, thermals?: {on, spokeMm, gapMm}, priority?, net?, keepIslands?}] (required)",
   "expectedRevision": "string",
   "dryRun": "bool"
  },
  "output": {
   "edited": "[{id, before, after}]",
   "pourState": "the pours after refill, as pour_state answers",
   "revision": "string",
   "mutated": "bool"
  },
  "hint": "pour_state lists the pours and their ids first. One undo step; a pour that refills to nothing is reported, not hidden.",
  "pitfalls": [
   "Changing the net of a pour reconnects copper: run_drc afterwards.",
   "A tool that keeps a pour's clearance and thermals in its design rules (Altium) writes rules scoped to that pour rather than changing the pour itself; the reply says which."
  ],
  "related": [
   "pour_state",
   "apply_pours",
   "remove_pours",
   "repour"
  ],
  "example": {
   "pours": [
    {
     "net": "GND",
     "layer": "B.Cu",
     "clearanceMm": 0.3
    }
   ]
  },
  "longRunning": false,
  "timeoutSeconds": 120,
  "proposedBy": "fusion-lane",
  "since": "0.28.1",
  "agreedBy": [
   "standard-lane",
   "kicad-lane",
   "altium-lane"
  ]
 },
 {
  "name": "tool_update",
  "tier": "app",
  "summary": "The tool's own updates: check whether one is offered, apply it in the background when no work would be lost, or read or set automatic updating.",
  "input": {
   "action": "check | apply | auto (required)",
   "on": "bool (auto): turn automatic updating on or off; omitted, the setting is read"
  },
  "output": {
   "current": "the installed version",
   "offered": "the version offered, or null",
   "applied": "bool",
   "auto": "bool",
   "needsRestart": "bool"
  },
  "hint": "apply never closes unsaved work: it refuses with the documents that need saving. Updating the tool is the user's machine changing, so say so before apply.",
  "pitfalls": [
   "An update offered only through the tool's own dialog is read from that dialog and answered in the background, never left open.",
   "apply refuses while documents are unsaved, and an installer that needs a person at the Windows UAC prompt answers needs_user with what to approve."
  ],
  "related": [
   "readiness",
   "diagnostics",
   "install"
  ],
  "example": {
   "action": "check"
  },
  "longRunning": true,
  "timeoutSeconds": 600,
  "proposedBy": "fusion-lane",
  "since": "0.28.1",
  "agreedBy": [
   "standard-lane",
   "altium-lane"
  ]
 },
 {
  "name": "import_step",
  "tier": "native",
  "summary": "Bring a STEP model in as 3D geometry placed with the board: an enclosure, a bracket or a mating part, for fit and clearance checks. Not a footprint's own model (that is add_body).",
  "input": {
   "filePath": "the STEP on the tool's machine (required)",
   "at": "[x, y, z] mm relative to the board origin, default [0, 0, 0]",
   "rotation": "[rx, ry, rz] degrees",
   "name": "what to call it"
  },
  "output": {
   "id": "the placed model",
   "bboxMm": "[x0, y0, z0, x1, y1, z1]",
   "bodies": "int"
  },
  "hint": "height_check and the bodies companion can then measure the board against it.",
  "pitfalls": [
   "A tool that can only open the STEP as a separate design answers partial and says so."
  ],
  "related": [
   "add_body",
   "height_check",
   "bodies",
   "export_step"
  ],
  "example": {
   "filePath": "C:/mech/enclosure.step",
   "at": [
    0,
    0,
    -3
   ]
  },
  "longRunning": true,
  "timeoutSeconds": 300,
  "proposedBy": "fusion-lane",
  "since": "0.28.1",
  "agreedBy": [
   "standard-lane",
   "altium-lane"
  ]
 },
 {
  "name": "physical_properties",
  "tier": "native",
  "summary": "Per component: volume, mass, density, surface area and centre of mass, from the tool's own materials. A tool with no materials or part masses answers unsupported with the reason. Read only.",
  "input": {
   "names": "[component name] (default every component)",
   "accuracy": "low|medium|high|veryhigh, default low"
  },
  "output": {
   "count": "int",
   "properties": "{name: {volume_cm3, mass_kg, density, area_cm2, center_of_mass}}"
  },
  "hint": "bodies gives each part's box on the board; this gives what it weighs.",
  "pitfalls": [
   "Mass is only as good as the material on the part."
  ],
  "related": [
   "bodies",
   "component_data"
  ],
  "example": {
   "names": [
    "Enclosure"
   ]
  },
  "longRunning": false,
  "timeoutSeconds": 120,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "altium-lane",
   "kicad-lane"
  ]
 },
 {
  "name": "preferences",
  "tier": "app",
  "summary": "Read the tool's own settings (all, or one by key), or change them with set. Reports per key what was applied. A tool that rewrites its settings on exit refuses set while running, with reason: \"tool_running\".",
  "input": {
   "key": "dotted path of one setting (default all)",
   "set": "{key: value} (omit to read)"
  },
  "output": {
   "current": "{key: value}",
   "applied": "{key: {ok, requested}} (with set)"
  },
  "hint": "Read first: the keys differ per tool.",
  "pitfalls": [
   "Keys differ per tool: read first.",
   "A tool that rewrites its settings on exit needs to be closed for set (reason: tool_running)."
  ],
  "related": [
   "tool_update"
  ],
  "example": {
   "set": {
    "lengthUnit": "mm"
   }
  },
  "longRunning": false,
  "timeoutSeconds": 30,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "altium-lane",
   "kicad-lane"
  ]
 },
 {
  "name": "select_items",
  "tier": "app",
  "summary": "Select parts by designator on the board or the sheet, or clear the selection. A bridge that cannot select on one of them refuses it by name. verified says whether the selection was read back.",
  "input": {
   "refs": "[designator]",
   "clear": "bool",
   "where": "board (default) | sheet"
  },
  "output": {
   "selected": "[ref]",
   "failed": "[{ref, error}]",
   "verified": "bool"
  },
  "hint": "select_net selects one net; sch_zoom also frames the view; selection reads what the user selected.",
  "pitfalls": [
   "A tool that cannot report its selection answers verified:false: look at the view."
  ],
  "related": [
   "select_net",
   "sch_zoom",
   "selection"
  ],
  "example": {
   "refs": [
    "R1",
    "R2"
   ]
  },
  "longRunning": false,
  "timeoutSeconds": 30,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "altium-lane",
   "kicad-lane"
  ]
 },
 {
  "name": "cancel_run",
  "tier": "app",
  "summary": "Stop the bridge's own long job, between steps, keeping what is done. With nothing to stop it answers cancelRequested:false and a reason. It never claims to interrupt the tool itself.",
  "input": {
   "runId": "str (default the latest run in flight)"
  },
  "output": {
   "cancelRequested": "bool",
   "reason": "str (when false)",
   "runId": "str",
   "stage": "str at the time of the request"
  },
  "hint": "Poll the job's own status verb to see it stop.",
  "pitfalls": [
   "Which jobs can stop differs per bridge: Fusion's library imports, KiCad's autoroute, Altium's multi-step verbs between steps."
  ],
  "related": [
   "status"
  ],
  "example": {},
  "longRunning": false,
  "timeoutSeconds": 30,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "altium-lane",
   "kicad-lane"
  ]
 },
 {
  "name": "aps_status",
  "tier": "platform",
  "summary": "APS state: configured, signed in, token live, never-charge meter. When configured:false the hint sends you to your org's shared app ID on the wiki (adom-wiki settings get <org> autodesk-aps) before anything else; the fusion-aps-org-setup skill covers new boxes and first-time orgs.",
  "input": {},
  "output": {
   "configured": "bool",
   "neverCharge": "bool",
   "signedIn": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {},
  "longRunning": false,
  "timeoutSeconds": 20,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_signin",
  "tier": "platform",
  "summary": "Open the Autodesk sign-in in the REMEMBERED browser+profile (not the OS default); a background listener captures the token. Pass {exe,profileDir,name} to use+remember a specific browser, or {allowDefaultBrowser:true} to fall back to the OS default. If nothing is remembered, returns needsExtensionOpen so the caller opens authUrl in the user's real browser via nbrowser_open_window.",
  "input": {
   "allowDefaultBrowser": "optional bool",
   "exe": "optional str (browser binary to launch+remember)",
   "name": "optional str",
   "profileDir": "optional str (e.g. 'Default','Profile 2')"
  },
  "output": {
   "authUrl": "str",
   "needsExtensionOpen": "bool",
   "openedVia": "str",
   "success": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {},
  "longRunning": false,
  "timeoutSeconds": 30,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_set_client_id",
  "tier": "platform",
  "summary": "Set the org's APS (PKCE) client id used for cloud search. Get it from your org's members-only wiki settings: adom-wiki settings get <org> autodesk-aps (never from another machine's config file). When the org has none yet, the reply's hint gives the adom-wiki settings set command that shares it, so every other box adopts it in two calls (fusion-aps-org-setup skill). Public identifier, no secret.",
  "input": {
   "clientId": "required str"
  },
  "output": {
   "success": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "clientId": "D5nn...EPAq"
  },
  "longRunning": false,
  "timeoutSeconds": 20,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_browse",
  "tier": "platform",
  "summary": "Browse hubs/projects/folders without launching Fusion.",
  "input": {
   "folderId": "optional str",
   "hubId": "optional str",
   "projectId": "optional str"
  },
  "output": {
   "items": "[{name,type,id}]"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {},
  "longRunning": false,
  "timeoutSeconds": 60,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_search",
  "tier": "platform",
  "summary": "Server-indexed search across the whole team hub: about 20-30 s hub-wide, a few seconds with projectId (not a 30-min folder walk). Budget 120 s. A ZERO from the server index is not absence: the reply then carries data.fallback (a name scan of the newest 400 items), data.completeness, and a hint to fusion_aps_browse a known sibling's folder (issue #85).",
  "input": {
   "hubId": "optional str",
   "limit": "optional int (default 50)",
   "projectId": "optional str",
   "query": "required str"
  },
  "output": {
   "count": "int",
   "results": "[{name,id,projectName,lastModified}]"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "limit": 10,
   "query": "Molecule"
  },
  "longRunning": false,
  "timeoutSeconds": 120,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_recent",
  "tier": "platform",
  "summary": "Most-recently-modified designs across the team hub, newest first.",
  "input": {
   "limit": "optional int (default 25)"
  },
  "output": {
   "count": "int",
   "results": "[...]"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "limit": 25
  },
  "longRunning": false,
  "timeoutSeconds": 120,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_file_info",
  "tier": "platform",
  "summary": "Version history + who/when/size for a file (tip + recent versions).",
  "input": {
   "query": "str  OR  projectId+urn"
  },
  "output": {
   "tip": "{...}",
   "versionCount": "int",
   "versions": "[...]"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "query": "BME690 Molecule"
  },
  "longRunning": false,
  "timeoutSeconds": 40,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_versions",
  "tier": "platform",
  "summary": "Full (uncapped) version history of a file.",
  "input": {
   "query": "str  OR  projectId+urn"
  },
  "output": {
   "versionCount": "int",
   "versions": "[...]"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "query": "BME690 Molecule"
  },
  "longRunning": false,
  "timeoutSeconds": 40,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_download",
  "tier": "platform",
  "summary": "Download a cloud file to the local machine (no Fusion needed).",
  "input": {
   "fileName": "optional str",
   "query": "str OR projectId+urn",
   "saveDir": "optional str"
  },
  "output": {
   "bytes": "int",
   "path": "str"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "query": "BME690 Molecule"
  },
  "longRunning": false,
  "timeoutSeconds": 90,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_upload",
  "tier": "platform",
  "summary": "Upload a local file as a NEW cloud file (free Data Management; needs data:write scope). ⛔ FOLDER HYGIENE: NEVER pass a project ROOT folderId - the bridge REFUSES it (refused_root_upload). Loose files in a shared root clutter the team's cloud. Create/choose a real subfolder first (fusion_aps_create_folder under an 'Adom AI Workspace' folder), or just use fusion_make_3d_package / fusion_build_library_3d which auto-target a non-root workspace. To RELOCATE an existing file, MOVE it (preserves its urn) - do NOT delete + re-upload (mints a new urn, breaks 3D bindings). See the fusion-cloud-hygiene skill.",
  "input": {
   "fileName": "optional str",
   "folderId": "required str (NON-ROOT subfolder)",
   "localPath": "required str",
   "projectId": "required str"
  },
  "output": {
   "bytes": "int",
   "itemUrn": "str"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "folderId": "urn:...",
   "localPath": "C:/x.f3d",
   "projectId": "a.YnVz..."
  },
  "longRunning": false,
  "timeoutSeconds": 90,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_create_folder",
  "tier": "platform",
  "summary": "Create a subfolder in a project (free; needs data:create scope). Use this to make an 'Adom AI Workspace' folder + per-task subfolders so the bridge never dumps loose files in the shared project root. See fusion-cloud-hygiene.",
  "input": {
   "name": "required str",
   "parentFolderId": "required str",
   "projectId": "required str"
  },
  "output": {
   "folderId": "str"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "name": "Adom AI Workspace",
   "parentFolderId": "urn:...",
   "projectId": "a.YnVz..."
  },
  "longRunning": false,
  "timeoutSeconds": 50,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "aps_open",
  "tier": "platform",
  "summary": "Find a cloud design by name and open it in Fusion (any folder depth). Fire-and-poll.",
  "input": {
   "query": "required str",
   "wait": "optional bool"
  },
  "output": {
   "match": "{name}",
   "opening": "bool",
   "statusVerb": "str"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "query": "BME690 Molecule"
  },
  "longRunning": true,
  "timeoutSeconds": 60,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "list_cloud_projects",
  "tier": "platform",
  "summary": "List the cloud PROJECTS visible to the signed-in Fusion session (hub walk - slow on big teams; prefer fusion_aps_search for finding files).",
  "input": {},
  "output": {
   "projects": "list",
   "success": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {},
  "longRunning": true,
  "timeoutSeconds": 120,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "list_cloud_files",
  "tier": "platform",
  "summary": "List files/folders in a cloud project (optionally a subfolder).",
  "input": {
   "folderPath": "optional str",
   "projectName": "optional str (defaults to active project)"
  },
  "output": {
   "files": "list",
   "success": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "projectName": "Main"
  },
  "longRunning": true,
  "timeoutSeconds": 120,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "create_cloud_folder",
  "tier": "platform",
  "summary": "Create a subfolder in a cloud project through the signed-in Fusion session's Data API (no APS needed). Idempotent: an existing folder of that name is returned with alreadyExisted:true instead of a duplicate. Folder names are matched case-insensitively. For an APS-side create without Fusion running, use fusion_aps_create_folder.",
  "input": {
   "folderName": "required str",
   "parentPath": "optional str (parent folder path; default the project root)",
   "projectName": "optional str (default the active project)"
  },
  "output": {
   "alreadyExisted": "bool (only when it already existed)",
   "folderId": "str",
   "folderName": "str",
   "parentFolder": "str",
   "project": "str",
   "success": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "folderName": "AI-Scratch",
   "projectName": "Main"
  },
  "longRunning": false,
  "timeoutSeconds": 60,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "delete_cloud_file",
  "tier": "platform",
  "summary": "DESTRUCTIVE: delete ONE cloud file through the signed-in Fusion session's Data API. Looks in exactly one folder (projectName + folderPath, no recursion) for an exact case-insensitive name match, or for the lineage urn when fileId is given (the precise form; prefer it in shared folders). Refuses without fileName or fileId. Large folders time out on the scan; give a precise folderPath. Use fusion_cleanup_cloud_files to delete a LIST of urns with dryRun support.",
  "input": {
   "fileId": "optional str (lineage urn for a precise delete; lineageUrn is accepted as an alias)",
   "fileName": "required str unless fileId is given (exact name match in one folder)",
   "folderPath": "optional str (default the project root)",
   "projectName": "optional str (default the active project)"
  },
  "output": {
   "fileId": "str",
   "fileName": "str",
   "folder": "str",
   "project": "str",
   "success": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "fileName": "verbtest-scratch",
   "folderPath": "AI-Scratch",
   "projectName": "Main"
  },
  "longRunning": false,
  "timeoutSeconds": 60,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "cleanup_cloud_files",
  "tier": "platform",
  "summary": "PRECISELY delete a list of cloud files by lineage urn - SAFE cleanup of AI-created clutter. Deletes ONLY the exact fileIds given (never name-guessing), so it can't touch a teammate's file in a shared folder. Loops server-side. Get the ids from fusion_aps_browse (item .id). Use this to remove f3d files the bridge created. A big list takes minutes (relay may time out at ~60s while deletes continue server-side - re-browse to confirm).",
  "input": {
   "fileIds": "required [<lineage urn>]",
   "folderPath": "optional str (default root - where the files live)",
   "projectName": "optional str (default active project)"
  },
  "output": {
   "deletedCount": "int",
   "failed": "[{fileId,error}]",
   "failedCount": "int",
   "success": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {
   "fileIds": [
    "urn:adsk.wipprod:dm.lineage:abc123"
   ],
   "projectName": "Adom"
  },
  "longRunning": true,
  "timeoutSeconds": 1800,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "managed_library_create",
  "tier": "platform",
  "summary": "Create a NEW managed library on library.io FROM the library in front (which must already be saved in a Fusion Hub). Drives MANAGE > LIBRARY.IO > Push, then completes Fusion's Create Managed Library dialog. PITFALL: a managed library created under one Autodesk account is NOT visible to another account until its managed FOLDER is shared on library.io - proven live, so do not assume hub membership shares it.",
  "input": {
   "description": "optional str",
   "name": "optional str (defaults to the library's own name)"
  },
  "output": {
   "alerts": "[...]",
   "library": "str",
   "success": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {},
  "longRunning": true,
  "timeoutSeconds": 240,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "managed_library_link",
  "tier": "platform",
  "summary": "Link the library IN FRONT to an existing managed library on library.io. With no name, opens Fusion's Select Managed Library picker, returns its rows as records (name/type/version/managedFolder/description) and CANCELS - a safe read-only listing of what this Autodesk account can reach. With name, selects that row and confirms. SAFETY: after linking, Fusion offers to force-update your library FROM the managed one; 'Replace Local Library' would destroy your parts, so this verb answers CANCEL by default - pass onUpdatePrompt to choose deliberately. A managed library owned by ANOTHER Autodesk account does NOT appear until its managed FOLDER is shared with this account on library.io; being in the same Fusion hub is not enough.",
  "input": {
   "name": "optional str (exact library name from the picker; omit to list read-only)",
   "onUpdatePrompt": "optional str cancel|merge|replace (default cancel; replace OVERWRITES the local library)"
  },
  "output": {
   "alerts": "[...]",
   "linkedTo": "str?",
   "listedOnly": "bool?",
   "managedLibraries": "[{name,type,version,managedFolder,description}]",
   "success": "bool",
   "updatePrompt": "obj?"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {},
  "longRunning": true,
  "timeoutSeconds": 180,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "managed_library_push",
  "tier": "platform",
  "summary": "Push a NEW VERSION of the library in front up to its linked managed library on library.io. Clicking the menu item alone does NOT push: Fusion raises a CEF 'Create New Version' confirmation and THAT is what creates the version, so this verb completes it and fails with confirm_missing rather than reporting a false pass. On a library that is not linked yet, Fusion offers Create Managed Library instead and this reports not_linked_yet - use fusion_managed_library_create. NOTE: Library Manager keeps showing the IMPORTED version number after a push, so the row gains an update-available badge instead of incrementing.",
  "input": {
   "onConfirm": "optional str create|cancel (default create)"
  },
  "output": {
   "alerts": "[...]",
   "confirmed": "obj",
   "library": "str",
   "success": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {},
  "longRunning": true,
  "timeoutSeconds": 240,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "managed_library_pull",
  "tier": "platform",
  "summary": "Pull the newest version FROM library.io into the linked library in front. A pull ends in ONE of two CEF dialogs and BOTH block the add-in until answered: the force-update prompt when content differs (answered MERGE by default, since pull is an explicit request for the managed content - pass onUpdatePrompt:'replace' to overwrite local parts entirely, or 'cancel' to back out), or 'Up to Date' when already current. If neither appears, nothing was pulled and this reports failure rather than a false pass - Fusion greys Pull out on a library that was never linked.",
  "input": {
   "onUpdatePrompt": "optional str merge|replace|cancel (default merge)"
  },
  "output": {
   "alerts": "[...]",
   "library": "str",
   "success": "bool",
   "upToDate": "bool",
   "updatePrompt": "obj?"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {},
  "longRunning": true,
  "timeoutSeconds": 240,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 },
 {
  "name": "managed_library_unlink",
  "tier": "platform",
  "summary": "Unlink the library in front from its managed library on library.io. Fusion greys this out on a library that was never linked, so a silent no-op there is expected.",
  "input": {},
  "output": {
   "alerts": "[...]",
   "library": "str",
   "success": "bool"
  },
  "hint": "Fusion's cloud (the Autodesk hub, library.io), the counterpart of Altium 365's a365_* verbs.",
  "pitfalls": [],
  "related": [],
  "example": {},
  "longRunning": true,
  "timeoutSeconds": 180,
  "proposedBy": "fusion-lane",
  "since": "0.31.0",
  "agreedBy": [
   "standard-lane"
  ]
 }
]